1.函數定義 函數就是將完成一件事情的步驟封裝在一起並得到最終的結果; 函數名代表了這個函數要做的事情; 函數體是實現函數功能的流程; 添加一個函數也被叫做實現了一個方法或功能; 函數可以幫助我們重覆使用一些操作步驟; 2.def 通過關鍵字def定義函數; def name(args...): p ...
1.函數定義
函數就是將完成一件事情的步驟封裝在一起並得到最終的結果;
函數名代表了這個函數要做的事情;
函數體是實現函數功能的流程;
添加一個函數也被叫做實現了一個方法或功能;
函數可以幫助我們重覆使用一些操作步驟;
2.def
通過關鍵字def定義函數;
def name(args...):
print('')
return 是將函數結果返回的關鍵字;
return只能在函數體中使用;
return支持返回所有python類型;
有返回值的函數可以直接賦值給一個變數;
def add(a, b):
c=a+b
return c # 出現retuen代表函數執行結束,後面有語句也不會執行了
def multiplication(a, b):
re = a * b
return re
print('test')
result = multiplication(3, 4) # 函數返回值可以直接賦值給變數
print(result)
'''
12 return後的語句不會被執行
'''
def no_re():
print('無返回的函數')
no_r = no_re()
print(no_r) # 函數無返回時,預設是None
'''
無返回的函數
None
'''
def test():
for i in range(4):
print(i)
if i == 2:
return i
t = test()
print(t)
'''
0
1
2
2
# return後迴圈結束,函數結束;只列印到2,且函數返回值2
'''
3.函數的參數
必傳參數(位置參數),函數中定義的沒有預設值的參數,在調用函數時若不傳則會報錯;
在定義函數時,參數後無等號和預設值;
且傳參時,實際值的順序與定義的參數順序要一致;
def add(a, b)
預設參數,定義函數時,定義的參數有預設值,通過賦值語句給他一個值;
如果調用函數時,為預設參數傳遞了新值,函數會使用新傳入的值;
def add(a, b=1)
def add(a, b, c=4):
return a+b+c
re = add(1, 2) # 使用c的預設值
print(re) # 7
re2 = add(1, 2, 5) # 使用c的新值
print(re2) # 8
# 註意,預設參數一定在位置參數之後,否則會報錯
def add2(a, b=3, c):
return a+b+c
add2(1, 3, 2)
'''
File "D:\python_exercise\test.py", line 566
def add2(a, b=3, c):
^
SyntaxError: non-default argument follows default argument
'''
不確定參數--可變參數,沒有固定的參數名和數量(提前不知道要傳的參數名和數量);
def add(*args, **kwargs)
*args保存多餘實參,保存為元組、**kwargs保存多餘的帶有變數名的實參,保存為字典;
def add(a, b, c=4, *args, **kwargs):
print(a)
print(b)
print(c)
print(args, type(args))
print(kwargs, type(kwargs))
add(1, 2, 3, 4, 5, d=3, e=4)
'''
1
2
3 # 3給了預設參數c,後面再有的剩餘實際參數保存為元組了
(4, 5) <class 'tuple'>
{'d': 3, 'e': 4} <class 'dict'>
# 後面就可以使用元組、字典的方法處理args和kwargs了
'''
def test(*args, **kwargs):
print(args)
print(kwargs)
test((2, 3), {'name': 'll', 'age': 23})
'''
((2, 3), {'name': 'll', 'age': 23})
{}
'''
# 可以發現*args是將多餘實參都放到了元組中
# 如果就想對應傳遞元組和字典,可以在實參前加*和**
test(*(2, 3), **{'name': 'll', 'age': 23})
'''
(2, 3)
{'name': 'll', 'age': 23}
'''
def add3(a, b, c):
return a+b+c
tuple_test = (23, 45, 0)
re = add3(*tuple_test) # 此時也可以藉助*tuple對實參進行解包
print(re) # 68
參數的規則,
多參數一般添加順序 :def add(a, b=1, *args, **kwargs) 。
上面的例子可以看到python中函數參數沒有定義類型,
其實在py3.7後可以為參數定義類型,但只是用於肉眼上的查看;
def person(name:str, age:int=33):
print(name, age)
def add(a: int, b: int, *args: int):
print(a, b, args)
add(1, 2, 4, 'rt') # 1 2 (4, 'rt')
# 雖然傳遞的參數不符合數據類型的要求,但可以正常執行,指定類型只是起提示功能
且pycharm中也會有提示標註
4.全局變數和局部變數
python腳本最上層代碼塊的變數,就是全局變數;全局變數可以在函數中讀取使用;
局部變數:只能在局部使用的變數,比如函數體內的變數只能在函數內使用;
name = 'll' # 定義一個全局變數
def test():
print('函數體內'+name)
test() # 函數體內ll (函數體內可以直接使用全局變數)
def test2():
age = 13
print(age)
test2() # 13
print(age) # NameError: name 'age' is not defined (局部變數只能在局部使用)
def test3():
name = 'tt'
print(name)
test3() # tt
print(name) # ll (全局變數未被函數修改,函數只能使用全局變數,不能修改)
可以使用global關鍵字,在函數內修改全局變數;(但在工作中不建議使用global對全局變數進行修改)
name = 'll' # 定義一個全局變數
def test():
global name
name = 'tt'
test()
print(name) # tt
當全局變數值是字典或列表時,函數內可以直接修改其值;
name_list = ['ll', 'tt'] # 定義一個全局變數
def test():
name_list.append('rr')
test()
print(name_list) # ['ll', 'tt', 'rr']
5.函數的遞歸
一個函數不停的將自己反覆執行;
def test(a):
print(a)
return test(a) 通過返回值,直接執行函數自身,就可以達到遞歸的效果;
避免濫用遞歸,一定要設置滿足後退出遞歸的條件,小心記憶體溢出;
能用遞歸解決的問題必須滿足兩個條件:
1.可以通過遞歸調用來縮小問題規模,且新問題與原問題有著相同的形式;
2.存在一種簡單情形,使用該簡單情形可退出遞歸;
count = 0
def test():
global count
count += 1
if count != 5:
print('繼續執行函數')
return test()
else:
print('執行結束')
test()
'''
繼續執行函數
繼續執行函數
繼續執行函數
繼續執行函數
執行結束
'''
兩個經典的遞歸案例,階乘和斐波那契數列;
'''
階乘
n! = 1*2*3*...*n
f(n) = n * f(n-1)
且f(1)=1
'''
def test(n):
if n == 1:
return 1
return n * test(n-1)
re = test(6)
print(re) # 720
'''
斐波那契數列(黃金分割數列)
數列從0開始,數列前兩項是0,1,第三項開始每一項是前兩項的和
f(0) = 0
f(1) = 1
f(n) = f(n-1) + f(n-2)
'''
def fib(n):
if n == 0:
return 0
elif n == 1:
return 1
return fib(n-1) + fib(n-2)
# 求數列的第9項
re2 = fib(9)
print(re2) # 34
# 列印20項
for i in range(20):
if i == 19:
print(fib(i), end=',')
else:
print(fib(i), end=',')
# 0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181
6.匿名函數lambda
可以定義一個輕量化的函數,處理一些簡單操作;
即用即刪除,適合需要完成一項功能,但此功能只在此一處使用;
無參數lambda, f = lambda : value ; f()調用;lambda函數自帶return關鍵字,此時返回值是value;
有參數lambda, f = lambda x,y: x*y ; f(3, 4)調用; 此時返回值是x*y的值12;
test = lambda: 34
print(test()) # 34
test2 = lambda x, y: x > y
re = test2(4, 6)
print(re) # False
test3 = lambda x, y=4: x + y
re = test3(4, 6)
print(re) # 10
# 此時可以再來看列表的sort(key)方法,key參數值就是函數、可以指定排序的參考值,此處就可以使用lambda函數的寫法
name_list = [
{'name': 'll', 'age': 34},
{'name': 'tt', 'age': 4},
{'name': 'rr', 'age': 24}
]
# 按照字典中age對應的值排序
name_list.sort(key=lambda x: x['age'])
print(name_list) # [{'name': 'tt', 'age': 4}, {'name': 'rr', 'age': 24}, {'name': 'll', 'age': 34}]
總結