VB.net 2010 視頻教程 VB.net 2010 視頻教程 VB.net 2010 視頻教程
SQL Server 2008 視頻教程 c#入門經典教程 Visual Basic從門到精通視頻教程
當前位置:
魔兽世界wow > 編程開發 > Python >
  • python基礎教程之day10-函數進階

  • 2019-05-27 16:02 來源:未知

魔兽世界飞行坐骑: 1.函數的命名空間

魔兽世界wow www.geyjm.icu   命名空間分為三種:

  內置命名空間:

    是python解釋器一啟動就可以使用的名字,存儲在內置命名空間中,啟動解釋器的時候被加載進內存里。比如list,tuple等等。

  全局命名空間:

    是在程序從上到下被執行的過程中依次加載進內存的,放置了我們設置的所有變量名和函數名。

1 a = 1
2 def func():
3     print(a)
4 fun()

  局部命名空間:

    就是函數內部定義的名字,當調用函數的時候 才會產生這個名稱空間 隨著函數執行的結束 這個命名空間就又消失了。

1 def func():
2     a = 1
3     print(a)
4 func()

  在局部:可以使用全局、內置命名空間中的名字。

  在全局:可以使用內置命名空間中的名字,但是不能用局部命名空間中的名字。

  在內置:不能使用局部和全局的名字的。

  注意以下幾點:

 ?。?)在正常情況下,直接使用內置的名字

 ?。?)當我們在全局定義了和內置名字空間中同名的名字時,會使用全局的名字

 ?。?)當在一個函數內,有我要使用的變量名,我就回去使用它,沒有的話,我就會向上級去尋找,找到了就用,找不到就繼續尋找,如果還找不到,就報錯

復制代碼
1 def input():
2     print('input')
3 def func():
4     input()
5 func()
6 # result:input
復制代碼

 ?。?)多個函數應該擁有多個獨立的局部名字空間,不互相共享,即在函數A中不能使用函數B的局部變量

 ?。?)函數名()---函數的調用  等價于  函數的內存地址()---函數的調用

1 def input():
2     print('input')
3 def func():
4     print(input)# 這里輸出的是函數的內存地址---<function input at 0x000001D05CEEC2F0>
5 func()

2.函數的作用域

  全局作用域 —— 作用在全局 —— 內置和全局名字空間中的名字都屬于全局作用域  ——用globals()可以打印出來

  局部作用域 —— 作用在局部 —— 函數(局部名字空間中的名字屬于局部作用域) ——用locals()可以打印出來

復制代碼
 1 a = 1
 2 b = 2
 3 def func():
 4     x = 'aaa'
 5     y = 'bbb'
 6     print(locals())
 7     print(globals())
 8 func()
 9 print(globals())
10 print(locals()) #本地的
11 # result:
12 # {'x': 'aaa', 'y': 'bbb'}
13 # {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000013D05871CF8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/Python/PyChram/WorkPlace/day01/Demo.py', '__cached__': None, 'input': <function input at 0x0000013D058AC2F0>, 'func': <function func at 0x0000013D05A5A8C8>, 'a': 1, 'b': 2}
14 # {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000013D05871CF8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/Python/PyChram/WorkPlace/day01/Demo.py', '__cached__': None, 'input': <function input at 0x0000013D058AC2F0>, 'func': <function func at 0x0000013D05A5A8C8>, 'a': 1, 'b': 2}
15 # {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000013D05871CF8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/Python/PyChram/WorkPlace/day01/Demo.py', '__cached__': None, 'input': <function input at 0x0000013D058AC2F0>, 'func': <function func at 0x0000013D05A5A8C8>, 'a': 1, 'b': 2}
復制代碼

  可以看到,內置函數中的locals打印的就是內置函數中定義的變量,而globals不論在哪里都打印全局變量,至于函數外的locals,他會將globals看作是一個笨的的變量,所以他打印出來的也是全局的。總結如下:

 ?。?)globals 永遠打印全局的名字

 ?。?)locals輸出什么,根據locals所在的位置

復制代碼
1 a = 1
2 def func():
3     global a
4     a = 2
5 func()
6 print(a)
復制代碼

  在上面代碼中,在函數外,若是想要打印出函數內的變量,只要在函數內對這個變量加上一個global就行了,但是一般不建議這么做,因為別人看你的代碼時,只會看到你定義的全局變量a = 1,誰會看到你函數內又將他變成了a = 2呢,所以建議不要使用global。

作者:拉格朗日定理
歡迎任何形式的轉載,但請務必注明出處。
限于本人水平,如果文章和代碼有表述不當之處,還請不吝賜教


相關教程