Python 基礎第十天
今日主要內容
1.動態參數
2.命名空間或名稱空間
3.函數的嵌套
4.關鍵字global和nonlocal
動態函數
動態參數*args ,**kwargs
(1)*args
接收的是實參對應的所有位置參數(實參中超出形參位置的),並將其放在元組中.
例1.*args正確放置的位置(不帶默認參數)
例2:帶默認參數,不影響默認參數的取值
總結:
形參對應順序:位置參數,*args,默認參數
(2)**kwargs 動態傳參
將所有關鍵字參數(超過形參設置的關鍵字參數)添加到一個字典裏.
例3:**kwargs正確使用
最終的排列順序:
例4:
總結:
最終順序:位置參數,*args,默認參數,**kwargs
一般工作的書寫方式:
def funcl(*args,**kwargs):
pass
funcl
知識點: *的應用
例5:*args,*的作用
將各個可叠代的數據類型轉換成元組形式,以前是元組的,直接套用原式
例6:**kwargs 的** 作用
總結 *,**
在函數的調用執行時,
*可叠代對象,代表打散(list,tuple,str,dict(鍵))將元素一一添加到args。
**字典,代表打散,將所有鍵值對放到一個kwargs字典裏。
在函數定義時, *args,**kwargs代表的是聚合。
def func(*args,**kwargs): # 聚合
print(args)
print(kwargs)
func(*,**)#打散
=================================================================
2.命名空間,名稱空間
命名空間一共分為三種:
全局命名空間
局部命名空間
內置命名空間
*內置命名空間中存放了python解釋器為我們提供的名字:input,print,str,list,tuple...它們都是我們熟悉的,拿過來就可以用的方法。
三種命名空間之間的加載與取值順序:
加載順序:內置命名空間(程序運行前加載)->全局命名空間(程序運行中:從上到下加載)->局部命名空間(程序運行中:調用時才加載)
取值順序:
在局部調用:局部命名空間->全局命名空間->內置命名空間
在全局調用:全局命名空間->內置命名空間
綜上所述,在找尋變量時,從小範圍,一層一層到大範圍去找尋。
如下圖簡單描述:
加載為向下的箭頭,取值為向上的箭頭.
作用域
作用域就是作用範圍,按照生效範圍可以分為全局作用域和局部作用域。
全局作用域:包含內置名稱空間、全局名稱空間,在整個文件的任意位置都能被引用、全局有效
局部作用域:局部名稱空間,只能在局部範圍內生效
globals和locals方法
例7:比較全局和局部作用域區別
取的值全部放在字典裏面.
全局名稱空間:py3中內置的所有變量
局部名稱空間:根據所在位置,對變量進行展示,如果所在的函數中有變量,則打印函數的變量,如果則空,只查找當前級內.
對比
函數的嵌套
解決思路:
1.先確認函數什麽執行,沒有看到調用函數,則函數不執行.即函數名()
2.代碼從上到下依次執行.
3.調用函數:函數裏面從上至下依次執行
例8:通過舉例理解上面的內容,就好理解了
4 關鍵字:global 和 nonlocal (聲明變量)
global:
1,在局部空間內,聲明一個全局變量。
2,在局部作用域想要對全局作用域的全局變量進行修改時,需要用到 global(限於字符串,數字)。
例9:
如果不用global聲明,則外部是找不到內部的變量的.
如果聲明,則外部可以使用此變量
2,在局部空間內改變一個全局變量
例10:
nonlocal #將內部變量,引用到外部,不包括全局
1,不能修改全局變量。
2.在局部作用域中,對父級作用域(或者更外層作用域非全局作用域)的變量進行引用和修改,
並且引用的哪層,從那層及以下此變量全部發生改變。(只要在函數內,就可以引用到外層,只要出了函數,到全局下就錯誤)
總結:
global和nonlocal用法相同,nonlocal不能反用到全局下,global可以從局部到全局這樣使用.
Python 基礎第十天