python函数-函数进阶
生活随笔
收集整理的這篇文章主要介紹了
python函数-函数进阶
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
python函數-函數進階
一、命名空間和作用域
1.命名空間
內置命名空間 —— python解釋器就是python解釋器一啟動就可以使用的名字存儲在內置命名空間中
內置的名字在啟動解釋器的時候被加載進內存里
全局命名空間 —— 我們寫的代碼但不是函數中的代碼
是在程序從上到下被執行的過程中依次加載進內存的
放置了我們設置的所有變量名和函數名
局部命名空間 —— 函數
就是函數內部定義的名字
當調用函數的時候 才會產生這個名稱空間 隨著函數執行的結束 這個命名空間就又消失了
在局部:可以使用全局、內置命名空間中的名字
在全局:可以使用內置命名空間中的名字,但是不能用局部中使用 在內置:不能使用局部和全局的名字的
在正常情況下,直接使用內置的名字
當我們在全局定義了和內置名字空間中同名的名字時,會使用全局的名字
當我自己有的時候 我就不找我的上級要了
如果自己沒有 就找上一級要 上一級沒有再找上一級 如果內置的名字空間都沒有 就報錯
多個函數應該擁有多個獨立的局部名字空間,不互相共享
2.作用域
全局作用域:內置命名空間、全局命名空間
局部作用域:局部命名空間
3.global關鍵字
對于不可變的數據類型,在局部可以查看全局作用域中的變量,但是不能修改,如果想在局部作用域中對全局作用域的不可變數據類型變量進行修改,需要在局部開始加上global聲明
x = 1 # 全局作用域的不可變數據類型變量x def func():global x # 在局部作用域中對其進行聲明x = 2 # 聲明后則可以在局部作用域中對其進行修改操作 func() print(x) # 局部作用域將全局作用域的不可變數據類型變量修改后,在全局作用域中打印,其值被修改4.locals()、globals()函數
①globals():輸出全局作用域的所有變量
②locals():輸出當前作用域的所有變量
a = 1 def func():a = 666print('函數內部的locals:'+str(locals())) func()print('函數外部的globals:'+str(globals())) print('函數外部的locals:'+str(locals()))>>> 函數內部的locals:{'a': 666} >>> 函數外部的globals:{'__doc__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000000653EF0>, '__name__': '__main__', '__builtins__': <module 'builtins' (built-in)>, '__cached__': None, '__spec__': None, '__author__': 'Elijah', '__file__': 'D:/python_fullstack_s9/day10/practice.py', '__date__': '2017/12/27 8:33', 'func': <function func at 0x000000000070E6A8>, 'a': 1, '__package__': None} >>> 函數外部的locals:{'__doc__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000000653EF0>, '__name__': '__main__', '__builtins__': <module 'builtins' (built-in)>, '__cached__': None, '__spec__': None, '__author__': 'Elijah', '__file__': 'D:/python_fullstack_s9/day10/practice.py', '__date__': '2017/12/27 8:33', 'func': <function func at 0x000000000070E6A8>, 'a': 1, '__package__': None}
③global關鍵字
a = 1 def func():global aa = 666 func()print('此時a的值:' + str(a)) >>> 此時a的值:666④nonlocal和global
global---在局部聲明一個全局變量
nonlocal--在局部聲明最近的上一層局部中的變量
nonlocal1.對全局無效 2.對局部,也是對最近的一層有影響 3.只能用于局部變量,找上層中離當前函數最近一層的局部變量 4.聲明了nonlocal的內部函數的變量,修改會影響到離當前函數最近的一層的局部變量a = 0 def func():#a = 1def inner():a = 2def inner2():nonlocal ainner2()inner() func()
5.函數的嵌套
def outer():print('this is outer!')def inner():print('this is inner!')inner() outer()6.作用域鏈
小范圍用變量的時候,先從自己的命名空間查找,找不到就一層一層向外層找,知道找為止,找不到就報錯
a = 1 def outer():a = 1def inner():a = 2def inner2():nonlocal a #聲明了一個上面第一層局部變量a += 1 #不可變數據類型的修改inner2()print('##a## : ', a)inner()print('**a** : ',a)outer() print('全局 :',a)7.函數名的本質
①可以被賦值
②可以被當作容器類型的元素
③可以當作函數的參數和返回值
第一類對象(first-class object)指 1.可在運行期創建 2.可用作函數參數或返回值 3.可存入變量的實體8.閉包
①內部函數調用對外部函數,還是嵌套函數稱為閉包函數
def outer():a = 1def inner():print(a)return inner inn = outer() inn()②判斷閉包函數的方法__closure__
?
#輸出的__closure__有cell元素 :是閉包函數 def func():name = 'eva'def inner():print(name)print(inner.__closure__)return innerf = func() f()#輸出的__closure__為None :不是閉包函數 name = 'egon' def func2():def inner():print(name)print(inner.__closure__)return innerf2 = func2() f2()
轉載于:https://www.cnblogs.com/a438842265/p/8466361.html
總結
以上是生活随笔為你收集整理的python函数-函数进阶的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于微信分享的一些心得之recommen
- 下一篇: WPF中通过AForge实现USB摄像头