匿名函數(shù)
1.什么是匿名函數(shù)
沒有函數(shù)名的函數(shù)就是匿名函數(shù)
2.語法
變量名 = lambda 形參列表:返回值 --根據(jù)實(shí)際情況剂买,前面的'變量名='可以不要(并非省略)
3.說明
lambda:關(guān)鍵字气笙,固定寫法
形參列表:可以設(shè)置默認(rèn)值得哆,不可以通過'冒號(hào)+類型名'的方式來說明參數(shù)類型(因?yàn)楹秃竺娴拿疤?hào)沖突)梁剔,只能用默認(rèn)值來設(shè)定參數(shù)類型虽画,其他和普通函數(shù)的形參列表一樣。
":" :固定寫法
返回值:相當(dāng)于普通函數(shù)中return后面的語句荣病,只能有一條語句(不能是帶有return的語句)码撰,因此有多行代碼的普通函數(shù),匿名函數(shù)無法實(shí)現(xiàn)
def func(n1,n2):
return n1+n2
lambda n1,n2=0:n1+n2
lambda:print('hello world') #參數(shù)可以為空
4.調(diào)用
變量名(實(shí)參列表):前面的變量名不一定要指定个盆,可以是通過任何方式獲取到的類型是function的值
在聲明時(shí)也可以同時(shí)調(diào)用:
(lambda n:n+1)(3)
Python中脖岛,聲明函數(shù)可以是看成聲明類型名為function的變量朵栖;匿名函數(shù)可以看成是function類型的數(shù)據(jù)(類似100是int類型的數(shù)據(jù))
a = lambda:print('hello world') #a為變量,可以出現(xiàn)在列表柴梆,字典以及各種語句中
print(type(a)) #<class 'function'>
b = ['abc',1,2,'c',a]
print(b[-1]) #結(jié)果為<function <lambda> at 0x00665228>
c = ['abc',1,2,lambda x,y:x+y]
print(c[-1](10,20)) #30
d = (lambda n:n+1)(3)
print(d) #4
函數(shù)作為變量
python中陨溅,聲明函數(shù)其實(shí)就是在聲明一個(gè)類型是function的變量,函數(shù)名就是變量名轩性。所以普通變量能做的事声登,函數(shù)都能做。
如下函數(shù)揣苏,func1是類型為function的變量悯嗓,它里面存的數(shù)據(jù)是一個(gè)函數(shù)
def func1(n):
return n*n
#也可以寫為:
func1 = lambda n:n*n
print(func1,type(func1),func1(10))
普通變量能做的函數(shù)都能做:
- 給其他變量賦值
a = lambda n:n*2
b = a
- 可以作為列表,元祖的元素卸察,字典的value脯厨,不能作為key及集合的元素,因?yàn)閒unction可變
def a(n):
return n*2
b = [ 1,2,3,a]
print(b[-1](3)) #6
- 作為其他函數(shù)的實(shí)參(實(shí)參高階函數(shù)或閉包)
def x(y):
y('abc')
x(print) #結(jié)果顯示:'abc'(print打印出來的坑质,函數(shù)調(diào)用值為None)
實(shí)參高階函數(shù)應(yīng)用:sort方法的使用
列表.sort(key):key需要傳一個(gè)類型是function的值(函數(shù))合武,要求這個(gè)函數(shù)有一個(gè)參數(shù)和一個(gè)返回值;
? 參數(shù)指向的是列表中的每個(gè)元素涡扼,返回值是排序的時(shí)候的比較對(duì)象稼跳。
nums = ['19','90','78','9','87']
nums.sort()
print(nums) #['19', '78', '87', '9', '90'],按字符串大小排序
#若要按數(shù)字大小比較排序:
print(nums.sort(key=lambda x:int(x))) #['9', '19', '78', '87', '90']
類似的還有max()吃沪,min()汤善。
nums = ['14', '40', '73', '9', '85']
def fn1(x):
return x[0] # 返回值決定列表中的元素按什么進(jìn)行排序
nums.sort(key=fn1)
print(nums) # ['14', '40', '73', '85', '9']
nums.sort(key=lambda item: int(item))
print(nums) # ['9', '14', '40', '73', '85']
students = [
{'name': 'xiaoming', 'age': 23, 'score': 90},
{'name': 'huahu', 'age': 30, 'score': 70},
{'name': 'zhangsan', 'age': 19, 'score': 100},
]
students.sort(key=lambda item: item['age'])
print(students)
students.sort(key=lambda item: item['score'])
print(students)
students.sort(key=lambda item: item['name'][-1])
print(students)
print(max(['10', '30', '8'], key=lambda x: int(x)))
print(max(students, key=lambda x: x['score']))
"""
['14', '40', '73', '85', '9']
['9', '14', '40', '73', '85']
[{'name': 'zhangsan', 'age': 19, 'score': 100}, {'name': 'xiaoming', 'age': 23, 'score': 90}, {'name': 'huahu', 'age': 30, 'score': 70}]
[{'name': 'huahu', 'age': 30, 'score': 70}, {'name': 'xiaoming', 'age': 23, 'score': 90}, {'name': 'zhangsan', 'age': 19, 'score': 100}]
[{'name': 'xiaoming', 'age': 23, 'score': 90}, {'name': 'zhangsan', 'age': 19, 'score': 100}, {'name': 'huahu', 'age': 30, 'score': 70}]
30
{'name': 'zhangsan', 'age': 19, 'score': 100}
"""
# =================自定義sort函數(shù)(模擬系統(tǒng)的)-了解============
def yt_sort(list1, key=None, reverse=False):
""""""
length = len(list1)
if reverse:
# 降序排列
for x in range(0, length-1):
for y in range(x+1, length):
if key:
if key(list1[y]) > key(list1[x]):
list1[x], list1[y] = list1[y], list1[x]
else:
if list1[y] > list1[x]:
list1[x], list1[y] = list1[y], list1[x]
else:
for x in range(0, length-1):
for y in range(x+1, length):
if key:
if key(list1[y]) < key(list1[x]):
list1[x], list1[y] = list1[y], list1[x]
else:
if list1[y] < list1[x]:
list1[x], list1[y] = list1[y], list1[x]
nums = ['1', '60', '27', '9']
yt_sort(nums, key=lambda x: x[-1])
print(nums)
nums = [1, 90, 89, 9]
yt_sort(nums, reverse=True)
print(nums)
- 作為函數(shù)的返回值
def oper(char):
if char == '+':
def zy_sum(*num):
sum1 = 0
for i in num:
sum1 += i
return sum1
return zy_sum
else:
return None
print(oper('+')(1,2,3,4,5,6)) #21
思考
list1 = []
for i in range(4):
list1.append(lambda x:x*i)
#求值
list1[0](3)
list1[1](3)
list1[2](3) #結(jié)果都是9
注意:函數(shù)在聲明時(shí),函數(shù)體不會(huì)執(zhí)行票彪,直接跳過红淡,直到被調(diào)用時(shí),因此即使函數(shù)體有錯(cuò)誤降铸,如果不被調(diào)用則不會(huì)報(bào)錯(cuò)
作用域
作用域:變量的使用范圍在旱,分為全局變量和局部變量
全局變量
Python中除了在函數(shù)中或者類中聲明的變量,都是全局變量推掸。全局變量的作用域是從聲明開始到文件結(jié)束的任何位置都可以使用
局部變量
在函數(shù)中聲明的變量就是局部變量桶蝎,從聲明開始到函數(shù)結(jié)束都可以用
函數(shù)聲明時(shí)的形參是局部變量
不能在函數(shù)中直接修改一個(gè)全局變量的值,其結(jié)果是在函數(shù)中重新聲明一個(gè)新的變量
a = 10
def func():
a = 22
return a
print(a) #10
print(func()) #22
global和nonlocal
global:若想要在一個(gè)函數(shù)中修改全局變量的值终佛,或者想要在函數(shù)中聲明一個(gè)全局變量俊嗽,使用global
語法:
global 變量名1,變量名2铃彰,...
變量名1=值1
變量名2=值2
...
注意:在函數(shù)中聲明全局變量時(shí)绍豁,不能在聲明全局變量前又聲明它為局部變量。聲明全局變量后牙捉,之后在函數(shù)中調(diào)用的此變量都視為全局變量
a=1
def func():
a = 111 #不能在聲明全局變量前又聲明為局部變量
global a
a = 11
return a
print(a)
print(func()) #直接報(bào)錯(cuò)
nonlocal:想要在局部的局部中修改一個(gè)局部變量的值竹揍,使用nonlocal
語法:
nonlocal 變量1敬飒,變量2,...
變量名1=值1
變量名2=值2
def fun22():
aaa = 123
def fun222():
nonlocal aaa
aaa = 1000
print('==:', aaa)
fun222()
print(aaa)
fun22()
"""
==:1000
1000
"""