大爽Python入门教程 6-3 容器进阶 生成式
大爽Python入门公开课教案 点击查看教程总目录
生成式
如何快速新建列表,比如建立一个0123456789的列表呢。
根据之前的知识,我们可以使用range
和list
函数来生成。
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
但这种方法局限其实比较大,比如想生成这些数据的平方就不行了。
这里介绍更高效的办法,那就是生成式(Comprehensions)。
python有多种生成式,这里只介绍常用的两种:
- 列表生成式(List Comprehensions)
- 字典生成式(Dictionary Comprehensions)
列表生成式
基础语法
其基础语法为
lst = [expression for item in iterable]
其作用相当于
lst = []
for item in iterable:
lst.append(expression)
也就是
- 遍历可迭代对象
iterable
- 每次遍历出的值,赋值给
item
, - 对
item
使用expression
表达式进行计算,把值添加到列表中。
其中expression
表达式是非常灵活的,
比如可以是固定的值,也可以是运算式,还可以是函数。
可以与item
有关,也可以与item
无关。
示例如下
>>> [0 for i in range(5)]
[0, 0, 0, 0, 0]
>>> [i * i for i in range(5)]
[0, 1, 4, 9, 16]
>>> colors = ["red", "blue", "yellow", "green"]
>>> [len(s) for s in colors] # 得到每个字符串的长度
[3, 4, 6, 5]
进阶语法
该语法也比较常用
列表生成式进阶语法为
lst = [expression for item in iterable if condition]
其作用相当于
lst = []
for item in iterable:
if condition:
lst.append(expression)
也就是多了个condition
做条件判断,
condition
为真时,才将expression
添加到列表中。
示例如下
>>> lst = [1, -2, 3, -4, 6, 7, -8]
>>> [item for item in lst if item > 0] # 获取所有的正数
[1, 3, 6, 7]
再举个例子,我们之前写过判断素数的函数,
这里结合这个语法,获取所有小于100的素数列表,代码如下
def is_prime(num):
if num < 2:
return False
for i in range(2, num):
if num % i == 0:
return False
return True
prime_100 = [num for num in range(100) if is_prime(num)]
print(prime_100)
输出如下
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
字典生成式
字典生成式其实用的比较少,列表生成式用的非常多。
字典生成式的完整语法如下
dic = {key: value for vars in iterable if condition}
其等价于
dic = {}
for vars in iterable:
if condition:
dic[key] = value
使用示例如下
>>> {s: 0 for s in "abcde"}
{'a': 0, 'b': 0, 'c': 0, 'd': 0, 'e': 0}
>>> fruits = [("apple",10), ("banana",5), ("cherry",20)]
>>> {item[0]: item[1] for item in fruits}
{'apple': 10, 'banana': 5, 'cherry': 20}
使用生成式复制
使用生成式也可以实现
对列表或字典的复制操作.
示例如下
拷贝列表
>>> x = [1, 2, 3, 4]
>>> x_copy = [item for item in x]
>>> x_copy
[1, 2, 3, 4]
拷贝字典
>>> a = {'apple': 10, 'banana': 5, 'cherry': 20}
>>> a_copy = {key: a[key] for key in a}
>>> a_copy
{'apple': 10, 'banana': 5, 'cherry': 20}