網(wǎng)站性能檢測評分
注:本網(wǎng)站頁面html檢測工具掃描網(wǎng)站中存在的基本問題,僅供參考。
python中file
學(xué)習Python必不可少的幾款好用的Python開發(fā)工具!你會幾個? 流量視頻課程
Python 是一門新手友好、功能強大、高效靈活的編程語言,學(xué)會之后無論是想進入數(shù)據(jù)分析、人工智能、網(wǎng)站開發(fā)這些領(lǐng)域,還是希望掌握第一門編程語言,都可以用 Python 來開啟無限未來的無限可能!工欲善其事必先利其器,一個好的工具能讓起到事半功倍的效果,Python社區(qū)提供了足夠多的優(yōu)秀工具來幫助開發(fā)者更方便的實現(xiàn)某些想法。今天千鋒武漢Python培訓(xùn)小編推薦下面這幾個Python開發(fā)工具,相信一定會給你的工作帶來很多便利。
Python Tutor
Python Tutor 是由 Philip Guo 開發(fā)的一個免費教育工具,可幫助學(xué)生攻克編程學(xué)習中的基礎(chǔ)障礙,理解每一行源代碼在程序執(zhí)行時在計算機中的過程。通過這個工具,教師或?qū)W生可以直接在 Web 瀏覽器中編寫 Python 代碼,并逐步可視化地運行程序。如果你不知道代碼在內(nèi)存中是如何運行的,不妨把它拷貝到Tutor里可視化執(zhí)行一遍,加深理解。
地址:http://pythontutor/
IPython
IPython 是一個 for Humans 的 Python 交互式 shell,用了它之后你就不想再用自帶的 Python shell 了,IPython 支持變量自動補全,自動縮進,支持 bash shell 命令,內(nèi)置了許多實用功能和函數(shù),同時它也是科學(xué)計算和交互可視化的最佳平臺。
地址:https://ipython.org/
Jupyter Notebook
Jupyter Notebook 就像一個草稿本,能將文本注釋、數(shù)學(xué)方程、代碼和可視化內(nèi)容全部組合到一個易于共享的文檔中,以 Web 頁面的方式展示。它是數(shù)據(jù)分析、機器學(xué)習的必備工具。
地址:http://jupyter.org/
Anaconda
Python 雖好,可總是會遇到各種包管理和 Python 版本問題,特別是 Windows 平臺很多包無法正常安裝,為了解決這些問題,Anoconda 出現(xiàn)了,Anoconda 包含了一個包管理工具和一個Python管理環(huán)境,同時附帶了一大批常用數(shù)據(jù)科學(xué)包,也是數(shù)據(jù)分析的標配。
地址:https://anaconda/
Skulpt
Skulpt 是一個用 Java 實現(xiàn)的在線 Python 執(zhí)行環(huán)境,它可以讓你輕松在瀏覽器中運行 Python 代碼。使用 skulpt 結(jié)合 CodeMirror 編輯器即可實現(xiàn)一個基本的在線Python編輯和運行環(huán)境。
Win10系統(tǒng)如何搭建Python 3.5.2開發(fā)環(huán)境
因為工作需求,一位 windows10正式版 用戶,想要在最新的系統(tǒng)中搭建Python 3.5.2開發(fā)環(huán)境。那么,這該如何操作呢?會不會非常復(fù)雜呢?為了幫助大家更好地使用win10系統(tǒng),下面小編就分享搭建和測試Python 3.5.2開發(fā)環(huán)境的具體方法。
Win10系列軟件最新版本下載
Win10系統(tǒng)正式版立即下載360安全衛(wèi)士Win10版立即下載Win10優(yōu)化大師立即下載具體方法如下:
1、首先從Python官網(wǎng)下載安裝軟件,如下圖,輸入IP地址;
2、找到Download,單擊下面Python 3.5.2進入下載頁面;
3、點擊“windows x86-64 executable installer”進行下載;
各個版本的介紹:
(下面的都是windows系統(tǒng)平臺的安裝包,x86適合32位操作系統(tǒng);x86-64適合64位操作系統(tǒng))
下面是官網(wǎng)的解釋:
The binaries for AMD64 will also work on processors that implement
the Intel 64 architecture. (Also known as the "x64" architecture, and
formerly known as both "EM64T" and "x86-64".) They will not work on
Intel Itanium Processors (formerly "IA-64").
Windows users: If installing Python 3.5 as a non-privileged user,
you may need to escalate to administrator privileges to install an
update to your C runtime libraries.
Windows users: There are now "web-based" installers for Windows
platforms; the installer will download the needed software components at
installation time.
Windows Users: There are redistributable zip files containing the
Windows builds, making it easy to redistribute Python as part of another
software package. Please see the documentation regarding Embedded Distribution for more information.It is intended for acting as part of another application, rather than being directly accessed by end-users.
可以通過下面3種途徑獲取python:
web-based installer 是需要通過聯(lián)網(wǎng)完成安裝的
executable installer 是可執(zhí)行文件(*.exe)方式安裝
embeddable zip file 嵌入式版本,可以集成到其它應(yīng)用中
4、找到下載后的文件;
5、雙擊安裝文件,點擊下圖所示的自定義安裝“custom installation”;
6、點擊下一步,“Next”;
7、此處可更換安裝目錄,然后單擊安裝“install”;
8、等待自動安裝……
9、安裝成功!
運行測試:
1、啟動Python shell,在“搜索Web和Windows”中輸入:idle;
2、就會啟動python IDLE,可以交互運行python;
3、同樣可以按“Ctrl + N”打開IDLE開發(fā)工具,輸入程序代碼;
4、編寫完程序后,“Ctrl + S”保存,然后如大多數(shù)編程軟件一樣,按“F5”運行程序;
5、如果程序沒有問題,此時在Idle中打印出“Hello World!”。
Win10搭建Python 3.5.2開發(fā)環(huán)境教程就介紹到這里了。剛剛使用windows10正式版的用戶們,如果也有同樣需求的話,不妨按照上述步驟操作自己手動一遍。
好了,今天的知識就分享到這里,歡迎關(guān)注愛編程的南風,私信關(guān)鍵詞:學(xué)習資料,獲取更多學(xué)習資源,如果文章對你有有幫助,請收藏關(guān)注,在今后與你分享更多學(xué)習python的文章。同時歡迎在下面評論區(qū)留言如何學(xué)習python。
python(十八)中斷和異常處理 流量視頻課程
一、break
二、continue
三、異常處理
循環(huán)我們已經(jīng)用的很多了,括while和for...in。while循環(huán)在條件不滿足時結(jié)束,for循環(huán)遍歷完序列后結(jié)束。如果在循環(huán)條件仍然滿足或序列沒有遍歷完的時候,想要強行跳出循環(huán),就需要用到break語句。
while True:
a = raw_input()
if a == 'end':
break
上面的程序不停接受用戶輸入。當用戶輸入一行“end”時,程序結(jié)束。
for i in range(10):
a = raw_input()
if a == 'exit':
break
上面的程序接受用戶10次輸入,當用戶輸入一行“exit”時,程序提前結(jié)束。
break是徹底地跳出循環(huán),而continue只是略過本次循環(huán)的余下內(nèi)容,直接進入下一次循環(huán)。
在我們前面寫的那個統(tǒng)計分數(shù)的程序里,如果發(fā)現(xiàn)有成績不足60分,就不記入總成績。當然,你可以用if判斷來實現(xiàn)這個效果。但我們今天要說另一種方法:continue。
for score in data[1:]:
point = int(score)
if point
continue
sum += point
注意:無論是continue還是break,其改變的僅僅是當前所處的最內(nèi)層循環(huán)的運行,如果外層還有循環(huán),并不會因此略過或跳出。
在程序運行時,如果我們的代碼引發(fā)了錯誤,python就會中斷程序,并且輸出錯誤提示。
比如我們寫了一句:
print int('0.5')
運行后程序得到錯誤提示:
Traceback (most recent call last):
File "C:/Python27/test.py", line 1, in
print int('0.5')
ValueError: invalid literal for int() with base 10: '0.5'
意思是,在test.py這個文件,第1行,print int('0.5')這里,你拿了一個不是10進制能夠表示的字符,我沒法把它轉(zhuǎn)成int值。
上面的錯誤可以避免,但在實際的應(yīng)用中,有很多錯誤是開發(fā)者無法控制的,例如用戶輸入了一個不合規(guī)定的值,或者需要打開的文件不存在。這些情況被稱作“異常”,一個好的程序需要能處理可能發(fā)生的異常,避免程序因此而中斷。
例如我們?nèi)ゴ蜷_一個文件:
f = file('non-exist.txt')
print 'File opened!'
f.close()
假如這個文件因為某種原因并沒有出現(xiàn)在應(yīng)該出現(xiàn)的文件夾里,程序就會報錯:
IOError: [Errno 2] No such file or directory: 'non-exist.txt'
程序在出錯處中斷,后面的print不會被執(zhí)行。
在python中,可以使用try...except語句來處理異常。做法是,把可能引發(fā)異常的語句放在try-塊中,把處理異常的語句放在except-塊中。
把剛才那段代碼放入try...except中:
try:
f = file('non-exist.txt')
print 'File opened!'
f.close()
except:
print 'File not exists.'
print 'Done'
當程序在try內(nèi)部打開文件引發(fā)異常時,會跳過try中剩下的代碼,直接跳轉(zhuǎn)到except中的語句處理異常。于是輸出了“File not exists.”。如果文件被順利打開,則會輸出“File opened!”,而不會去執(zhí)行except中的語句。
但無論如何,整個程序不會中斷,最后的“Done”都會被輸出。
在try...except語句中,try中引發(fā)的異常就像是扔出了一只飛盤,而except就是一只靈敏的狗,總能準確地接住飛盤。
sciencen. 科學(xué)
writtenadj. 書面的, 寫成文字的 vbl. 寫, 著述
windown. 窗戶
behaviorn. 行為,舉止
definitionn. 定義, 闡釋,清晰度
以上每天用一點時間,練習并寫出練習過程這樣是對于學(xué)習的一個及時反饋重在堅持!
Python智闡8-文件和目錄操作 企業(yè)視頻課程
本篇主要介紹文件目錄、文件的一些操作方法。
其中目錄的操作需要引入os模塊:
import os
操作文件和目錄的函數(shù)一部分放在os模塊中,一部分放在os.path模塊中。
1、目錄操作方法
1.1 查看當前目錄
import osprint(os.getcwd()) #查看當前目錄
輸出:
>>>D:\Code
1.2 返回指定目錄下的所有文件
import ospath = r"D:\Code"print(os.listdir(path))
會以列表的形式,返回所有文件
輸出:
>>>['.idea', '4.py', 'log', 'test.txt', 'venv', '函數(shù).py', '基本數(shù)據(jù)類型.py','文件讀寫.py', '輸入和輸出.py']
1.3 目錄創(chuàng)建、重命名、刪除
import ospath = r"D:\Code"# 在當前目錄D:\Code下創(chuàng)建目錄os.mkdir("test") #方式1:直接創(chuàng)建testos.mkdir(r"D:\Code\test") #方式2:輸入完整目錄進行創(chuàng)建# 重命名剛剛創(chuàng)建的目錄os.rename("test", "testpy")# 刪掉剛剛創(chuàng)建的目錄os.rmdir("testpy") #方式1:直接刪除testos.rmdir(r"D:\Code\testpy") #方式2:輸入完整目錄進行刪除
1.4 判斷目錄是否存在
import ospath = r"D:\Code"#判斷是否是目錄print(os.path.isdir(path))#判斷目錄是否存在print(os.path.exists(path))
1.5 目錄拼接、拆分
import os#目錄拼接newPath = os.path.join(r"D:\Code\test", 'test.txt')print(newPath)
#目錄拆分path = os.path.split(r"D:\Code\test\test.txt")print(path)
#獲取文件擴展名txtName = (os.path.splitext(r"D:\Code\test\test.txt"))print(txtName)print(txtName[1])
輸出:
>>>
>>>D:\Code\test\test.txt
>>>('D:\\Code\\test', 'test.txt')
>>>('D:\\Code\\test\\test', '.txt')
>>>.txt
2、打開文件/關(guān)閉文件
文件的打開和關(guān)閉用open()和close()來實現(xiàn)
open()函數(shù)主要參數(shù)介紹:
參數(shù)file:文件路徑
參數(shù)mode:打開方式,常用的mode有
r 以只讀的方式打開文件,文件讀取光標會放到文件的開頭
w 打開一個文件,只用于寫入,如果文件存在則打開文件,寫入的內(nèi)容會覆蓋原內(nèi)容,如果文件不存在,則新生成一個文件。
a 打開一個文件用于追加。如果文件存在,則文件讀寫光標會放到文件的末尾,新寫入的內(nèi)容將會被寫入到已有內(nèi)容之后。如果該文件不存在,創(chuàng)建新文件進行寫入。
+ 打開一個文件進行更新(可讀可寫)。
b 二進制模式。
還有r+、w+、a+、rb、wb、ab等??勺孕袇⒖脊俜轿臋n。
參數(shù)encoding:編碼方式 (encoding="utf-8"一般都是utf-8)
errors:錯誤處理 (errors="ignore"表示忽略錯誤)
path = r"D:\Code\test.txt"f = open(path, "r")#f = open(path, "r", encoding="utf-8", errors="ignore")f.close()
3、讀寫文件
3.1 read() 讀取文件內(nèi)容
path = r"D:\Code\test.txt"f = open(path, "r")txt = f.read() #讀取文件全部內(nèi)容print(txt)f.close()
3.2 read(n) 讀取指定字符數(shù)
path = r"D:\Code\test.txt"f = open(path, "r")txt = f.read(2) #讀取指定字符 -1 表示讀取全部內(nèi)容print(txt)f.close()
3.3 readline() 讀取整行
path = r"D:\Code\test.txt"f = open(path, "r")txt = f.readline() #讀取整行print(txt)f.close()
3.4 readlines() 讀取所有行并返回列表
path = r"D:\Code\test.txt"f = open(path, "r")txt = f.readlines() #讀取所有行并返回列表print(txt)f.close()
輸出:
>>>['hello 智數(shù)分析1!\n', 'hello 智數(shù)分析2!\n', 'hello 智數(shù)分析3!\n', 'hello 智數(shù)分析4!']
3.5 寫文件
內(nèi)容先寫入內(nèi)存緩沖區(qū),然后再由內(nèi)存緩沖區(qū)寫入到文件。
path = r"D:\Code\test.txt"f = open(path, "a")f.write("hello python") #將信息寫入內(nèi)存緩沖區(qū)f.flush() #刷新內(nèi)存緩沖區(qū)f.close()
4、文件讀寫異常
前面已經(jīng)介紹過了python異常處理,我們在處理文件時也經(jīng)常會遇到一些異常,會導(dǎo)致f.close()無法執(zhí)行。
如果也用try......except......finally方式去處理,程序代碼會比較復(fù)雜。
try:f = openr(r"D:\Code\test.txt", 'r') print(f.read())finally: if f: f.close()
Python提供了with語句來幫我們自動調(diào)用close()方法,以后我們要處理文件時,都可以用以下這種寫法。
path = r"D:\Code\test.txt"with open(path, "r") as f:print(f.read())
Python代碼風格:PEP8規(guī)則 筆記 行業(yè)視頻課程
Python程序設(shè)計的代碼風格應(yīng)該遵循PEP8規(guī)則:
一、代碼布局
1、縮進:
每級縮進4個空格(不用Tab,更不空格Tab混用)
1、續(xù)行應(yīng)該與其包裹元素對齊,要么使用圓括號、方括號和花括號內(nèi)的隱式行連接來垂直對齊,要么使用懸掛式縮進對齊。當使用懸掛縮進時,應(yīng)該考慮到第一行不應(yīng)該有參數(shù),以及使用縮進以區(qū)分自己是續(xù)行。
2、縮進4個空格的規(guī)則對于續(xù)行是可選的。
3、當 if 語句的條件部分長到需要換行寫的時候,注意可以在兩個字符關(guān)鍵字的連接處(比如 if ),增加一個空格,再增加一個左括號來創(chuàng)造一個4空格縮進的多行條件。這會與 if 語句內(nèi)同樣使用4空格縮進的代碼產(chǎn)生視覺沖突。PEP沒有明確指明要如何區(qū)分i發(fā)的條件代碼和內(nèi)嵌代碼。可使用的選項包括但不限于下面幾種情況:
4、(可以參考下面關(guān)于是否在二進制運算符之前或之后截斷的討論)
在多行結(jié)構(gòu)中的大括號/中括號/小括號的右括號可以與內(nèi)容對齊單獨起一行作為最后一行的第一個字符,如:
或者也可以與多行結(jié)構(gòu)的第一行第一個字符對齊,如:
2、Tab還是空格?
空格是被首先推薦的縮進方式。
Tab應(yīng)該只在現(xiàn)有代碼已經(jīng)使用tab進行縮進的情況下使用,以便和現(xiàn)有代碼保持一致。
Python 3不允許再同一個代碼塊中Tab和空格混合使用。
混合使用制表符和空格縮進的Python2代碼應(yīng)該統(tǒng)一轉(zhuǎn)成空格。
使用命令行運行Python 2時,使用-t選項,會出現(xiàn)非法混用tab和空格的警告。當使用-tt選項時,這些警告會變成錯誤。強烈推薦使用這些選項!
3、最大行長
每行最大長度79個字符。
對于連續(xù)大段的文字(比如文檔字符串(docstring)或注釋),每行應(yīng)該被限制在72個字符長度內(nèi)。
Python標準庫比較傳統(tǒng),將行長限制在79個字符以內(nèi)(文檔字符串/注釋為72個字符)。
一種推薦的換行方式是利用Python圓括號、方括號和花括號中的隱式續(xù)行。長行可以通過在括號內(nèi)換行來分成多行。應(yīng)該最好加上反斜杠來區(qū)別續(xù)行。
有時續(xù)行只能使用反斜杠才。例如,較長的多個 with 語句不能采用隱式續(xù)行,只能接受反斜杠表示換行:
另一個這樣的例子是assert語句。要確保續(xù)行的縮進適當。
在二元運算符之前應(yīng)該換行嗎?
遵循數(shù)學(xué)的傳統(tǒng)能產(chǎn)出更多可讀性高的代碼:
4、空行
頂層函數(shù)和類的定義,前后用兩個空行隔開。
類里的方法定義用一個空行隔開。
相關(guān)的功能組可以用額外的空行(盡量少地)隔開。一堆相關(guān)的單行代碼之間的空白行可以省略(例如,一組虛擬實現(xiàn) dummy implementations)。
在函數(shù)中使用空行來區(qū)分邏輯段(盡量少地)。
Python接受control-L(即^L)換頁符作為空格;許多工具把這些字符當作頁面分隔符,所以你可以在文件中使用它們來分隔相關(guān)段落。請注意,一些編輯器和基于Web的代碼閱讀器可能無法識別control-L為換頁,將在其位置顯示另一個字形。
5、源文件編碼
Python核心發(fā)布版本中的代碼總是以UTF-8格式編碼(或者在Python2中用ASCII編碼)。
使用ASCII(Python 2)或者UTF-8(Python 3)的文件不應(yīng)該添加編碼聲明。
在標準庫中,只有用作測試目的,或者注釋或文檔字符串需要提及作者名字而不得不使用非ASCII字符時,才能使用非默認的編碼。否則,在字符串文字中包括非ASCII數(shù)據(jù)時,推薦使用\x, \u, U或N等轉(zhuǎn)義符。
對于Python 3.0及其以后的版本中,標準庫遵循以下原則(參見PEP 3131):Python標準庫中的所有標識符都必須只采用ASCII編碼的標識符,在可行的條件下也應(yīng)當使用英文詞(很多情況下,使用的縮寫和技術(shù)術(shù)語詞都不是英文)。此外,字符串文字和注釋應(yīng)該只包括ASCII編碼。只有兩種例外:
(a) 測試情況下為了測試非ASCII編碼的特性
(b) 作者名字。作者名字不是由拉丁字母組成的也必須提供一個拉丁音譯名。
鼓勵面向全球的開源項目都采用類似的原則。
6、導(dǎo)入
1、imports應(yīng)該分行寫,而不是都寫在一行,例如:
這樣寫也是可以的:
導(dǎo)入(import)始終在文件的頂部,在模塊注釋和文檔字符串之后,在模塊全局變量和常量之前。
導(dǎo)入順序如下:
imports應(yīng)該按照下面的順序分組來寫:
1、標準庫imports
2、相關(guān)第三方imports
3、本地應(yīng)用/庫的特定imports
不同組的imports之前用空格隔開。
將任何相關(guān)的 __all__ 說明(specification)放在imports之后。
推薦使用絕對(absolute)imports,因為這樣通常更易讀,在import系統(tǒng)沒有正確配置的情況下,也會有更好的表現(xiàn)(或者至少會給出錯誤信息):
在絕對路徑比較長的情況下,也可以使用相對導(dǎo)入:
Python 3中已經(jīng)禁止隱式的相對導(dǎo)入。
導(dǎo)入類的方法,通??梢赃@樣寫:
如果和本地命名的拼寫產(chǎn)生了沖突,應(yīng)當使用絕對導(dǎo)入:
禁止使用通配符導(dǎo)入。
通配符導(dǎo)入(from import *)應(yīng)該避免,因為它不清楚命名空間有哪些名稱存,混淆讀者和許多自動化的工具。唯一的例外是重新發(fā)布對外的API時可以考慮使用。
7、模塊中前后具有雙下劃線的變量名
像__all__ , __author__ , __version__ 等這樣的模塊中的變量名(也就是名字里有兩個前綴下劃線和兩個后綴下劃線),應(yīng)該放在文檔字符串的后面,以及除from __future__ 之外的import表達式前面。Python要求將來在模塊中的導(dǎo)入,必須出現(xiàn)在除文檔字符串之外的其他代碼之前。
比如:
二、字符串引號
Python中單引號字符串和雙引號字符串都是相同的。注意盡量避免在字符串中的反斜杠以提高可讀性。
根據(jù)PEP 257, 三個引號都使用雙引號。
三、表達式和語句中的空格
在下列情況下,避免使用無關(guān)的空格:
1、緊跟在小括號,中括號或者大括號后。
2、緊貼在逗號、分號或者冒號之前。
3、然而,冒號在切片中就像二元運算符,在兩邊應(yīng)該有相同數(shù)量的空格(把它當做優(yōu)先級最低的操作符)。在擴展的切片操作中,所有的冒號必須有相同的間距。例外情況:當一個切片參數(shù)被省略時,空格就被省略了。
4、緊貼在函數(shù)參數(shù)的左括號之前。
5、緊貼索引或者切片的左括號之前。
6、為了和另一個賦值語句對齊,在賦值運算符附件加多個空格。
其他建議
1、避免在尾部添加空格。因為尾部的空格通常都看不見,會產(chǎn)生混亂:比如,一個反斜杠后面跟一個空格的換行符,不算續(xù)行標記。有些編輯器不會保留尾空格,并且很多項目(像CPython)在pre-commit的掛鉤調(diào)用中會過濾掉尾空格。
總是在二元運算符兩邊加一個空格:賦值(=),增量賦值(+=,-=),比較(==,,!=,,=,in,not,in,is,is not),布爾(and, or, not)。
如果使用具有不同優(yōu)先級的運算符,請考慮在具有最低優(yōu)先級的運算符周圍添加空格。有時需要通過自己來判斷;但是,不要使用一個以上的空格,并且在二元運算符的兩邊使用相同數(shù)量的空格。
2、在指定函數(shù) 關(guān)鍵字參數(shù) 或者 默認參數(shù) 值的時候,不要在=附近加上空格。
3、功能型注釋應(yīng)該使用冒號的一般性規(guī)則,并且在使用 ->的時候要在兩邊加空格。(參考下面的功能注釋得到能夠多信息)
4、當給有類型備注的參數(shù)賦值的時候,在=兩邊添加空格(僅針對那種有類型備注和默認值的參數(shù))。
5、復(fù)合語句(同一行中的多個語句)通常是不允許的。
6、雖然有時候?qū)⑿〉拇a塊和 if/for/while 放在同一行沒什么問題,多行語句塊的情況不要這樣用,同樣也要避免代碼行太長!
四、注釋
與代碼自相矛盾的注釋比沒注釋更差。修改代碼時要優(yōu)先更新注釋!
注釋是完整的句子。如果注釋是斷句,首字母應(yīng)該大寫,除非它是小寫字母開頭的標識符(永遠不要修改標識符的大小寫)。
如果注釋很短,可以省略末尾的句號。注釋塊通常由一個或多個段落組成。段落由完整的句子構(gòu)成且每個句子應(yīng)該以點號(后面要有兩個空格)結(jié)束,并注意斷詞和空格。
非英語國家的程序員請用英語書寫你的注釋,除非你120%確信代碼永遠不會被不懂你的語言的人閱讀。
1、注釋塊
注釋塊通常應(yīng)用在代碼前,并和這些代碼有同樣的縮進。每行以 '# '(除非它是注釋內(nèi)的縮進文本,注意#后面有空格)。
注釋塊內(nèi)的段落用僅包含單個 '#' 的行分割。
2、行內(nèi)注釋
慎用行內(nèi)注釋(Inline Comments) 節(jié)儉使用行內(nèi)注釋。 行內(nèi)注釋是和語句在同一行,至少用兩個空格和語句分開。行內(nèi)注釋不是必需的,重復(fù)羅嗦會使人分心。
不推薦:
但是有時,很有必要:
加了以后對理解代碼很有幫助的情況下,關(guān)鍵處才加。
3、文檔字符串
文檔字符串的標準參見:PEP 257。
為所有公共模塊、函數(shù)、類和方法書寫文檔字符串。非公開方法不一定有文檔字符串,建議有注釋(出現(xiàn)在 def 行之后)來描述這個方法做什么。
更多參考:PEP 257 文檔字符串約定。注意結(jié)尾的 """ 應(yīng)該單獨成行,例如:
單行的文檔字符串,結(jié)尾的 """ 在同一行。
4、版本標簽
如果你必須在源文件中包含git、Subversion、CVS或RCS crud信息,放置在模塊的文檔字符串之后,任何其他代碼之前,上下各用一個空行:
五、命名規(guī)范
Python庫的命名約定有點混亂,不可能完全一致。但依然有些普遍推薦的命名規(guī)范的。新的模塊和包 (包括第三方的框架) 應(yīng)該遵循這些標準。對不同風格的已有的庫,建議保持內(nèi)部的一致性。
1、最重要的原則
用戶可見的API命名應(yīng)遵循使用約定而不是實現(xiàn)。
2、命名風格
以下是常見的命名方式:
b(單個小寫字母)
B(單個大寫字母)
lowercase (小寫字母)
lower_case_with_underscores (使用下劃線分隔的小寫字母)
UPPERCASE( 大寫字母)
UPPER_CASE_WITH_UNDERSCORES (使用下劃線分隔的大寫字母)
CapitalizedWords(首字母大寫的單詞串或駝峰縮寫)
注意: 使用大寫縮寫時,縮寫使用大寫字母更好。故 HTTPServerError 比 HttpServerError 更好。
mixedCase(不同于首字母大寫,第一個單詞的首字母小寫)
Capitalized_Words_With_Underscores(帶下劃線,首字母大寫,巨丑無比)
還有一種風格使用短前綴分組名字。這在Python中不常用, 但出于完整性提一下。例如,os.stat()返回的元組有st_mode, st_size, st_mtime等等這樣的名字(與POSIX系統(tǒng)調(diào)用結(jié)構(gòu)體一致)。
X11庫的所有公開函數(shù)以X開頭, Python中通常認為是不必要的,因為屬性和方法名有對象作前綴,而函數(shù)名有模塊名為前綴。
下面講述首尾有下劃線的情況:
_single_leading_underscore:(單前置下劃線): 弱內(nèi)部使用標志。 例如"from M import " 不會導(dǎo)入以下劃線開頭的對象。
single_trailing_underscore_(單后置下劃線): 用于避免與 Python關(guān)鍵詞的沖突。 例如:
__double_leading_underscore(雙前置下劃線): 當用于命名類屬性,會觸發(fā)名字重整。 (在類FooBar中,__boo變成 _FooBar__boo)。
__double_leading_and_trailing_underscore__(雙前后下劃線):用戶名字空間的魔法對象或?qū)傩浴@?__init__ , __import__ or __file__,不要自己發(fā)明這樣的名字。
3、命名約定規(guī)范
避免采用的名字:
決不要用字符'l'(小寫字母el),'O'(大寫字母oh),或 'I'(大寫字母eye) 作為單個字符的變量名。一些字體中,這些字符不能與數(shù)字1和0區(qū)別。用'L' 代替'l'時。
包和模塊名:
模塊名要簡短,全部用小寫字母,可使用下劃線以提高可讀性。包名和模塊名類似,但不推薦使用下劃線。
模塊名對應(yīng)到文件名,有些文件系統(tǒng)不區(qū)分大小寫且截短長名字,在 Unix上不是問題,但當把代碼遷移到 Mac、Windows 或 DOS 上時,就可能是個問題。當然隨著系統(tǒng)的演進,這個問題已經(jīng)不是經(jīng)常出現(xiàn)。
另外有些模塊底層用C或C++ 書寫,并有對應(yīng)的高層Python模塊,C/C++模塊名有一個前置下劃線 (如:_socket)。
類名:
遵循CapWord。
接口需要文檔化并且可以調(diào)用時,可能使用函數(shù)的命名規(guī)則。
注意大部分內(nèi)置的名字是單個單詞(或兩個),CapWord只適用于異常名稱和內(nèi)置的常量。
異常名:
如果確實是錯誤,需要在類名添加后綴 "Error"。
全局變量名:
變量盡量只用于模塊內(nèi)部,約定類似函數(shù)。
對設(shè)計為通過 "from M import " 來使用的模塊,應(yīng)采用 __all__ 機制來防止導(dǎo)入全局變量;或者為全局變量加一個前置下劃線。
函數(shù)名:
函數(shù)名應(yīng)該為小寫,必要時可用下劃線分隔單詞以增加可讀性。 mixedCase(混合大小寫)僅被允許用于兼容性考慮(如: threading.py)。
函數(shù)和方法的參數(shù):
實例方法第一個參數(shù)是 'self'。
類方法第一個參數(shù)是 'cls'。
如果函數(shù)的參數(shù)名與保留關(guān)鍵字沖突,通常在參數(shù)名后加一個下劃線。
方法名和實例變量:
同函數(shù)命名規(guī)則。
非公開方法和實例變量增加一個前置下劃線。
為避免與子類命名沖突,采用兩個前置下劃線來觸發(fā)重整。類Foo屬性名為__a, 不能以 Foo.__a訪問。(執(zhí)著的用戶還是可以通過Foo._Foo__a。) 通常雙前置下劃線僅被用來避免與基類的屬性發(fā)生命名沖突。
常量:
<...Python程序員最常犯的10個錯誤,你中招了嗎? 行業(yè)視頻課程
大數(shù)據(jù)文摘作品
編譯:什錦甜、Gao Ning、小魚
Python簡介
Python是一種具有動態(tài)語義的、面向?qū)ο蟮慕忉屝透呒壘幊陶Z言。因其內(nèi)置了高級數(shù)據(jù)結(jié)構(gòu),并支持動態(tài)類型和動態(tài)綁定,使用Python進行快速應(yīng)用程序開發(fā)十分便利。同時作為一門腳本語言,它兼容部分現(xiàn)有的組件和服務(wù)。Python還支持模塊和各種庫的擴展,有助于實現(xiàn)模塊化編程和提高代碼復(fù)用率。
關(guān)于本文
剛接觸這門語言的新手可能會對Python簡潔靈活的語法有些不適應(yīng),或是低估了Python強大的性能。鑒于此,本文列出了Python開發(fā)人員常犯的10個小錯誤,資深程序猿也難免會中招哦。
本文供Python高級開發(fā)人員參考,Python小白可以參考下面這篇文章:
http://onlamp/pub/a/python/2004/02/05/learn_python.html
常見錯誤1:濫用表達式作為函數(shù)參數(shù)的默認值
Python允許開發(fā)者指定函數(shù)參數(shù)的默認值,這也是Python的一大特色,但當默認值可變時,可能會給開發(fā)者帶來一些困擾。例如下面定義的函數(shù):
>>> def foo(bar=[]): # bar is optional and defaults to [] if not specified... bar.append("baz") # but this line could be problematic, as we'll see...... return bar
看出bug了嗎?那就是在每次調(diào)用函數(shù)前沒有對可變參數(shù)進行賦值,而認為該參數(shù)就是默認值。比如上面的代碼,有人可能期望在反復(fù)調(diào)用foo()時返回'baz',以為每次調(diào)用foo()時,bar的值都為[],即一個空列表。
但是,讓我們來看看代碼運行結(jié)果:
>>> foo()["baz"]>>> foo()["baz", "baz"]>>> foo()["baz", "baz", "baz"]
嗯?為什么每次調(diào)用foo()后會不斷把"baz"添加到已有的列表,而不是新建一個新列表呢?答案就是,函數(shù)參數(shù)的默認值僅在定義函數(shù)時執(zhí)行一次。因此,僅在第一次定義foo()時,bar初始化為默認值(即空列表),此后,每次調(diào)用foo()函數(shù)時,參數(shù)bar都是第一次初始化時生成的列表。
常見的解決方案:
>>> def foo(bar=None):... if bar is None: # or if not bar:... bar = []... bar.append("baz")... return bar...>>> foo()["baz"]>>> foo()["baz"]>>>foo()["baz"]
常見錯誤2:錯誤地使用類變量
代碼示例:
>>> class A(object):... x = 1...>>> class B(A):... pass...>>> class C(A):... pass...>>> print A.x, B.x, C.x1 1 1
運行結(jié)果沒問題。
>>> B.x = 2>>> print A.x, B.x, C.x1 2 1
結(jié)果也正確。
>>> A.x = 3>>> print A.x, B.x, C.x3 2 3
什么鬼?我們只改變了A.x.,為什么C.x 也變了?
在Python中,類變量是以字典形式進行內(nèi)部處理,遵循方法解析順序(Method Resolution Order ,MRO)。因此,在上述代碼中,因為在類C中沒有找到屬性x,它就會從父類中查找x的值(盡管Python支持多重繼承,但上述代碼只存在一個父類A)。換句話說,C沒有獨立于類A的屬于自己的x。因此,C.x實際上指的是A.x。除非處理得當,否則就會導(dǎo)致Python出現(xiàn)錯誤。
如果想更深入了解Python的類特性,請戳:
https://toptal/python/python-class-attributes-an-overly-thorough-guide
常見錯誤3:錯誤指定異常代碼塊的參數(shù)
假設(shè)你有如下代碼:
>>> try:... l = ["a", "b"]... int(l[2])... except ValueError, IndexError: # To catch both exceptions, right?... pass...Traceback (most recent call last):File "
這里的問題是except語句不接受以這種方式指定的異常列表。在Python2.x中,except Exception語句中變量e可用來把異常信息綁定到第二個可選參數(shù)上,以便進一步查看異常的情況。因此,在上述代碼中,except語句并沒有捕捉到IndexError異常;而是將出現(xiàn)的異常綁定到了參數(shù)IndexError中。
想在一個except語句同時捕捉到多個異常的正確方式是,將第一個參數(shù)指定為元組,并將要捕捉的異常類型都寫入該元組中。為了方便起見,可以使用as關(guān)鍵字,Python 2 和Python 3都支持這種語法格式:
>>> try:... l = ["a", "b"]... int(l[2])... except (ValueError, IndexError) as e: ... pass...>>>
常見錯誤4:錯誤理解Python中變量的作用域
Python變量作用域遵循LEGB規(guī)則,LEGB是Local,Enclosing,Global,Builtin的縮寫,分別代表本地作用域、封閉作用域、全局作用域和內(nèi)置作用域,這個規(guī)則看起來一目了然。事實上,Python的這種工作方式較為獨特,會導(dǎo)致一些編程錯誤,例如:
>>> x = 10>>> def foo():... x += 1... print x...>>> foo()Traceback (most recent call last):File "
問題出在哪?
上面的錯誤是因為在作用域內(nèi)對變量賦值時,Python自動將該變量視為該作用域的本地變量,并對外部定義的同名變量進行了屏蔽。因此,原本正確的代碼,在某個函數(shù)內(nèi)部添加了一個賦值語句后,卻意外收到了UnboundLocalError的報錯信息。
關(guān)于UnboundLocalError更多內(nèi)容請戳:
https://docs.python.org/2/faq/programming.html#why-am-i-getting-an-unboundlocalerror-when-the-variable-has-a-value
在使用列表時,Python程序員更容易掉入此類陷阱,例如:
>>> lst = [1, 2, 3]>>> def foo1():... lst.append(5) # This works ok......>>> foo1()>>> lst[1, 2, 3, 5]>>> lst = [1, 2, 3]>>> def foo2():... lst += [5] # ... but this bombs!...>>> foo2()Traceback (most recent call last):File "
奇怪,為什么foo1正常運行,而foo2崩潰了呢?
原因和上一個案例中出現(xiàn)的問題相似,但這里的錯誤更加細微。函數(shù)foo1沒有對變量lst進行賦值操作,而函數(shù)foo2有賦值操作。
首先, lst += [5]是lst = lst + [5]的縮寫形式,在函數(shù)foo2中試圖對變量lst進行賦值操作(Python將變量lst默認為本地作用域的變量)。但是,lst += [5]語句是對lst變量自身進行的賦值操作(此時變量lst的作用域是函數(shù)foo2),但是在函數(shù)foo2中還未聲明該變量,所以就報錯啦!
常見錯誤5:在遍歷列表時修改列表
下面代碼中的錯誤很明顯:
>>> odd = lambda x : bool(x % 2)>>> numbers = [n for n in range(10)]>>> for i in range(len(numbers)):... if odd(numbers[i]):... del numbers[i] # BAD: Deleting item from a list while iterating over it...Traceback (most recent call last):File "
有經(jīng)驗的程序員都知道,在Python中遍歷列表或數(shù)組時不應(yīng)該刪除該列表(數(shù)組)中的元素。雖然上面代碼的錯誤很明顯,但是在編寫復(fù)雜代碼時,資深程序員也難免會犯此類錯誤。
幸好Python集成了大量經(jīng)典的編程范式,如果運用得當,可以大大簡化代碼并提高編程效率。簡單的代碼會降低出現(xiàn)上述bug的幾率。列表解析式(list comprehensions)就是利器之一,它將完美避開上述bug,解決方案如下:
>>> odd = lambda x : bool(x % 2)>>> numbers = [n for n in range(10)]>>> numbers[:] = [n for n in numbers if not odd(n)] # ahh, the beauty of it all>>> numbers[0, 2, 4, 6, 8]
更多有關(guān)列表解析式的詳細內(nèi)容,請戳:https://docs.python.org/2/tutorial/datastructures.html#tut-listcomps
常見錯誤6:不理解Python閉包中的變量綁定
代碼示例:
>>> def create_multipliers():... return [lambda x : i * x for i in range(5)]>>> for multiplier in create_multipliers():... print multiplier(2)...
你以為運行結(jié)果會是:
02468
但實際輸出結(jié)果是:8
8888
驚不驚喜!
這種情況是由于Python延遲綁定(late binding)機制造成的,也就是說只有在內(nèi)部函數(shù)被調(diào)用時才會搜索閉包中變量的值。所以在上述代碼中,每次調(diào)用create_multipliers()函數(shù)中的return函數(shù)時,會在附近作用域中查詢變量i的值。(此時,return中循環(huán)已結(jié)束,所以i值為4)。
常見解決方案:
>>> def create_multipliers():... return [lambda x, i=i : i * x for i in range(5)]...>>> for multiplier in create_multipliers():... print multiplier(2)...02468
沒錯!我們利用了匿名函數(shù)lambda的默認參數(shù)來生成結(jié)果序列。有人覺得這種用法很簡潔,有人會說它很巧妙,還有人會覺得晦澀難懂。如果你是Python開發(fā)人員,那么深刻理解上述語法對你而言非常重要。
常見錯誤7:模塊之間出現(xiàn)循環(huán)依賴
假設(shè)你有兩個文件,分別是a.py和b.py,兩者相互導(dǎo)入,如下所示:
a.py模塊中的代碼:
import bdef f():return b.xprint f()
b.py模塊中的代碼:
import ax = 1def g():print a.f()
首先,我們嘗試導(dǎo)入a.py:
>>> import a1
運行結(jié)果正確!這似乎有點出人意料,因為我們在這里進行循環(huán)導(dǎo)入,應(yīng)該會報錯呀!
答案是,在Python中如果僅存在一個循環(huán)導(dǎo)入,程序不會報錯。如果一個模塊已經(jīng)被導(dǎo)入,Python會自動識別而不會再次導(dǎo)入。但是如果每個模塊試圖訪問其他模塊不同位置的函數(shù)或變量時,那么Error又雙叒叕出現(xiàn)了。
回到上面的示例中,當導(dǎo)入a.py模塊時,程序可以正常導(dǎo)入b.py模塊,因為此時b.py模塊未訪問a.py中定義任何的變量或函數(shù)。b.py模塊僅引用了a.py模中的a.f()函數(shù)。調(diào)用的a.f()函數(shù)隸屬于g()函數(shù),而a.py或b.py模塊中并沒有調(diào)用g()函數(shù)。所以程序沒有報錯。
但是,如果我們在未導(dǎo)入a.py模塊之前先導(dǎo)入b.py模塊,結(jié)果會怎樣?
>>> import bTraceback (most recent call last):File "
報錯了!問題在于,在導(dǎo)入b.py的過程中,它試圖導(dǎo)入a.py模塊,而a.py模塊會調(diào)用f()函數(shù),f()函數(shù)又試圖訪問b.x變量。但此時,還未對變量b.x進行定義,所以出現(xiàn)了AttributeError異常。
稍微修改下b.py,即在g()函數(shù)內(nèi)部導(dǎo)入a.py就可以解決上述問題。
修改后的b.py:
x = 1def g():
import a # This will be evaluated only when g() is calledprint a.f()
現(xiàn)在我們再導(dǎo)入b.py模塊,就不會報錯啦!
>>> import b>>> b.g()1 # Printed a first time since module 'a' calls 'print f()' at the end1 # Printed a second time, this one is our call to 'g'
常見錯誤8:文件命名與Python標準庫模塊的名稱沖突
Python的優(yōu)勢之一就是其集成了豐富的標準庫。正因為如此,稍不留神就會在為自己的文件命名時與Python自帶標準庫模塊重名。例如,如果你的代碼中有一個名為email.py的模塊,恰好就和Python標準庫中email.py模塊重名了。)
上述問題比較復(fù)雜。舉個例子,在導(dǎo)入模塊A的時候,假如該模塊A試圖導(dǎo)入Python標準庫中的模塊B,但你已經(jīng)定義了一個同名模塊B,模塊A會錯誤導(dǎo)入你自定義的模塊B,而不是Python標準庫中的模塊B。這種錯誤很糟糕,因為程序員很難察覺到是因為命名沖突而導(dǎo)致的。
因此,Python程序員要注意避免與Python標準庫模塊的命名沖突。畢竟,修改自己模塊的名稱比修改標準庫的名稱要容易的多!當然你也可以寫一份Python改善建議書(Python Enhancement Proposal,PEP)提議修改標準庫的名稱。
常見錯誤9:不熟悉Python2和Python3之間的差異
先來看看foo.py文件中的代碼:
import sysdef bar(i):if i == 1: raise KeyError(1) if i == 2: raise ValueError(2)def bad(): e = None try: bar(int(sys.argv[1])) except KeyError as e: print('key error') except ValueError as e: print('value error') print(e)bad()
在Python 2中,上述代碼運行正常
$ python foo.py 1key error1$ python foo.py 2value error2
但是在Python 3中運行時:
$ python3 foo.py 1key errorTraceback (most recent call last):File "foo.py", line 19, in
什么情況?原來,在Python 3中,在except代碼塊作用域外無法訪問異常對象。(原因是,Python 3會將內(nèi)存堆棧中的循環(huán)引用進行保留,直到垃圾回收...
python入門——Python中I/O函數(shù) 企業(yè)視頻課程
python大數(shù)據(jù)課堂已經(jīng)開始了。想轉(zhuǎn)行大數(shù)據(jù),數(shù)據(jù)挖掘,機器學(xué)習,人工智能的小伙伴可以關(guān)注啦。上一篇帶大家了解了python模塊。今天我們來繼續(xù)了解python中的I/O函數(shù)。調(diào)試環(huán)境以python3.6環(huán)境為例。需要代碼和demo的朋友可以搜索“欒鵬全棧”到我的CSDN博客。
第八部分. Python中I/O函數(shù)
8、Python中I/O函數(shù)
8.1、讀取鍵盤輸入
str = input("請輸入:");
print("你輸入的內(nèi)容是: ", str)
inpu()函數(shù)可以接受Python表達式的輸入,并輸出表達式的計算結(jié)果
請輸入:[x*5 for x in range(2,10,2)]
輸出為:[10, 20, 30, 40]
8.2、打開、關(guān)閉讀寫文件
可以用file對象對大多數(shù)文件進行操作。
1)打開文件
你必須先用Python內(nèi)置的open()函數(shù)打開一個文件,創(chuàng)建一個file對象,相關(guān)的方法才可以調(diào)用它進行讀寫。
file_name:file_name變量是一個包含了你要訪問的文件名稱的字符串值。
access_mode:access_mode決定了打開文件的模式:只讀,寫入,追加等。所有可取值見如下的完全列表。這個參數(shù)是非強制的,默認文件訪問模式為只讀(r)。
buffering:如果buffering的值被設(shè)為0,就不會有寄存。如果buffering的值取1,訪問文件時會寄存行。如果將buffering的值設(shè)為大于1的整數(shù),表明了這就是的寄存區(qū)的緩沖大小。如果取負值,寄存區(qū)的緩沖大小則為系統(tǒng)默認。
當文件不存在但通過open函數(shù)打開時,如果是寫入則會自動創(chuàng)建文件,如果是讀取內(nèi)容則會報錯。
2)打開文件的模式
3)File對象的屬性
4)關(guān)閉文件
當一個文件對象的引用被重新指定給另一個文件時,Python 會關(guān)閉之前的文件(Python會自動地關(guān)閉之前的文件對象,這樣不那么耗費內(nèi)存)。用close()方法關(guān)閉文件是一個很好的習慣。
5)讀寫文件
無論讀、寫、還是關(guān)閉文件,都需要先用open打開文件。
6)文件內(nèi)定位
tell()方法告訴你文件內(nèi)的當前位置(那應(yīng)該就是告訴你文件指針在哪個位置);換句話說,下一次的讀寫會發(fā)生在文件開頭這么多字節(jié)之后。
seek(offset [,from])方法改變當前文件的位置。Offset變量表示要移動的字節(jié)數(shù)。From變量指定開始移動字節(jié)的參考位置。如果from被設(shè)為0,這意味著將文件的開頭作為移動字節(jié)的參考位置。如果設(shè)為1,則使用當前的位置作為參考位置。如果它被設(shè)為2,那么該文件的末尾將作為參考位置。
8.3、文件File對象的方法
8.4、文件OS(文件和目錄處理)
下節(jié)預(yù)告:Python中的異常處理