九、匿名函數
lambda表達式
語法規則:
變量 = lambda 參數1,參數2,…:返回值
例:用lambda簡化下述操作
def func(a,b):return a+b
ret = func(1, 2)
print(ret)
代碼:
fn = lambda a,b:a+b
print(fn)
print(fn(12,13))
結果:
<function <lambda> at 0x000001E751EAAF20>
25
可以幫我們一句話創建函數
可以與某些內置函數一起用
十、內置函數(下)
(一)zip:可以把多個可迭代內容進行合并
zip自動實現如下操作:
代碼:
lst1 = ["趙本山","范偉","蘇有朋"]
lst2 = [40,38,42]
lst3 = ["賣拐","耳朵大有福","情深深雨濛濛"]result = []
for i in range(len(lst1)):first = lst1[i]second = lst2[i]third = lst3[i]result.append((first,second,third))
print(result)
結果:
[('趙本山', 40, '賣拐'), ('范偉', 38, '耳朵大有福'), ('蘇有朋', 42, '情深深雨濛濛')]
代碼:
result = zip(lst1, lst2, lst3)
print(result)
print(dir(result)) # 查詢功能lst = list(result)
print(lst)
結果:
<zip object at 0x000001E1A9C563C0>
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__'] # 包含迭代器功能
既然是迭代器,那么就可以用for循環拿到元素
代碼:
for item in result:print(item)
結果:
('趙本山', 40, '賣拐')
('范偉', 38, '耳朵大有福')
('蘇有朋', 42, '情深深雨濛濛')
還可以放到一個列表中
代碼:
lst = list(result)
print(lst)
結果:
[('趙本山', 40, '賣拐'), ('范偉', 38, '耳朵大有福'), ('蘇有朋', 42, '情深深雨濛濛')]
(二)locals、globals(了解)
locals:查看當前位置所有的局部變量
如果locals寫在了全局作用域范圍內,此時看到的就是全局作用域中的內容。
代碼:
lst1 = ["趙本山","范偉","蘇有朋"]
lst2 = [40,38,42]
lst3 = ["賣拐","耳朵大有福","情深深雨濛濛"]
a = 188
print(locals())
結果:
'__cached__': None, 'lstat': <built-in function lstat>, 'lst1': ['趙本山', '范偉', '蘇有朋'], 'lst2': [40, 38, 42], 'lst3': ['賣拐', '耳朵大有福', '情深深雨濛濛'], 'a': 188}
如果locals放在局部作用域范圍,看到的就是局部作用域的內容
代碼:
def func():a=336print(locals())func()
結果:
{'a': 336}
globals:不管寫在哪,看到的都是全局作用域中的變量
(三)sorted:排序
1. 語法規則:
sorted(可迭代的, key=排序函數,reverse=True/False是否翻轉,否則為從小到大)
代碼:
lst = [16,22,34,68,1,213,324,49]
s = sorted(lst) # 從小到大
print(s)
s1 = sorted(lst,reverse=True) # 翻轉,從大到小
print(s1)
結果:
[1, 16, 22, 34, 49, 68, 213, 324]
[324, 213, 68, 49, 34, 22, 16, 1]
2. 對字符串排序
sorted把列表中的每一項傳遞給排序函數,然后排序函數返回相應的值,最后根據返回值進行排序
要求:以字符串長短排序
代碼:
lst = ["秋","張二嘎","比克","卡卡羅特","超級宇宙無敵大帥B"]def func(item): # item對應列表中的每一項數據return len(item)s = sorted(lst,key=func) # func后不要加(),否則變成調用函數了
print(s)
結果:
['秋', '比克', '張二嘎', '卡卡羅特', '超級宇宙無敵大帥B']
函數改成lanbda形式
lst = ["秋","張二嘎","比克","卡卡羅特","超級宇宙無敵大帥B"]
func = lambda x: len(x)
s = sorted(lst,key=func)
print(s)
由于排序函數在后文幾乎不會用到,所以可以進一步簡化
lst = ["秋","張二嘎","比克","卡卡羅特","超級宇宙無敵大帥B"]
s = sorted(lst,key=lambda x: len(x))
print(s)
一般情況下,lambda配合sorted使用
3. 對列表排序
lst = [{"id": 1, "name": "周潤發", "age": 18, "salary": 56000},{"id": 2, "name": "周星馳", "age": 28, "salary": 51100},{"id": 3, "name": "周海媚", "age": 78, "salary": 56123},{"id": 4, "name": "周伯通", "age": 12, "salary": 513414},{"id": 5, "name": "周大興", "age": 35, "salary": 563123},{"id": 6, "name": "周有辣", "age": 47, "salary": 561240},{"id": 7, "name": "周扒皮", "age": 8, "salary": 2310},
]
要求1:根據每個人的年齡排序
代碼:
s = sorted(lst, key=lambda d: d["age"])
print(s)
結果:
[{'id': 7, 'name': '周扒皮', 'age': 8, 'salary': 2310}, {'id': 4, 'name': '周伯通', 'age': 12, 'salary': 513414}, {'id': 1, 'name': '周潤發', 'age': 18, 'salary': 56000}, {'id': 2, 'name': '周星馳', 'age': 28, 'salary': 51100}, {'id': 5, 'name': '周大興', 'age': 35, 'salary': 563123}, {'id': 6, 'name': '周有辣', 'age': 47, 'salary': 561240}, {'id': 3, 'name': '周海媚', 'age': 78, 'salary': 56123}]
要求2. 根據工資從大到小排列
代碼:
s = sorted(lst, key=lambda d: d["salary"], reverse=True)
print(s)
結果:
[{'id': 5, 'name': '周大興', 'age': 35, 'salary': 563123}, {'id': 6, 'name': '周有辣', 'age': 47, 'salary': 561240}, {'id': 4, 'name': '周伯通', 'age': 12, 'salary': 513414}, {'id': 3, 'name': '周海媚', 'age': 78, 'salary': 56123}, {'id': 1, 'name': '周潤發', 'age': 18, 'salary': 56000}, {'id': 2, 'name': '周星馳', 'age': 28, 'salary': 51100}, {'id': 7, 'name': '周扒皮', 'age': 8, 'salary': 2310}]
(四)filter:篩選
自動提取需要的內容
語法規則:
filter(函數,可迭代對象)
列表元素依次當做參數傳遞給函數,函數判定之后再決定是否保留
filter是個生成器
lst = ["張無忌","張三豐","張翠山","滅絕小師太","小狐仙"]
要求1:提取姓張的人
代碼:
f = filter(lambda x: x.startswith("張"),lst)
print(list(f))
結果:
['張無忌', '張三豐', '張翠山']
要求2:不要姓張的人
代碼:
f = filter(lambda x: not x.startswith("張"),lst)
print(list(f))
結果:
['滅絕小師太', '小狐仙']
(五)map:映射
map(函數,可迭代對象)
列表中的每一個元素,經過函數計算之后得到的值,作為最終結果保留
map是一個生成器
lst = [1,2,3,4,5,6,7,8,9]
要求:對每一項計算平方
代碼:
r = map(lambda x: x * x, lst)
print(list(r))
結果:
[1, 4, 9, 16, 25, 36, 49, 64, 81]
也可以不用map實現
result = [item * item for item in lst]
print(result)
后續數據分析的內容中,有些時候是列表推導式解決不了的,只能用map
十一、三元表達式(了解)
各大語言都有三元表達式。
目的是把簡單的if判斷寫成一行。
語法:
結果1 if 條件 else 結果2
過程:
判斷條件是否為真,如果真,返回結果1,否則返回結果2
代碼:
a = 10
b = 20
c = a if a > b else b
print(c)
作用等同于:
if a > b:print(a)
else:print(b)
結果:
20