問題:
def mysum(a,b):
print(a+ b)
r =mysum(100, 200)
print(r) # 請問r綁定的是什麼?
# 讓mysum返回一個加法的結果:
def mysum(a,b):
result =a + b
r =mysum(100, 200)
print(result) # 打印錯誤
函數說明:
函數外部無法訪問函數內部的局部變量
函數內部可以訪問函數外部的變量,但不能修改函數外部變量的綁定關係
例如:
x = 0
defmyadd(a, b):
x = a+ b
print(x)
r =myadd(100, 200)
print(x) # 0
return 語句
語法:
return [表達式]
注: []代表內容可省略
作用:
用於函數中,結束當前的函數的執行,返回到調用該函數的地方,同時返回表達式的引用關係
說明:
1. return語句後跟的表達式可以省略,省略後相當於return None
2. 如果函數內沒有return語句,則函數執行完最後一條語句後返回None(相當於在最後加了一條 return None語句)
示例見:
return.py
練習:
1. 寫一個函數mymax,實現返回兩個數的最大值:
如:
defmymax(a, b):
...<<-- 此處自己實現
print(mymax(100, 200)) # 200
print(mymax("ACB", "ABC")) # ACB
2. 寫一個函數input_number
definput_number():
此處自己實現
此函數用來獲取用戶循環輸入的整數,當輸入負數時結束輸入.
將用戶輸入的數字以"列表"的形式返回,再用內建函數max, min, sum求出用戶輸入的最大值,最小值和平均值
L =input_number()
print(L) # 打印用戶輸入的列表
print("用戶輸入的最大值是:", max(L))
print("用戶輸入的最小值是:", min(L))
print("用戶輸入的平均是:", sum(L)/len(L))
函數的參數傳遞
傳遞方式:
位置傳參
序列傳參
關鍵字傳參
字典關鍵字傳參
位置傳參:
實際傳遞參數(以下簡稱"實參")與形式參數(形參)的對應關係按位置來依次對應
示例見:
position_give_args.py
序列(列表,元組,字符串,有序的排列)傳參:
序列傳參是指在函數調用過程中用"*"將序列拆解後按位置進行傳遞的傳參方式
示例見:
sequence_give_args.py
關鍵字傳參:
關鍵字傳參是指傳參時,按着形參的"名稱"給形參賦值
實參和形參按名稱進行匹配
示例見:
keyword_give_args.py
字典關鍵字傳參:
是指實參爲字典,將字典用 "**" 拆解後進行關鍵傳參的傳參方式
示例見:
dict_keywork_give_args.py
說明:
字典的鍵名和形參名必須一致
字典的鍵名必須爲字符串(且必須爲標識符的規則)
字典的鍵名要在形參中存在
函數的綜合傳參:
函數的傳參方式在能確定形參能唯一匹配到應當實參的情況下可以任意組合
要求:
位置傳參在前,關鍵字傳參在後
示例見:
com_give_args.py
練習:
1. 利用上題input_number獲取用戶輸入的數字列表
寫一個函數split_number(L)傳入得到的列表
將所有的數字分爲奇數和偶數,分別放在兩個列表odds 和evens 中
同時返回這兩個列表打印其中的數據
defsplit_number(L):
此處自己實現
L =input_number() # 1, 2, 3, 4, 5, 6
t =split_number(L) # 返回一個元組,元組裏放兩個列表
odds, evens =t
print("所有的奇數是:", odds) # [1, 3, 5]
print("所有的偶數是:", evens) # [2, 4, 6]
上午:
函數的傳參:
四種:
位置傳參
(*序列傳參)
關鍵字傳參
(**字典關鍵字傳參)
---------以下講函數的定義和創建時形參的定義--------
函數的缺省參數
語法
def 函數名(形參名1=默認實參1, 形參名2=默認實參2, ..)
示例見:
defualt_args.py
說明:
1. 缺省參數必須自右至左依次存在,如果一個參數有缺省參數,則其右側的所有參數都必須有缺省參數
deffa(a=1, b, c=3): # 是錯的
def fb(a,b=10, c): # 是錯的
2. 缺省參數可以有0個或多個,甚至全部都是缺參參數
練習:
寫一個函數myadd, 此函數可以計算兩個數的和,也可以計算三個數的和
defmyadd(.......):
.... 此處自己實現
print(myadd(10, 20)) # 30
print(myadd(100, 200, 300)) # 600
函數形參的定義方式:
位置形參
星號元組形參
命名關鍵字形參
雙星號字典形參
位置形參:
語法:
def 函數名(形參名1, 形參名2, ...):
語句塊
星號元組形參:
語法:
def 函數名(*元組形參名):
語句塊
作用:
收集多餘的位置傳參
練習:
寫一個函數mysum 可以傳入任意個實參,返回所有實參的和
defmysum(*args):
....
print(mysum(1, 2, 3, 4)) # 10
print(mysum(5, 6, 7, 8, 9, 10)) #45
命名關鍵字形參
語法:
def 函數名(*,命名關鍵字形參): *只是個標識,*後面的必須是關鍵字傳參
語句塊
或
def 函數名(*args,命名關鍵字形參):
語句塊
作用:
強制所有的傳參都必須用關鍵字傳參
示例見:
keywords_args.py
雙星號字典形參
語法:
def 函數名(**字典形參名):
語句
作用:
收集多餘的關鍵字傳參
示例見:
double_star_keyword_args.py
函數的參數說明:
位置形參,星號元組形參,命名關鍵字形參,雙星號字典形參,缺省參數可以混合使用
函數參數自左至右的順序依次爲:
位置形參
星號元組形參
命名關鍵字形參
雙星號字典形參
函數的不定長參數:
星號元組形參,雙星號字典形參
說明:
可以接受任意位置的傳參解關鍵字傳參
示例:
def fn(a, b,*args, c, d, **kwargs):
pass
fn(1,2,3,4, c=100,d=200, e=300, f=400)
全局變量和局部變量
局部變量:
1. 定義在函數內部的變量稱爲局部變量(函數的形參也是局部變量)
2. 局部變量只能在函數內部使用
3. 局部變量在函數調用時才能夠被創建,在函數調用結束之後會自動銷燬
全局變量:
1. 定義在函數外部,模塊內部的變量稱爲全局變量
2. 所有的函數都可以直接訪問"全局"變量,但函數內部不能直接通過賦值語句來改變全局變量
示例見:
variable.py
局部變量說明:
1. 在函數內首次對變量賦值是創建局部變量,再次爲變量賦值是修改局部變量的綁定關係
2. 在函數內部的賦值語句不會對全局變量造成影響
3. 局部變量只能在其被聲明的函數內部訪問,而全局變量可以在整個模塊同訪問
練習:
創建一個全局變量:
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))