A. 風變編程的Python課程學完效果如何
一、Python簡介
Python是一種用來編寫應用程序的高級程序設計語言,TIOBE程序語言排行榜2015年12月的排名如下:
Python實現強勢逆襲,而且我相信,隨著時間的推移,國內Python語言未來前景也是一片向好。
Python的特點是優雅簡單,易學易用(雖然我感覺還是有一些概念不容易理解),Python的哲學是盡量用最少的,最簡單易懂的代碼實現需要的功能。Python適宜於開發網路應用,腳本寫作,日常簡單小工具等等。Python的缺點是效率較低,但是在大量的場合效率卻不是那麼重要或者說Python不是其性能瓶頸,所以不要太在意。其次是2.x-3.x的過渡使得許多3.x還缺少很多2.x下的模塊,不過也在完善中。其次就是源代碼無法加密,發布Python程序其實就是發布源代碼。
二、基礎語法要點
1.如果一個字元串中有許多需要轉義的字元,而又不想寫那麼多'',那麼可以用 r'...' 表示 '...'內的內容不轉義。
2.Python可用'''...'''來表示多行內容,如:
123456>>>print('''line1line2line3''')line1line2line3
3.Python的邏輯運算and, or, not 分別對應C語言中的&&, ||, !.
4.Python的整數與浮點數大小都沒有范圍。
5.Python中除法有兩種: '/'除出來必是浮點數, '//'除出來是整數,即地板除。
6.Python中一切皆引用。每個對象都有一個引用計數器(內部跟蹤變數)進行跟蹤,引用計數值表示該對象有多少個引用,當初次產生賦給變數時,引用計數為1,其後沒進行下列行為中的任意一種都會增加引用計數:
123賦值: a=b用作函數參數傳遞: func(a)成為容器對象的一個元素: lis=[1,2,a]
以下任意一種行為都會減少引用計數:
1234del銷毀:dela變數另賦給其他對象:a=False對象從容器中刪除: lis.remove(a)身在的容器被銷毀:dellis
7.深拷貝與淺拷貝的概念與對比,有點復雜,看這篇文章
8.list,tuple和dict,set
list:為列表,是一個有序集合,類似於數組但又比數組功能強大,可以隨時append,pop元素,下標從0開始,且下標為加n模n制,即lis[-1] = lis[len-1],下標范圍[-len,len-1].
tuple:為元組,類似於list,但list為可變類型,而tuple不可變,即沒有append,pop等函數。一個建議是為了安全起見,能用tuple代替list盡量用tuple。如果tuple只有一個元素,要寫成如(1,)以避免歧義。
dict:字典類型,存放key-value鍵值對,可以根據key迅速地找出value,當然,key必須是不可變類型,如下是錯誤的:
12345>>> dic={[1,2]:'value'}Traceback (most recent call last):File"<pyshell#10>", line1,in<mole>dic={[1,2]:'value'}TypeError: unhashabletype:'list'
list與dict的優劣對比:
1234567dict:1.插入,查找速度快,跟key的數目無關2.需佔用大量內存,內存浪費嚴重list:1.插入,查找速度慢,O(n)的復雜度,隨元素個數增加而增加2.佔用內存小
dict內部存放的順序和key放入的順序是沒有關系的
set:set與dict類似,相當於只有key沒有value的dict,每個key不同,set間有 &, | 等操作對應集合的交,並操作。
三、函數
1.函數是對象,函數名即是指向對應函數對象的引用,所以可以將函數名賦給一個變數,相當於給函數起一個『別名』。
123>>> mmm=max>>> mmm(1,2,3)3
2.Python函數可以返回」多個值「,之所以打引號,是因為實際上返回的多個值拼成了一個元組,返回這個元組。
3.定義默認參數需要牢記:默認參數必須指向不變對象。否則第一次調用和第二次調用結果會不一樣,因為可變的默認參數調用後改變了。
4.可變參數:傳入的參數個數是可變的,可以是0個或多個。可變參數會將你傳入的參數自動組裝為一個tuple。在你傳入的list或tuple名字前加一個 * 即說明傳入的是可變參數。習慣寫法為*args。
5.關鍵字參數:傳入0個或多個含參數名的參數,這些參數被自動組裝成一個dict。習慣寫法**kw,如**a表示把a中所有的鍵值對以關鍵字參數的形式傳入kw,獲得一個dict,這個dict是a的一份拷貝,對kw改動不會傳遞到a
6.命名關鍵字在函數定義中跟在一個*分割符後,如
12deffunc(a,b,*,c,d):pass
c,d為命名關鍵字參數,可以限制調用者可以傳入的參數名,同時可以提供默認值。
7.參數定義順序:必選參數,默認參數,可變參數/命名關鍵字參數,關鍵字參數。
8.切片操作格式為lis[首下標:尾下標:間隔],如果都不填,即lis[::]則代表整個容器lis
9.用圓括弧()括起來一個列表生成式創建一個生成器generator,generator保存生成演算法,我們可以用next(g)取得生成器g的下一個返回值。生成器的好處就是我們不需要提前生成所有列表元素,而是需要時再生成,這在某些情況下可以節省許多內存。演算法也可以不是列表生成式而是自定義函數,只需在函數定義中包含yield關鍵字。
10.map()和rece(): 二者都是高階函數。map()接收兩個參數,一個是函數,一個是Iterable序列,map將傳入的函數依次作用在序列每一個元素上,並把結果作為新的Iterator返回。rece()類似累積計算版的map(),把一個函數作用在一個序列上,每次接收兩個參數,將結果繼續與序列的下一個元素做累積計算。
利用map和rece編寫一個str2float函數,如把字元串'123.456'轉換成浮點數123.456:
123456789101112131415(s):deff1(x,y):returnx*10+ydefchar2num(s):return{'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}[s]deff2(x,y):returnx*0.1+ya,b=s.split('.')print('a=',a)print('b=',b)returnrece(f1,map(char2num,a))+0.1*rece(f2,map(char2num,b[::-1]))print('str2float('123.456') =', str2float('123.456'))
11.fliter()函數過濾序列,類似於map()作用於每一元素,根據返回值是True或者False決定舍棄還是保留該元素。函數返回一個Iterator。
12.sorted()函數可實現排序,類似於C++庫中的sort()函數,但是比其更加簡潔,語法為sorted(lis,key=func,reverse=T/F)
key函數可實現自定義的排序規則,reverse表示升序還是降序。
13.一個函數可以返回一個函數,但是返回時該函數並未執行,所以返回函數中不要引用任何可能發生變化的變數,否則會出現邏輯錯誤。
14.裝飾器(decorator): 當需要增強函數的功能卻不希望修改函數本身,那麼可以採用裝飾器這種運行時動態增加功能的方式,增加的功能卸載裝飾器函數中。如在執行前後列印'begin call'和'end call',可以這樣做:
12345678910111213141516importfunctoolsdeflog(func):@functools.wraps(func)#為了校正函數簽名,最好寫上defwrapper(*args,**kw):print('begin call')f=func(*args,**kw)print('end call')returnfreturnwrapper@logdefhah():print('hahahaha')hah()
123
begin callhahahahaend call
15.偏函數: functools.partial(),作用是將一個函數的某些參數固定住,作為新函數的參數,即固定住該參數,返回一個新函數,使調用更簡單。
四、面向對象編程
1.Python實例變數可以自由地綁定任何屬性
2.為了不讓內部屬性不被外部訪問,在屬性的名稱前加上兩個下劃線__,這樣就變成了一個私有變數(private),注意,不能直接訪問不代表一定不能訪問,事實上,加雙下劃線後Python就會將其改名為『_class名__name』,所以還是可以這樣來訪問這個『私有』變數。
3.對於靜態語言,如果要求傳入一個class類型的對象,那麼傳入的對象必須是class類型或者其子類,否則將無法調用class中的方法,而Python這樣的動態語言有『鴨子類型』一說,即不一定要傳入class類型或其子類,而只要保證傳入的對象中有要使用的方法即可。
4.如果想要限制實例可以綁定的屬性,那麼在定義class時定義一個__slots__變數即可,例如:
12classStudent(object):__slots__=(『name』,』age』)
注意,__slots__限制的屬性對當前類實例起完全限製作用,且與子類共同定義其__slots__,也就是說子類可以定義自己的__slots__,子類實例允許定義的屬性就是自身的__slots__加上父類的__slots__,即並集。
5.@ property裝飾器可以使一個getter方法變成屬性,如果方法名為me,那麼@me.setter裝飾器則可使一個setter方法變成屬性。這樣可以使代碼更簡短,同時可對參數進行必要的檢查。
6.通過多重繼承,可使子類擁有多個父類的所有功能。
7.在類中__call__方法可使實例對象像函數那樣直接調用,作用即是該方法定義的過程。
8.ORM(Object Relational Mapping 對象關系映射),就是把關系資料庫的一行映射為一個對象,也就是一個類對應一個表。ORM的實現需要通過metaclass元類修改類的定義。元類可以改變類創建時的行為。
五、調試
1.Python調試方法:
(1)直接列印
(2)斷言
(3)pdb
(4)IDE
六、IO編程
1.序列化: 把變數從內存中變成可存儲或傳輸的過程稱之為序列化。Python用pickle模塊實現序列化。序列化之後,就可以把序列化後的內容存儲到磁碟上或者通過網路進行傳輸。pickle.mps()將對象序列化成一個bytes,而pickle.loads()可以根據bytes反序列化出對象。
2.pickle雖好,但是它專為Python而生,所以要在不同語言間傳遞對象,最好還是xml或者json,而json表示格式是一個字元串,更易讀取,且比xml快,所以更加適宜於對象序列化。Python內置了json模塊,相應方法仍然是mps()和loads()。
3.但是在默認情況下,有些對象是無法序列化的,所以我們有時還需要定製轉換方法,告訴json該如何將某類對象轉換成可序列為json格式的{}對象。如下即是一個轉換方法:
123456defmantodict(std):return{'name': std.name,'age': std.age,'id': std.id}
七、進程與線程
1.Python用mutiprocessing模塊來實現多進程。
2.如果要大量創建子進程,可以使用進程池:
1frommultiprocessingimportPool
示例如下:
12345678....p=Pool(4)foriinrange(5):p.apply_async(long_time_task, args=(i,))print('Waiting for all subprocesses done...')p.close()p.join()print('All subprocesses done.')
要使用進程池需新建Pool對象,對Pool對象調用join()使等待池中所有子進程運行完畢,調用join()方法之前必須調用close(),且此後無法再新加子進程。
3.使用subprocess模塊可以方便的啟動並管理一個子進程,控制其輸入輸出。
4.進程間通信使用Queue,Pipes實現。
5.threading模塊管理線程。threading.lock()創建線程鎖,防止同時訪問互斥資源造成的錯誤,示例如下:
1234567lock=threading.Lock()...lock.acquire()...change(mutex)...lock.release()
6.ThreadLocal可以解決參數在一個線程中各個函數之間互相傳遞的問題。
7.managers模塊實現分布式進程。
八、正則表達式與常用內建模塊
1.re模塊進行正則表達式編譯和匹配,如果該表達式需要匹配很多次,那麼最好進行編譯從而大大節省時間。
正則表達式匹配郵箱例子:
12345678910importrehah=re.compile('[0-9a-zA-Z]+[.[0-9a-zA-Z]+]*@[0-9a-zA-Z]+.[a-z]{2,3}')print(hah.match('[email protected]').group())print(hah.match('[email protected]').group())i=1whilei <10:r=input('請輸入郵箱:')print(hah.match(r).group())i=i+1
2.datetime模塊進行日期和時間的處理,每一個時間對應一個timestamp,我們把1970年1月1日 00:00:00 UTC+00:00時區的時刻稱為epoch time,記為0(1970年以前的時間timestamp為負數),當前時間就是相對於epoch time的秒數,稱為timestamp。字元串和datetime也可以相互轉換,採用strptime()方法,字元串轉換為datetime時需要設定一個識別格式,其中
1%Y-%m-%d%H:%M:%S
分別表示年-月-日 時-分-秒。
從datetime得出月份,星期等字元串用strftime()方法,其中:
1%a,%b%d%H:%M
分別表示星期, 月份 日期 時:分。
示例:
12345678910fromdatetimeimportdatetimer='2015-11-23 12:01'dt=datetime.strptime(r,'%Y-%m-%d %H:%M')print(dt)week=dt.strftime('%a %b %d, %H:%M')print(week)2015-11-2312:01:00Mon Nov23,12:01
3.collections是Python內建的一個集合模塊,提供了許多有用的集合類。
4.Base64是一種任意二進制到文本字元串的編碼方法,常用於在URL、Cookie、網頁中傳輸少量二進制數據。
5.struct模塊用來解決bytes和其他二進制數據類型的轉換。
6.Python的hashlib提供了常見的哈希演算法,如MD5,SHA1等等。hashlib實現簡單登錄:
importhashlibdb={'michael':'','bob':'','alice':''}defget_md5(ostr):md5=hashlib.md5()md5.update(ostr.encode())returnmd5.hexdigest()deflogin(user, password):r=get_md5(password)fornameindb:ifdb[name]==r:returnTruereturnFalseprint(login('bob','abc999'))True
7.Python的內建模塊itertools提供了非常有用的用於操作迭代對象的函數。
8.urllib提供了一系列用於操作URL的功能。如GET,POST...
9.PIL(Python Imaging Library Python圖像庫)是一個強大的圖像處理標准庫,功能強大卻又簡單易用。現在的名字叫做Pillow。可以如下安裝Pillow:
1pip3 install pillow
從下面生成數字驗證碼的程序可以窺其一斑:
九、網路編程和電子郵件
1.網路編程主要是TCP和UDP的編程,示例見【Python網路編程】利用Python進行TCP、UDP套接字編程
2.SMTP是發送郵件的協議,Python內置對SMTP的支持,可以發送純文本郵件、HTML郵件以及帶附件的郵件。Python對SMTP支持有smtplib和email兩個模塊,email負責構造郵件,smtplib負責發送郵件。Python內置一個poplib模塊,實現了POP3協議,可以直接用來收郵件。由於現在絕大多數大型郵件服務商都採取了反垃圾郵件措施,所以這部分的簡單實驗並沒有成功,還需進一步研究,等遇到具體情況再說。
3.Python內嵌了sqlite資料庫,還可以自行安裝連接mysql,MySQL是當前最流行的開源資料庫,在行業內有著廣泛的應用。
十、Web開發和非同步IO
1.WSGI(Web Server Gateway Interface) 伺服器網關介面。
2.Python web 開發框架:
-Flask:流行的Web框架
-Django:全能型Web框架
-web.py:一個小巧的Web框架
-Bottle:和Flask類似的Web框架
-Tornado:Facebook的開源非同步Web框架
3.協程
B. IOC容器是什麼
IOC容器:Ioc—Inversion of Control,即「控制反轉」,就是具有依賴注入功能的容器,是可以創建對象的容器,IOC容器負責實例化、定位、配置應用程序中的對象及建立這些對象間的依賴。
IoC 的全稱叫做 Inversion of Control,可翻譯為為「控制反轉」或「依賴倒置」,它主要包含了三個准則:
1、高層次的模塊不應該依賴於低層次的模塊,它們都應該依賴於抽象;
2、抽象不應該依賴於具體實現,具體實現應該依賴於抽象;
3、面向介面編程 而不要面向實現編程。
(2)高級編程容器的設計與應用擴展閱讀
Spring 提供了許多 IOC 容器
的實現。比如 XmlBeanFactory, 等。其中 XmlBeanFactory 就 是針對最基本的IOC 容器的實現,這個 IOC 容器可以讀取XML 文件定義的 BeanDefinition(XML 文件中對 bean 的描述)。
ApplicationContext 是 Spring 提供的一個高級的 IOC 容器,它除了能夠提供 IOC 容器的基本功
能外,還為用戶提供了以下的附加服務。
C. 編程時選用的程序設計語言,對軟體的開發與維護的影響
【CSDN 編者按】「如果我們把人類文明想像成汽車的話,那麼軟體開發行業就相當於汽車的引擎,編程語言就像引擎的燃料。」作為一名開發者,需跟隨技術潮流的發展來學習新技術。2020年,你有計劃新學一門編程語言嗎?
本文作者從一名架構師的角度,詳細分析了7種現代編程語言的優點與功能,你對哪門語言最感興趣呢?
作者 | Md Kamaruzzaman,軟體架構師
譯者 | 彎月,責編 | 伍杏玲
封圖| CSDN 下載於視覺中國
出品 | CSDN(ID:CSDNnews)
以下為譯文:
如果我們把人類文明想像成汽車的話,那麼軟體開發行業就相當於汽車的引擎,而編程語言就像引擎的燃料。作為一名開發者,今年你應該學習哪種編程語言呢?
學習一種新的編程語言無疑是時間、精力和智力上的巨大投資, 但是學習一種新的編程語言可以提升你的軟體開發技術力,促進你的職業發展。
在這里,我將獻上一份現代編程語言的列表,這些語言不僅有助於提高你的生產力,而且還可以促進你的職業發展,並讓你成長為更優秀的開發人員。這份列表還涵蓋了非常廣泛的領域:系統編程、應用程序開發、Web開發、科學計算等。
什麼是現代編程語言?
「現代編程語言」這個說法本身就很含糊。許多人認為Python和JavaScript等語言是現代編程語言,還認為Java是一種古老的編程語言。實際上,這幾種語言大約在同一時間出現:1995年。
大多數主流編程語言是上個世紀開發的:七十年代(如C)、八十年代(如C ++)、九十年代(如Java、Python、JavaScript)。這些語言在設計上並沒有考慮現代軟體開發生態系統:多核CPU、GPU、快速的互聯網、移動設備、容器和雲等。盡管許多語言中的許多功能都已進行一些改進,如並發等,而且在不斷調整自己以適應時代,但它們依然保留了向後兼容性,無法拋棄那些過時的舊功能。
在這方面,Python就做得很好(某種意義上也未必是好事),Python 2和Python 3兩者之間有明確的分界線。很多語言常常會為解決同一個問題提供十餘種的方法,同時又沒有顧及到開發人員的感受。根據StackOverflow的開發人員調查,大多數舊時的主流編程語言在「最可怕的語言」排名都名列前茅:
如果非要在新舊編程語言之間劃個界限的話,那麼應該是2007年6月29日,也就是第一台iPhone發行的時候。在這之後,編程語言界發生了很大變化。因此,在本文的列表中,我只考慮2007年以後的編程語言。
為什麼要學習新語言?
首先,現代編程語言充分利用現代計算機硬體(多核CPU、GPU、TPU)、移動設備、大量數據、高速互聯網、容器和雲的優勢。大多數現代編程語言會關注開發人員的體驗,比如:
簡潔明了的代碼(減少樣板代碼)
內置的並發支持
空指針安全
類型推斷
簡潔的功能集
降低學習難度
融合所有編程範例的最佳功能
本文列表的許多編程語言都帶有革命性地變化,並將永久地改變軟體行業。一些已成為主流編程語言,還有一些則有望取得突破。因此選擇這些語言作為第二種編程語言是明智的做法。
Rust
一直以來,系統編程語言環境主要由靠近硬體的語言(如C、C ++等)主導。盡管它們可以完全控製程序和硬體,但是它們缺乏內存安全性。即使它們支持並發,使用C/C ++編寫並發程序也很困難,因為沒有並發安全性。還有一些流行的編程語言是解釋性語言,例如Java、Python、Haskell。這些語言具備安全性,但需要龐大的運行時或虛擬機。由於它們的運行時間長,因此Java等語言不適合於系統編程。
許多人曾嘗試將C/C ++的功能與Java、Haskell的安全性相結合。然而,Rust才是第一個成功實現了這一點的編程語言。
Graydon Hoare在業余項目中開發出了Rust,他的靈感來自研究編程語言Cyclone。Rust是開源的,由Mozilla與許多其他公司和社區一起領導這門語言的開發。Rust於2015年首次發布,並很快引起了社區的關注。
主要特徵:
通過所有權和借用概念提供內存安全和並發安全。
內存安全和並發安全在編譯時確保,即如果程序代碼可以編譯,那麼內存既安全又沒有數據競爭。這是Rust最吸引人的功能。
它還提供了Haskell中元編程的表現力。憑借不可變的數據結構和功能編程功能,Rust提供了功能並發和數據並發。
Rust的速度非常快,純Rust的性能甚至優於純C。
在沒有運行時的情況下,Rust可以完全控制現代硬體(TPU、GPU、多核CPU)。
Rust具有LLVM支持。因此,Rust提供一流的與WebAssembly的互操作性,而且Web代碼也非常快。
流行度:
自2015年首次亮相以來,Rust已被開發人員廣泛接受,並在StackOverflow開發人員調查中連續四年(2016、2017、2018、2019)被評選為最受歡迎的語言:
根據GitHub Octoverse的調查,Rust是運行速度第二快的語言,僅次於Dart:
此外,根據編程語言流行度排名網站PyPl的數據,Rust排名第18位,並呈上升趨勢:
對比Rust提供的功能集,我們就會明白為什麼微軟、亞馬遜、Google等科技巨頭相繼宣布投資Rust作為一種長期的系統編程語言。
根據Google統計的趨勢,在過去的5年中,Rust的熱度每年都在增加。
主要用途:
系統編程
Serverless 計算
商業應用
主要競爭對手:
C
C++
Go
Swift
Go
在本世紀初,Google面臨兩個擴展問題:開發擴展和應用程序擴展。開發擴展問題指的是他們不能僅通過投入開發人員的方式來添加更多功能。應用程序擴展問題則指他們無法開發出一款能夠擴展到Google級別的計算機集群的應用程序。
所以在2007年左右,Google創建了一種新的編程語言,用於解決這兩個擴展問題。兩位才華橫溢的Google軟體工程師Rob Pike(UTF-8)和Ken Thompson(UNIX OS)創建了一種新語言。
2012年,Google正式發布了第一版的Go編程語言。Go是一種系統編程語言,但與Rust不同,它還具有Runtime和垃圾收集器(幾兆位元組)。但是與Java或Python不同,這個Runtime包含了生成的代碼。最後,Go生成了一個本地的二進制代碼,可以在沒有附加依賴項或運行時的情況下在計算機中運行。
主要特徵:
Go具有一流的並發支持。Go不通過線程和鎖提供「共享內存」並發性,因為編程難度太大。相反,它提供了基於CSP的消息傳遞並發性(基於Tony Hoare的論文)。Go使用「 Goroutine」(輕量級綠色線程)和「 Channel」進行消息傳遞。
Go最大的殺手級功能是:簡單,它是最簡單的系統編程語言。新手軟體開發人員只需幾天就可以編寫高效的代碼,就像Python一樣。有些大規模的雲原生項目(如Kubernetes、Docker)都是用Go編寫的。
Go還內置了垃圾收集器,這意味著開發人員無需擔心C/C++中的內存管理問題。
Google投入了大量資金打造Go。因此Go擁有大量的工具支持。新手Go開發人員擁有大量的工具生態系統。
一般,開發人員80%的時間都花在了維護現有代碼上,用於編寫新代碼的時間只佔20%。由於其簡單性,Go在語言維護方面表現出色。如今,Go在業務應用程序中大量使用。
流行度:
Go一問世就受到了軟體開發社區熱烈的歡迎。2009年-2018年,Go一直在TIOBE編程語言排行榜上徘徊。Go的成功為Rust等新一代編程語言鋪平了道路。
如今,Go已是主流編程語言。最近,Go團隊宣布了有關「Go 2」的消息,這門編程語言的發展會更加穩固。
幾乎在所有的流行編程語言排行榜中,Go的排名都很高,已超過許多現有的語言。自2019年12月以來,在TIOBE指數排名中,Go名列第15位:
根據StackOverFlow的調查,十大最受喜愛的編程語言中,Go也位列其中:
此外,根據GitHub的數據,Go也是十大發展最迅速的語言之一:
Google趨勢顯示,在過去的5年中,Go的熱度每年都在增加。
主要用途:
系統編程
Serverless 計算
商業應用
雲原生開發
主要競爭對手:
C
C++
Rust
Python
Java
Kotlin
Java 是企業軟體開發領域無可爭議的王者。近年來,Java受到了一些負面評論:過於冗長,大量樣板代碼,容易出現意外的復雜性。但是,關於Java虛擬機(JVM)的爭論卻很少。JVM是軟體工程的傑作,經過了時間的考驗,提供了硬核的runtime。
多年來,Scala等JVM語言一直在努力克服Java的缺點,想成為更好的Java,但他們都失敗了。最終,這場提升Java的探索以Kotlin的誕生結束。Jet Brains(流行的IDE IntelliJ背後的公司)開發了Kotlin,它可以在JVM上運行,克服了Java的很多缺點,提供許多現代功能。
與Scala不同的是,Kotlin比Java更簡單,還可在JVM中提供與Go或Python開發人員同等的生產力。
Google宣布Kotlin是一流的Android應用開發語言,因此Kotlin在社區中的接受度得到了大幅提高。自2017年以來,同樣受歡迎的Java Enterprise框架Spring也開始支持Kotlin。我曾嘗試結合Kotlin與Reactive Spring使用,體驗非常棒。
主要特徵:
Kotlin的主要賣點在於其語言設計。我總是將Kotlin視為JVM上的Go/Python,因為它簡潔明了的代碼。因此,Kotlin的生產力很高。
與許多其他現代語言一樣,Kotlin提供了Null指針、安全性、類型推斷等功能。
由於Kotlin也運行在JVM中,因此現有Java庫龐大的生態系統都可供使用。
Kotlin是一流的Android應用開發語言,並且已經超過Java,成為開發Android應用的首選。
Kotlin得到了JetBrains和Open Source的支持,因此具有出色的工具支持。
Kotlin有兩個有趣的項目:Kotlin Native(將Kotlin編譯為原生代碼)和kotlin.js(Kotlin到JavaScript)。如果成功,則可以在JVM外部使用Kotlin。
Kotlin還提供了一種簡單的方式來編寫DSL(域特定語言)。
流行度:
自2015年首次發布以來,Kotlin的知名度不斷飆升。根據Stack Overflow,Kotlin是2019年第四大最受歡迎的編程語言:
Kotlin還是增長最快的編程語言之一,排名第四:
在流行編程語言排名網站PyPl的排名中,Kotlin名列第十二名,並具有較高的上升趨勢:
自從Google宣布Kotlin是一流的Android應用開發語言以來,Kotlin的流行趨勢出現了大幅上漲,如下所示:
主要用途:
企業應用程序
主要競爭對手:
TypeScript
JavaScript是一門優秀的編程語言,在2015年之前,JavaScript有很多缺點。著名的軟體工程師Douglas Crockford寫了一本書名為《JavaScript: The Good Parts》,暗示了JavaScript有很糟的部分。無模塊化,還有「回調地獄」,因此開發人員都不喜歡維護特別大的JavaScript項目。
Google甚至還開發了一個平台,可將Java代碼反編譯為JavaScript代碼(GWT)。許多公司和個人都曾嘗試開發更好的JavaScript,例如CoffeeScript、Flow、ClojureScript。最終,微軟的TypeScript取得了成功。
微軟的一隊工程師在著名的Anders Hejlsberg的帶領下,創建了JavaScript的靜態類型、模塊化超集——TypeScript。
TypeScript可以編譯為JavaScript。於2014年首次發布後,TypeScript很快引起了社區的關注。Google當時還計劃開發JavaScript的靜態類型超集。Google對TypeScript青睞有加,以至於他們沒有開發新的語言,而是選擇與微軟合作改進TypeScript。
Google選擇TypeScript作為其SPA框架Angular 2+的主要編程語言。此外,流行的SPA框架React也提供對TypeScript的支持。另一個流行的JavaScript框架Vue.js也宣布將使用TypeScript開發新的Vue.js 3:
另外,node.js的創建者Ryan Dahl已決定使用TypeScript來開發安全的Node.js替代品Deno。
主要特徵:
流行度:
開發人員喜歡TypeScript的優雅語言設計。在StackOverFlow最受歡迎的語言類別的調查中,TypeScript與Python並列第二名:
根據GitHub的排名,TypeScript是增長最快的編程語言之一,排名第五:
從GitHub的貢獻度來看,TypeScript排名第七,打進了前十:
Google的趨勢表明,在過去的幾年中,TypeScript的熱度越來越高:
主要用途:
主要競爭對手:
Swift
當初喬布斯拒絕在iOS中支持Java(和JVM),他認為Java不再是主流編程語言。如今我們發現喬布斯當初的估計是錯的,雖然iOS仍然不支持Java。蘋果選擇了Objective-C作為iOS中的首選編程語言。Objective-C是一門很難掌握的語言,它不支持現代編程語言所要求的高生產力。
後來,蘋果的Chris Lattner和其他人開發了一種多範例、通用的、編譯編程語言——Swift,來替代Objective-C。Swift的第一個穩定版本於2014年發布。Swift還支持LLVM編譯器工具鏈(也由Chris Lattner開發)。Swift與Objective-C代碼庫具有出色的互操作性,並且已確立為iOS應用開發中的主要編程語言。
主要特徵:
流行度:
開發人員對Swift的喜愛不亞於許多其他現代編程語言。根據StackOverflow的調查,Swift在最受歡迎的編程語言中排名第六:
2019年,在TIOBE的編程語言排名中,Swift的排名上升到了第10名。鑒於這種編程語言只有5年的歷史,可以說是成績斐然:
Google的趨勢表明,在過去的幾年中,Swift的熱度出現了激增:
主要用途:
主要競爭對手:
Dart
Dart是Google出品的第二大編程語言。Google是Web和Android領域的巨頭,因此Google在Web和應用領域開發自己的編程語言也不足為奇。在丹麥軟體工程師Lars Bak(領導Chrome的 JavaScript V8引擎開發)的帶領下,Google於2013年發布了Dart。
Dart是一種通用編程語言,支持「強類型」和「面向對象」編程。Dart也可以轉編譯為JavaScript,凡是JavaScript可以運行的任何地方(例如Web、移動、伺服器)幾乎都可以運行 Dart。
主要特徵:
流行度:
根據GitHub Octoverse數據顯示,Dart是2019年增長最快的編程語言,去年它的流行度增長了五倍:
根據TIOBE指數顯示,Dart排名第23,僅用了4年時間就超過了很多其他的現代編程語言:
根據StackOverflow的調查,Dart在最受歡迎的編程語言中排名第12:
受Flutter的影響,Google的趨勢表明,在過去的兩年中,Dart的熱度急劇上升:
主要用途:
主要競爭對手:
Julia
本文提及的大多數編程語言都是由大型公司開發的,但Julia是個例外。科技計算領域通常都會使用動態語言,例如Python、Matlab。雖然這些語言提供易於使用的語法,但不適用於大規模的科技計算。他們需要使用C/C ++庫執行CPU密集型任務,因此這就產生了著名的「兩種語言」的問題,因為他們需要粘合代碼來綁定兩種語言。由於編寫的代碼需要在兩種語言之間來回切換,因此總是會損失部分性能。
為了解決這個問題,麻省理工學院的一隊研究人員計劃從頭開始創建一種新的語言,這種語言既可以利用現代硬體的優勢,而且還結合其他語言的優勢。於是,Julia誕生了。
Julia是一種動態的高級編程語言,提供一流的並發、並行和分布式計算支持。Julia的第一個穩定版本於2018年發布,並很快受到社區和行業的關注。Julia可用於科學計算、人工智慧和許多其他領域,而且還可以解決「兩種語言」的問題。
主要特徵:
流行度:
Julia在許多領域主要與Python競爭。由於Python是最流行的編程語言之一,因此Julia想晉升主流還需要幾年的時間。
雖然Julia非常新(只有一歲),但仍在TIOBE指數中排到第43名:
Google趨勢顯示,在過去的一年中,Julia的熱度在穩步增長:
但是考慮到Julia的功能集,以及NSF、DARPA、NASA、因特爾等公司的推動,相信Julia取得突破的進展只是時間的問題。
主要用途:
主要競爭對手:
原文鏈接:https://towardsdatascience.com/top-7-modern-programming-language-to-learn-now-156863bd1eec
本文為 CSDN 翻譯,轉載請註明來源出處。
【End】
Python
Matlab
科學計算
高性能計算
數據科學
可視化
與Rust一樣,Julia的主要特徵在於語言的設計。這種語言在不犧牲性能的情況下,將高性能和科學計算中現有編程語言的一些功能結合在一起。就目前的情況來看,Julia出色地完成了這項任務。
Julia是一種動態編程語言,支持類型系統但類型不是必須的。因此,Julia這種編程語言很容易學習,生產力很高。
Julia的核心是多調度編程範例。
Julia內部支持並發、並行和分布式計算。
Julia為I/O密集型任務提供非同步I/O。
Julia的運行速度非常快,可用於需要數百萬個線程的科學計算。
JavaScript
TypeScript
應用開發
UI開發
與Go一樣,Dart也非常注重開發人員的工作效率。由於Dart簡潔的語法,以及高效的生產力,受到開發人員的喜愛。
Dart還提供「強類型」和「面向對象」編程。
Dart是少數同時支持JIT編譯(運行時編譯)和AOT編譯(創建時編譯)的編程語言之一。因此,Dart可以針對JavaScript運行時(V8引擎),並且Dart可以編譯為快速的原生代碼(AOT編譯)。
跨平台原生應用程序開發平台Flutter選擇了Dart作為開發iOS和Android應用的編程語言。從那以後,Dart的流行度越來越高。
與Goog的Go編程語言一樣,Dart也具有出色的工具支持和龐大的Flutter生態系統。Flutter的日益普及也會推動Dart的採用率升高。
Objective-C
Rust
Go
iOS應用開發
系統編程
客戶端開發(通過WebAssembly)
Swift的殺手級功能之一是其語言設計。語言本身很簡單,語法簡潔,比Objective-C更高效。
Swift還提供了現代程序語言的功能:null安全。此外,它還提供了語法糖來避免「厄運金字塔」。
作為一種編譯語言,Swift和C++一樣快。
Swift支持LLVM編譯器工具鏈。因此,我們可以在伺服器端編程,甚至瀏覽器編程(使用WebAssembly)中使用Swift。
Swift提供了自動引用計數(ARC)支持,可抑制內存管理的不善。
JavaScript
Dart
Web UI開發
伺服器端開發
與Go或Kotlin同樣,TypeScript的主要特徵也是語言設計。TypeScript憑借其簡潔明快的代碼,成為了目前最優雅的編程語言之一。就開發人員的生產力而言,它與JVM或Go/Python上的Kotlin並駕齊驅。TypeScript是生產力最高的JavaScript超集。
TypeScript是JavaScript的強類型超集,特別適合大型項目,而且可以稱為「可擴展的JavaScript」。
單頁應用程序框架的「三巨頭」(Angular、React、Vue.js)為TypeScript提供了出色的支持。在Angular中,TypeScript是首選的編程語言。在React和Vue.js中,TypeScript越來越受歡迎。
最大的兩家技術巨頭:微軟和Google正在合作開發由活躍的開源社區支持的TypeScript。因此,TypeScript擁有最好的工具支持。
由於TypeScript是JavaScript的超集,因此凡是可以運行JavaScript的任何地方都可以運行TypeScript,包括瀏覽器、伺服器、移動設備、物聯網設備和雲。
Java
Scala
Python
Go
D. c++primer第4版與最新版的區別
根據我們搜索的信息,C++ Primer第4版與最新版的主要區別是:最新版增加了容器和演算法的知識;支持ISO C++11標準的特性,如變數聲明、動態內存管理類等;應用示例有所更新;部分章節內容有所修正等