一.Python3函數
函數是組織好的,可重複使用,用來實現單一或相關聯功能的代碼段。
函數能提高應用的模塊性,和代碼的重複利用率。可以自己創建函數,這被叫做用戶自定義函數。
1.默認參數
在定義函數時 直接給定
def enroll(name,age,city='BeiJing'):
print("name",name)
print("age",age)
print("city",city)
enroll("Tom",44)
這裏是個坑 默認函數也是一個變量 在函數定義出的時候就已經被定義出來了
def down(L=[]):
L.append("END")
return L
# L這個函數看似是給傳入的一個list添加元素
# print(down([1,2,3]))
print(down()) #['END'] 函數返回的L是 ['END']
print(down()) #['END', 'END'] 無參時 默認傳入L 然而L已經被定義 所以第二個返回的 L 是['END', 'END']
print(down()) #['END', 'END', 'END'] t同理
def add_end(L=None):
if L is None:
L = []
L.append('END')
return L
# str 和 None 對象都是不可變對象 該內部數據結構不會變
2.可變參數
def add_n(*n): # 參數 n 接收的是一個tuple元組 (5),(8,9)
sum = 0
for s in n:
sum = sum+s
return sum
print(add_n(5,6,9))
# 當有一個List 或 tuple 時 可以直接傳入
LL = [9,6,8,43,21,8]
print(add_n(*LL))
3.關鍵字參數
關鍵字參數允許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝爲一個dict
def person(name,age,**kr):
print("name:",name,"age:",age,"other:",kr)
person("tony",88,city="BeiJing")
extra = {'city': 'Beijing', 'job': 'Engineer'} # 同理 可直接傳入dict
# **extra表示把extra這個dict的所有key-value用關鍵字參數傳入到函數的**kr參數,kr將獲得一個dict,注意kw獲得的dict是extra的一份拷貝,對kr的改動不會影響到函數外的extra
person('Jack',99,**extra)
4命名關鍵字參數
限制關鍵字參數的名字,就 用命名關鍵字參數;
和關鍵字參數*kw不同,命名關鍵字參數需要一個特殊分隔符,*後面的參數被視爲命名關鍵字參數。
def person_1(name,age,*,city,job): # 只接收 附加key w爲 city 和job 的 dict
print(name,age,city,job)
5.參數組合
參數的順序必須是:必選參數,默認參數,可變參數,命名關鍵字參數和關鍵字參數。
def more(a,b,c='222',*d,**ee):
print(a,b,c)
sum = 0
for i in d:
sum=sum+i
print(d)
print(sum)
print(ee)
more(1,2,"dddd",2,3,ee={'x':3})
6.變量作用域
Python中,程序的變量並不是在哪個位置都可以訪問的,訪問權限決定與這個變量是在哪裏賦值。
L (Local) 局部作用域
E (Enclosing) 閉包函數外的函數中
G (Global) 全局作用域
B (Built-in) 內建作用域
以L->E->G->B的順序查找:
m = 'girl'
def aa():
m = 'boy'
return m
print(aa()) # boy
print(m) #girl
b =100
def bb():
b =200
x = b +100
return x
print(b) #
print(bb())# 300
def cc(): # 一個嵌套函數
bar = 100
def dd(): # 嵌套使用閉包作用域變量
print(bar)
dd()
print(bar)
cc()#100
#100
# 之前講過數字類型不允許改變,如果修改number數據類型的值將重新分配內存空間;
def ee():
bar = 100
def ff():
print(bar) # 編譯器報錯 不可變 此處不能重新定義
bar = 200
print(bar)
ff()
def ee():
bar = [100]
def ff():
print(bar) # 如果定義爲列表則不會報錯了
bar[0] = 200
print(bar)
ff()
ee()#[100]
#[200]
7.匿名函數
Python使用lambda關鍵字來創建匿名函數;
所謂的匿名函數即不再使用def()這樣的標準模式來創建一個函數了;
有以下幾點需要注意:
lambda表達式的函數體較def簡單得多,並不會包含太多邏輯;
lambda的匿名函數僅僅是一個表達式,並非一塊代碼塊,因此並不會包含太多邏輯;
lambda有自己的命名空間,故不可以訪問自己參數列表外的參數 及 全局命名空間裏的參數;
有興趣的可以去看一下java中的lambda表達式 在自身認識較淺的理解下個人任務Python 中lambda 可運用的功能比較淺;
a = lambda x,y:x*y #生成x+y匿名函數
>>> a(2,5)
10
>>> b = lambda x,y =3,z =4:x+y+z # 在lambda中定義默認函數
>>> b(4)
11
>>> b(5)
12
>>> b(3)
10
>>> b(3,z=7) # 注意多參數傳值時需指定參數名
13
>>> list(map(lambda x:x**3,[1,2,3,4]))# 使map生成序列
[1, 8, 27, 64]
>>> list(map(lambda x,y:x+y,[11,22,33,44],[1,2,3,4]))# 多個參數傳值,如不匹配則以最少爲準
[12, 24, 36, 48]
>>> list(map(lambda x:x,range(10)))# 迭代器生成
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(map(lambda x:x*2,range(10)))
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
>>> l =[lambda x:x+2,lambda x:x*3,lambda x:x*5] # 生成一個可變列表
>>> l[0](0)
2
>>> l[0](100) #具體多大
102
>>> l[0](100000000000) #
100000000002
>>> print(l[0](1),l[1](1),l[2](1))
3 3 5
>>> dict1 = {'k1':(lambda x:x**2),'k2':(lambda x:x**3),'k3':(lambda x:x**4)}
>>> print(dict1['k1'](2),dict1['k2'](2),dict1['k3'](2)) #生成可變字典
4 8 16