大爽Python入门教程 63 容器进阶 生成式

大爽Python入门公开课教案 点击查看教程总目录

生成式

如何快速新建列表,比如建立一个0123456789的列表呢。
根据之前的知识,我们可以使用rangelist函数来生成。

>>> 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)

也就是

  1. 遍历可迭代对象iterable
  2. 每次遍历出的值,赋值给item
  3. 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}
原文地址:https://www.cnblogs.com/BigShuang/p/15630241.html