zoukankan      html  css  js  c++  java
  • 大爽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}
    
  • 相关阅读:
    Win10升级后无法删除Windows.old文件夹
    修改Window服务器虚拟内存位置
    快速修改Windows系统密码命令
    本机无法连通虚拟机但是虚拟机之间可以连通问题记录
    Windows删除文件夹下的指定格式文件(递归删除)
    Xshell连接SqlPlus无法使用退格、删除键
    Spring SpringMVC SpringBoot SpringCloud概念、关系及区别
    关于接口设计的一些思考
    SpringCloud 在Feign上使用Hystrix(断路由)
    Docker-Compose入门
  • 原文地址:https://www.cnblogs.com/BigShuang/p/15630241.html
Copyright © 2011-2022 走看看