Python解析式和生成式
python三元表达式
-
python中没有像其他语言中一样的三元表达式或者三目运算符,但有类似的实现方式
-
其他语言中,一般语法格式是"判断条件?为真时的结果:为假时的结果"
-
在python中,格式是为真时结果 if 判断条件 else 为假时的结果
In [21]: True if 1 > 0 else False Out[21]: True
python列表解析式
语法
- [返回值] for 元素 in 可迭代对象 if 条件]
- 使用[],内部时for循环,if可选
- 返回一个新列表
列表解析式是一种语法糖
- 编译器会优化,不会因为简写影响代码效率
- 简化语法和代码
# 求1-9的平方的值
# 不实用列表解析时
In [22]: newlist = []
In [23]: for i in range(10):
...: newlist.append((i+1)**2)
...:
In [24]: newlist
Out[24]: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# 使用列表解析的实现
In [27]: newlist1 = [(i+1)**2 for i in range(10)]
In [28]: newlist1
Out[28]: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# 获取10以内的偶数,配合if条件语句
In [43]: even = []
In [45]: for x in range(10):
...: if x % 2 == 0:
...: even.append(x)
In [46]: even
Out[46]: [0, 2, 4, 6, 8]
# 使用列表解析实现
In [50]: [x for x in range(10) if x % 2 == 0]
Out[50]: [0, 2, 4, 6, 8]
列表解析式进阶
-
[expr for i in iterables1 for j in iterables2]
等价于
ret = []
for i in iterables1:
for j in iterables2:
ret.append(i*j)
-
示例
- [(x,y) for x in 'abcde' for y in range(5)]
- [(i,j) for i in range(7) for j in range(20,25) if i>4 and j>23]
-
演示
- 既能被2整除又能被3整除的数
In [53]: [i for i in range(20) if i%2 == 0 if i%3 ==0] Out[53]: [0, 6, 12, 18] -
获取列表两两相邻的和并输出新列表
lst = [1, 4, 9, 16, 2, 5, 10, 15]
newlist = [lst[index] + lst[index + 1] for index in range(len(lst) - 1)]
print(newlist)
- 获取九九乘法表
# 一
print('\n'.join(["".join(["{}*{}={:<4}".format(j, i, i * j) for i in range(1, j + 1)]) for j in range(1, 10)]))
# 二
[print('{}*{}={:<4}{}'.format(j, i, i * j, '\n' if i == j else ''), end='') for i in range(1, 10) for j in range(1, i + 1)]
- 按照0001.abcdbfsf的格式生成ID
print(["{:>04}.".format(j) + "".join([random.choice(string.ascii_lowercase) for i in range(10)]) for j in range(1, 100)])
生成器表达式
-
语法
- (返回值 for 元素 in 可迭代对象 if 条件)
- 将列表解析式中的中括号换成小括号
- 返回一个生成器
-
生成器表达式和列表解析式的区别
- 计算方式
- 生成器表达式是按需计算(惰性求值、延迟计算,需要的时候草计算值)
- 列表解析式是全部立即返回值
- 生成器返回迭代器,可以迭代,列表解析式返回的也可以迭代,但不是迭代器
- 迭代器只可迭代一遍,列表解析式可以重复迭代
- 内存占用
- 生成器表达式更加节省内存,列表解析式返回新列表
- 计算速度
- 生成器表达式耗时较短,列表解析式耗时长
- 生成器本身并没有返回值,只返回了一个生成器对象
# 列表解析式直接返回 In [1]: [x for x in range(5)] Out[1]: [0, 1, 2, 3, 4] In [6]: lst = [x for x in range(5)] In [7]: for i in lst: ...: print(i) 0 1 2 3 4 # 生成器返回一个可迭代对象 In [2]: (x for x in range(5)) Out[2]: <generator object <genexpr> at In [3]: g = (x for x in range(5)) In [4]: next(g) Out[4]: 0 In [5]: next(g) Out[5]: 1 - 计算方式
-
生成器
- 可迭代对象
- 迭代器
集合解析式
- 语法
- 列表解析式中括号换成{}
- 立即返回一个集合
- 示例
In [92]: {x for x in range(10)}
Out[92]: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
字典解析式
- 语法
- 使用key:value形式
- 返回一个字典
- 示例
In [93]: {x:x+1 for x in range(10)}
Out[93]: {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}

浙公网安备 33010602011771号