day10筆記:
局部變量:
1. 定義在函數內部的變量稱爲局部變量(函數的形參也是局部變量)
2. 局部變量只能在函數內部使用
3. 局部變量在函數調用時才能夠被創建,在函數調用結束之後會自動銷燬
全局變量:
1. 定義在函數外部,模塊內部的變量稱爲全局變量
2. 所有的函數都可以直接訪問"全局"變量,但函數內部不能直接通過賦值語句來改變全局變量
示例見:
variable.py
局部變量說明:
1. 在函數內首次對變量賦值是創建局部變量,再次爲變量賦值是修改局部變量的綁定關係
2. 在函數內部的賦值語句不會對全局變量造成影響
3. 局部變量只能在其被聲明的函數內部訪問,而全局變量可以在整個模塊同訪問
4. 形參也是局部變量
練習:
創建一個全局變量:
L = []
寫一個函數:
definput_number():
讀入正整數 放到L列表內
# ...... input_number() # 輸入1 2 3
print(L) # [1, 2, 3]
# .....input_number() # 輸入4,5
print(L) # [1, 2, 3, 4, 5]
globals() 函數和locals 函數
globals() 返回當前全局作用域內變量的字典
locals() 返回當前局部作用域內的變量的字典
示例見:
globals_locals_function.py
函數變量
函數名是變量,它在創建時綁定一個函數
示例見:
function_variable.py
一個函數可以作爲另一個函數實參傳遞
示例:
def f1():
print("f1被調用")
def f2():
print("f2被調用")
def fx(fn):
print("fn綁定的是: ", fn)
fn() # 調用fn綁定的函數,此處等同於調用誰呢?
fx(f1)
fx(f2)
案例:
看懂如下代碼做什麼事?
defmyinput(fn):
L = []
whileTrue:
x =int(input("請輸入大於0的整數:") or '-1')
if x< 0:
break
L.append(x)
returnfn(L) # <<< 注意此處
print(myinput(max))
print(myinput(min))
print(myinput(sum))
函數作爲另一個函數的返回值
示例見:
function_return_other_function.py
函數的嵌套定義
函數嵌套定義是指一個函數裏用def 語句來創建其它函數的情況
示例見:
function_embed_def.py
python 的作用域
作用域也叫命名空間,是訪問變量時查找變量名的範圍空間
python的四個作用域 LEGB
作用域 英文解釋 英文簡寫
局部作用域(函數內) Local(function) L
外部嵌套函數作用域 Enclosingfunction locals E
函數定義所在模塊(文件)的作用域 Globals(module) G
python 內置模塊的作用域 Builtin(python) B
示例見:
namespace.py
變量名的查找規則:
1. 在訪問變量時先查找本地變量,然後是包裹此函數外部的函數內部的變量,之後是全局變量,最後是內置(內建)變量
L---> E ---> G ---> B
2. 在默認情況下,變量名賦值會創建或者改變本地作用域變量
問題:
v = 100
defchange_v(a):
v = a # 請問能修改全局的v嗎?
change_v(200)
global 語句
作用:
1. 告訴解釋器,global語句聲明的一個或多個變量,這些變量的作用域爲模塊級的作用域(也稱作全局變量)
2. 全局聲明(global)將賦值的變量映射到模塊文件內部的作用域
語法:
global 變量1, 變量2, ...
示例:
global v, a,b, c
global d
示例見:
global.py
global說明
1. 全局變量如果要在函數內部被賦值,則必須經過全局 聲明(否則會被認爲是局部變量)
2. 全局變量在函數內部不經過聲明就可以直接訪問
3.不能先創建局部變量,再用global聲明爲全局變量,此做法不附合規則
4. global變量列表裏的變量名不能出現在此作用域內形參列表裏
練習:
寫一個函數
defhello(name):
... 此處自己實現
count =0 # 此變量用來記錄hello函數被調用的次數
hello("小張")
hello("小李")
print("函數hello已經被調用%d次" % count ) # 2
hello("小趙")
print("函數hello已經被調用%d次" % count ) # 3
nonlocal 語句
作用:
告訴解釋器,nonlocal聲明的變量不是局部變量,也不是全局變量,而是外部嵌套函數內的變量
nonlocal的語法
nonlocal 變量名1,變量名2, ...
示例見:
nonlocal.py
說明:
1. nonlocal 語句只能在被嵌套的函數內部進行使用
2. 訪問nonlocal變量將對外部嵌套函數作用域內的變量進行操作
3. 當有兩層或兩層以上函數嵌套時,訪問nonlocal變量只對最近一層的變量進行操作
4. nonlocal語句的變量列表裏的變量名,不能出現在此函數參數列表中
問題:
請問'def 語句' 幹什麼用的?
lambda 表達式(又稱匿名函數)
作用:
創建一個匿名函數對象
同 def類似,但不提供函數名
語法格式:
lambda [形參1, 形參2, ...] : 表達式
示例見:
lambda.py
說明:
1. lambda 只是一個表達式,它用來創建一個函數對象
2. 當lambda表達式調用時,先執行冒號(:)後的表達式,並返回表達式的結果的引用
3. lambda 表達式創建的函數只能包含一條表達式
4. lambda比函數簡單且可以隨時創建和銷燬,有利於減少程序的偶合度
eval()/exec()函數
eval(source,globals=none,local=none)
把一個字符串srouce