九、匿名函数
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=336
print(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