一.實參類型
-->實參可以傳遞任意類型
def fn(a):
? ? ?print('a = ',a)
b = 123 ????#a =? 123
b = True? ?//?a =? True
b = 'python'? ? //a =? python
fn(b)
-->函數(shù)調(diào)用時解析器不會檢查實參類型,需要注意
def f1(a,b):
? ? ?print(a + b)
f1(1,'2')
TypeError: unsupported operand type(s) for +: 'int' and 'str'
-->如果形參執(zhí)行的是一個對象(列表,字典...),但我們通過形參改變對象時,會改變所有指向該對象的變量
def fn(a):
a[0] =30
? ? print('a = ',a, id(a))
c = [1,2,3]
fn(c)?# 相當(dāng)于a = c,次數(shù)a,c 是指向同一個對象
fn(c.copy())????#此時指向不同對象
print('c = ',c, id(c))
# a =? [30, 2, 3] 2360030290504
# c =? [30, 2, 3] 2360030290504
# a =? [30, 2, 3] 1828469891720
# c =? [1, 2, 3] 1828469891656
二.不定長參數(shù)
-->實參可以傳遞任意類型
def fn(a):
? ? ?print('a = ',a)
b = 123???? #a =? 123
b = True? ? a =? True
b = 'python'? ? a =? python
fn(b)
-->函數(shù)調(diào)用時解析器不會檢查實參類型
def f1(a,b):
? ? print(a + b)
f1(1,'2')
# # TypeError: unsupported operand type(s) for +: 'int' and 'str'
-->如果形參執(zhí)行的是一個對象(列表,字典...),但我們通過形參改變對象時,會改變所有指向該對象的變量
def fn(a):
a[0] =30
? ? print('a = ',a, id(a))
c = [1,2,3]
fn(c)? ???? # 相當(dāng)于a = c,次數(shù)a,c 是指向同一個對象
# fn(c.copy())? ? #此時指向不同對象
print('c = ',c , id(c))
# a =? [30, 2, 3] 2360030290504
# c =? [30, 2, 3] 2360030290504
# a =? [30, 2, 3] 1828469891720
# c =? [1, 2, 3] 1828469891656
-->在定義函數(shù)的時候,在形參前面加*,那么他就能獲取所有實參,保存在元組中
????多個數(shù)的計算實例:
def f4(*args):
# print('args =',args,type(args))? ? //args = (1, 2, 3, 4, 5)
? ? r =0
? ? for iin args:
r += i
print(r)
# f4(1,2,3,4,5)
# 15
注意:
? ? ? ? ? ? 1.帶*的形參只能有一個,
????????????2.帶*的形參后面只能是關(guān)鍵字參數(shù),否則報錯
def f5(a,b,*c):
# def f6(a,*b,c):??
def f7(a,*b,c):
????print('a = ',a)
????print('b = ',b)
????print('c = ',c)
# f5(1,2,3,4,5)
# a =? 1
# b =? 2
# c =? (3, 4, 5)
# f6(1,2,3,4,5)? ? ? ? // TypeError: f6() missing 1 required keyword-only argument: 'c'
# f7(1,2,3,4,c = 5)
a =? 1
b =? (2, 3, 4)
c =? 5
-->*args只能接收位置參數(shù),
-->**keyargs可以接收關(guān)鍵字參數(shù),只能有一個,且只能放在最后面
def fn8(*a):
#def fn8(**a):
print('a = ', a)
fn8(b =1,c =4,d =8)
#TypeError: fn8() got an unexpected keyword argument 'b'
a =? {'b': 1, 'c': 4, 'd': 8}
三.函數(shù)返回值
?1.直接使用函數(shù)返回值
? 2.通過變量接受函數(shù)返回值
-->return 任意對象(序列,數(shù)字,字符串,布爾值..)
-->一個函數(shù)沒有return,或者return后面什么都沒有寫,相當(dāng)于return None
-->return一旦出現(xiàn),后面的代碼都不會執(zhí)行
def fn():
????return 12
fn()
print(fn())? ? 12? ? ? // 1.直接使用函數(shù)返回值
r = fn()
print(r)? ? 12? ? ? ? ? // 2.通過變量接受函數(shù)返回值
四.文檔字符串
僅做了解,簡單代碼實例:
def fn():
"""
? ? 這是一個文檔字符串
? ? :return:
"""
help(fn)
Help on function fnin module __main__:
fn()
這是一個文檔字符串
? ? :return:
五.函數(shù)作用域
1.作用域:變量生效的區(qū)域
-->局部作用域
def fn():
a =1? #局部變量a,只能作用在函數(shù)內(nèi)部
? ? print('a = ',a)
?fn()? ? #a =? 1
print('a = ', a)? ? #NameError: name 'a' is not defined
-->全局作用域
b = 2? #//全局變量,可以被訪問到
def fn1():
? ? ?a = 1
? ? ?print('函數(shù)內(nèi)部a = ',a)
? ? ?print('函數(shù)內(nèi)部b = ',b)
fn1()
print('函數(shù)外部b = ',b)
# 函數(shù)內(nèi)部a =? 1
# 函數(shù)內(nèi)部b =? 2
# 函數(shù)外部b =? 2
-->可以在局部作用域的變量前面加上關(guān)鍵字 global,使它成為全局變量
def fn():
????global a
????a =1
? ? print('a = ',a)
fn()
print('a = ', a)
a =1
a =1
六.遞歸
遞歸:解決問題的思想,類似循環(huán),但是基本不使用,在函數(shù)中自己調(diào)用自己
兩個條件:
? ? ? ? ? ? 1.基線條件:問題可以被分解為最小的問題,滿足基線條件,遞歸不再執(zhí)行
? ? ? ? ? ? 2.遞歸條件:問題可以繼續(xù)分解的條件
-->用遞歸求任意數(shù)(用戶決定)的階乘,
def fn(n):
? ? if n == 1:? #基線條件
? ? ? ? return 1
? ? else:
? ? ? ? return fn(n - 1) * n? ? ? #遞歸條件
print(fn(int(input('請輸入階乘數(shù):'))))? ? #24