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}
    
  • 相关阅读:
    poj3278 Catch That Cow
    poj2251 Dungeon Master
    poj1321 棋盘问题
    poj3083 Children of the Candy Cor
    jvm基础知识—垃圾回收机制
    jvm基础知识1
    java面试基础必备
    java soket通信总结 bio nio aio的区别和总结
    java scoket aIO 通信
    java scoket Blocking 阻塞IO socket通信四
  • 原文地址:https://www.cnblogs.com/BigShuang/p/15630241.html
Copyright © 2011-2022 走看看