1. 程式人生 > >2018.12.7 今日所學

2018.12.7 今日所學

今天主要的學習內容

1. 函式引數--動態傳參
2. 名稱空間, 區域性名稱空間, 全域性名稱空間, 作?域, 載入順序.
3. 函式的巢狀
4. gloabal, nonlocal關鍵字

一 .動態傳參  *   **

動態傳參分為兩種:

1  .動態接受位置引數

我自己的理解是將你輸入的輸入全部賦值給你的變數引數  如:

  def func(*content):

    pass

  func(1,2,3,4,5,6,7)

就是上面的將1-7全部給content,最後輸入的全部放到一個tuple中

注意: 動態接收引數的時候要注意 : 動態引數必須在位置引數後面

def chi(*food, a, b):
  print("我要吃", food, a, b)
chi("大米飯", "小米飯", "黃瓜", "茄子")     # 前兩個引數用位置引數來接收, 後面的引數用

動態引數接收

  

上面的程式碼是錯誤的, 因為*food 已經接收了所有的資料,a,b永遠接收不到資訊,系統報錯

由此我們得出總結:

順序 : 位置引數,動態引數* ,預設值引數

2.動態接收關鍵字引數

在python中我們使用**來接受動態關鍵字引數

def func(**kwargs):
    print(kwargs)
func(a=1,b=2,c=3)
func(a=1,b=3)


結果 :
{'a': 1, 'b': 2, 'c': 3}
{'a': 1, 'b': 2}

  這個時候接收的是一個字典dict

最終我們得到的順序是:

        位置引數 > *args > 預設值引數 > **kwargs

這四種引數可以任意的進行使用

這裡如果想要接收所有的引數 ,有一種無敵傳參(自己給的名字):

  def func (*args ,**kwargs):

    print(*args,**kwargs)

func()這裡使用者輸入的所有引數都可以拿到並輸出

當* ,**在形參的位置 相當於把輸入的東西聚合 ,聚合成元組 ,字典

當* ,**在實參位置的時候,把使用者輸入的東西按照順序打散

名稱空間

全域性名稱空間 --->我們直接在py 檔案中,函式外宣告的變數都屬於全域性名稱空間

區域性名稱空間 --->在函式宣告的變數中會放在區域性名稱空間

內建名稱空間 --->存放在python直譯器中為我們提供的名字 ,list ,tuple ,dict ,int ,str 這些都是內建名稱空間

載入順序:  內建名稱空間-->全域性名稱空間 -->區域性名稱空間

取值順序:  區域性名稱空間 -->全域性名稱空間-->內建名稱空間

a=10
def func():
    a=20
    print(a)

func()  #結果為20

  作用域:作用域就是作用範圍 ,按照生效範圍來看分為 全域性作用域 和區域性作用域

全域性作用域: 包含了全域性名稱空間和內建名稱空間,在整個檔案的任何位置都可以使用(遵循從上到下逐個進行)

區域性作用域: 在函式內部可以使用

 作用域名稱空間:

1. 全域性作用域: 全域性名稱空間+ 內建名稱空間   locals() 檢視全域性作用域內容

2. 區域性作用域: 區域性名稱空間   globals() 檢視當前作用域內容 

 函式的巢狀 

1. 只要遇到了()就是函式的呼叫 ,如果沒有()就不是函式的呼叫

2, 函式的執行順序

def fun1():
     print(111)
 def fun2():
     print(222)
 fun1()
 
fun2()
print(111)
# 函式的巢狀
def fun2():
     print(222)
     def fun3():
         print(666)
     print(444)
     fun3()
     print(888)

print(33)
fun2()
print(555)    

  關鍵字global 和nonlocal

我們寫一個程式碼,首先在全域性宣告一個變數 ,然後在區域性呼叫這個變數,並改變這個變數的值

a=100
def func():
    global a  #這裡的global 是把外面的a 引入進來 (用的是外面的a),但是要注意,這裡將a修改後,外面的a也相應的發生了改變
    a=28
    print(a)

func()
print(a)

  即 :global表示的不在用區域性的內容,改用全域性作用域的變數

nonlocal是呼叫上一級的內容 ,如果找不到,繼續往上找,直到找到全域性,但是找不到全域性

a=10
def func():
    a=20
    def pp():
        nonlcal a  #這裡的nonlcal就是呼叫了上一層的a=20 ,而不是a=10
        print(a)
     pp()      

func()  

 nonlcal和global都是引入外面的內容 ,也同樣是修改了外面的內容