1、數學意義的函數與python中的函數
數學意義的函數
y = 2*3+1
x =3
y =7
x是自變量,y是因變量
2、python中定義函數的方法
一個函數往往都是為了完成一個特定的功能而存在的,所以注釋信息加上是個好習慣
def atest(x): "The function definitions" x += 1 return x
def: 定義函數的關鍵字
atest: 函數名
(): 內可定義形參
"": 文檔描述(非必要,但是強烈建議為你的函數添加描述信息)
x+=1: 泛指代碼塊或程序處理邏輯
return: 定義返回值
沒有return也是可以的,一個函數里面只要運行到return就會退出整個函數,不在繼續往下走
調用運行:可以帶參數也可以不帶
函數名()
3、寫一個函數
def atest(x):
"""
2*x+1
:param x: 整形數字
:return: 返回計算結果
"""
y=2*x+1
return y
print (atest)
打印出來的是函數的內存地址
<function test at 0x0000000001556D90>
調用下函數
def atest(x): """ 2*x+1 :param x: 整形數字 :return: 返回計算結果 """ y = 2 * x + 1 return y a = atest(3) print(a) C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py 7
4.什么情況下調用函數的時候不用加參數呢,就是定義函數的時候括號里面為空
def atest(): """ 2*x+1 :param x: 整形數字 :return: 返回計算結果 """ x = 3 y = 2 * x + 1 return y a = atest() print(a) C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py 7
5、同一個文件里面的函數名不能有相同的函數名,如果有2個相同的函數名,在下面調用代碼的時候會先最終調用最下面的函數,因為python執行順序是從上到下的,上面的函數會被下面的函數覆蓋掉
6.函數的好處
函數的好處:
代碼重用
保持一致性,易維護
可擴展性
7.過程定義
過程就是簡單特殊沒有返回值的函數
下面這atest01就是過程,atest02就是函數
def atest01(): msg="hello the little green frog" print (msg) def atest02(): msg="hello beiye" print (msg) return msg t1=atest01() t2=atest02() C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py hello the little green frog hello beiye
8.return可以返回多個值,其實也是一個值,是一個元組
def atest01(): msg="test01" print (msg) def atest02(): msg="test02" print (msg) return msg def atest03(): msg="test03" print (msg) return 1,2,3,"gou",["beiye"],None,{"name":"gou"} t1=atest01() t2=atest02() t3=atest03() print (t1) print (t2) print (t3) C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py test01 test02 test03 None test02 (1, 2, 3, 'gou', ['beiye'], None, {'name': 'gou'})
總結:
返回參數=0:返回None
返回參數=1:返回object
返回值數>1:返回tuple 元組
9.函數的參數
分為2種,形參 實參
(1)形參變量只有在被調用的時候才分配內存單元。因此形參只在函數內部有效。函數調用結束返回主調用函數后則不能再使用該形參變量
(2)實參可以是常量、變量、表達式、函數等,無論實參是何種類型的變量,在進行函數調用時,他們都必須有確定的值,以便把這些值傳送給形參,因此預先賦值,輸入等辦法使參數獲得確定值
上面的說法聽不懂,我自己說下,
形參就是定義函數的時候()里面的定義的參數,還沒有被使用,只是定義好
實參就是函數定義完成了,在下面進行調用的時候傳進去的參數
def cacl(x, y): #定義了一個函數cacl 形參是x y reus = x ** y #reus = x的y次方 return reus reus = cacl(2, 5) #把2傳值給x,把5傳值給y print(reus) C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py 32
(3)位置參數,形參和實參位置必須一一對應,多傳參數和少傳參數都不行
這個函數的功能就是傳入什么參數就打印出來什么
def reus(x,y,z): #x y z是3個形參 print(x) print(y) print(z) reus(1,2,3)#因為形參是三個,所以實參也得是3個,得一一對應,不然就會報錯 C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py 1 2 3
我們試下形參是3個,實參傳2個試試(直接報錯了,也就是說少傳參數是不行的)
def reus(x,y,z): print(x) print(y) print(z) reus(1,2) TypeError: reus() missing 1 required positional argument: 'z'
required [rɪ'kwaɪəd] 必須的
positional [pəˈzɪʃənəl] 位置
(4)關鍵字參數,傳參數的時候給指定的形參賦值,並不需要考慮位置的先后順序,只要形參和實參的個數是一一對應的就可以,多傳參數和少傳參數都不行
def reus(x,y,z): print(x) print(y) print(z) reus(y=5,x=4,z=6) C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py 4 5 6
(5)位置參數和關鍵字參數混合使用
位置參數必須在關鍵字參數左邊
def reus(x,y,z): print(x) print(y) print(z) reus(4,y=5,z=6) #4就是位置參數,y=5,z=6就是關鍵字參數 C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py 4 5 6
這個位置參數也是在關鍵字參數左邊,為什么報錯呢?
因為傳參數的時候,第一個參數4賦值給了x,第二個參數6賦值給了y,第三個又傳給了y的值等於5, 我們翻譯下報錯信息就是,這個reus函數的y參數被賦了多個值,所以這里就知道了,一個形參是不能被傳參多次的
def reus(x,y,z): print(x) print(y) print(z) reus(4,6,y=5) TypeError: reus() got multiple values for argument 'y'
multiple [ˈmʌltɪpl] 多個
(6)默認參數
y="linux"就是默認參數,如果傳參的時候不傳這個參數就使用默認的,如果傳入的話就使用傳入的值
def reus(x,y="linux"): print(x) print(y) reus(4) C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py 4 linux
這里為什么把66也括起來呢,因為上面的默認參數就是一個字符串,下面實參也要是字符串
def reus(x,y="linux"): print(x) print(y) reus(4,"66") C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py 4 66
(7)參數組 **字典 *列表 (也叫可變長參數)
def atest(x,*args): #args 是第二個形參 *是一個特殊用法 print (x) print (args) atest(1,2,3,4,5,6) #1傳入x,剩下的都傳給args了當成一個元組的方式打印出來了 C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py 1 (2, 3, 4, 5, 6)
(7).1還能按照索引的方式打印,這就是非固定長度的參數
def atest(x,*args): #args 是第二個形參 *是一個特殊用法 print (x) print (args) print(args[0]) atest(1,2,3,4,5,6) C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py 1 (2, 3, 4, 5, 6) 2
(7).2也可以傳入多個值給args,但是函數中並不處理這個args,也是可以的
def atest(x,*args): #args 是第二個形參 *是一個特殊用法 print (x) atest(1,2,3,4,5,6) C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py 1
也可不傳
def atest(x,*args): #args 是第二個形參 *是一個特殊用法 print (x) print(args) atest(1) C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py 1 ()
(7).3如果給args傳入的是2個列表呢
他會把這2個列表作為2個整體傳給args,然后以元組的方式打印出來,這2個列表作為這個元組的2個元素
a=[22,33,44,55,66] b=["heh","beiye"] def atest(x,*args): #args 是第二個形參 *是一個特殊用法 print (x) print(args) atest(1,(a),(b)) C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py 1 ([22, 33, 44, 55, 66], ['heh', 'beiye'])
傳入2個字典也是一樣的
他會把這2個字典作為2個整體傳給args,然后以元組的方式打印出來,這2個字典作為這個元組的2個元素
a={"name":"gou"} b={"age":28} def atest(x,*args): #args 是第二個形參 *是一個特殊用法 print (x) print(args) atest(1,(a),(b)) C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py 1 ({'name': 'gou'}, {'age': 28})
(7).4問題來了,如果我不想讓列表和字典作為一個整體傳給args呢,而是遍歷一下傳給args
列表的時候應該怎么遍歷呢
傳入參數是列表的時候用1個*(傳參數是元組也是用一個*就不舉例子了)
下面的第一個實參 "哈哈"傳給了x,
a和b這2個參數是2個列表傳給了args,傳列表用一個* 這是固定用法,傳字典用2個
a=[1,2,3] b=[4,5,6] def atest(x,*args): #args 是第二個形參 *是一個特殊用法 print (x) print(args) atest("哈哈",*(a),*(b)) C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py 哈哈 (1, 2, 3, 4, 5, 6)
要想取到列表中的6這個元素該怎么取(索引方式就可以取到了)
a=[1,2,3] b=[4,5,6] def atest(x,*args): #args 是第二個形參 *是一個特殊用法 print (x) print(args[5]) atest("哈哈",*(a),*(b)) C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py 哈哈 6
(7).5傳入參數是字典的時候用2個* **kwargs
a={"name":"gou"} b={"age":28} def atest(x,**kwargs): #args 是第二個形參 *是一個特殊用法 print (x) print(kwargs) atest(1,**(a),**(b)) C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py 1 {'name': 'gou', 'age': 28}
要想取到字典里面的28這個value應該怎么取呢
a={"name":"gou"} b={"age":28} def atest(x,**kwargs): #args 是第二個形參 *是一個特殊用法 print (x) print(kwargs["age"]) atest(1,**(a),**(b)) C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py 1 28 a={"name":"gou"} b={"age":28} def atest(x,**kwargs): #args 是第二個形參 *是一個特殊用法 print (x) print(kwargs.get("age")) atest(1,**(a),**(b)) C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py 1 28
要想取到字典里面所有的value呢,就可以用字典的方法了
a={"name":"gou"} b={"age":28} def atest(x,**kwargs): #args 是第二個形參 *是一個特殊用法 print (x) print(kwargs.values()) atest(1,**(a),**(b)) C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py 1 dict_values([28, 'gou'])
也可以這樣寫,最后也會以字典的方式打印出來
def atest(x,**args): #args 是第二個形參 *是一個特殊用法 print (x) print(args) atest(1,y=2,z=3) C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py 1 {'z': 3, 'y': 2}
(7).6 *args **kwargs 兩者連接起來使用,無所不能,可以接受任意長度的參數
def atest(x,*args,**kwargs): print (x) print(args) print (kwargs) atest(1,11,22,33,44,y=2,z=3) C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py 1 (11, 22, 33, 44) {'y': 2, 'z': 3}