<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          總結(jié)Python的幾點(diǎn)語言特性

          共 3934字,需瀏覽 8分鐘

           ·

          2021-04-30 13:05


          Python語言簡潔,優(yōu)雅,擴(kuò)展性強(qiáng)...... 這些特點(diǎn)常被Python程序員掛在嘴邊,確實(shí)也都是Python的特點(diǎn)。


          要討論語言的特點(diǎn)或特性,可以得到很多不同的結(jié)論,有針對語言整體而言的特性,也有針對某一個(gè)應(yīng)用領(lǐng)域的特性。本文只從語言設(shè)計(jì)方面(其他的不討論),總結(jié)Python的幾點(diǎn)語言特性。


          一、解釋型語言


          高級語言不能直接被計(jì)算機(jī)理解(計(jì)算機(jī)只能理解機(jī)器語言,二進(jìn)制代碼),要先將高級語言翻譯成機(jī)器語言,計(jì)算機(jī)才能執(zhí)行高級語言編寫的代碼。根據(jù)翻譯工具(解釋器或編譯器)的不同,高級語言分為解釋型語言和編譯型語言。

          • 解釋型語言:在代碼運(yùn)行時(shí),解釋器將代碼逐行翻譯成機(jī)器語言,代碼可以按行運(yùn)行。


          • 編譯型語言:先使用編譯器對代碼編譯,生成可執(zhí)行文件(如.exe文件),然后運(yùn)行可執(zhí)行文件。


          Python是解釋型語言,所以Python代碼不需要編譯,編寫完就可以直接運(yùn)行。


          解釋型語言相當(dāng)于實(shí)時(shí)翻譯,省去了編譯這個(gè)步驟。每運(yùn)行一次代碼,解釋器都要重新翻譯代碼,而解釋器把代碼翻譯成機(jī)器語言是要花時(shí)間的,所以,解釋型語言的運(yùn)行效率比編譯型語言低很多,速度慢,性能上處于劣勢。


          編譯型語言相當(dāng)于提前翻譯,運(yùn)行時(shí)直接運(yùn)行可執(zhí)行文件。編譯只需要一次,后面不管運(yùn)行多少次,都可以直接運(yùn)行可執(zhí)行文件,所以,編譯型語言的運(yùn)行效率比解釋型語言高很多,速度快,性能上有優(yōu)勢。


          因?yàn)樾阅苌系牧觿荩忉屝驼Z言不適合開發(fā)操作系統(tǒng)、大型應(yīng)用程序、數(shù)據(jù)庫系統(tǒng)等對性能要求高的程序,這些程序基本都是使用編譯型語言。當(dāng)然,解釋型語言可以通過對解釋器進(jìn)行優(yōu)化來提高運(yùn)行效率,同時(shí),隨著計(jì)算機(jī)硬件的性能提升,也可以彌補(bǔ)解釋型語言在性能上的不足,使性能差距對生產(chǎn)的影響降低,甚至消除。


          另一方面,因?yàn)樵谶\(yùn)行時(shí)才解釋代碼,解釋型語言的跨平臺性更好,代碼移植到不同的操作系統(tǒng)中后可以直接運(yùn)行。而因?yàn)椴煌僮飨到y(tǒng)識別的機(jī)器語言有差異,編譯型語言移植到不同的操作系統(tǒng)后,需要重新編譯后才能運(yùn)行,跨平臺性不如解釋型語言。


          說回Python,Python程序運(yùn)行后也可以將運(yùn)行的機(jī)器語言保存到以.pyc為擴(kuò)展名的文件中,下次運(yùn)行時(shí),如果代碼沒有變化,解釋器可以直接運(yùn)行.pyc文件。這算是Python對運(yùn)行效率的一種優(yōu)化,所以,也有人說Python是一種解釋型和編譯型相結(jié)合的語言。


          二、動態(tài)類型語言


          在不同的高級語言中,都有很多數(shù)據(jù)類型,這些數(shù)據(jù)類型的定義大同小異。在代碼中,數(shù)據(jù)一般保存在變量之中(被變量引用),通常會先定義變量,然后將數(shù)據(jù)賦值給變量。根據(jù)定義變量前是否需要提前聲明變量的數(shù)據(jù)類型,高級語言分為動態(tài)類型語言和靜態(tài)類型語言。


          • 動態(tài)類型語言:定義變量前,不需要聲明變量的數(shù)據(jù)類型,執(zhí)行代碼的時(shí)候由解釋器動態(tài)確認(rèn)變量的數(shù)據(jù)類型。


          • 靜態(tài)類型語言:定義變量前,必須先聲明變量的數(shù)據(jù)類型,給變量賦值時(shí)數(shù)據(jù)類型必須匹配。


          Python是動態(tài)類型語言,所以Python代碼中不需要提前聲明變量的數(shù)據(jù)類型,運(yùn)行代碼的時(shí)候再動態(tài)確認(rèn)數(shù)據(jù)類型。


          var = 100
          print(var, type(var))
          var = '!@#$%'
          print(var, type(var))


          100 <class 'int'>
          !@#$% <class 'str'>


          看上面的例子,定義變量var的時(shí)候賦值為100,運(yùn)行時(shí)的數(shù)據(jù)類型為int(整數(shù)),再將它賦值為字符!@#$%,運(yùn)行時(shí)的數(shù)據(jù)類型為str(字符串)。不僅變量的數(shù)據(jù)類型不需要提前聲明,在運(yùn)行過程中,數(shù)據(jù)類型還會根據(jù)不同的引用而改變。


          動態(tài)類型語言不需要提前聲明變量的數(shù)據(jù)類型,使代碼更加簡潔,可以少寫很多代碼,同時(shí),也給了程序員很大的自由度,寫代碼時(shí)多了很多自由發(fā)揮的空間。但是,太自由了也可能會有弊端,如果一些變量定義得不規(guī)范(如多處出現(xiàn)同名變量名),會使代碼的可讀性降低,增加定位問題的難度,甚至帶來一些不易察覺的BUG。


          靜態(tài)類型語言的每個(gè)變量都先聲明了數(shù)據(jù)類型,每個(gè)變量都必須先聲明才能使用,一旦聲明后數(shù)據(jù)類型不能修改,這充分保證了同一個(gè)變量名在上下文中的一致性,即使代碼量很大的情況下也不會出現(xiàn)混亂。只是,會使代碼量變多,實(shí)現(xiàn)相同的功能,代碼量會增加很多。


          三、強(qiáng)類型語言


          在高級語言中,將不同類型的變量進(jìn)行運(yùn)算時(shí),有些語言可以自動對數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,使不同數(shù)據(jù)類型的變量能兼容,能返回運(yùn)算結(jié)果,程序不報(bào)錯,另一些語言必須先將數(shù)據(jù)類型轉(zhuǎn)換成一致,才能進(jìn)行運(yùn)算,否則程序會報(bào)錯。所以高級語言可以分為強(qiáng)類型語言和弱類型語言。


          • 強(qiáng)類型語言:不同類型的數(shù)據(jù)進(jìn)行運(yùn)算前,必須先將數(shù)據(jù)類型轉(zhuǎn)換成一致。


          • 弱類型語言:不同類型的數(shù)據(jù)進(jìn)行運(yùn)算,會自動進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。


          Python是強(qiáng)類型語言,所以Python代碼中不同類型的數(shù)據(jù)運(yùn)算會報(bào)錯。


          強(qiáng)類型和弱類型是體現(xiàn)在數(shù)據(jù)運(yùn)算時(shí)不同類型的數(shù)據(jù)能否兼容,而動態(tài)類型和靜態(tài)類型是體現(xiàn)在定義變量時(shí)是否需要先聲明數(shù)據(jù)類型,所以這是兩個(gè)維度的概念,不能混淆了。


          a = 100
          print(a, type(a))
          b = '100'
          print(b, type(b))
          print(a + b)


          100 <class 'int'>
          100 <class 'str'>
          TypeError: unsupported operand type(s) for +: 'int' and 'str'


          print(str(a) + b, type(str(a) + b))
          print(a + int(b), type(a + int(b)))


          100100 <class 'str'>
          200 <class 'int'>


          看上面的例子,變量a是int(整型),變量b是str(字符串),將兩者相加時(shí),會報(bào)錯TypeError:不支持整型與字符串相加。當(dāng)將a和b的數(shù)據(jù)類型轉(zhuǎn)換成一致后,可以正常運(yùn)算。


          強(qiáng)類型語言不支持不同類型的數(shù)據(jù)直接進(jìn)行運(yùn)算,必須先對數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,這可以幫助程序員在變量運(yùn)算前確認(rèn)和厘清數(shù)據(jù)的類型,避免了不同數(shù)據(jù)類型進(jìn)行運(yùn)算的混亂。但是,不同類型的數(shù)據(jù)進(jìn)行運(yùn)算前,要先進(jìn)行類型轉(zhuǎn)化,多了一個(gè)步驟,也會降低運(yùn)行效率。


          弱類型語言支持不同類型的數(shù)據(jù)直接進(jìn)行運(yùn)算,在不同類型的數(shù)據(jù)進(jìn)行運(yùn)算時(shí)會自動進(jìn)行轉(zhuǎn)換,省了自動轉(zhuǎn)換的步驟。但是,兩個(gè)不同類型的數(shù)據(jù)直接運(yùn)算,可能會使程序員錯誤判斷結(jié)果的數(shù)據(jù)類型,甚至可能會帶來BUG。


          在動態(tài)類型和靜態(tài)類型方面,Python給程序員留了足夠的自由,但在強(qiáng)類型和弱類型方面,Python又對數(shù)據(jù)的運(yùn)算進(jìn)行了限制。可以猜想,Guido這么設(shè)計(jì)是經(jīng)過深思熟慮的,在定義變量的時(shí)候給了足夠自由,也提升了代碼的簡潔性,但在進(jìn)行數(shù)據(jù)運(yùn)算時(shí)進(jìn)行了限制,加了一道保險(xiǎn),避免太過自由帶來一些不必要的問題。


          四、面向?qū)ο笳Z言


          在編程時(shí),一個(gè)功能可以分成多個(gè)步驟來逐步實(shí)現(xiàn),基本所有語言都支持按步驟實(shí)現(xiàn)功能和抽取可重用的函數(shù),而面向?qū)ο笳Z言還支持由數(shù)據(jù)和功能組合而成的對象來實(shí)現(xiàn)功能。所以,根據(jù)是否支持面向?qū)ο缶幊蹋呒壵Z言可以分為面向?qū)ο笳Z言和面向過程語言。


          • 面向?qū)ο笳Z言:以對象作為代碼的基礎(chǔ)結(jié)構(gòu),通過對象的屬性和方法來實(shí)現(xiàn)業(yè)務(wù)功能。


          • 面向過程語言:代碼由過程代碼和抽取的功能函數(shù)構(gòu)成,函數(shù)可以重復(fù)使用。


          Python是面向?qū)ο笳Z言,Python中一切皆對象,可以將數(shù)據(jù)和功能封裝到對象中,從對象的角度去處理問題和實(shí)現(xiàn)功能。當(dāng)然,用Python也可以實(shí)現(xiàn)面向過程編程。


          面向?qū)ο笳Z言的設(shè)計(jì)聚焦于對象之上,將數(shù)據(jù)作為屬性封裝在對象內(nèi),將功能作為方法封裝在對象內(nèi),不管是使用屬性還是方法,都可以通過對象調(diào)用。面向?qū)ο笳Z言具有封裝、繼承和多肽三大特性,可以使程序設(shè)計(jì)得更加清晰,由此也產(chǎn)生了很多設(shè)計(jì)模式。在復(fù)雜的業(yè)務(wù)中,不同的對象執(zhí)行不同的功能,降低了代碼的耦合度,有利于提高開發(fā)效率,降低重構(gòu)代碼的難度。


          面向過程語言的代碼按照業(yè)務(wù)邏輯自上而下,逐步實(shí)現(xiàn)功能,如果有可以重復(fù)使用的功能,可以抽取成函數(shù)。面向過程編程沒有面向?qū)ο缶幊坛橄螅愿菀桌斫猓a與業(yè)務(wù)邏輯環(huán)環(huán)相扣,一步一步地實(shí)現(xiàn),這就使得代碼的耦合度很高。即使將重復(fù)代碼抽取成函數(shù),還是很難避免代碼的冗余,代碼的設(shè)計(jì)模式也比較少,設(shè)計(jì)思路沒有面向?qū)ο蟮那逦貥?gòu)代碼也更難。


          關(guān)于面向?qū)ο笳Z言和面向過程語言的討論內(nèi)容很多,對于業(yè)務(wù)邏輯比較復(fù)雜的程序,比較統(tǒng)一的看法是面向?qū)ο髢?yōu)于面向過程,而對于業(yè)務(wù)邏輯簡單的程序,面向?qū)ο蠛兔嫦蜻^程都可以。


          上面總結(jié)了幾點(diǎn)Python的語言特性,如果有一些編程經(jīng)驗(yàn),大家都會有自己的理解,每個(gè)人的理解可能會存在一些小差異,所以沒必要在意是否權(quán)威,自己思考最重要。


          如果對Python編程感興趣,歡迎點(diǎn)擊關(guān)注公眾號“Python碎片”,號主會不定期分享Python相關(guān)知識。


          瀏覽 38
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产视频黄色精频大全 | 操逼视频免费网站 | 先锋影音av成人资源站 | 色五月综合激情 | 日逼123 |