# python函式 def fun(): return 1,"abcd",2>1 print(fun()) print(type(fun())) print(fun()[1]) # 值傳遞和引用(地址)傳遞 # 值傳遞:適用於實參型別為不可變型別(字串、數字、元組) # 引用(地址)傳遞:適用於實參型別為可變型別(列表、字典) # 區別:值傳遞,形參改變,不會改變實參的值;引用傳遞,形參改變,會改變實參的值。 list1 = [1,2] def fun(obj): obj[0] = 2 print('形參的值', obj) fun(list1) print('實參的值', list1) # 關鍵字引數 # 特點:1、對引數位置沒有要求;2、但如果位置引數和關鍵字引數混用時,關鍵字引數必須位於所有位置引數之後。 def fun(str1,str2): print('str1:', str1, end=' ') print('str2:', str2) fun('111', '222') fun('111', str2='222') fun(str2='222', str1='111') # 預設引數 # 定義函式時,預設引數必須位於所有沒有預設值引數的後面。 def fun(str1,str2='444'): print('str1:', str1, end=' ') print('str2:', str2) fun('333','555') fun('333') # 可變引數 # 接收的實引數量不確定時,建立形參*obj,相當於建立了一個名為obj的空元組,並將接收到的引數封裝進去 def fun(*obj): print('可變引數',obj) fun('str1','str2') # 位置引數+可變引數(非關鍵字引數) # 需要將可變引數的形參放在最後 def fun(str1,*obj): print('位置引數',str1,'可變引數(非關鍵字引數)',obj) fun('str1','str2','str3') # 位置引數+可變引數(關鍵字引數) # 建立形參**obj,相當於建立了一個名為obj的空字典,並將接收到的引數封裝進去 def fun(str1,**obj): print('位置引數',str1,'可變引數(關鍵字引數)',obj) fun('str1',str2='2',str3='3') # 位置引數+可變引數(非關鍵字引數)+可變引數(關鍵字引數) def fun(str1,*obj1,**obj2): print('位置引數',str1,'可變引數(非關鍵字引數)',obj1,'可變引數(關鍵字引數)',obj2) fun('str1','str2',str3='3') # 逆向引數收集 # 列表、元組前新增*,字典前新增** def fun(a,b): print(a,b) list1 = (1,2) dict1 = {'a':3, 'b':4} # 字典的key必須與函式的形參一致 fun(*list1) fun(**dict1) # 多個返回值 # 多個值以元組的方式返回 def fun(a,b): return a,b,a+b print(fun(1,2)) # partial偏函式 from functools import partial def fun(a,b): print(a,b) fun1 = partial(fun,a=1) fun2 = partial(fun,1) fun1(b=2) # 此處必須使用關鍵字引數,使用位置引數為被認為按位置傳參給a,程式會報錯 fun2(2) # 全域性變數 a = "全域性變數" # 函式外定義的變數,一定是全域性變數 def fun(): print(a) fun() # 函式內定義全域性變數 def fun(): global a a = "函式內的全域性變數" print(a) fun() print('print自己列印', a) # 函式賦值給其它變數執行 def fun(): print("函式賦值給其它變數,使用其他變數來呼叫函式") fun1=fun fun1() # 閉包函式(又稱閉合函式) # 閉包中外部函式返回的不是一個具體的值,而是一個函式。 # 一般情況下,返回的函式會賦值給一個變數,這個變數可以在後面被繼續執行呼叫。 def fun(a): def fun1(b): return b**a return fun1 square = fun(2) # 計算平方 cube = fun(3) # 計算立方 print(square(10)) print(cube(10)) # lambda表示式(又稱匿名函式),常用來表示內部僅包含1行表示式的函式。 # 格式:name = lambda [list] : 表示式 # [list]:可選引數,函式的引數列表 add = lambda x,y:x+y print(add(1,2)) '''相當於 def add(x,y): return x+y ''' # 優勢 # 1、對於單行函式,使用lambda表示式可以省去定義函式的過程,讓程式碼更加簡潔; # 2、對於不需要多次複用的函式,使用lambda表示式可以在用完之後立即釋放,提高程式執行的效能 # eval()和exec(),用於執行字串表示式(字串一定要是可執行的程式碼),在使用Python開發服務端程式時,這兩個函式應用得非常廣泛。 # 區別eval返回結果,exec返回None # 格式:eval或exec(str[,globals[,locals]]) # globals:變數作用域,全域性名稱空間,如果沒有提供這個引數,預設使用python的全域性名稱空間 # locals:變數作用域,區域性名稱空間,locals的變數與globals衝突時,以locals為準 a=10 b=20 c=30 g={'a':6, 'b':8} #定義一個字典 t={'b':100, 'c':10} #定義一個字典 print('eval返回的結果',eval('a+b+c',g,t)) print('exec返回的結果',exec('a+b+c',g,t)) # 函數語言程式設計 # map(function, iterable, ...)根據提供的函式對指定序列做對映 list1 = [1,2,3,4] list2 = [2,3,4,5] newlist = map(lambda x,y:x+y, list1,list2) print(list(newlist)) # filter(function, iterable) # 對iterable中的每個元素都用function函式判斷,並返回True或False,最後將返回True的元素組成一個新的可遍歷集合 newlist = filter(lambda x:0==x%2, list1) print(list(newlist)) # reduce(funtion, iterable)對一個集合做一些累積操作 import functools # reduce()在python3.x中已經被移除,放入functools模組 sum1 = functools.reduce(lambda x,y:x+y, list1) product = functools.reduce(lambda x,y:x*y, list1) print(sum1) print(product)