函數的形參中除了默認值參數和位置參數外,還有動態傳參.當不肯定形參有幾個或者有不少的時候,就能夠使用動態傳參.python
1.1 動態接收位置參數函數
在python中使用*來接收動態位置參數ui
1 def chi(*food): #只有動態參數
2 print('我要吃',*food) 3 chi('飯','肉','魚') #我要吃 飯 肉 魚
4
5 def chi(a,b,*food): #動態參數和位置參數
6 print('我要吃',*food) 7 chi('飯','肉','魚','桃子','蘋果') #我要吃 魚 桃子 蘋果
8
9 def chi(*food,a,b): 10 print('我要吃',*food) 11 chi('飯','肉','魚','桃子','蘋果') #chi() missing 2 required keyword-only arguments: 'a' and 'b'
12 #★動態參數必須在位置參數的後面,不然就全被動態參數給收了
13
14 def chi(a,b,*food,c='哈哈'): #動態參數和位置參數和默認值參數
15 print('我要吃',*food,c) 16 chi('飯','肉','魚','桃子','蘋果') #我要吃 魚 桃子 蘋果 哈哈
17 #★順序位置參數,動態參數,默認值參數
1.2動態接收關鍵字參數spa
在python中使用**來接收動態關鍵字參數code
1 def chi(**food): #只有動態關鍵字參數
2 print(food) 3 chi(a='收到',b=1,c=6) #{'a': '收到', 'b': 1, 'c': 6}
4
5 def chi(a,b,**food): #動態關鍵字參數和位置參數
6 print(a,b,food) 7 chi('sd','zc',n='收到',z=1,x=2) # 3sd zc {'n': '收到', 'z': 1, 'x': 2}
8
9 def chi(a,b,c='哈哈',**food): #動態關鍵字參數和位置參數和默認值參數
10 print(a,b,c,food) 11 chi('sd','zc',n='收到',z=1,x=2) #sd zc 哈哈 {'n': '收到', 'z': 1, 'x': 2}
★★★最終順序:位置參數>*args>默認值參數>**kwargs★★★對象
這四種參數能夠任意的進行使用blog
若是想接受全部的參數:內存
1 def func(*args,**kwargs): #無敵
2 print(args,kwargs) 3 func(0,1,2,'及',a=1,b=2,c='積極') #(0, 1, 2, '及') {'a': 1, 'b': 2, 'c': '積極'}
4 ##############接收到的動態位置參數保存在元組中,接收到的動態關鍵字參數保存在字典中############
1.3 打散和聚合作用域
1 def func(*args): 2 print(args) 3 lis=[1,2,3,4,5] 4 func(lis) #([1, 2, 3, 4, 5],)
5
6 ##################將一個可迭代對象打碎須要在這個可迭代對象前加*#######################
7 def func(*args): 8 print(args) 9 lis=[1,2,3,4,5] 10 func(*lis) #(1, 2, 3, 4, 5)
11
12 #若是是字典
13
14 def func(**kwargs): 15 print(kwargs) 16 dic={1:'a',2:'b',3:'c',4:'d',5:'e'} 17 func(**dic) #TypeError: func() keywords must be strings打散以後變成了1='a'不符合邏輯
18
19 ##################這裏字典的鍵只能是字符串類型####################
20
21 def func(**kwargs): 22 print(kwargs) 23 dic={'A':'a','B':'b','C':'c','D':'d','E':'e'} 24 func(**dic) #{'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd', 'E': 'e'}
25
26 #########################形參的位置*,**: 聚合;實參的位置*,**: 打散#############################
1.4 函數的註釋字符串
1 #在函數名下且只能在函數名下,輸入多行註釋便可產生
2 def func(**kwargs): 3 '''
4 這個位置寫當前函數是幹什麼的 5 :param kwargs: kwargs參數是什麼意思 6 :return: 返回值是什麼玩意 7 '''
8 print(kwargs) 9 dic={'A':'a','B':'b','C':'c','D':'d','E':'e'} 10 func(**dic)
2.1
在python解釋器開始運行以後,就會在內存中開闢一個空間,每當遇到一個變量的時候,就會把變量名和值之間的關係記錄下來,當遇到函數定義的時候,解釋器只是把函數的名讀入內存,表示這個函數存在了,至於函數內部的變量和邏輯,解釋器是不關心的,也就是說,一開始函數只是加載進來,只有當函數被調用或訪問的時候,解釋器纔會根據函數內部聲明的變量開闢內存空間,可是,隨着函數的執行完畢,這些函數內部變量佔用的空間也會隨着函數的執行完畢而被清空.
1 def func(): 2 a=10
3 print(a) 4 func() 5 print(a) #此時的a不存在
命名空間 :存放名字和值之間的空間
命名空間的分類:
1.全局命名空間:函數外聲明的變量都屬於全局命名空間
2.局部命名空間:在函數中聲明的變量會放在局部命名空間
3.內置命名空間:python解釋器爲咱們提供的名字,list,tuple......
加載順序:
1.內置命名空間
2.全局命名空間
3.局部命名空間
2.2做用域就是做用範圍.
1.全局做用域
2.局部做用域
1 a=10
2 def func(): 3 a=40
4 b=20
5 def abc(): 6 print('哈哈') 7 print(a,b) 8 print(globals()) # 'a': 10, 'func': <function func at 0x0000025C198F2EA0>
9 print(locals()) # 'b': 20, 'a': 40
10 func() 11 #####經過globals()函數來查看全局做用域中的內容,經過locals()函數來查看局部做用域中的內容
2.3 關鍵字global和nonlocal
global: 在局部訪問全局中的內容
nonlocal: 在局部尋找外層函數中離他最近的那個變量
以上是有nonlocal的狀況:
一下是沒有nonlocal的狀況: