您好,登錄后才能下訂單哦!
函數的定義有以下規(guī)則:
def 函數名(參數):
函數體
# 輸出hello world函數
def HelloWorld():
print('Hello world')
# 函數調用
HelloWorld()
在函數調用時,可以不傳送值的參數;或者說,有默認值的參數
# 例1:
#!/usr/bin/python3
import random
def choose_num(s,e=10):
num = random.randint(s,e)
return num
choose_num(3) # 調用時只傳了s,未傳e,e用的默認值
輸出 5
choose_num(1,50) # 默認值被覆蓋
輸出 28
# 示例2,默認值必須在最后
#!/usr/bin/python3
def choose_num(s=10,e): # 默認值放前邊,報錯了。
num = random.randint(s,e)
return num
choose_num(3)
報錯
File "<ipython-input-18-16c067f4bcb8>", line 1
def choose_num(s=10,e):
^
SyntaxError: non-default argument follows default argument
def choose_num(s, e=10, n=5):
numbers = []
for x in range(n):
num = random.randint(s,e)
numbers.append(num)
return numbers
choose_num(3)
輸出
[6, 7, 4, 3, 8]
# 示例3,默認值只分配一次
#!/usr/bin/python3
def f(a,L=[]): # 由于默認值只在內存里分配一次,所以當此列表做默認值時,
L.append(a) # 結果不管調用多少次,都是往已經分配好的列表中追加的
return L # 就是結果中的樣子。
# 而不是第一次返回 [1] 第二次返回[2] 第三次返回[3]
print(f(1))
print(f(2))
print(f(3))
輸出
[1]
[1, 2]
[1, 2, 3]
示例代碼:
#!/usr/bin/python3
def car(color,price='10',user='yhyang'):
print(f'{user}有一輛{color}色的車,價值{price}塊')
car('藍') # 其它的使用默認參數
car('紅','30','hmm') # 對應位置覆蓋
car(color='blue',price='100',) # k=v的方式給參數傳值,
輸出
yhyang有一輛藍色的車,價值10塊
hmm有一輛紅色的車,價值30塊
yhyang有一輛blue色的車,價值100塊
用 *args , **kwargs
作參數,args->tuple,kwargs->dict
示例代碼:
#!/usr/bin/python3
def car(*args): # 一個*號跟args,即 *args 可以成為一個元組
print(args) # 兩個*號跟kwargs 即 **kwargs 可以成為一個字典
for k in args: # 重點在于*號有幾個,不在于args kwargs的名稱
print(k)
car("red",10,"yhyang")
輸出
('red', 10, 'yhyang')
red
10
yhyang
#!/usr/bin/python3
def car(**kw): # 這種參數,在傳遞的時候需要傳遞 key=value的方式,才能按字典的方式存儲并打印
for k,v in kw.items():
print(f'{k}::{v}')
car(color='red',price=20,user='yhyang')
輸出
color::red
price::20
user::yhyang
#!/usr/bin/python3
def car(*args,**kw): # 可以識別單個參數和key value參數
print('args:',args)
print('kw:',kw)
for k in args:
print(k)
for k,v in kw.items():
print(f'{k}::{v}')
car('adfsdf','t',color='red',price=20,user='yhyang') # 可以識別單個參數和key value參數
輸出
args: ('adfsdf', 't')
kw: {'color': 'red', 'price': 20, 'user': 'yhyang'}
adfsdf
t
color::red
price::20
user::yhyang
示例代碼:
#!/usr/bin/python3
kwargs = {'color':'red','price':30,}
def car(**kw):
print(kw)
car(**kwargs) #這里注意,傳字典名字的時候前面要加兩個*
輸出
{'color': 'red', 'price': 30}
示例代碼:
#!/usr/bin/python3
def car(color='blue',*,price):
print(color,price)
car(price=30)
輸出
blue 30
示例代碼:
#!/usr/bin/python3
def add(x,y):
"""Add x and y together.""" # 函數文檔說明,寫在函數定義的第一行,就可以用
return x+y # 函數名.__doc__來查看函數說明文檔
add.__doc__
輸出
'Add x and y together.'
#!/usr/bin/python3
def add(x:int, y:'這個參數隨便')-> int:
"""Add x and y together."""
return x+y
add.__doc__
add.__annotations__
輸出
'Add x and y together.'
{'x': int, 'y': '這個參數隨便', 'return': int}
變量作用域,在自己屋干自己的事兒
# 以下代碼會報錯
#!/usr/bin/python3
x = 1 # 全局
def add():
x += 1 # 局部變量賦值錯誤,此處x沒有被聲明,所以不能被賦值,此處x不是全局的x
print(x)
add()
error_list = [2,3,5]
def big_list():
error_list += [99] # 此處是error_list = error_list + [99],需要先在函數內部聲明error_list,才不會報錯
print(error_list)
big_list()
示例代碼:
#!/usr/bin/python3
error_list = [2,3,5]
def big_list():
error_list.append(88) # 此處是在全局變量的基礎上追加,所以可以。
print(error_list)
big_list()
輸出
[2, 3, 5, 88]
error_list = [2,3,5]
def big_list():
error_list = [] # 事先聲明才能做下邊的 += 操作
error_list += [99]
print(error_list)
big_list()
輸出
[99]
函數是python里面的一級對象,可以用在任何地方,函數里的作用域屬于封閉作用域
# 函數嵌套
#!/usr/bin/python3
def calc(x,y):
def add(x,y):
print('x+y:',x+y)
def sub(x,y):
print('x-y:',x-y)
def mul(x,y):
print('x*y:',x*y)
add(x,y) # 在函數內部直接執(zhí)行嵌套的函數
sub(x,y)
calc(2,5)
輸出
x+y: 7
x-y: -3
# 返回值為函數本身
#!/usr/bin/python3
def calc(x,y):
def add(x,y):
print('x+y:',x+y)
def sub(x,y):
print('x-y:',x-y)
def mul(x,y):
print('x*y:',x*y)
add(x,y) # 在函數內部直接執(zhí)行嵌套的函數
sub(x,y)
return mul # 返回 mul函數本身,可以賦給變量
calc(3,5)
輸出
x+y: 8
x-y: -2
<function __main__.calc.<locals>.mul(x, y)>
c = calc(3,5) # c 被賦值為mul函數
輸出
x+y: 8
x-y: -2
函數返回值為內部函數的名字,內部函數又處理外層函數變量;這個整體叫閉包
示例代碼:
# 閉包
#!/usr/bin//python3
def hello():
s = 'yhyang' # s變量在函數中是自由變量
def say():
print(s)
return say # 返回內部函數名,內部函數綁定了外層函數的變量
hello()
h = hello()
h() # h 得到的值為say()函數,再次執(zhí)行,則會用到外層函數的變量s
輸出
<function __main__.hello.<locals>.say()>
yhyang
函數閉包,或者閉包函數,本質是一種函數,可以在函數運行以后,依然存在自由變量(或者說可用變量),可以對閉包的數據進行隱藏,避免使用全局變量
如上邊 hello中的變量 s一樣,在第一次執(zhí)行h = hello的時候,隱藏了s,此時s為自由變量,依然存在,可以繼續(xù)使用。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。