Python是一種編程語(yǔ)言,它使用對(duì)象,類和清晰的語(yǔ)法語(yǔ)言來(lái)幫助您創(chuàng)建,編輯和生成自己的應(yīng)用程序。無(wú)論你是編程新手還是經(jīng)驗(yàn)豐富的開發(fā)人員,都可以輕松學(xué)習(xí)和使用Python。有需要的小伙伴歡迎來(lái)西西下載Python2020最新版本。
軟件特征:
以交互方式編寫 Python 代碼
Python 的解釋器允許您編寫和執(zhí)行代碼,以及定義變量。突出顯示的是語(yǔ)法語(yǔ)言的簡(jiǎn)單性,旨在幫助您以交互方式編寫代碼,從而顯著提高可讀性并縮短調(diào)試時(shí)間。
輕松創(chuàng)建,測(cè)試和編輯代碼
用 Python 編寫的代碼可以通過(guò)在解釋器中運(yùn)行來(lái)多次編輯和測(cè)試。與其他語(yǔ)言不同,它不會(huì)限制您在執(zhí)行環(huán)境之外編輯代碼,因此您只需使用解釋器進(jìn)行更改即可。
由于它是一種面向?qū)ο蟮木幊陶Z(yǔ)言,Python 使用數(shù)據(jù)結(jié)構(gòu)將信息存儲(chǔ)在主程序無(wú)法訪問的位置,可以使用專用函數(shù)檢索。
由于其語(yǔ)法清晰,任何計(jì)算機(jī)用戶都可以輕松理解 Python。如果您剛開始學(xué)習(xí)編程,開發(fā)人員的網(wǎng)站會(huì)為您提供多個(gè)教程和資源。
新功能說(shuō)明:
新功能
賦值表達(dá)式
有一種新語(yǔ)法:=可將值賦給變量,作為較大表達(dá)式的一部分。由于它與海象的眼睛和象牙很像,因此被親切地稱為“海象操作員” 。
在此示例中,賦值表達(dá)式有助于避免調(diào)用 len()兩次:
if (n := len(a)) > 10: print(f"List is too long ({n} elements, expected <= 10)")
在正則表達(dá)式匹配期間會(huì)產(chǎn)生類似的好處,其中需要兩次匹配對(duì)象,一次是測(cè)試是否發(fā)生匹配,另一次是提取子組:
discount = 0.0if (mo := re.search(r'(\d+)% discount', advertisement)): discount = float(mo.group(1)) / 100.0
該運(yùn)算符對(duì)while循環(huán)也很有用,該循環(huán)計(jì)算一個(gè)值以測(cè)試循環(huán)終止,然后在循環(huán)體中再次需要相同的值:
# Loop over fixed length blockswhile (block := f.read(256)) != '': process(block)
另一個(gè)具有啟發(fā)性的用例出現(xiàn)在列表理解中,其中表達(dá)式主體中還需要在過(guò)濾條件下計(jì)算出的值:
[clean_name.title() for name in names if (clean_name := normalize('NFC', name)) in allowed_names]
嘗試限制使用海象運(yùn)算符來(lái)清理可降低復(fù)雜性并提高可讀性的案例。
看到 有關(guān)完整說(shuō)明,請(qǐng)參見PEP 572。
(由Emily Morehouse在bpo-35224中貢獻(xiàn)。)
僅位置參數(shù)
有一個(gè)新的函數(shù)參數(shù)語(yǔ)法,/以指示某些函數(shù)參數(shù)必須在位置上指定,并且不能用作關(guān)鍵字參數(shù)。這help()與用Larry Hastings的Argument Clinic工具注釋的C函數(shù)所顯示的符號(hào)相同。
在以下示例中,參數(shù)a和b是僅位置的,而c或d可以是位置或關(guān)鍵字,而e或f必須是關(guān)鍵字:
def f(a, b, /, c, d, *, e, f): print(a, b, c, d, e, f)
以下是有效的呼叫:
f(10, 20, 30, d=40, e=50, f=60)
但是,這些是無(wú)效的調(diào)用:
f(10, b=20, c=30, d=40, e=50, f=60) # b cannot be a keyword argumentf(10, 20, 30, 40, 50, f=60) # e must be a keyword argument
這種表示法的一個(gè)用例是,它允許純Python函數(shù)完全模擬現(xiàn)有C編碼函數(shù)的行為。例如,內(nèi)置divmod()函數(shù)不接受關(guān)鍵字參數(shù):
def divmod(a, b, /): "Emulate the built in divmod() function" return (a // b, a % b)
另一個(gè)用例是在參數(shù)名稱無(wú)用時(shí)排除關(guān)鍵字參數(shù)。例如,內(nèi)置len()函數(shù)具有簽名。這避免了尷尬的調(diào)用,例如:len(obj, /)
len(obj='hello') # The "obj" keyword argument impairs readability
將參數(shù)標(biāo)記為僅位置的另一個(gè)好處是,它允許將來(lái)更改參數(shù)名稱而不會(huì)破壞客戶端代碼。例如,在statistics模塊中,將來(lái)可能會(huì)更改參數(shù)名稱dist?梢酝ㄟ^(guò)以下功能規(guī)范來(lái)實(shí)現(xiàn):
def quantiles(dist, /, *, n=4, method='exclusive') ...
由于左側(cè)的參數(shù)/未作為可能的關(guān)鍵字公開,因此參數(shù)名稱仍可用于**kwargs:
>>>
>>> def f(a, b, /, **kwargs):... print(a, b, kwargs)...>>> f(10, 20, a=1, b=2, c=3) # a and b are used in two ways10 20 {'a': 1, 'b': 2, 'c': 3}
這大大簡(jiǎn)化了需要接受任意關(guān)鍵字參數(shù)的函數(shù)和方法的實(shí)現(xiàn)。例如,以下是該collections模塊中代碼的摘錄:
class Counter(dict): def __init__(self, iterable=None, /, **kwds): # Note "iterable" is a possible keyword argument
看到 有關(guān)完整說(shuō)明,請(qǐng)參見PEP 570。
(由Pablo Galindo在bpo-36540中貢獻(xiàn)。)
編譯后的字節(jié)碼文件的并行文件系統(tǒng)緩存
新的 PYTHONPYCACHEPREFIX設(shè)置(也可作為 )將隱式字節(jié)碼緩存配置為使用單獨(dú)的并行文件系統(tǒng)樹,而不是每個(gè)源目錄中的默認(rèn)子目錄。-X pycache_prefix__pycache__
緩存的位置報(bào)告在sys.pycache_prefix (None指示__pycache__ 子目錄中的默認(rèn)位置)。
(由Carl Meyer在bpo-33499中貢獻(xiàn)。)
調(diào)試版本使用與發(fā)布版本相同的
不管是在發(fā)布模式還是調(diào)試模式下構(gòu)建,Python現(xiàn)在都使用相同的ABI。在Unix上,當(dāng)Python以調(diào)試模式構(gòu)建時(shí),現(xiàn)在可以加載以發(fā)布模式構(gòu)建的C擴(kuò)展和使用穩(wěn)定ABI構(gòu)建的C擴(kuò)展。
現(xiàn)在,發(fā)行版本和調(diào)試版本與ABI兼容:定義 Py_DEBUG宏不再意味著該P(yáng)y_TRACE_REFS宏,它引入了唯一的ABI不兼容性。該P(yáng)y_TRACE_REFS宏,它增加了sys.getobjects()功能和PYTHONDUMPREFS 環(huán)境變量,可以使用新的 構(gòu)建選項(xiàng)進(jìn)行設(shè)置。(由Victor Stinner在bpo-36465中貢獻(xiàn)。)./configure --with-trace-refs
在Unix上,除了Android和Cygwin之外,C擴(kuò)展不再鏈接到libpython。現(xiàn)在,靜態(tài)鏈接的Python可以加載使用共享庫(kù)Python構(gòu)建的C擴(kuò)展。(由Victor Stinner在bpo-21536中貢獻(xiàn)。)
在Unix上,當(dāng)Python以調(diào)試模式構(gòu)建時(shí),import現(xiàn)在還將尋找以發(fā)布模式編譯的C擴(kuò)展以及使用穩(wěn)定的ABI編譯的C擴(kuò)展。(由Victor Stinner在bpo-36722中貢獻(xiàn)。)
要將Python嵌入到應(yīng)用程序中,--embed必須傳遞一個(gè)新選項(xiàng) 以獲取(將應(yīng)用程序鏈接到libpython)。要同時(shí)支持3.8和更早版本的3.8,請(qǐng)首先嘗試使用該命令,如果先前的命令失敗,則回退到(無(wú))。python3-config --libs --embed-lpython3.8python3-config --libs --embedpython3-config --libs--embed
添加pkg-config python-3.8-embed模塊以將Python嵌入到應(yīng)用程序中:includes 。要同時(shí)支持3.8和更早版本的3.8,請(qǐng)首先嘗試使用該命令,如果先前的命令失敗,則回退到(無(wú))(用Python版本替換)。pkg-config python-3.8-embed --libs-lpython3.8pkg-config python-X.Y-embed --libspkg-config python-X.Y --libs--embedX.Y
另一方面,不再包含 。C擴(kuò)展不得鏈接到libpython(Android和Cygwin除外,它們的情況由腳本處理);此更改是有意向后不兼容的。(由Victor Stinner在bpo-36721中貢獻(xiàn)。)pkg-config python3.8 --libs-lpython3.8
f字符串支持=自記錄表達(dá)式和調(diào)試
=在f-string中添加了一個(gè)說(shuō)明符。f字符串(例如) f'{expr=}'將擴(kuò)展為表達(dá)式的文本,等號(hào),然后擴(kuò)展為求值表達(dá)式的表示形式。例如:
>>>
>>> user = 'eric_idle'>>> member_since = date(1975, 7, 31)>>> f'{user=} {member_since=}'"user='eric_idle' member_since=datetime.date(1975, 7, 31)"
常用的f字符串格式說(shuō)明符允許對(duì)表達(dá)式結(jié)果的顯示方式進(jìn)行更多控制:
>>>
>>> delta = date.today() - member_since>>> f'{user=!s} {delta.days=:,d}''user=eric_idle delta.days=16,075'
的=說(shuō)明符將顯示整個(gè)表達(dá)式所以可以示出的計(jì)算:
>>>
>>> print(f'{theta=} {cos(radians(theta))=:.3f}')theta=30 cos(radians(theta))=0.866
(由Eric V. Smith和Larry Hastings在bpo-36817中貢獻(xiàn)。)
PEP 578:Python運(yùn)行時(shí)審核掛鉤
PEP添加了“審核掛鉤”和“已驗(yàn)證的打開掛鉤”。兩者都可以從Python和本機(jī)代碼獲得,從而允許使用純Python代碼編寫的應(yīng)用程序和框架利用額外的通知,同時(shí)還允許嵌入程序或系統(tǒng)管理員在始終啟用審核的情況下部署Python版本。
看到 PEP 578詳細(xì)信息。
PEP 587:Python初始化配置
的 PEP 587添加了新的C API以配置Python初始化,從而提供了對(duì)整個(gè)配置的更好控制和更好的錯(cuò)誤報(bào)告。
常見問題答疑:
如何在Windows下運(yùn)行Python程序?
這不一定是一個(gè)簡(jiǎn)單的問題。如果您已經(jīng)熟悉從Windows命令行運(yùn)行程序,那么一切似乎都是顯而易見的。否則,您可能需要更多指導(dǎo)。
除非使用某種集成開發(fā)環(huán)境,否則最終將 在各種稱為“ DOS窗口”或“命令提示窗口”的窗口中鍵入 Windows命令。通常,您可以通過(guò)搜索從搜索欄創(chuàng)建這樣的窗口cmd。您應(yīng)該能夠識(shí)別出何時(shí)啟動(dòng)了這樣的窗口,因?yàn)槟鷮⒖吹絎indows“命令提示符”,通常如下所示:
C:\>
該字母可能有所不同,并且后面可能還有其他內(nèi)容,因此您可能會(huì)很容易看到以下內(nèi)容:
D:\YourName\Projects\Python>
取決于計(jì)算機(jī)的設(shè)置方式以及您最近對(duì)計(jì)算機(jī)所做的其他操作。一旦啟動(dòng)了這樣的窗口,就可以很好地運(yùn)行Python程序。
您需要意識(shí)到Python腳本必須由另一個(gè)稱為Python 解釋器的程序處理。解釋器讀取您的腳本,將其編譯為字節(jié)碼,然后執(zhí)行字節(jié)碼以運(yùn)行您的程序。那么,如何安排解釋器處理Python?
首先,您需要確保命令窗口將單詞“ py”識(shí)別為啟動(dòng)解釋器的指令。如果您打開了命令窗口,則應(yīng)嘗試輸入命令py并按回車鍵:
C:\Users\YourName> py
然后,您應(yīng)該看到類似以下內(nèi)容:
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32Type "help", "copyright", "credits" or "license" for more information.>>>
您已經(jīng)以“交互模式”啟動(dòng)了解釋器。這意味著您可以交互輸入Python語(yǔ)句或表達(dá)式,并在等待時(shí)執(zhí)行或評(píng)估它們。這是Python最強(qiáng)大的功能之一。通過(guò)輸入一些您選擇的表達(dá)式并查看結(jié)果來(lái)進(jìn)行檢查:
>>>
>>> print("Hello")Hello>>> "Hello" * 3'HelloHelloHello'
許多人將交互模式用作方便但高度可編程的計(jì)算器。當(dāng)您想結(jié)束交互式Python會(huì)話時(shí),請(qǐng)?jiān)谳斎隺的同時(shí)調(diào)用該exit()函數(shù)或按住Ctrl鍵Z,然后按“ Enter”鍵以返回Windows命令提示符。
您可能還會(huì)發(fā)現(xiàn),您有一個(gè)開始菜單項(xiàng),例如開始Start程序‣Python 3.x‣Python(命令行),這會(huì)導(dǎo)致您>>>在新窗口中看到提示。如果是這樣,則在您調(diào)用exit()函數(shù)或輸入Ctrl-Z 字符后,該窗口將消失;Windows在窗口中運(yùn)行單個(gè)“ python”命令,并在終止解釋器時(shí)將其關(guān)閉。
現(xiàn)在我們知道該py命令已被識(shí)別,您可以為其提供Python腳本了。您必須提供Python腳本的絕對(duì)路徑或相對(duì)路徑。假設(shè)您的Python腳本位于您的桌面上,名為hello.py,并且您的主目錄中很好地打開了命令提示符,因此您會(huì)看到類似以下內(nèi)容的內(nèi)容:
C:\Users\YourName>
因此,現(xiàn)在您將要求該py命令py通過(guò)在腳本路徑后鍵入以下內(nèi)容來(lái)將腳本提供給Python :
C:\Users\YourName> py Desktop\hello.py hello
如何使Python腳本可執(zhí)行?
在Windows上,標(biāo)準(zhǔn)的Python安裝程序已經(jīng)將.py擴(kuò)展名與文件類型(Python.File)關(guān)聯(lián),并為該文件類型提供了運(yùn)行解釋器()的打開命令。這足以使腳本在命令提示符下以“ foo.py”的身份可執(zhí)行。如果您希望能夠通過(guò)簡(jiǎn)單地鍵入'foo'而沒有擴(kuò)展名來(lái)執(zhí)行腳本,則需要將.py添加到PATHEXT環(huán)境變量中。D:\Program Files\Python\python.exe "%1" %*
為什么Python有時(shí)需要很長(zhǎng)時(shí)間才能啟動(dòng)?
通常,Python在Windows上的啟動(dòng)速度非?,但偶爾也有錯(cuò)誤報(bào)告稱Python突然開始需要很長(zhǎng)時(shí)間才能啟動(dòng)。這使您更加困惑,因?yàn)镻ython在其他配置相同的Windows系統(tǒng)上可以正常工作。
該問題可能是由問題機(jī)器上的病毒檢查軟件配置錯(cuò)誤引起的。當(dāng)某些病毒掃描程序配置為監(jiān)視來(lái)自文件系統(tǒng)的所有讀取時(shí),會(huì)引入兩個(gè)數(shù)量級(jí)的啟動(dòng)開銷。嘗試檢查系統(tǒng)上病毒掃描軟件的配置,以確保它們的配置確實(shí)相同。McAfee被配置為掃描所有文件系統(tǒng)讀取活動(dòng)時(shí),是一個(gè)特別的冒犯者。
如何從Python腳本制作可執(zhí)行文件?
有關(guān)distutils擴(kuò)展的信息,請(qǐng)參見cx_Freeze,該擴(kuò)展允許您從Python代碼創(chuàng)建控制臺(tái)和GUI可執(zhí)行文件。 py2exe是構(gòu)建基于Python 2.x的可執(zhí)行文件的最流行的擴(kuò)展,尚不支持Python 3,但正在開發(fā)中。
是一個(gè)*.pyd文件相同的DLL?
是的,.pyd文件是dll的文件,但是有一些區(qū)別。如果您有一個(gè)名為的DLL foo.pyd,則它必須具有一個(gè)函數(shù)PyInit_foo()。然后,您可以編寫Python“ import foo”,Python將搜索foo.pyd(以及foo.py,foo.pyc),如果找到,將嘗試調(diào)用PyInit_foo()以對(duì)其進(jìn)行初始化。您不要將.exe與foo.lib鏈接,因?yàn)槟菢訒?huì)使Windows要求該DLL存在。
請(qǐng)注意,foo.pyd的搜索路徑是PYTHONPATH,與Windows用于搜索foo.dll的路徑不同。另外,不需要foo.pyd即可運(yùn)行程序,而如果將程序與dll鏈接,則該dll是必需的。當(dāng)然,如果您想說(shuō)foo.pyd是必需的。在DLL中,鏈接在源代碼中用聲明。在.pyd中,鏈接在可用功能列表中定義。import foo__declspec(dllexport)
如何將Python嵌入Windows應(yīng)用程序?
將Python解釋器嵌入Windows應(yīng)用程序可以總結(jié)如下:
不要直接將Python構(gòu)建到.exe文件中。在Windows上,Python必須是DLL才能處理本身就是DLL的導(dǎo)入模塊。(這是第一個(gè)未記錄的關(guān)鍵事實(shí)。)相反,鏈接到;。它通常安裝在中。 NN是Python版本,對(duì)于Python 3.3,數(shù)字是“ 33”。pythonNN.dllC:\Windows\System
您可以通過(guò)兩種不同的方式鏈接到Python。加載時(shí)鏈接表示針對(duì),而運(yùn)行時(shí)鏈接表示針對(duì)。(一般說(shuō)明:是對(duì)應(yīng)于的所謂的“ import lib” 。它僅定義鏈接器的符號(hào)。)pythonNN.libpythonNN.dllpythonNN.libpythonNN.dll
運(yùn)行時(shí)鏈接大大簡(jiǎn)化了鏈接選項(xiàng);一切都在運(yùn)行時(shí)發(fā)生。您的代碼必須使用Windows 例程加載。該代碼還必須使用Windows 例程獲取的指針使用訪問例程和數(shù)據(jù)(即Python的C API)。宏可以使這些指針對(duì)調(diào)用Python C API中的例程的任何C代碼透明。pythonNN.dllLoadLibraryEx()pythonNN.dllGetProcAddress()
Borland注意:首先使用Coff2Omf.exe 轉(zhuǎn)換為OMF格式。pythonNN.lib
如果您使用SWIG,則很容易創(chuàng)建一個(gè)Python“擴(kuò)展模塊”,它將使應(yīng)用程序的數(shù)據(jù)和方法可供Python使用。SWIG將為您處理幾乎所有繁瑣的細(xì)節(jié)。結(jié)果是鏈接到您的.exe文件的C代碼 (!)您不必創(chuàng)建DLL文件,而且還簡(jiǎn)化了鏈接。
SWIG將創(chuàng)建一個(gè)初始化函數(shù)(C函數(shù)),該函數(shù)的名稱取決于擴(kuò)展模塊的名稱。例如,如果模塊的名稱是leo,則init函數(shù)將稱為initleo()。如果您應(yīng)該使用SWIG陰影類,則init函數(shù)將稱為initleoc()。這將初始化陰影類使用的幾乎隱藏的幫助程序類。
您可以將第2步中的C代碼鏈接到.exe文件的原因是,調(diào)用初始化函數(shù)等效于將模塊導(dǎo)入Python。ㄟ@是第二個(gè)未記錄的關(guān)鍵事實(shí)。)
簡(jiǎn)而言之,您可以使用以下代碼通過(guò)擴(kuò)展模塊初始化Python解釋器。
#include "python.h"...Py_Initialize(); // Initialize Python.initmyAppc(); // Initialize (import) the helper class.PyRun_SimpleString("import myApp"); // Import the shadow class.
Python的C API存在兩個(gè)問題,如果您使用MSVC(用于構(gòu)建pythonNN.dll的編譯器)以外的其他編譯器,這些問題將變得顯而易見。
問題1:帶有FILE *參數(shù)的所謂“非常高級(jí)”函數(shù)在多編譯器環(huán)境中將不起作用,因?yàn)槊總(gè)編譯器對(duì)結(jié)構(gòu)FILE的概念將有所不同。從實(shí)現(xiàn)的角度來(lái)看,這些是非常低級(jí)的功能。
問題2:在生成包裝器以使函數(shù)無(wú)效時(shí),SWIG生成以下代碼:
Py_INCREF(Py_None);_resultobj = Py_None;return _resultobj;
las,Py_None是一個(gè)宏,它擴(kuò)展為對(duì)pythonNN.dll中稱為_Py_NoneStruct的復(fù)雜數(shù)據(jù)結(jié)構(gòu)的引用。同樣,此代碼在多編譯器環(huán)境中將失敗。將此類代碼替換為:
return Py_BuildValue("");
%typemap盡管我無(wú)法使它生效(我是完整的SWIG新手),但也許可以使用SWIG的命令自動(dòng)進(jìn)行更改。
在Windows應(yīng)用程序內(nèi)部使用Python Shell腳本建立Python解釋器窗口不是一個(gè)好主意;生成的窗口將獨(dú)立于您應(yīng)用程序的窗口系統(tǒng)。相反,您(或wxPythonWindow類)應(yīng)創(chuàng)建一個(gè)“本機(jī)”解釋器窗口。將該窗口連接到Python解釋器很容易。您可以將Python的I / O重定向到支持讀取和寫入的_any_對(duì)象,因此您所需要的只是一個(gè)包含read()和write()方法的Python對(duì)象(在擴(kuò)展模塊中定義)。
如何防止編輯器將制表符插入我的Python源代碼?
FAQ不建議使用標(biāo)簽和Python樣式指南, PEP 8,建議分布式Python代碼有4個(gè)空格;這也是Emacs的python-mode默認(rèn)設(shè)置。
在任何編輯器下,混合使用制表符和空格是一個(gè)壞主意。MSVC在這方面沒有什么不同,并且可以很容易地配置為使用空格:選取“ 工具”‣“選項(xiàng)”‣“選項(xiàng)卡”,對(duì)于文件類型“默認(rèn)”,將“標(biāo)簽大小”和“縮進(jìn)大小”設(shè)置為4,然后選擇“插入空格”單選按鈕。
Python引發(fā),IndentationError或者TabError制表符和空格混合導(dǎo)致前導(dǎo)空格出現(xiàn)問題。您也可以運(yùn)行該tabnanny模塊以批處理方式檢查目錄樹。
如何檢查按鍵是否暢通無(wú)阻?
使用msvcrt模塊。這是Windows的標(biāo)準(zhǔn)擴(kuò)展模塊。它定義了一個(gè)功能kbhit(),該功能檢查是否存在鍵盤擊鍵,并getch()獲得一個(gè)字符而不回顯它。