函數初識:
s = '12345'
def my_len():
i = 0
for k in s:
i += 1
print(i)
my_len()
my_len() #重複調用
問題:
1.只能打印s的長度
2.經過i = my_len() 返回none,發現函數沒有返回長度,只是單純的打印
解決:增長返回值
s = '12345'
def my_len():
i = 0
for k in s:
i += 1
return i #給蘋果
my_len()
length = my_len() #要蘋果
print(length)
返回值的三種狀況:
1.沒有返回值
-不寫return 程序會在最後默認return None
-只寫return,程序遇到return就不會運行後面的程序了。結束一個
函數的繼續。
-寫return None和只寫return功能同樣
2.返回一個值
-能夠返回任何數據類型
-只要返回了就能夠接受到
-若是在一個程序中有多個return,那麼只執行一個
3.返回多個值
-有多少個返回值用多少個變量接收,不能多也不能少。return 1,2,3 a,b,c = fun()
-用一個變量接收多個返回值,會返回一個元組
元組、list、dict是能夠解包的:
1.a,b,c = (1,2,3)
2.a,b,c = [1,2,3]
3.a,b,c = {1:1,2:2,3:3}
參數:
1.ret = my_len(s) #傳遞參數;傳參;實際參數;實參
2.def my_len(s): #形式參數,形參;接收參數
3.兩個函數能夠互相調用
def f1(i):
for k in i:
print(k)
def f2(i):
f1(i)
for y in i:
print(k)
f2([1,2,3,4]) #函數的嵌套調用
參數:
1.一個參數
2.兩個參數 def my_len(a,b)
站在參數的角度上:
1.按照位置傳參
2.按照關鍵字傳參
3.混着用能夠:可是必須先按照位置傳參,再按照關鍵字傳參
4.不能給同一個變量傳多個值
站在形參的角度上:
1.位置參數:必須傳,並且有幾個參數就傳幾個值
2.默認參數:能夠不傳,若是不傳就是默認的參數,若是傳了就用傳了
3.動態參數:args是習慣,能夠無限多的增長參數,可是*args不能收到關鍵字傳遞的參數,*args必須再*kwargs以前
4.順序:-位置參數,-*args,-默認參數, -**kwargs
動態參數1:能夠接收任意多個參數
def sum(
*args): #args只是一個變量名,*不可變
print(args) #元組用for循環調用
sum(1,2)
sum(1,2,3)
sum(1,2,,3,4) #接收的是按照位置傳參的值,組織成一個
元組
動態參數2:能夠傳入無限多個關鍵詞參數
def func(
**kwargs):
print(kwargs)
fun(a=1,b=2,c=3)
fun(a=1,b=2)
fun(a=1) #接收的是按照關鍵字傳參的值,組織成一個
字典
兩個動態參數結合,能夠接收全部的值
def func(*args,**kwargs):
print(args,kwargs)
func(1,2,3,a=1,b=3) #先傳位置參數,再傳關鍵字參數
def func(a,b,*args,sex='man',**kwargs):
print(
a,b,args,sex='man',kwargs)
func(1,3,4,sex='man',a=1,b=2)
def func(*args):
#站在形參的角度上,給變量加上*,就是組合全部傳來的值
print(args)
a = [1,2,3,4,5]
func(*a)
#效果等於func(1,2,3,4,5)
#站在實參的角度上,給一個序列加上*,就是將這個序列按照順序打散
def func(**kwargs):
print(kwargs)
d = {'a':1,'b':2}
func(**d)
效果等於func(a=1,b=2)
函數的註釋:
def func():
'''
這個函數實現了什麼功能
參數1:
參數2:
return:是字符串或者是列表的長度
'''
pass
函數的陷阱:
若是默認參數的值是一個可變數據類型,那麼每一次調用函數的時候,若是不傳值就公用這個數據類型的資源。
def qqxing(i=[]):
i.append(i)
qqxing()
qqxing([1])
qqxing()
def qqxing(k,a={}):
a[k] = 'v'
print(a)
qqxing(1)
qqxing(2)
qqxing(3)