1、全局變量和局部變量、上一級變量、
(1)全局變量特點:頂格寫的,沒有縮進,在任意位置都可以調用。
(2)局部變量特點:在任意一個子程序(函數)裏定義的,只在該子程序(函數)內生效。
(3)可以在一個程序中存在相同名稱的局部變量和全局變量,這樣的話,在哪裏打印則輸出哪個變量。示例如下:
name = "ZHM"
def test():
name = "LLL"
print(name)
test()
print(name)
#輸出結果:
LLL
ZHM
(4)如果想直接在子程序裏修改全局變量,應該加關鍵字global,如下:
name = "ZHM"
def test():
global name
name = "LLL"
print(name)
test()
print(name)
#輸出結果:
LLL
LLL
(5)由於程序從上到下執行,所以上面的程序修改全局變量後,下面引用的全局變量也跟着修改。
name = "ZHM"
def test1():
global name
name = "LLL"
print(name)
def test2():
print(name)
test1()
test2()
#輸出結果:
LLL
LLL
換一下執行順序就會不一樣,如下:
name = "ZHM"
def test1():
global name
name = "LLL"
print(name)
def test2():
print(name)
test2()
test1()
#輸出結果:
ZHM
LLL
(6)先找自己的作用域(偷懶方法:可以看空格),沒有引用全局;修改全局則用global;如果全局是可變類型,可以直接使用對應方法,對內部元素進行操作。如下:
name = ["ooo","lll"]
def test():
global name
name.append("ZHM")
print(name)
test()
#輸出結果:
['ooo', 'lll', 'ZHM']
(7)爲了防止重名,建議書寫規範:全局變量都大寫,局部變量都小寫。
(8)上一級變量關鍵字nonlocal,和global類似。
2、函數嵌套
(1)代碼默認執行順序:從上到下
嵌套函數執行順序:先執行外循環,再執行內循環
def outer():
def inner():
print('inner')
print('outer')
inner()
outer()
print("ooo")
#輸出結果:
outer
inner
ooo
備註:但是好像爲了避免不必要的麻煩,一般直接調用,不用函數嵌套
def inner():
print('inner')
def outer():
inner()
print('outer')
outer()
#輸出結果:
inner
outer
(2)先定義後執行,未定義執行會報錯。
def test1():
print("test1")
test2() #由於在這之前未定義過test2()
test1()
def test2():
print("test2")
#輸出結果:
報錯
3、關於函數名
(1)函數名可以進行賦值
def test():
print("123")
new_test = test
new_test()
#輸出結果:
123
4、閉包函數特點
1、是嵌套函數
2、返回一個調用外部變量的函數對象
舉例如下:
def outer():
name="Python"
def inner():
print(name)
print(inner.__closure__)
return inner
inn = outer()
inn()
#輸出結果:
(<cell at 0x0000021B7492AB88: str object at 0x0000021B748F5670>,)
Python