了解python

      網(wǎng)友投稿 794 2025-04-02

      1.Python語言特點(diǎn)

      1)Python 程序簡潔、易讀:

      高級數(shù)據(jù)類型允許在單一語句中表述復(fù)雜操作;

      使用縮進(jìn),而不是括號實(shí)現(xiàn)代碼塊分組;

      無需預(yù)聲明變量或參數(shù)。

      2)Python 支持把程序分割為模塊,以便在其他 Python 程序中復(fù)用。

      3)Python 是一種解釋型語言,不需要編譯和鏈接,可以節(jié)省大量開發(fā)時間。它的解釋器實(shí)現(xiàn)了交互式操作,輕而易舉地就能試用各種語言功能,編寫臨時程序,或在自底向上的程序開發(fā)中測試功能。

      2.python解釋器

      python xx.py python -c command [arg] ... python -m module [arg] ... #回車后解釋器讀取命令行參數(shù),把腳本名與其他參數(shù)轉(zhuǎn)化為字符串列表存到sys模塊的argv的變量里, #解釋器不直接處理 -c command 或 -m module 之后的選項,而是直接留在 sys.argv 中由命令或模塊來處理。

      【執(zhí)行原理】

      執(zhí)行 python XX.py 后,將會啟動 Python 的解釋器,python解釋器的編譯器會將.py源文件編譯(解釋)成字節(jié)碼生成PyCodeObject字節(jié)碼對象存放在內(nèi)存中。python解釋器的虛擬機(jī)將執(zhí)行內(nèi)存中的字節(jié)碼對象

      轉(zhuǎn)化為機(jī)器語言,虛擬機(jī)與操作系統(tǒng)交互,使機(jī)器語言在機(jī)器硬件上運(yùn)行。運(yùn)行結(jié)束后python解釋器則將PyCodeObject寫回到pyc文件中。當(dāng)python程序第二次運(yùn)行時,首先程序會在硬盤中尋找pyc文件,如果找到,則直接載入,否則就重復(fù)上面的過程。

      所以我們應(yīng)該這樣來定位PyCodeObject和pyc文件,我們說pyc文件其實(shí)是PyCodeObject的一種持久化保存方式。

      pyc文件,文件中包含python的magic number(來說明編譯時使用的python版本號)、源文件的mtime(使pyc和py文件保持同步)、編譯出的code對象。

      主流python解釋器:

      cpython:C語言開發(fā)

      IPython:基于CPython之上的一個交互式解釋器

      PyPy:它的目標(biāo)是執(zhí)行速度。PyPy采用JIT技術(shù),對Python代碼進(jìn)行動態(tài)編譯(注意不是解釋),所以可以顯著提高Python代碼的執(zhí)行速度。

      Jython:運(yùn)行在Java平臺上的Python解釋器,可以直接把Python代碼編譯成Java字節(jié)碼執(zhí)行。

      【小結(jié)】

      一個python的程序會有若干代碼塊組成,例如一個Python文件是一個代碼塊,一個類,一個函數(shù),甚至一個語句都是一個代碼塊,一個代碼塊會對應(yīng)一個運(yùn)行的上下文環(huán)境以及一系列的字節(jié)碼指令。

      而Python的字節(jié)碼是一種類似匯編指令的中間語言,但是一個字節(jié)碼指令并不是對應(yīng)一個機(jī)器指 令(二進(jìn)制指令),而是對應(yīng)一段C代碼,而不同的指令的性能不同,所以不能單獨(dú)通過指令數(shù)量來判斷代碼的性能,而是要通過查看調(diào)用比較頻繁的指令的代碼來 確認(rèn)一段程序的性能。

      a,b=b,a #通過上述就很容易理解python一行代碼就能交換兩個值:包含了一個代碼塊,其中對應(yīng)的是一段字節(jié)碼指令序列 #實(shí)現(xiàn)的主要原因就是其中的 ROT_TWO指令

      dis的作用

      dis模塊主要是用來分析字節(jié)碼的一個內(nèi)置模塊,經(jīng)常會用到的方法是dis.dis([bytesource]),參數(shù)為一個代碼塊,可以得到這個代碼塊對應(yīng)的字節(jié)碼指令序列。

      dis.dis(a,b=b.a)輸出結(jié)果:

      在python3.4的源碼中查閱ceval.c文件可以看到ROT_TWO:

      TARGET(ROT_TWO) { PyObject *top = TOP(); PyObject *second = SECOND(); SET_TOP(second); SET_SECOND(top); FAST_DISPATCH(); } TARGET(ROT_THREE) { PyObject *top = TOP(); PyObject *third = THIRD(); SET_SECOND(third); FAST_DISPATCH(); }

      解釋器的運(yùn)行環(huán)境:

      #!/usr/bin/env python3 # -*- coding: cp1252 -*-

      習(xí)慣注明python環(huán)境與編碼方式(下一章介紹編碼與解釋器的關(guān)系)

      3.詞法分析

      python程序由解析器讀取,輸入解析器的是詞法分析生成的形符流:

      Python 將讀取的程序文本轉(zhuǎn)為 Unicode 代碼點(diǎn);編碼聲明用于指定源文件的編碼,默認(rèn)為 UTF-8,詳見?PEP 3120。源文件不能解碼時,觸發(fā)?SyntaxError。

      編碼聲明

      Python 腳本第一或第二行的注釋匹配正則表達(dá)式?coding[=:]\s*([-\w.]+)?時,該注釋會被當(dāng)作編碼聲明;這個表達(dá)式的第一組指定了源碼文件的編碼。編碼聲明必須獨(dú)占一行,在第二行時,則第一行必須也是注釋。編碼表達(dá)式的形式如下:

      # -*- coding: -*-

      這也是 GNU Emacs 認(rèn)可的形式,此外,還支持如下形式:

      # vim:fileencoding=

      這是 Bram Moolenaar 的 VIM 認(rèn)可的形式。

      沒有編碼聲明時,默認(rèn)編碼為 UTF-8。此外,如果文件的首字節(jié)為 UTF-8 字節(jié)順序標(biāo)志(b'\xef\xbb\xbf'),文件編碼也聲明為 UTF-8(這是 Microsoft 的?notepad?等軟件支持的形式)。

      聲明的編碼名稱必須是 Python 能識別的。語義字符串、注釋和標(biāo)識符等詞法分析都使用此編碼。

      行結(jié)構(gòu)

      Python程序可以拆分為多個邏輯行,NEWLINE 形符表示結(jié)束邏輯行。根據(jù)顯式或隱式?行拼接?規(guī)則,一個或多個?物理行?可組成邏輯行。物理行是一序列字符,由行尾序列終止,輸入結(jié)束也可以用作最終物理行的隱式終止符。嵌入 Python 時,傳入 Python API 的源碼字符串應(yīng)使用 C 標(biāo)準(zhǔn)慣例換行符(\n,代表 ASCII 字符 LF, 行終止符)。

      顯式拼接行

      兩個及兩個以上的物理行可用反斜杠(\)拼接為一個邏輯行,規(guī)則如下:以不在字符串或注釋內(nèi)的反斜杠結(jié)尾時,物理行將與下一行拼接成一個邏輯行,并刪除反斜杠及其后的換行符。例如:

      if 1900 < year < 2100 and 1 <= month <= 12 \ and 1 <= day <= 31 and 0 <= hour < 24 \ and 0 <= minute < 60 and 0 <= second < 60: # Looks like a valid date return 1

      以反斜杠結(jié)尾的行,不能加注釋;反斜杠也不能拼接注釋。除字符串字面值外,反斜杠不能拼接形符(如,除字符串字面值外,不能用反斜杠把形符切分至兩個物理行)。反斜杠只能在代碼的字符串字面值里,在其他任何位置都是非法的。

      了解python

      隱式拼接行

      圓括號、方括號、花括號內(nèi)的表達(dá)式可以分成多個物理行,不必使用反斜杠。例如:

      month_names = ['Januari', 'Februari', 'Maart', # These are the 'April', 'Mei', 'Juni', # Dutch names 'Juli', 'Augustus', 'September', # for the months 'Oktober', 'November', 'December'] # of the year

      隱式行拼接可含注釋;后續(xù)行的縮進(jìn)并不重要;還支持空的后續(xù)行。隱式拼接行之間沒有 NEWLINE 形符。三引號字符串支持隱式拼接行(見下文),但不支持注釋。

      空白行

      只包含空格符、制表符、換頁符、注釋的邏輯行會被忽略(即不生成 NEWLINE 形符)。交互模式輸入語句時,空白行的處理方式可能因讀取 - 求值 - 打印循環(huán)(REPL)的具體實(shí)現(xiàn)方式而不同。標(biāo)準(zhǔn)交互模式解釋器中,完全空白的邏輯行(即連空格或注釋都沒有)將結(jié)束多行復(fù)合語句。

      縮進(jìn)

      邏輯行開頭的空白符(空格符和制表符)用于計算該行的縮進(jìn)層級,決定語句組塊。

      制表符(從左至右)被替換為一至八個空格,縮進(jìn)空格的總數(shù)是八的倍數(shù)(與 Unix 的規(guī)則保持一致)。首個非空字符前的空格數(shù)決定了該行的縮進(jìn)層次。縮進(jìn)不能用反斜杠進(jìn)行多行拼接;首個反斜杠之前的空白符決定了縮進(jìn)的層次。

      源文件混用制表符和空格符縮進(jìn)時,因空格數(shù)量與制表符相關(guān),由此產(chǎn)生的不一致將導(dǎo)致不能正常識別縮進(jìn)層次,從而觸發(fā)?TabError。

      連續(xù)行的縮進(jìn)層級以堆棧形式生成 INDENT 和 DEDENT 形符,說明如下。

      讀取文件第一行前,先向棧推入一個零值,該零值不會被移除。推入棧的層級值從底至頂持續(xù)增加。每個邏輯行開頭的行縮進(jìn)層級將與棧頂行比較。如果相等,則不做處理。如果新行層級較高,則會被推入棧頂,并生成一個 INDENT 形符。如果新行層級較低,則?應(yīng)當(dāng)?是棧中的層級數(shù)值之一;棧中高于該層級的所有數(shù)值都將被移除,每移除一級數(shù)值生成一個 DEDENT 形符。文件末尾,棧中剩余的每個大于零的數(shù)值生成一個 DEDENT 形符。

      關(guān)鍵字

      False await else import pass None break except in raise True class finally is return and continue for lambda try as def from nonlocal while assert del global not with async elif if or yield

      內(nèi)置函數(shù)

      abs() divmod() input() open() staticmethod() all() enumerate() int() ord() str() any() eval() isinstance() pow() sum() basestring() execfile() issubclass() print() super() bin() file() iter() property() tuple() bool() filter() len() range() type() bytearray() float() list() raw_input() unichr() callable() format() locals() reduce() unicode() chr() frozenset() long() reload() vars() classmethod()getattr() map() repr() xrange() cmp() globals() max() reverse() zip() compile() hasattr() memoryview() round() __import__() complex() hash() min() set() delattr() help() next() setattr() dict() hex() object() slice() dir() id() oct() sorted() exec 內(nèi)置表達(dá)式

      Python

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:excel表格如何把前面幾行鎖住(怎么把excel前幾行鎖定)
      下一篇:excel利用VBA判斷工作表是否存在
      相關(guān)文章
      亚洲视频一区在线观看| 亚洲?v无码国产在丝袜线观看| 亚洲国产精品人人做人人爱| 亚洲福利在线观看| 国产av无码专区亚洲av毛片搜 | 亚洲伊人精品综合在合线| 亚洲女同成人AⅤ人片在线观看| 亚洲欧洲日产国产综合网| 亚洲午夜无码AV毛片久久| 亚洲精品无码99在线观看| 亚洲国产精品狼友中文久久久| 亚洲精品无码久久久久AV麻豆| 亚洲黄黄黄网站在线观看| 国产精品亚洲αv天堂无码| 亚洲精品亚洲人成在线| 亚洲黄色中文字幕| 亚洲欧洲国产视频| 亚洲AV无码不卡无码| 无码国产亚洲日韩国精品视频一区二区三区 | 亚洲人成图片网站| 亚洲人成影院在线| 亚洲精品在线不卡| 亚洲Av无码专区国产乱码DVD| 亚洲Av无码专区国产乱码DVD| 伊人久久综在合线亚洲2019| 国产午夜亚洲精品午夜鲁丝片| 亚洲高清一区二区三区电影| 天天综合亚洲色在线精品| 亚洲国产成人久久笫一页| 亚洲中久无码永久在线观看同| 国产亚洲视频在线| 国产成人亚洲精品影院| 激情97综合亚洲色婷婷五| 久久精品国产亚洲| 亚洲国产另类久久久精品小说| JLZZJLZZ亚洲乱熟无码| 久久亚洲国产午夜精品理论片| 久久亚洲欧洲国产综合| 亚洲av中文无码乱人伦在线咪咕| 久久久亚洲欧洲日产国码aⅴ| 亚洲人成影院午夜网站|