前言回顧
1.函數(shù)的定義:函數(shù)就是對(duì)實(shí)現(xiàn)某一特定功能的代碼塊的封裝
2.函數(shù)的聲明:
def 函數(shù)名(形參列表):
函數(shù)體 - 兩部分組成(聲明文檔绍坝,代碼塊)
注意:1.python中不支持函數(shù)的重載(名字相同的函數(shù)只能有一個(gè))
2.聲明函數(shù)的時(shí)候函數(shù)體不會(huì)執(zhí)行
3.函數(shù)的調(diào)用 - 調(diào)用函數(shù)必須在聲明函數(shù)之后
函數(shù)名(實(shí)參列表)
(重點(diǎn)畴栖!)函數(shù)的調(diào)用過程:
- 回到函數(shù)聲明的位置
- 傳參
- 執(zhí)行函數(shù)體
- 執(zhí)行完函數(shù),確定函數(shù)返回值
怎么確定返回值:看執(zhí)行完函數(shù)有沒有遇到return镰烧,如果遇到return后面的值就是函數(shù)的返回值惹盼,否則就是None- 回到函數(shù)調(diào)用的位置唤反,接著往后執(zhí)行 (這個(gè)時(shí)候函數(shù)調(diào)用表達(dá)式的值就是函數(shù)的返回值)
def func1(a=10):
print('函數(shù)1')
func2() # 此處func2存在,是因?yàn)閜ython是解釋性語言柴信,在沒有調(diào)用的時(shí)候套啤,是不會(huì)執(zhí)行函數(shù)里面的函數(shù)體的
# func1() # func1 在此位置會(huì)出錯(cuò),因?yàn)閒unc2()還沒聲明
def func2():
print('函數(shù)2')
func1() # 此處func1和func2都已經(jīng)聲明了随常,不會(huì)報(bào)錯(cuò)
print('=====')
4.函數(shù)的參數(shù)
- 位置參數(shù)和關(guān)鍵字參數(shù)(位置參數(shù)要在關(guān)鍵字參數(shù)前)
- 參數(shù)默認(rèn)值 (沒有默認(rèn)值的參數(shù)要放在有默認(rèn)值的參數(shù)前面)
- 函數(shù)中參數(shù)和返回值類型說明
- 不定長參數(shù)
參數(shù)名潜沦,參數(shù)名 (為位置參數(shù) ->多個(gè)數(shù)據(jù)返回元組,**為關(guān)鍵字參數(shù) -> 多個(gè)數(shù)據(jù)返回字典)
def func3(b: str, a=10) -> int: # -> 說明返回值類型
a = 10
if a >=10:
print('大于等于10')
print('函數(shù)3')
return 10
result = func3('abc')
print(result)
print(func3('abc') * 100)
def func4() -> str: # 說明返回值為str
return 'abc'
print(func4())
print('======')
5.返回值
- 怎么確定返回值:看return
2)怎么獲取返回值:使用函數(shù)調(diào)用表達(dá)式
def func6(a, b, c):
print('abc:', a, b, c)
def func5(*num):
print(*num) # 容器加*绪氛,是將容器中的元素都拿出來
# func6(10, 20, 30)
func6(*num)
# range(12, 34, 56)
for x in range(*num): # num中的元素自動(dòng)填充唆鸡,放在range里面,最后一個(gè)數(shù)就是步長
print('===:', x) # ===: 12
func5(12, 34, 56)
print('+++++++++')
def func7():
print('=======')
return 'abc'
print(func7()[0]) # func7返回后(返回'abc')枣察,然后切片(即為'a')
for x in func7():
print(x)
匿名函數(shù)
1.什么是匿名函數(shù)
匿名函數(shù)就是沒有名字的函數(shù)
- 語法
lambda 參數(shù)列表:返回值
- 說明
lambda - 關(guān)鍵字
參數(shù)列表 - 相當(dāng)于普通函數(shù)的形參列表争占,變量1,變量2...
: - 固定寫法
返回值 - 相當(dāng)于普通函數(shù)體中的return語句 可以是除了賦值語句以外的任何語句
注意:1.匿名函數(shù)本質(zhì)還是函數(shù)序目,之前函數(shù)中的語法絕大多數(shù)都使用(通過類型名對(duì)參數(shù)類型進(jìn)行說明不支持 如:-> x:int)
2.匿名函數(shù)能做的事情臂痕,普通函數(shù)都能做,只是匿名函數(shù)簡潔
用匿名函數(shù)求兩個(gè)數(shù)的和
func = lambda x, y=20: x+y
print(func(10, 20)) # 位置參數(shù)也支持
print(func(y=10, x=20)) # 關(guān)鍵字參數(shù)也支持
print(func(10))
# func = lambda x: int, y=20: x+y # 不支持x: int 匿名函數(shù)無法識(shí)別:
func1 = lambda *num: sum(num)
print(func1(1, 2, 3))
# lambda x, y: x+y的意義如下:
# def func(x, y):
# return x+y
print('=====')
func2 = lambda x, y: x if x>y else y
print(func2(3, 5))
例如用匿名函數(shù)實(shí)現(xiàn)用某一關(guān)鍵字進(jìn)行排序
students = [
{'name': '張三', 'age': 20},
{'name': '李四', 'age': 19},
{'name': '王五', 'age': 18}
]
students.sort(key=lambda stu: stu['age'])
print(students)
===匿名函數(shù)就是函數(shù)的值的理解===
10 # int的值
a = 10
print(type(a))
'abc' # str的值
str1 = 'abc'
print(type(str1))
[10, 39, 90] # list的值
list1 = [10, 39, 90]
print(type(list1))
{'a': 10, 'b': 100} #dict的值
dict1 = {'a': 10, 'b': 100}
print(type(dict1))
lambda x, y: x+y # function的值
func1 = lambda x, y: x+y
print(type(func1))
1.變量的作用域
指的就是變量的使用范圍
2.全局變量猿涨、局部變量
- 全局變量:沒有聲明在函數(shù)/類中的變量都是全局變量握童,全局變量的作用域是從變量[聲明]開始到整個(gè)py[文件結(jié)束]
- 局部變量:聲明在函數(shù)中的變量都是局部變量,局部變量的作用域是從變量[聲明]到[函數(shù)結(jié)束]
注意:形參也是局部變量
當(dāng)在調(diào)用函數(shù)的時(shí)候叛赚,系統(tǒng)會(huì)自動(dòng)的在內(nèi)存的棧區(qū)間為這個(gè)函數(shù)開辟一個(gè)獨(dú)立的內(nèi)存區(qū)域澡绩,
用來保存在函數(shù)中聲明或者產(chǎn)生的數(shù)據(jù),當(dāng)函數(shù)調(diào)用結(jié)束后俺附,這塊內(nèi)存區(qū)域會(huì)自動(dòng)銷毀
===全局變量===
a = 10 # a是全局變量
if True:
print('if:', a)
for x in range(4):
print('for:', x, a)
# num 全局變量
for num in range(3):
temp = 100 # temp 全局變量
print(num)
print('循環(huán)外', num)
def func2():
print('函數(shù)里', num)
func2()
===局部變量===
# 函數(shù)里面聲明的數(shù)是局部變量英古,函數(shù)的形參也是也是局部變量
def func3(xx):
yy = 100
print('函數(shù)中', xx, yy)
func3(10)
# print(xx) # NameError: name 'xx' is not defined
# print(yy) # NameError: name 'yy' is not defined
3.global和nonlocal
- global - 在函數(shù)中聲明一個(gè)全局變量(只能在函數(shù)中使用)
global 變量名
變量名 = 值 # 不可以把global和變量賦值放在一行 - nonlocal - 在局部環(huán)境(函數(shù)內(nèi)部)的局部中取修改一個(gè)局部變量的值,就使用nonlocal
===global===
# x1 = 100
def func4():
global x1 # 說明后面的x1是全局變量
x1 = 200
# 只有下面一行時(shí)
# x1 = 200 # 新增的局部變量x1昙读,下面的print就近打印x1
print('函數(shù)中', x1)
func4()
print('函數(shù)外面', x1)
===nonlocal===
def func5():
x2 = 100
def func6():
nonlocal x2
x2 = 200
print('函數(shù)中的函數(shù)', x2)
func6()
print('函數(shù)中', x2)
func5()
聲明函數(shù)是不會(huì)執(zhí)行函數(shù)體的