python全栈学习总结三:函数学习
一函數(shù)基本概念
1 函數(shù)定義
def 函數(shù)名(參數(shù)1,參數(shù)2,參數(shù)3,......):
"""
功能:
參數(shù)1:
參數(shù)2:
參數(shù)3:
......
返回值:
"""
函數(shù)體(處理方法,執(zhí)行過程)
return? ? 返回值
只要是函數(shù)開頭就用def定義,后面緊跟函數(shù)名,在括號(hào)中加入需要傳遞的形參,用冒號(hào)后面表示函數(shù)體,表示具體實(shí)現(xiàn)的方法,處理過程,最后返回值。函數(shù)參數(shù)可以沒有,也可以有一個(gè)或多個(gè),沒有具體數(shù)量限制。以下是我對(duì)函數(shù)的理解:函數(shù)名是整個(gè)函數(shù)代碼段的入口地址,在內(nèi)存中存儲(chǔ)時(shí),是一個(gè)實(shí)時(shí)內(nèi)存的地址,一個(gè)函數(shù)我們也可以看成一個(gè)變量,一個(gè)函數(shù)名即一個(gè)變量地址,函數(shù)名加上小括號(hào)表示函數(shù)執(zhí)行。找到內(nèi)存中的入口地址,執(zhí)行相關(guān)的代碼段,函數(shù)使用遵循的原則是先定義后調(diào)用,若是沒有定義,提前調(diào)用,系統(tǒng)會(huì)報(bào)錯(cuò),python解釋器在解釋代碼時(shí),實(shí)時(shí)運(yùn)行傳入的變量,運(yùn)行到?jīng)]有定義的函數(shù)變量,必然會(huì)報(bào)錯(cuò)。函數(shù)返回值在沒有任何返回時(shí)返回None,一個(gè)或以元組的形式返回多個(gè)值。
2 函數(shù)參數(shù)
函數(shù)傳遞的參數(shù)即形參變量只能在函數(shù)內(nèi)部有效,主要有這么幾種:
位置參數(shù):調(diào)用函數(shù)時(shí),按照固定位置(固定順序)一個(gè)也不落的全部傳遞。
關(guān)鍵字參數(shù):調(diào)用函數(shù)時(shí),可以給相關(guān)關(guān)鍵字(即形參的命名)來傳遞,只要關(guān)鍵字都對(duì)上,打亂順序無所謂不影響函數(shù)調(diào)用。
默認(rèn)參數(shù):在函數(shù)定義時(shí),可以預(yù)先給形參賦值參數(shù),在函數(shù)調(diào)用時(shí),可以不用賦值,使用默認(rèn)的參數(shù),也可以重新賦值,針對(duì)特殊場合使用方便。
參數(shù)數(shù)組:若是傳遞的參數(shù)不固定,則可以使用參數(shù)數(shù)組的形式,*args表示以元組的形式傳遞參數(shù),**kwarg表示以字典的形式傳遞參數(shù)。
*arg形式傳遞數(shù)組
def foo(x,y,*args):print(x,y)print(args) foo(1,2,3,4,5)def foo(x,y,*args):print(x,y)print(args) foo(1,2,*[3,4,5])def foo(x,y,z):print(x,y,z) foo(*[1,2,3])**kwarg傳遞形參數(shù)組
def foo(x,y,**kwargs):print(x,y)print(kwargs) foo(1,y=2,a=1,b=2,c=3)def foo(x,y,**kwargs):print(x,y)print(kwargs) foo(1,y=2,**{'a':1,'b':2,'c':3})def foo(x,y,z):print(x,y,z) foo(**{'z':1,'x':2,'y':3})3局部變量與全局變量
簡單的來說,局部變量就是頂格來定義,局部變量在子程序中定義的。變量使用原則,先從內(nèi)部找起,逐漸向外部擴(kuò)。引用外部全局變量是,可以使用關(guān)鍵字global來引用,表示使用全局變量,使用上一級(jí)變量時(shí),可以使用nonlocal。
name = '騎驢追車'def test1():name = '贏在大四'def test2():nonlocal name #引用上一級(jí)變量name = '揚(yáng)帆起航'print(name)test2()print(name) def test2():name = '在路上'def test3():global namename = '若水三千'print(name)test3()print(name) print(name) test1() test2() print(name)輸出結(jié)果:
4嵌套函數(shù)總結(jié)
重點(diǎn):函數(shù)即變量(python中變量即對(duì)象),變量的要求是先定義,后使用,那么函數(shù)也是如此,函數(shù):先定義后引用!
name = "若水三千" def foo():name ='在路上'def bar():print(name)return bar a = foo() #函數(shù)調(diào)用,函數(shù)返回值為函數(shù)名(函數(shù)首地址即變量) print(a) #產(chǎn)看變量類型 a() #函數(shù)名保存在變量a中,加括號(hào)即可調(diào)用函數(shù)5 遞歸函數(shù)
? 簡單的來說:函數(shù)自己調(diào)用函數(shù)自己,特點(diǎn):不斷的用棧來分配內(nèi)存,所占內(nèi)存很大。
要求:有個(gè)明確的結(jié)束條件
? ? 每執(zhí)行一次遞歸,函數(shù)規(guī)模有所減小
遞歸效率不高
def test(n):if n > 1:sum = test(n-1)+nreturn sumelse:return 1 num = test(100) print(num)?
6 函數(shù)式編程
(1) 匿名函數(shù)
lambda:變量:函數(shù)體
fun1 = lambda r:2*3.14*r? ?#定義一個(gè)求周長的匿名函數(shù)
fun2 = lambda x,y,z:(x+1,y+1,z+1) #定義一個(gè)匿名函數(shù),返回多個(gè)值
(2)函數(shù)式編程特點(diǎn)
不可變:不用變量保存狀態(tài),不修改變量
函數(shù)即變量:函數(shù)名可以當(dāng)做參數(shù)傳遞,也可以返回函數(shù)名(函數(shù))
尾調(diào)用:在函數(shù)的最后一步調(diào)用另一個(gè)函數(shù)(最后一行不一定是函數(shù)的最后一步)
(3)map函數(shù)推導(dǎo)過程
map函數(shù)主要用在對(duì)一堆可迭代序列處理上,處理列表中的每一個(gè)元素,得到的結(jié)果是一個(gè)列表,列表中位置與個(gè)數(shù)與原來列表一樣
""" 對(duì)一個(gè)列表進(jìn)行自增一,求平方,求周長 """ nums = [3,7,23,18,51] #列表中的值自增一 num_s = [] for num in nums:num_s.append(num+1) print(num_s) #列表中的值求平方 num_s = [] for num in nums:num_s.append(num**2) print(num_s) #列表中的值求周長 num_s = [] for num in nums:num_s.append(num*2*3.14) print(num_s)nums = [3,7,23,18,51] def add_one(x):return x+1 def suq_value(x):return x**2 def cricle_value(x):return 2*3.14*x def calc_map(func,arry):num_l = []for i in arry:num_l.append(func(i))return num_l print(calc_map(add_one,nums)) print(calc_map(suq_value,nums)) print(calc_map(cricle_value,nums))nums = [3,7,23,18,51] def calc_map(func,arry):num_l = []for i in arry:num_l.append(func(i))return num_l print(calc_map(lambda x:x+1,nums)) print(calc_map(lambda x:x**2,nums)) print(calc_map(lambda x:x*2*3.14,nums)) """ map函數(shù)輸入兩個(gè)對(duì)象,第一個(gè)為函數(shù),第二個(gè)為可迭代對(duì)象列表元組字符串 返回值為內(nèi)存對(duì)象的首地址,需要轉(zhuǎn)化 """ nums = [3,7,23,18,51] print(list(map(lambda x:x+1,nums))) print(list(map(lambda x:x**2,nums))) print(list(map(lambda x:x*2*3.14,nums)))(4)filter函數(shù)推導(dǎo)過程
filter函數(shù)功能:遍歷列表中的每一個(gè)元素,判斷每一個(gè)元素得到一個(gè)布爾值,如果為真,則留下來
""" 過濾掉列表中的某些字符 """ name_lst = ['yz_zhg','yz_dx','yz_ds','zailushang','yz_ls']name_new =[] for n in name_lst:if not n.startswith('yz'):name_new.append(n) print(name_new)name_lst = ['yz_zhg','yz_dx','yz_ds','zailushang','yz_ls']def show_yz(x):return x.startswith('yz') def filter_test(func,arry):name_new =[]for n in arry:if not func(n):name_new.append(n)return name_new print(filter_test(show_yz,name_lst))name_lst = ['yz_zhg','yz_dx','yz_ds','zailushang','yz_ls'] def filter_test(func,arry):name_new =[]for n in arry:if not func(n):name_new.append(n)return name_new print(filter_test(lambda x:x.startswith('yz'),name_lst))name_lst = ['yz_zhg','yz_dx','yz_ds','zailushang','yz_ls'] print(list(filter(lambda x:not x.startswith('yz'),name_lst)))(5)reduce函數(shù)推導(dǎo)過程
首先要使用from functools import reduce? ?導(dǎo)入
功能:處理一個(gè)序列,然后進(jìn)行合并操作
#求一個(gè)列表中所有值 num_l = [1,2,3,4,100] res = 0 for i in num_l:res += i print(res) #去列表中所有數(shù)的乘積 res = 1 for i in num_l:res *= i print(res)#求一個(gè)列表中所有值 num_l = [1,2,3,4,100] def sum_value(x,y):return x+y def vol_value(x,y):return x*y def reduce_test(func,arry,init_value = None):if init_value is None:res = arry.pop(0)else :res = init_valuefor i in num_l:res = func(res,i)return res print(reduce_test(sum_value,num_l,10)) print(reduce_test(vol_value,num_l,10))from functools import reduce num_l = [1,2,3,4,100] print(reduce(lambda x,y:x+y,num_l)) print(reduce(lambda x,y:x*y,num_l))
轉(zhuǎn)載于:https://www.cnblogs.com/qilvzhuiche/p/9293805.html
總結(jié)
以上是生活随笔為你收集整理的python全栈学习总结三:函数学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ABB robot 与 Fronius
- 下一篇: Folx Pro苹果BT磁力多线程下载工