python中的命名空間以及函數的嵌套

 一.動態傳參

函數的形參中除了默認值參數和位置參數外,還有動態傳參.當不肯定形參有幾個或者有不少的時候,就能夠使用動態傳參.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的狀況:

 

相關文章
相關標籤/搜索