python27函數
Ⅰ python函數調用
inname = r"C:\Python27\esri.shp"
outname = "outname.cst"
# 在此處調用該函數。函數體定義必須放在調用以前。可以通過import
read_ESRT_……(file = inname, fileOut = outname)
# 這兩個參數只是字元串而已,指明你的文件路徑。注意在python中,若有 \ 號,則最好使用 \\ 雙斜杠,或者如上例,加上前綴 r
Ⅱ python 8個常用內置函數解說
8個超好用內置函數set(),eval(),sorted(),reversed(),map(),rece(),filter(),enumerate()
python中有許多內置函數,不像print那麼廣為人知,但它們卻異常的強大,用坦棗好了可以大大提高代碼效率。
這次來梳理下8個好用的python內置函數
1、set()
當需要對一個列表進行去重操作的時候,set()函數就派上用場了。
用於創建一個集合,集合里的元素是無序且不重復的。集合對象創建後,還能使用並集、交集、差集功能。
2、eval()之前有人問如何用python寫一個四則運算器,輸入字元串公式,直接產生結果。用eval()來做就很簡單:eval(str_expression)作用是將字元串轉換成表達式,並且執行。
3、sorted()在處理數據過程中,我們經常會用到排序操作,比如將列表、字典、元組裡面的元素正/倒排序。這時候就需要用到sorted() ,它可以對任何可迭代對象進行排序,並返回列表。對列表升序操作:
對元組倒序操作:
使用參數:key,根據自定義規則,按字元串長度來排序:
根據自定義規則,對元組構成的列表進行排序:
4、reversed()如果需要對序列的元素進行反轉操作,reversed()函數能幫到你。reversed()接受一個序列,將序列里的元素反轉,並最終返回迭代器。
5、map()做文本處理的時候,假如要對序列里的每個單詞進行大寫轉化操作。這個時候就可以使用map()函數。
map()會根據提供的函數,對指定的序列做映射,最終返回迭代器。也就是說map()函數會把序列里的每一個元素用指定的方法加工一遍,最終返回給你加工好的序列。舉個例子,對列表裡的每個數字作平方處理:
6、rece()前面說空備到對列表裡的每個數字作平方處理,用map()函數。那我想將列表裡的每個元素相乘,該怎麼做呢?這時候用到rece()函數。
rece()會對參數序列中元素進行累積。第一、第二個元素先進行函數操作,生成的結果再和第三個元素進行函數操作,以此類推,最終生成所有元素累積運讓虧拆算的結果。再舉個例子,將字母連接成字元串。
你可能已經注意到,rece()函數在python3里已經不再是內置函數,而是遷移到了functools模塊中。這里把rece()函數拎出來講,是因為它太重要了。
7、filter()一些數字組成的列表,要把其中偶數去掉,該怎麼做呢?
filter()函數輕松完成了任務,它用於過濾序列,過濾掉不符合條件的元素,返回一個迭代器對象。filter()函數和map()、rece()函數類似,都是將序列里的每個元素映射到函數,最終返回結果。我們再試試,如何從許多單詞里挑出包含字母w的單詞。
8、enumerate()這樣一個場景,同時列印出序列里每一個元素和它對應的順序號,我們用enumerate()函數做做看。
enumerate翻譯過來是枚舉、列舉的意思,所以說enumerate()函數用於對序列里的元素進行順序標注,返回(元素、索引)組成的迭代器。再舉個例子說明,對字元串進行標注,返回每個字母和其索引。
Ⅲ python中函數包括
1. print()函數:列印字元串
2. raw_input()函數:從用戶鍵盤捕獲字元
3. len()函數:計算字元長度
4. format(12.3654,'6.2f'/'0.3%')函數:實現格式化輸出
5. type()函數:查詢對象的類型
6. int()函數、float()函數、str()函數等:類型的轉化函數
7. id()函數:獲取對象的內存地址
8. help()函數:Python的幫助函數
9. s.islower()函數:判斷字元小寫
10. s.sppace()函數:判斷是否為空格
11. str.replace()函數:替換字元
12. import()函數:引進庫
13. math.sin()函數:sin()函數
14. math.pow()函數:計算次方函數
15. 3**4: 3的4次方
16. pow(3,4)函數:3的4次方
17. os.getcwd()函數:獲取當前工作目錄
18. listdir()函數:顯示當前目錄下的文件
19. socket.gethostbyname()函數:獲得某主機的IP地址
20. urllib.urlopen(url).read():打開網路內容並存儲
21. open().write()函數:寫入文件
22. webbrowser.open_new_tab()函數:新建標簽並使用瀏覽器打開指定的網頁
23. def function_name(parameters):自定義函數
24. time.sleep()函數:停止一段時間
25. random.randint()函數:產生隨機數
Ⅳ python中常用的函數有多少個(python中有哪些函數)
導讀:本篇文章首席CTO筆記來給大家介紹有關python中常用的函數有多少個的相關內容,希望對大家有所幫助,一起來看看吧。
Python常用函數三有哪些?這7個函數使用頻率最高,總算搞明白了1.1例如:print(hex(2))案例
1.2輸出函數:print(hex(2))
1.3輸出結果:0x2
1.4解析說明:返回16進制的數。
2.1例如:print(chr(10))案例
2.2輸出函數:print(chr(10))
2.3輸出結果:0o12
2.4解析說明:返回當前整數對應的ASCll碼
3.1例如:print(ord("b"))案例
3.2輸出函數:print(ord("b"))
3.3輸出結果:98
3.4解析說明:返回當前ASCll碼的10進制數
4.1例如:print(chr(97))
4.2輸出函數:print(chr(97))
4.3輸出結果:b
4.4解析說明:返回當前ASCll碼的10進制數。
案例一:給你一個字元串,s='hellokitty'
1.1輸出函數:print(s.capitalize())
1.2輸出結果:0x2
1.3解析說明:返回16進制的數。
2.1輸出函數:print(s.replace('kitty','kuang'))
2.2輸出結果:hellokuang
2.3解析說明:替換功能,將kitty換成kuang。
2.4輸出函數:print(s.replace(Ɗ','KK'))
2.5輸出結果:12KK12KK
2.6解析說明:所有的4都替換成KK
2.7輸出函數:print(s.replace(Ɗ','KK'))
2.8輸出結果:12KK12KK124
2.9解析說明:將前兩個的4替換成go
案例一:給你一個字元串,ip=餘.168.1.1'
3.1輸出函數:print(ip.split(','))
3.2輸出結果:[餘.168.1.1']
3.3解析說明:將字元串分割成列表
案例一:給你一個字元串,ip=餘.168.1.1'
3.3輸出函數:print(ip.split(',',2))
3.4輸出結果:[餘.168.1.1']
3.5解析說明:從第二個開始分割成列表
Python的函數都有哪些?
Python函數
函數是組織好的,可重復使用的,用來實現單一,或相關聯功能的代碼段。
函數能提高應用的模塊性,和代碼的重復利用率。你已經知道Python提供了許多內建函數,比如print()。但你也可以自己創建函數,這被叫做用戶自定義函數。
定義一個函數
你可以定義一個由自己想要功能的函數,以下是簡單的規則:
函數代碼塊以?def?關鍵詞開頭,後接函數標識符名稱和圓括弧()。
任何傳入參數和自變數必須放在圓括弧中間。圓括弧之間可以用於定義參數。
函數的第一行語句可以選擇性地使用文檔字元串—用於存放函數說明。
函數內容以冒號起始,並且縮進。
return[表達式]?結束函數,選擇性地返回一個值給調用方。不帶表達式的return相當於返回None。
語法
deffunctionname(parameters):?"函數_文檔字元串"
?function_suite
?return[expression]
默認情況下,參數值和參數名稱是按函數聲明中定義的順序匹配起來的。
實例
以下為一個簡單的Python函數,它將一個字元串作為傳入參數,再列印到標准顯示設備上。
實例(Python2.0+)
defprintme(str):?"列印傳入的字元串到標准顯示設備上"
?printstr
?return
函數調用
定義一個函數只給了函數一個名稱,指定了函數里包含的參數,和代碼塊結構。
這個函數的基本結構完成以後,你可以通過另一個函數調用執行,也可以直接從Python提示符執行。
如下實例調用了printme()函數:
實例(Python2.0+)
#!/usr/bin/python#-*-coding:UTF-8-*-
#定義函數defprintme(str):?"列印任何傳入的字元串"
?printstr
?return
#調用函數printme("我要調用用戶自定義函數!")printme("再次調用同一函數")
以上實例輸出結果:
我要調用用戶自定義函數!再次調用同一函數
參數傳遞
在python中,類型屬於對象,變數是沒有類型的:
a=[1,2,3]
a="Runoob"
以上代碼中,[1,2,3]?是List類型,"Runoob"?是String類型,而變數a是沒有類型,她僅僅是一個對象的引用(一個指針),可以是List類型對象,也可以指向String類型對象。
可更改(mutable)與不可更改(immutable)對象
在python中,strings,tuples,和numbers是不可更改的對象,而list,dict等則是可以修改的對象。
不可變類型:變數賦值?a=5?後再賦值?a=10,這里實際是新生成一個int值對象10,再讓a指向它,而5被丟棄,不是改變a的值,相當於新生成了a。
可變類型:變數賦值?la=[1,2,3,4]?後再賦值?la[2]=5?則是將listla的第三個元素值更改,本身la沒有動,只是其內部的一部分值被修改了。
python函數的參數傳遞:
不可變類型:類似c++的值傳遞,如整數、字元串、元組。如fun(a),傳遞的只是a的值,沒有影響a對象本身。比如在fun(a)內部修改a的值,只是修改另一個復制的對象,不會影響a本身。
可變類型:類似c++的引用傳遞,如列表,字典。如fun(la),則是將la真正的傳過去,修改後fun外部的la也會受影響
python中一切都是對象,嚴格意義我們不能說值傳遞還是引用傳遞,我們應該說傳不可變對象和傳可變對象。
python傳不可變對象實例
實例(Python2.0+)
#!/usr/bin/python#-*-coding:UTF-8-*-
defChangeInt(a):??a=10
b=2ChangeInt(b)printb#結果是2
實例中有int對象2,指向它的變數是b,在傳遞給ChangeInt函數時,按傳值的方式復制了變數b,a和b都指向了同一個Int對象,在a=10時,則新生成一個int值對象10,並讓a指向它。
傳可變對象實例
實例(Python2.0+)
#!/usr/bin/python#-*-coding:UTF-8-*-
#可寫函數說明defchangeme(mylist):?"修改傳入的列表"
?mylist.append([1,2,3,4])
?print"函數內取值:",mylist
?return
#調用changeme函數mylist=[10,20,30]changeme(mylist)print"函數外取值:",mylist
實例中傳入函數的和在末尾添加新內容的對象用的是同一個引用,故輸出結果如下:
函數內取值:?[10,20,30,[1,2,3,4]]函數外取值:?[10,20,30,[1,2,3,4]]
參數
以下是調用函數時可使用的正式參數類型:
必備參數
關鍵字參數
默認參數
不定長參數
必備參數
必備參數須以正確的順序傳入函數。調用時的數量必須和聲明時的一樣。
調用printme()函數,你必須傳入一個參數,不然會出現語法錯誤:
實例(Python2.0+)
#!/usr/bin/python#-*-coding:UTF-8-*-
#可寫函數說明defprintme(str):?"列印任何傳入的字元串"
?printstr
?return
#調用printme函數printme()
以上實例輸出結果:
Traceback(mostrecentcalllast):
?File"test.py",line11,inmole
??printme()TypeError:printme()takesexactly1argument(0given)
關鍵字參數
關鍵字參數和函數調用關系緊密,函數調用使用關鍵字參數來確定傳入的參數值。
使用關鍵字參數允許函數調用時參數的順序與聲明時不一致,因為Python解釋器能夠用參數名匹配參數值。
以下實例在函數printme()調用時使用參數名:
實例(Python2.0+)
#!/usr/bin/python#-*-coding:UTF-8-*-
#可寫函數說明defprintme(str):?"列印任何傳入的字元串"
?printstr
?return
#調用printme函數printme(str="Mystring")
以上實例輸出結果:
Mystring
下例能將關鍵字參數順序不重要展示得更清楚:
實例(Python2.0+)
#!/usr/bin/python#-*-coding:UTF-8-*-
#可寫函數說明defprintinfo(name,age):?"列印任何傳入的字元串"
?print"Name:",name
?print"Age",age
?return
#調用printinfo函數printinfo(age=50,name="miki")
以上實例輸出結果:
Name:?mikiAge?50
默認參數
調用函數時,默認參數的值如果沒有傳入,則被認為是默認值。下例會列印默認的age,如果age沒有被傳入:
實例(Python2.0+)
#!/usr/bin/python#-*-coding:UTF-8-*-
#可寫函數說明defprintinfo(name,age=35):?"列印任何傳入的字元串"
?print"Name:",name
?print"Age",age
?return
#調用printinfo函數printinfo(age=50,name="miki")printinfo(name="miki")
以上實例輸出結果:
Name:?mikiAge?50Name:?mikiAge?35
不定長參數
你可能需要一個函數能處理比當初聲明時更多的參數。這些參數叫做不定長參數,和上述2種參數不同,聲明時不會命名。基本語法如下:
deffunctionname([formal_args,]*var_args_tuple):?"函數_文檔字元串"
?function_suite
?return[expression]
加了星號(*)的變數名會存放所有未命名的變數參數。不定長參數實例如下:
實例(Python2.0+)
#!/usr/bin/python#-*-coding:UTF-8-*-
#可寫函數說明defprintinfo(arg1,*vartuple):?"列印任何傳入的參數"
?print"輸出:"
?printarg1
?forvarinvartuple:???printvar
?return
#調用printinfo函數printinfo(10)printinfo(70,60,50)
以上實例輸出結果:
輸出:10輸出:706050
匿名函數
python使用lambda來創建匿名函數。
lambda只是一個表達式,函數體比def簡單很多。
lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
lambda函數擁有自己的命名空間,且不能訪問自有參數列表之外或全局命名空間里的參數。
雖然lambda函數看起來只能寫一行,卻不等同於C或C++的內聯函數,後者的目的是調用小函數時不佔用棧內存從而增加運行效率。
語法
lambda函數的語法只包含一個語句,如下:
lambda[arg1[,arg2,.....argn]]:expression
如下實例:
實例(Python2.0+)
#!/usr/bin/python#-*-coding:UTF-8-*-
#可寫函數說明sum=lambdaarg1,arg2:arg1+arg2
#調用sum函數print"相加後的值為:",sum(10,20)print"相加後的值為:",sum(20,20)
以上實例輸出結果:
相加後的值為:?30相加後的值為:?40
return語句
return語句[表達式]退出函數,選擇性地向調用方返回一個表達式。不帶參數值的return語句返回None。之前的例子都沒有示範如何返回數值,下例便告訴你怎麼做:
實例(Python2.0+)
#!/usr/bin/python#-*-coding:UTF-8-*-
#可寫函數說明defsum(arg1,arg2):?#返回2個參數的和."
?total=arg1+arg2
?print"函數內:",total
?returntotal
#調用sum函數total=sum(10,20)
以上實例輸出結果:
函數內:?30
變數作用域
一個程序的所有的變數並不是在哪個位置都可以訪問的。訪問許可權決定於這個變數是在哪裡賦值的。
變數的作用域決定了在哪一部分程序你可以訪問哪個特定的變數名稱。兩種最基本的變數作用域如下:
全局變數
局部變數
全局變數和局部變數
定義在函數內部的變數擁有一個局部作用域,定義在函數外的擁有全局作用域。
局部變數只能在其被聲明的函數內部訪問,而全局變數可以在整個程序范圍內訪問。調用函數時,所有在函數內聲明的變數名稱都將被加入到作用域中。如下實例:
實例(Python2.0+)
#!/usr/bin/python#-*-coding:UTF-8-*-
total=0#這是一個全局變數#可寫函數說明defsum(arg1,arg2):?#返回2個參數的和."
?total=arg1+arg2#total在這里是局部變數.
?print"函數內是局部變數:",total
?returntotal
#調用sum函數sum(10,20)print"函數外是全局變數:",total
以上實例輸出結果:
函數內是局部變數:?30函數外是全局變數:?0
python裡面有哪些自帶函數?python系統提供了下面常用的函數:
1.數學庫模塊(math)提供了很多數學運算函數;
2.復數模塊(cmath)提供了用於復數運算的函數;
3.隨機數模塊(random)提供了用來生成隨機數的函數;
4.時間(time)和日歷(calendar)模塊提供了能處理日期和時間的函數。
注意:在調用系統函數之前,先要使用import語句導入相應的模塊
該語句將模塊中定義的函數代碼復制到自己的程序中,然後就可以訪問模塊中的任何函數,其方法是在函數名前面加上「模塊名.」。
希望能幫到你。
python函數有哪些1、print()函數:列印字元串;
2、raw_input()函數:從用戶鍵盤捕獲字元;
3、len()函數:計算字元長度;
4、format()函數:實現格式化輸出;
5、type()函數:查詢對象的類型;
6、int()函數、float()函數、str()函數等:類型的轉化函數;
7、id()函數:獲取對象的內存地址;
8、help()函數:Python的幫助函數;
9、s.islower()函數:判斷字元小寫;
10、s.sppace()函數:判斷是否為空格;
11、str.replace()函數:替換字元;
12、import()函數:引進庫;
13、math.sin()函數:sin()函數;
14、math.pow()函數:計算次方函數;
15、os.getcwd()函數:獲取當前工作目錄;
16、listdir()函數:顯示當前目錄下的文件;
17、time.sleep()函數:停止一段時間;
18、random.randint()函數:產生隨機數;
19、range()函數:返回一個列表,列印從1到100;
20、file.read()函數:讀取文件返回字元串;
21、file.readlines()函數:讀取文件返回列表;
22、file.readline()函數:讀取一行文件並返回字元串;
23、split()函數:用什麼來間隔字元串;
24、isalnum()函數:判斷是否為有效數字或字元;
25、isalpha()函數:判斷是否全為字元;
26、isdigit()函數:判斷是否全為數字;
27、lower()函數:將數據改成小寫;
28、upper()函數:將數據改成大寫;
29、startswith(s)函數:判斷字元串是否以s開始的;
30、endwith(s)函數:判斷字元串是否以s結尾的;
31、file.write()函數:寫入函數;
32、file.writeline()函數:寫入文件;
33、abs()函數:得到某數的絕對值;
34、file.sort()函數:對書數據排序;
35、tuple()函數:創建一個元組;
36、find()函數:查找返回的是索引;
37、dict()函數:創建字典;
38、clear()函數:清楚字典中的所有項;
39、()函數:復制一個字典,會修改所有的字典;
40、get()函數:查詢字典中的元素。
…………
python常用函數1、complex()
返回一個形如?a+bj?的復數,傳入參數分為三種情況:
參數為空時,返回0j;參數為字元串時,將字元串表達式解釋為復數形式並返回;參數為兩個整數(a,b)時,返回?a+bj;參數只有一個整數a時,虛部b默認為0,函數返回?a+0j。
2、dir()
不提供參數時,返回當前本地范圍內的名稱列表;提供一個參數時,返回該對象包含的全部屬性。
3、divmod(a,b)
a--代表被除數,整數或浮點數;b--代表除數,整數或浮點數;根據除法運算計算a,b之間的商和余數,函數返回一個元組(p,q)?,p代表商?a//b?,q代表余數?a%b。
4、enumerate(iterable,start=0)
iterable--一個可迭代對象,列表、元組序列等;start--計數索引值,默認初始為0『該函數返回枚舉對象是個迭代器,利用next()方法依次返回元素值,每個元素以元組形式存在,包含一個計數元素(起始為start)和iterable中對應的元素值。
python有多少內置函數Python內置函數有很多,為大家推薦5個神仙級的內置函數:
(1)Lambda函數
用於創建匿名函數,即沒有名稱的函數。它只是一個表達式,函數體比def簡單很多。當我們需要創建一個函數來執行單個操作並且可以在一行中編寫時,就可以用到匿名函數了。
Lamdba的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
利用Lamdba函數,往往可以將代碼簡化許多。
(2)Map函數
會將一個函數映射到一個輸入列表的所有元素上,比如我們先創建了一個函數來返回一個大寫的輸入單詞,然後將此函數應有到列表colors中的所有元素。
我們還可以使用匿名函數lamdba來配合map函數,這樣可以更加精簡。
(3)Rece函數
當需要對一個列表進行一些計算並返回結果時,rece()是個非常有用的函數。舉個例子,當需要計算一個整數列表所有元素的乘積時,即可使用rece函數實現。
它與函數的最大的區別就是,rece()里的映射函數(function)接收兩個參數,而map接收一個參數。
(4)enumerate函數
用於將一個可遍歷的數據對象(如列表、元組或字元串)組合為一個索引序列,同時列出數據和數據下標,一般用在for循環當中。
它的兩個參數,一個是序列、迭代器或其他支持迭代對象;另一個是下標起始位置,默認情況從0開始,也可以自定義計數器的起始編號。
(5)Zip函數
用於將可迭代的對象作為參數,將對象中對應的元素打包成一個個元組,然後返回由這些元組組成的列表
當我們使用zip()函數時,如果各個迭代器的元素個數不一致,則返回列表長度與最短的對象相同。
Ⅳ python函數可以有多少個參數(2023年最新解答)導讀:很多朋友問到關於python函數可以有多少個參數的相關問題,本文首席CTO筆記就來為大家做個詳細解答,供大家參考,希望對大家有所幫助!一起來看看吧!
Python函數的參數類型Python函數的參數類型主要包括必選參數、可選參數、可變參數、位置參數和關鍵字參數,本文介紹一下他們的定義以及可變數據類型參數傳遞需要注意的地方。
必選參數(Requiredarguments)是必須輸入的參數,比如下面的代碼,必須輸入2個參數,否則就會報錯:
其實上面例子中的參數num1和num2也屬於關鍵字參數,比如可以通過如下方式調用:
執行結果:
可選參數(Optionalarguments)可以不用傳入函數,有一個默認值,如果沒有傳入會使用默認值,不會報錯。
位置參數(positionalarguments)根據其在函數定義中的位置調用,下面是pow()函數的幫助信息:
x,y,z三個參數的的順序是固定的,並且不能使用關鍵字:
輸出:
在上面的pow()函數幫助信息中可以看到位置參數後面加了一個反斜杠/,這是python內置函數的語法定義,Python開發人員不能在python3.8版本之前的代碼中使用此語法。但python3.0到3.7版本可以使用如下方式定義位置參數:
星號前面的參數為位置參數或者關鍵字參數,星號後面是強制關鍵字參數,具體介紹見強制關鍵字參數。
python3.8版本引入了強制位置參數(Positional-OnlyParameters),也就是我們可以使用反斜杠/語法來定義位置參數了,可以寫成如下形式:
來看下面的例子:
python3.8運行:
不能使用關鍵字參數形式賦值了。
可變參數(varargsargument)就是傳入的參數個數是可變的,可以是0-n個,使用星號(*)將輸入參數自動組裝為一個元組(tuple):
執行結果:
關鍵字參數(keywordargument)允許將任意個含參數名的參數導入到python函數中,使用雙星號(**),在函數內部自動組裝為一個字典。
執行結果:
上面介紹的參數可以混合使用:
結果:
注意:由於傳入的參數個數不定,所以當與普通參數一同使用時,必須把帶星號的參數放在最後。
強制關鍵字參數(Keyword-OnlyArguments)是python3引入的特性,可參考:。使用一個星號隔開:
在位置參數一節介紹過星號前面的參數可以是位置參數和關鍵字參數。星號後面的參數都是強制關鍵字參數,必須以指定參數名的方式傳參,如果強制關鍵字參數沒有設置默認參數,調用函數時必須傳參。
執行結果:
也可以在可變參數後面命名關鍵字參數,這樣就不需要星號分隔符了:
執行結果:
在Python對象及內存管理機制中介紹了python中的參數傳遞屬於對象的引用傳遞(passbyobjectreference),在編寫函數的時候需要特別注意。
先來看個例子:
執行結果:
l1和l2指向相同的地址,由於列表可變,l1改變時,l2也跟著變了。
接著看下面的例子:
結果:
l1沒有變化!為什麼不是[1,2,3,4]呢?
l=l+[4]表示創建一個「末尾加入元素4「的新列表,並讓l指向這個新的對象,l1沒有進行任何操作,因此l1的值不變。如果要改變l1的值,需要加一個返回值:
結果:
下面的代碼執行結果又是什麼呢?
執行結果:
和第一個例子一樣,l1和l2指向相同的地址,所以會一起改變。這個問題怎麼解決呢?
可以使用下面的方式:
也可以使用淺拷貝或者深度拷貝,具體使用方法可參考Python對象及內存管理機制。這個問題在Python編程時需要特別注意。
本文主要介紹了python函數的幾種參數類型:必選參數、可選參數、可變參數、位置參數、強制位置參數、關鍵字參數、強制關鍵字參數,注意他們不是完全獨立的,比如必選參數、可選參數也可以是關鍵字參數,位置參數可以是必選參數或者可選參數。
另外,python中的參數傳遞屬於對象的引用傳遞,在對可變數據類型進行參數傳遞時需要特別注意,如有必要,使用python的拷貝方法。
參考文檔:
--THEEND--
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.默認參數:用於定義函數,為參數提供默認值,調用函數時可傳可不傳該默認參數的值,所有位置參數必須出現在默認參數前,包括函數定義和調用,有多個默認參數時,調用的時候,既可以按順序提供默認參數,也可以不按順序提供部分默認參數。當不按順序提供部分默認參數時,需要把參數名寫上
默認參數的函數定義
上面示例第一個是正確的定義位置參數的方式,第二個是錯誤的,因為位置參數在前,默認參數在後
defadd1(x=1,y)的定義會拋出如下異常
默認參數的函數調用
注意:定義默認參數默認參數最好不要定義為可變對象,容易掉坑
不可變對象:該對象所指向的內存中的值不能被改變,int,string,float,tuple
可變對象,該對象所指向的內存中的值可以被改變,dict,list
這里只要理解一下這個概念就行或者自行網路,後續會寫相關的專題文章講解
舉一個簡單示例
4.可變參數區別:定義函數時,有時候我們不確定調用的時候會多少個參數,j就可以使用可變參數
可變參數主要有兩類:
*args:(positionalargument)允許任意數量的可選位置參數(參數),將被分配給一個元組,參數名前帶*,args只是約定俗成的變數名,可以替換其他名稱
**kwargs:(keywordargument)允許任意數量的可選關鍵字參數,,將被分配給一個字典,參數名前帶**,kwargs只是約定俗成的變數名,可以替換其他名稱
*args的用法
args是用來傳遞一個非鍵值對的可變數量的參數列表給函數
語法是使用符號的數量可變的參數;按照慣例,通常是使用arg這個單詞,args相當於一個變數名,可以自己定義的
在上面的程序中,我們使用*args作為一個可變長度參數列表傳遞給add()函數。在函數中,我們有一個循環實現傳遞的參數計算和輸出結果。
還可以直接傳遞列表或者數組的方式傳遞參數,以數組或者列表方式傳遞參數名前面加(*)號
理解**kwargs
**kwargs允許你將不定長度的鍵值對,作為參數傳遞給函數,這些關鍵字參數在函數內部自動組裝為一個dict
下篇詳細講解*args,**kwargs的參數傳遞和使用敬請關注
Python獲取函數參數個數和默認參數創建一個函數用來計算三個數的和,如下:
下來,我們對其進行調用:
假設我們要計算這個函數返回結果的平均值。那麼此時,我們只需將和值除以參數個數即可,那麼參數個數怎麼獲取呢?你可能會說:數一下就知道了。那麼假設此時有很多的參數,你還去數嗎?此時,明顯這個方法是不恰當的,那麼有沒有更加方便、高效的方法呢?我們接著往下看。
通過上面這個例子,我們不但可以獲取參數個數,還可以獲取所有變數名以及默認返回值。此時,我們只需根據自己的需求,去應用就可以了,那麼以上的問題,就自然解決了。
Python的位置參數、默認參數、關鍵字參數、可變參數區別對於python函數參數,對於初學者可能就是進入了迷宮,盡管我也是初學者,簡單總結一下。
說參數之前,先講一下兩個packing(包裹)和unpacking(解包裹):
輸出:
我總結不了這個概念,只能幫大家到這了
一、位置參數和關鍵字參數:
調用函數時根據函數定義的參數位置來傳遞參數。
注意:
有位置參數時,位置參數必須在關鍵字參數的前面,但關鍵字參數之間不存在先後順序的
二、默認參數:
用於定義函數,為參數提供默認值,調用函數時可傳可不傳該默認參數的值(注意:所有位置參數必須出現在默認參數前,包括函數定義和調用)
三、可變參數:
定義函數時,有時候我們不確定調用的時候會傳遞多少個參數(不傳參也可以)。此時,可用包裹(packing)位置參數,或者包裹關鍵字參數,來進行參數傳遞,會顯得非常方便。
1、包裹位置傳遞
我們傳進的所有參數都會被args變數收集,它會根據傳進參數的位置合並為一個元組(tuple),args是元組類型,這就是包位置傳遞。
2、包裹關鍵字傳遞
kargs是一個字典(dict),收集所有關鍵字參數
四、解包裹參數:
*args和**kargs,也可以在函數調用的時候使用,稱之為解包(unpacking)
1、在傳遞元組時,讓元組的每一個元素對應一個位置參數
2、在傳遞詞典字典時,讓詞典的每個鍵值對作為一個關鍵字參數傳遞給函數
五、位置參數、默認參數、可變參數的混合使用
1、基本原則是:先位置參數,默認參數,包裹位置,包裹關鍵字(定義和調用都應遵循)
2、Python中*args和**kwargs的區別
先看個demo:
輸出結果:
分析一下:可以看到,這兩個是[Python]中的可變參數。*args表示任何多個無名參數,它是一個tuple;**kwargs表示關鍵字參數,它是一個dict。並且同時使用*args和**kwargs時,必須*args參數列要在**kwargs前,否則會報語法錯誤!!!
還有個小應用場景:創建字典
其實python中就帶有dict類,使用dict(a=1,b=2,c=3)即可創建一個字典了。
*args:
重點在*,後面的args相當於一個變數名,可以自己定義的。它的本質就是將標准調用剩下的值集中轉變為元組。
從形參的角度:
從實參的角度:
從不同角度看**kwargs:
**kwargs與位置參數和默認參數混用:
超復雜混合參數混用記:
總結:
位置參數:
調用函數時所傳參數的位置必須與定義函數時參數的位置相同
關鍵字參數:
使用關鍵字參數會指定參數值賦給哪個形參,調用時所傳參數的位置可以任意
*位置參數:可接受任意數量的位置參數(元組);只能作為最後一個位置參數出現,其後參數均為關鍵字參數
**關鍵字參數:可接受任意數量的關鍵字參數(字典);只能作為最後一個參數出現
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')的結果會是
而不是期望的
結語:以上就是首席CTO筆記為大家整理的關於python函數可以有多少個參數的全部內容了,感謝您花時間閱讀本站內容,希望對您有所幫助,更多關於python函數可以有多少個參數的相關內容別忘了在本站進行查找喔。