表达式和生成式
在python中,分支结构和for循环结构十分的常用,它们也有一些简化的版本。
三元表达式
分支结构if的一般用法:
name = input('输入你的大名')
if name =='leethon':
print('handsome boy')
else:
print('点个赞呗,大帅哥')
这样二选一的结构占了四行,不是很优雅,python提供了简洁的语法:
name = input('输入你的大名')
res = 'handsome boy' if name == 'leethon' else '点个赞呗,大帅哥' # 三元表达式
print(res)
二选一的if-else结构被简化为了一行,十分的优雅。
这样的结构叫三元表达式,三元指,
一元:数据值
if二元:判断条件
else三元:数据值
如果判断条件成立则返回if左侧的数据值,如果判断条件不成立则返回else右侧的数据值。
列表生成式
如何对一个列表进行整体型的操作,如:
对列表[1, 2, 3, 4, 5]
中的每个数字进行+1操作,以最普遍的for循环用法:
l1 = []
for num in [1, 2, 3, 4, 5]:
l1.append(num + 1)
print(l1) # [2, 3, 4, 5, 6]
但是python又给我们提供了更简洁的语法:
l1 = [num + 1 for num in [1, 2, 3, 4, 5]]
print(l1) # [2, 3, 4, 5, 6]
这个优雅快速获取新列表的语法叫列表生成器,通过遍历一个可以遍历的对象,对遍历对象的每个元素进行一定的操作,得到新的列表。
其语法结构的一般形式为
[表达式 for 变量名 in 可被遍历的对象]
执行顺序:
1.for先行,将遍历值的第一个元素塞到变量名里面,
1.for前面表达式的结果被作为新列表的第一个元素(注,这个表达式可以含for后的变量名)
2.进入下一次for循环,遍历新值
2.for前表达式的结果作为第二个元素传入列表
以此类推
表达式中可含变量名的特点,使它可以对可遍历对象的的每个元素做一定的处理,再生成新的列表。
进阶例子
l1 = [[0] for _ in range(10)]
print(l1)
# [[0], [0], [0], [0], [0], [0], [0], [0], [0], [0]]
# 得到一个嵌套的列表
字典生成式
for循环有时会跟两个变量形成以下的结构:
any_dict = {'leethon': 'handsome', 'alex': 'small-handsome', 'lalisa': 'big-bella'}
for k, v in any_dict.items():
print(k, v)
## 运行结果
leethon handsome
alex small-handsome
lalisa big-bella
##
# enumerate内置方法,类似于得到一个序号与值的二元组列表
for index, value in enumerate([1, 2, 3, 4, 5]):
print(index, value)
## 运行结果
0 1
1 2
2 3
3 4
4 5
##
我们也利用for跟两个变量的形式,来构筑字典生成式:
# 打印A-D的ASCII码对应
print({k: v for k, v in enumerate(['A', 'B', 'C', 'D'], start=65)}) # enumerate的start参数,表示序号开头
# {65: 'A', 66: 'B', 67: 'C', 68: 'D'}
字典生成式以{}
为外壳,内部也是表达式加for循环的结构,for循环先执行,表达式作为for关键字的子代码后执行。表达式要为键值对的形式才得到字典。
集合生成式
如果{}
内部的表达式不是k:v
键值对的形式,而是单独一个表达式形式,则产生集合生成式
print({v for v in 'hello'})
# {'l', 'o', 'e', 'h'} # 去重且无序
匿名函数及其应用
匿名函数指没有函数名的函数,无法通过名字找到它的代码,他可以代替如下的结构:
def func(a, b):
return a+b
# 只传参和只返回,所有的表达式在return后写完的结构
匿名函数关键字lambda
lambda 形参:返回值 # lambda语法
代替上述代码写为:
lambda a, b: a+b
匿名函数的应用场景很小,因为代码不能被函数名找到,所以即用即丢。
它常常搭配一些需要传入函数实参的内置函数使用。
常见内置函数
-
map() —— 映射
map(函数, 可遍历对象) 指将遍历的元素挨个取出来做函数的形参,得到的返回值放到map工厂里,map工厂转换为列表的结果就是每个被函数处理好的元素组成的列表
l1 = [1, 2, 3, 4, 5] '''如果用有名函数 def func(a): return a + 1 res = map(func, l1) ''' res = map(lambda x:x+1, l1) # 而匿名函数这种简单又临时的函数很适合用在这里 print(list(res)) # [2, 3, 4, 5, 6] """ 元素1经过匿名函数变成2, 元素2经过匿名函数返回3 以此类推 最终res会接收一个迭代器,可以被for循环,所以可以被list()转换为列表 """
-
max()/min() —— 最大最小值
# 简单的比较 l1 = [11, 22, 33, 44] res = max(l1) # 44 # 依据映射关系比较 d1 = { 'leethon': 100, 'jason': 8888, 'lalisa': 99999999, 'alex': 1000 } # def func(a): # 传键 # return d1.get(a) # 返回字典的值 # res = max(d1, key=func) # key后面跟函数 res = max(d1, key=lambda k: d1.get(k)) # 根据键的值来比较 print(res) # lalisa # 但是返回的是键
max根据映射关系比较的逻辑是:
根据遍历元素映射后的值作依据比较,得到的结果是映射前原本的元素。
-
reduce()
# reduce 传多个值,返回一个值
from functools import reduce # 已经不是内置方法了,需要导入模块
l1 = [1, 2, 3, 4, 5]
res = reduce(lambda a, b: a * b, l1) # 计算 ((((1+2)+3)+4)+5)
print(res)
标签:函数,res,列表,匿名,l1,print,表达式
From: https://www.cnblogs.com/Leethon-lizhilog/p/16788991.html