一.函數的動態參數java
以前咱們說過了傳參, 若是咱們須要給一個函數傳參, 而參數又是不肯定的. 或者我給一個函數傳不少參數, 個人形參就要寫不少, 很麻煩, 怎麼辦呢. 咱們能夠考慮使用動態參數.python
動態參數分紅兩種:編程
1. *args 動態接收位置參數安全
動態接收參數的時候要注意:動態參數必須在位置參數後面閉包
1 def xue(*language,'a','b'): 2 3 print('我要學:',language,a,b) 4 5 xue('PHP',JAVA,'Python')
若是這個程序不遵循順序的話就會報錯,如上面代碼,由於前面傳進去的全部位置參數都給*language接收了,a和b永遠也接收不了參數編程語言
因此必須改寫成以下代碼:函數
1 # -*- coding:utf-8 -*- 2 def xue(*language,a,b): 3 print('我要學:',language,a,b) 4 xue('JC','PHP',a='java',b='Python') #必須用關鍵字指定參數
這個時候a和b就有值了, 可是這樣寫呢位置參數就不能用了. 因此. 咱們要先寫位置參數,而後再用動態參數spa
1 # -*- coding:utf-8 -*- 2 def xue(a,b,*language): 3 print('我要學:',a,b,language) 4 xue('JC','PHP','java','Python') #前兩個參數用位置參數來接收,後面的參數用動態參數接收
哪默認值參數呢?3d
這個時候咱們發現全部的默認值都生了. 這個時候若是不給出關鍵字傳參. 那麼你的默認值是永遠都生效的.code
要記住的順序: 位置參數, 動態參數*, 默認值參數
2. **kwargs 動態接收關鍵字參數
在python中能夠動態的位置參數, 可是*這種狀況只能接收位置參數⽆沒法接收關鍵字參數.
在python中使⽤用**來接收動態關鍵字參數
1 def xue(**kwargs): 2 print(kwargs) 3 xue(a='Python',b='PHP',c='vb')
這個時候接收到的都是dict(字典)
順序問題,在函數調用的時候,若是先給出關鍵字參數,則整個函數都會報錯
1 def xue(a,b,c,d): 2 print(a,b,c,d) 3 #關鍵字參數必須在位置參數前面,不然參數會混亂至報錯 4 xue(1,2,c='Python',666)
因此關鍵字參數必須在位置參數後面. 因爲實參是這個順序. 因此形參接收的時候也是這
個順序. 也就是說位置參數必須在關鍵字參數前⾯面. 動態接收關鍵字參數也要在後面
最終順序(*):
位置參數 > *args > 默認值參數 > **kwargs
函數的註釋:
1 def XUE(JAVA,PHP): 2 """ 3 這個函數是用來總結學的編程語言, 4 :param JAVA: 參數Java是Java語言 5 :param PHP: 參數PHP是PHP語言 6 :return: 返回的是什麼東西 7 """ 8 print(JAVA,PHP) 9 return '堅持'
二.命名空間
在python解釋器開始執行以後, 就會在內存中開闢一個空間, 每當遇到一個變量的時候, 就把變量名和值之間的關係記錄下來, 可是當遇到函數定義的時候, 解釋器只是把函數名讀入內存, 表示這個函數存在了, 至於函數內部的變量和邏輯, 解釋器是不關心的. 也就是說一開始的時候函數只是加載進來, 僅此而已, 只有當函數被調用和訪問的時候, 解釋器纔會根據函數內部聲明的變量來進行開闢變量的內部空間. 隨着函數執行行完畢, 這些函數內部變量佔用的空間也會隨着函數執行完畢而被清空
1 def xue(): 2 a = 'YJ' 3 print(a) 4 xue() 5 print(a) #a已經不存在了已經
1. 內置名稱空間:存放python解釋器爲咱們提供的名字, list, tuple, str, int這些都是內置命名空間
2. 全局名稱空間:咱們直接在py⽂文件中, 函數外聲明的變量都屬於全局命名空間
3. 局部名稱空間:在函數中聲明的變量量會放在局部命名空間
做用域:
1. 全局做用域: 內置+全局
2. 局部做用域: 局部(函數被調用)
三.函數嵌套
函數能夠互相的嵌套
1.只要碰見了()就是函數的調用,若是沒有()就不是函數的調用
2.函數的執行順序
四 global和nonlocal關鍵
global:在局部訪問全局中的內容
1 a = 10 # 全局變量自己就是不安全的, 不能隨意修改, 閉包 2 def func(): 3 global a # 1. 能夠把全局中的內容引入到函數內部 , 2. 在全局建立一個變量 4 # a = 20 5 a += 10 # a = a+10 6 print(a) 7 func() 8 print(a) 9 a = 10
#結果爲,20,20
nonlocal:在局部尋找外層函數中離他最近的那個變量
1 a = 10 2 def outer(): 3 a = 'yj' 4 def inner(): # 在inner中改變a的值 5 nonlocal a # 尋找外層函數中離他最近的那個變量 6 a = 20 7 print(a) 8 inner() 9 outer() 10 print(a)