python可選參數
① python其實很簡單 第十五章 文件操作
在各種變數中保存的數據都是臨時的,隨著程序運行結束都會丟失。要做到數據長期有效,必須建立在磁碟中建立文件,將數據輸入到文件中並保存。需要獲取數據時需要打開文件讀取。
而我們自己建立的程序都是應用程序,從本質上講,應用程序是無法直接操作計算機的硬體的,譬如讀寫磁碟中文件,這就需要調用操作系統中的相應命令。接下來我們使用的Python內置函數open()、write()都是通過調用操作系統的相關命令才實現文件讀寫的,至於其中的細節,我們就不需要考慮了。
15.1創建和打開文件
在Python 中創建或打開文件,實際上是建立一個對象,該對象通過調用內置的open()函數創建或打開一個文件。
語法:
file object = open(filename [, mode][, buffering])
參數說明如下:
filename:file_name變數是一個包含了你要訪問的文件名稱的字元串值;
mode:mode決定了打開文件的模式:只讀,寫入,追加等。所有可取值見如下的完全列表。這個參數是非強制的,默認文件訪問模式為只讀(r)。
Buffering:如果buffering的值被設為0,就不會有寄存;如果buffering的值取1,訪問文件時會寄存行;如果將buffering的值設為大於1的整數,表明了這就是的寄存區的緩沖大小;如果取負值,寄存區的緩沖大小則為系統默認。
mode參數的參數值及說明
對於其中最難區別的r、r+、w、w+、a、a+幾個參數的區別總結如下,要特別注意指針的位置:
下面舉例說明open( )函數的使用方法。
例1:
>>> file=open(Ƈ.py')
如果文件「1.py」存在,則可以打開此文件;如果文件「1.py」不存在,則會出現如下提示:
Traceback (most recent call last):
File " ", line 1, in
file=open(Ƈ.py')
FileNotFoundError: [Errno 2] No such file or directory: Ƈ.py'
例2:
>>> file=open(Ɗ.py',』a+』)
雖然文件「4.py」不存在,但運行並未出現錯誤,參見上表,「a+」的含義是以讀寫模式打開文件,如果該文件已經存在,新內容將以追加方式寫入;如果該文件不存在,則新建文件用於寫入。查看文件夾,發現已經生成了一個新的文件4.py。
例3:
file=open('python.png','rb')
print(file)
運行結果:
這就是說,雖然Python可以打開一個圖片格式的文件,但print()並不能將其輸出,還需要第三方庫中模塊的相應方法去處理,如PIL中的open()f方法。
例4:
file = open("f.txt", "w",encoding='utf-8')
# 以只寫模式打開文件f.txt,編碼方式為utf-8
print( "文件名: ", file.name) # 輸出文件名
print( "是否已關閉 : ", file.closed) # 文件是否打開
print( "訪問模式 : ", file.mode) # 文件訪問模式
運行結果:
文件名: f.txt
是否已關閉 : False
訪問模式 : w
例5:
15.2關閉文件
打開文件使用後要及時關閉,以免造成不必要的破壞,同時也可以釋放內存。在Python中使用close()方法可以關閉文件。
語法格式:
file.close()
其中,file為文件對象。
15.3 with語句
with 語句適用於對資源進行訪問的場合,確保不管使用過程中是否發生異常都會執行必要的「清理」操作,釋放資源,比如文件使用後自動關閉、線程中鎖的自動獲取和釋放等。
with語句的語法格式如下:
with expression as target:
with-body
其中,expression用於指定一個表達式,譬如打開文件的open()函數。target用於指定一個變數,並且將expression的結果保存到該變數中,譬如文件對象file。with-body用於指定with語句體,譬如一些文件操作的相關語句,如果沒有要執行的語句體,則直接用pass語句代替。
假設python當前目錄下存在一個test.txt文件,其內容如下:
Python是一種解釋型語言: 這意味著開發過程中沒有了編譯這個環節。類似於PHP和Perl語言。
Python是互動式語言: 這意味著,您可以在一個 Python 提示符 >>> 後直接執行代碼。
Python是面向對象語言: 這意味著Python支持面向對象的風格或代碼封裝在對象的編程技術。
Python是初學者的語言:Python 對初級程序員而言,是一種偉大的語言,它支持廣泛的應用程序開發。
舉例如下:
with open('test.txt','r',encoding='utf-8') as file:
line=file.readline() # readline()方法可以讀取文件一行數據,接下來就會講到。
print(line)
運行結果如下:
Python是一種解釋型語言: 這意味著開發過程中沒有了編譯這個環節。類似於PHP和Perl語言。
而此時,我們給該段代碼with語句之外再增加一個讀取文件的語句,代碼如下:
with open('test.txt','r',encoding='utf-8') as file:
line=file.readline()
print(line)
line2=file.readline()
print(line2)
發現出現了如下錯誤提示:
Traceback (most recent call last):
File "C:/Users/zym/AppData/Local/Programs/Python/Python39/3.py", line 5, in
line2=file.readline()
ValueError: I/O operation on closed file.
意思是要讀取的文件已經被關閉了。
由此可知,當with語句運行結束後,被打開的test.txt文件就自動關閉了。
15.4讀取文件
在Python 中讀取文件的方法有:
1、讀取指定個數的字元
格式如下:
File.read([size])
其中,file為打開的文件對象。size為可選參數,可以指定要讀取的字元個數,省缺表示讀取所有內容。
在調用read()方法讀取文件內容時,文件必須是以r(只讀)或者r+(讀寫)方式打開。
如:
with open('test.txt','r',encoding='utf-8') as file:
txt=file.read() (或txt=file.read(10))
print(txt)
將讀取、輸出test.txt文件的全部內容(或前10個字元)。
2、移動文件的指針
對於剛打開的文件,文件指針總是指向文件頭的。也可以通過seek()方法將文件的指針移動到新的位置。
格式如下:
file.seek(offset[,whence])
其中,file表示已經打開的文件對象;offset用於指定移動的字元個數;whence表示從哪個位置起始計算個數,其值為0表示從文件頭開始計算,其值為1表示從當前位置開始計算,其值為2表示從文件尾開始計算,默認值為0。
例如:
with open('test.txt','r',encoding='utf-8') as file:
string=file.read(9)
print('取9個字元: '+string)
file.seek(2) #指針從文件頭開始移動2個字元
string=file.read(9) #從當前位置讀取10個字元
輸出結果:
取9個字元:
Python是一種
取9個字元:
thon是一種解釋
而下面的代碼會拋出錯誤:
with open('test.txt','r',encoding='utf-8') as file:
file.seek(2,1) #指針從當前位置開始移動2個字元
string=file.read(10) #從當前位置讀取10個字元
print('取10個字元: '+string)
錯誤提示為:
Traceback (most recent call last):
File "C:.py", line 7, in
file.seek(2,1) #指針從當前位置開始移動2個字元
io.UnsupportedOperation: can't do nonzero cur-relative seeks
原因在於,必須使用b模式(即rb)打開文件,才能使用whence參數。但是,b模式(二進制)不適合文本文件。對於test.txt這樣的文本文件,為了解決通過改變指針讀取任意位置字元,可以採用加一個位置變數的方法來存儲指針的值。
例如:
with open('test.txt','r',encoding='utf-8') as file:
#utf-8漢字與英文字元都佔一個字元
string='' #設置一個空字元串
pointer=0 #當前指針為0
str1=file.read(6) #讀取6個字元
pointer+=6 #指針變數後移6個字元
string+=str1 #string用來存放已讀取的字元
print('取6個字元: ',str1)
file.seek(pointer) #指針從文件頭開始移動2個字元
str1=file.read(8) #從當前位置讀取10個字元
pointer+=8 #指針跳過已讀取的字元
string+=str1
print('再取8個字元: ',str1)
print('所有讀取的字元: ',string)
print('當前指針所處的位置: ',pointer)
str1=file.read(1)
print('當前指針所處的字元: ',str1)
運行結果如下:
取6個字元:
Python
再取8個字元:
是一種解釋型語言
所有讀取的字元:
Python是一種解釋型語言
當前指針所處的位置:
14
當前指針所處的字元:
:
3、讀取一行數據readline()方法
語法格式:
file.readline()
例:
with open('test.txt','r',encoding='utf-8') as f:
string=f.read(1) # 讀取文件的第一個字元
if string != '': # 防止文件為空文件
lineno=0
while True:
line=f.readline()
if line != '':
lineno+=1
print('第'+str(lineno)+'行:'+line,end='')
# 因為每行都有自帶的分行符,print()語句不允許換行
else:
break # 出現空行時停止讀取
else:
print('要讀取的文件為空文件!')
運行結果:
第1行:ython是一種解釋型語言: 這意味著開發過程中沒有了編譯這個環節。類似於PHP和Perl語言。
第2行:Python是互動式語言: 這意味著,您可以在一個 Python 提示符 >>> 後直接執行代碼。
第3行:Python是面向對象語言: 這意味著Python支持面向對象的風格或代碼封裝在對象的編程技術。
第4行:Python是初學者的語言:Python 對初級程序員而言,是一種偉大的語言,它支持廣泛的應用程序開發。
4、讀取全部行命令readlines()方法
語法格式:
File.readlines()
該方法與read()方法一樣,在調用read()方法讀取文件內容時,文件必須是以r(只讀)或者r+(讀寫)方式打開。
例:
with open('test.txt','r',encoding='utf-8') as f:
txt=f.readlines()
print(txt)
運行結果:
['Python是一種解釋型語言: 這意味著開發過程中沒有了編譯這個環節。類似於PHP和Perl語言。 ', 'Python是互動式語言: 這意味著,您可以在一個 Python 提示符 >>> 後直接執行代碼。 ', 'Python是面向對象語言: 這意味著Python支持面向對象的風格或代碼封裝在對象的編程技術。 ', 'Python是初學者的語言:Python 對初級程序員而言,是一種偉大的語言,它支持廣泛的應用程序開發。 ']
從上面的運行結果可以看出,readlines()方法的返回值為一個字元串列表。所以,也可以以讀取列表元素的方法輸出。如下所示:
with open('test.txt','r',encoding='utf-8') as f:
txt=f.readlines()
for line in txt:
print(line,end='')
運行結果:
Python是一種解釋型語言: 這意味著開發過程中沒有了編譯這個環節。類似於PHP和Perl語言。
Python是互動式語言: 這意味著,您可以在一個 Python 提示符 >>> 後直接執行代碼。
Python是面向對象語言: 這意味著Python支持面向對象的風格或代碼封裝在對象的編程技術。
Python是初學者的語言:Python 對初級程序員而言,是一種偉大的語言,它支持廣泛的應用程序開發。
15.5 寫入文件內容
語法格式如下:
file.write(string)
其中,file為打開的文件對象,string為要寫入的字元串。
寫入文件內容時,文件必須以w(可寫)或a(追加)模式打開。否則,會拋出如下異常提示:
Traceback (most recent call last):
File "C:.py", line 2, in
f.write('人生苦短,我用Python!')
io.UnsupportedOperation: not writable
關於write()方法的用法舉例如下:
with open('test.txt','a',encoding='utf-8') as f:
f.write('人生苦短,我用Python!')
with open('test.txt','r',encoding='utf-8') as f:
txt=f.read()
print(txt)
運行結果:
Python是一種解釋型語言: 這意味著開發過程中沒有了編譯這個環節。類似於PHP和Perl語言。
Python是互動式語言: 這意味著,您可以在一個 Python 提示符 >>> 後直接執行代碼。
Python是面向對象語言: 這意味著Python支持面向對象的風格或代碼封裝在對象的編程技術。
Python是初學者的語言:Python 對初級程序員而言,是一種偉大的語言,它支持廣泛的應用程序開發。
人生苦短,我用Python!
可以看出,由於文件的打開方式為a模式(追加模式),寫入的內容被寫入到文件的末尾。
在Python中,文件操作方法里沒有類似於字元串內的計算長度、查找、替換、截取、分隔等方法,為什麼沒有?原因可能是文件的類型太復雜,譬如說二進制文件,上述操作的意義不大。如果僅僅要對文本文件進行上述操作,完全可以先把文件的內容讀取到字元串中,再用相應的字元串函數或方法去操作就可以了。譬如,要將test.txt文件中的字元串『Python』替換為』PHP』,則可以用如下代碼完成:
txt1=''
with open('test.txt','r',encoding='utf-8') as f:
txt1=f.read() #先將文件內容存入字元串txt1中
txt2=txt1.replace('Python','PHP') #將txt1中的'Python'替換為'PHP',並存入txt2
with open('test.txt','w',encoding='utf-8') as f:
f.write(txt2) #將字元串txt2的內容寫回到文件中
這里之所以分兩步打開文件(第一次為r模式,第二次為w模式),而沒有採用一次讀寫(r+、w+方式),因為那樣比較容易出錯。實踐證明,將文件的讀操作和寫操作分開其實是非常正確的選擇。
② python中使用_thread模塊創建進程怎麼使用可選參數
_thread.start_new_thread(fun1,('thread_1', 4, '參數3'))
_thread.start_new_thread(fun2,('thread_1', 2, '參數3'))
③ python怎麼查看函數有什麼參數
在開發中我們可以藉助於相關插件或使用Python內置函數"help()」來查看某個函數的參數說明,以查看內置函數sorted()為例:
④ python如何將可選參數或關鍵字參數從一個函數傳遞到另一個函數
使用函數參數列表中的*和**說明符收集參數;這會將位置參數作為元組,將關鍵字參數作為字典。然後,您可以使用*和**調用另一個函數時傳遞這些參數:
def f(x, *args, **kwargs):
...
kwargs['width'] = '14.3c'
...
g(x, *args, **kwargs)
⑤ python 函數參數類型
python 的函數參數類型分為4種:
1.位置參數:調用函數時根據函數定義的參數位置來傳遞參數,位置參數也可以叫做必要參數,函數調用時必須要傳的參數。
當參數滿足函數必要參數傳參的條件,函數能夠正常執行:
add(1,2) #兩個參數的順序必須一一對應,且少一個參數都不可以
當我們運行上面的程序,輸出:
當函數需要兩個必要參數,但是調用函數只給了一個參數時,程序會拋出異常
add(1)
當我們運行上面的程序,輸出:
當函數需要兩個必要參數,但是調用函數只給了三個參數時,程序會拋出異常
add(1,2,3)
當我們運行上面的程序,輸出
2.關鍵字參數:用於函數調用,通過「鍵-值」形式加以指定。可以讓函數更加清晰、容易使用,同時也清除了參數的順序需求。
add(1,2) # 這種方式傳參,必須按順序傳參:x對應1,y對應:2
add(y=2,x=1) #以關健字方式傳入參數(可以不按順序)
正確的調用方式
add(x=1, y=2)
add(y=2, x=1)
add(1, y=2)
以上調用方式都是允許的,能夠正常執行
錯誤的調用方式
add(x=1, 2)
add(y=2, 1)
以上調用都會拋出SyntaxError 異常
上面例子可以看出:有位置參數時,位置參數必須在關鍵字參數的前面,但關鍵字參數之間不存在先後順序的
3.默認參數:用於定義函數,為參數提供默認值,調用函數時可傳可不傳該默認參數的值,所有位置參數必須出現在默認參數前,包括函數定義和調用,有多個默認參數時,調用的時候,既可以按順序提供默認參數,也可以不按順序提供部分默認參數。當不按順序提供部分默認參數時,需要把參數名寫上
默認參數的函數定義
上面示例第一個是正確的定義位置參數的方式,第二個是錯誤的,因為位置參數在前,默認參數在後
def add1(x=1,y) 的定義會拋出如下異常
默認參數的函數調用
注意:定義默認參數默認參數最好不要定義為可變對象,容易掉坑
不可變對象:該對象所指向的內存中的值不能被改變,int,string,float,tuple
可變對象,該對象所指向的內存中的值可以被改變,dict,list
這里只要理解一下這個概念就行或者自行網路,後續會寫相關的專題文章講解
舉一個簡單示例
4.可變參數區別:定義函數時,有時候我們不確定調用的時候會多少個參數,j就可以使用可變參數
可變參數主要有兩類:
*args: (positional argument) 允許任意數量的可選位置參數(參數),將被分配給一個元組, 參數名前帶*,args只是約定俗成的變數名,可以替換其他名稱
**kwargs:(keyword argument) 允許任意數量的可選關鍵字參數,,將被分配給一個字典,參數名前帶**,kwargs只是約定俗成的變數名,可以替換其他名稱
*args 的用法
args 是用來傳遞一個非鍵值對的可變數量的參數列表給函數
語法是使用 符號的數量可變的參數; 按照慣例,通常是使用arg這個單詞,args相當於一個變數名,可以自己定義的
在上面的程序中,我們使用* args作為一個可變長度參數列表傳遞給add()函數。 在函數中,我們有一個循環實現傳遞的參數計算和輸出結果。
還可以直接傳遞列表或者數組的方式傳遞參數,以數組或者列表方式傳遞參數名前面加(*) 號
理解* * kwargs
**kwargs 允許你將不定長度的鍵值對, 作為參數傳遞給函數,這些關鍵字參數在函數內部自動組裝為一個dict
下篇詳細講解 *args, **kwargs 的參數傳遞和使用敬請關注
⑥ Python參數類型
上一期我們學習參數傳遞怎麼傳遞,也了解了參數的幾種類型。
首先,我們再來回顧一下,形參和實參:
形參是在定義函數時定義的,放在函數名後面的圓括弧里,可為空
實參是調用函數時為形參傳入具體的參數值
簡單總結一下,誰調用函數,誰就負責傳入參數。
好吶,本期我們來詳細學習函數幾種參數類型,大綱如下:
python函數的參數名是無意義的,Python允許在調用函數時通過通過名字來傳入參數值。
位置參數:按照形參位置傳入的參數
調用函數時,實參默認按位置順序傳遞的。同時實參個數也要和形參匹配
舉一個小栗子
如果實參的個數與形參不匹配時,調用函數運行就會報錯
Python中,形參與調用函數緊密聯系在一起的。
關鍵字參數:調用函數時,使形參名稱來傳遞參數,形式為「形參名=實參」
關鍵字參數,又叫命名參數,傳遞時無需考慮參數位置和順序
舉一個小栗子
默認參數:定義函數時,我們可以為形參提前設置具體的值。
在定義函數時,默認參數要放到位置等其他參數後面
在調用函數時,默認參數是可選的。如果傳入新值,則會覆蓋默認值
舉一個小栗子
注意,默認值不能位於位置參數前面,否則程序會報錯誤
不定長參數又名可變參數。
不定長參數指的是可變數量的參數,分兩種情況:
如果不定長參數後面,可以新增參數嗎?
我們通過例子來看,會發生什麼?
運行上面的程序,Python解釋器會報錯
原因是,形參a已經是不定長參數,我們調用的test(2,3,4)傳入的三個實參,系統自動把它們屬於形參a的值,形參b 和形參c就等於沒有值傳入,這時候系統就認為,調用函數的對象,參數沒有傳夠。
為了解決這一報錯,python引入了 強制命名參數
規定,調用不定參數後面有跟位置參數的函數時,傳入給位置參數時,必須要強制命名參進行傳參。
逆向參數收集針對的對象傳入函數的實參
調用函數時,如果實參是元組,列表或者字典,通過在實參前面加入星號,可以自動把元素進行隔開,然後再轉入給函數進行處理
舉一個小栗子
本期,我們詳細學習了參數幾種類型,為後面我們學習函數,打好基礎。
實踐是檢驗真理的過程,大家多動手練習練習,會有不一樣的奇妙旅程~
好吶,以上是本期內容,歡迎大佬們評論區指正~
⑦ python中eval是幹嘛的
eval是Python的一個內置函數,功能十分強大,這個函數的作用是,返回傳入字元串的表達式的結果。就是說:將字元串當成有效的表達式來求值並返回計算結果。
eval函數就是實現list、dict、tuple與str之間的轉化,同樣str函數把list,dict,tuple轉為為字元串
eval的語法:
eval(expression])expression:表達式。globals:(可選參數)變數作用域,全局命名空間,如果被提供,則必須是一個字典對象。locals:(可選參數)變數作用域,局部命名空間,如果被提供,可以是任何映射對象。
簡介:
eval函數主要是用來實現python中各種數據類型與str之間的轉換。字元串中包含的什麼,通過eval函數就可以輸出什麼。
比如字元串裡麵包含的字典就輸出字典,包含的列表就輸出列表,但是字元串相應的格式一定要輸入正確,否則會報錯。
⑧ Python的函數和參數
parameter 是函數定義的參數形式
argument 是函數調用時傳入的參數實體。
對於函數調用的傳參模式,一般有兩種:
此外,
也是關鍵字傳參
python的函數參數定義一般來說有五種: 位置和關鍵字參數混合 , 僅位置參數 , 僅關鍵字參數 , 可變位置參數 , 可變關鍵字參數 。其中僅位置參數的方式僅僅是一個概念,python語法中暫時沒有這樣的設計。
通常我們見到的函數是位置和關鍵字混合的方式。
既可以用關鍵字又可以用位置調用
或
這種方式的定義只能使用關鍵字傳參的模式
f(*some_list) 與 f(arg1, arg2, ...) (其中some_list = [arg1, arg2, ...])是等價的
網路模塊request的request方法的設計
多數的可選參數被設計成可變關鍵字參數
有多種方法能夠為函數定義輸出:
非常晦澀
如果使用可變對象作為函數的默認參數,會導致默認參數在所有的函數調用中被共享。
例子1:
addItem方法的data設計了一個默認參數,使用不當會造成默認參數被共享。
python裡面,函數的默認參數被存在__default__屬性中,這是一個元組類型
例子2:
在例子1中,默認參數是一個列表,它是mutable的數據類型,當它寫進 __defauts__屬性中時,函數addItem的操作並不會改變它的id,相當於 __defauts__只是保存了data的引用,對於它的內存數據並不關心,每次調用addItem,都可以修改 addItem.__defauts__中的數據,它是一個共享數據。
如果默認參數是一個imutable類型,情況將會不一樣,你無法改變默認參數第一次存入的值。
例子1中,連續調用addItem('world') 的結果會是
而不是期望的
⑨ index在python中的用法
如下:
1、index函數:用於從列表中找出某個值第一個匹配項的索引位置。
2、index方法語法:list.index(x[,start[,end]])。
3、參數:x-- 查找的對象。start-- 可選,查找的起始位置。end-- 可選,查找的結束位置。
4、返回值:該方法返回查找對象的索引位置,如果沒有找到對象則拋出異常。
5、實例:
代碼:str1="thisisstringexample....wow!!!";str2="exam"。
index函數為print(str1.index(str2))。
python中index函數怎麼用?
Python中index方法檢測字元串中是否包含子字元串 str ,如果指定 beg(開始) 和 end(結束) 范圍,則檢查是否包含在指定范圍內,該方法與 python find方法一樣,只不過如果str不在string中會報一個異常。
index函數一般用處是在序列中檢索參數並返回第一次出現的索引,沒找到就會報錯。
⑩ python中np.zeros中的參數是什麼意思
shape:形狀
dtype:數據類型,可選參數,默認numpy.float64
t ,位域
b,布爾值,true or false
i,整數,如i8(64位)
u,無符號整數,u8(64位)
f,浮點數,f8(64位)
c,浮點負數,
o,對象,
s,a,字元串,s24
u,unicode,u24
order:可選參數,c代表與c語言類似,行優先;F代表列優先