zoukankan      html  css  js  c++  java
  • Python 高级特性(3)- 列表生成式

    range() 函数

    日常工作中,range() 应该非常熟悉了,它可以生成一个迭代对象,然后可以使用 list() 将它转成一个 list

    # 判断是不是迭代对象
    print(isinstance(range(0, 10), Iterable))
    
    # 生成列表
    lists = list(range(0, 10))
    print(lists)
    
    # 输出结果
    True
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    range() 的语法格式

    range(stop)
    range(start, stop[, step])

    range() 的作用

    返回一个迭代对象,它是一个整型序列,从 start 开始,然后到 stop(不包括)结束,当然也可以设置它的步进 step

    具体更多的栗子

    for i in range(5):
        print(i)
    
    for i in range(10, 15):
        print(i)
    
    for i in range(5, 25, 5):
        print(i)

    运行结果

    0
    1
    2
    3
    4
    
    10
    11
    12
    13
    14
    
    5
    10
    15
    20

    列表生成式前置知识

    • 但如果要生成 [1x1, 2x2, 3x3, ..., 10x10] 怎么做?
    • 当你不会列表生成式前就是用循环
    res = []
    for i in range(11):
        res.append(i * i)
    print(res)
    
    # 输出结果
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

    但很明显繁琐了很多

    列表生成式

    针对上面的问题,列表生成式一句代码即可完成

    res = [i * i for i in range(11)]
    print(res)
    
    # 输出结果
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

    列表生成式:带 if

    # 筛选偶数
    res = [i * i for i in range(11) if i % 2 == 0]
    print(res)
    
    # 输出结果
    [0, 4, 16, 36, 64, 100]

    等价写法

    res = []
    for i in range(11):
        if i % 2 == 0:
            res.append(i * i)

    列表生成式:双重循环

    res = [i + j for i in range(5) for j in range(6, 11)]
    print(res)
    
    # 输出结果
    [6, 7, 8, 9, 10, 7, 8, 9, 10, 11, 8, 9, 10, 11, 12, 9, 10, 11, 12, 13, 10, 11, 12, 13, 14]

    等价写法

    res = []
    for i in range(5):
        for j in range(6, 11):
            res.append(i + j)

    列表生成式:多个变量

    d = {'x': 'A', 'y': 'B', 'z': 'C'}
    res = [(k, v) for k, v in d.items()]
    print(res)
    
    # 输出结果
    [('x', 'A'), ('y', 'B'), ('z', 'C')]

    等价写法

    d = {'x': 'A', 'y': 'B', 'z': 'C'}
    res = []
    for k, v in d.items():
        res.append((k, v))

    列表生成式:包含函数

    L = ['Hello', 'World', 'IBM', 'Apple']
    res = [s.lower() for s in L]
    print(res)
    
    # 输出结果
    ['hello', 'world', 'ibm', 'apple']

    列表生成式:包含 if...else

    错误写法一

    res = [i * i for i in range(11) if i % 2 == 0 else 0]
    print(res)
    
    # 报错信息
    res = [i * i for i in range(11) if i % 2 == 0 else 0]
                                  ^
    SyntaxError: invalid syntax
    • pycharm 也会直接提示语法错误
    • 因为跟在 for 后面的 if 是一个筛选条件,不能带 else

    错误写法二

    res = [i if i % 2 == 0  for i in range(11)]
    print(res)
    
    # 报错信息
    res = [i if i % 2 == 0  for i in range(11)]
                                      ^
    SyntaxError: invalid syntax

    for 前面是一个表达式,它需要有个表达式计算结果,只有 if 是不完整的,需要有 else

    正确写法

    res = [i if i % 2 == 0 else "奇数" for i in range(11)]
    print(res)
    
    # 输出结果
    [0, '奇数', 2, '奇数', 4, '奇数', 6, '奇数', 8, '奇数', 10]

    将 if ... else 放在前面写

  • 相关阅读:
    半夜的时候,干了个活,反了个小软件
    bzoj2243[SDOI2011]染色
    bzoj4034[HAOI2015]T2
    bzoj2661[BeiJing wc2012]连连看
    bzoj1406[AHOI2007]密码箱
    bzoj1452[JSOI2009]Count
    bzoj1934[Shoi2007]Vote 善意的投票
    bzoj1787[Ahoi2008]Meet 紧急集合&bzoj1832[AHOI2008]聚会
    bzoj1293[SCOI2009]生日礼物
    bzoj1221[HNOI2001] 软件开发
  • 原文地址:https://www.cnblogs.com/poloyy/p/14659472.html
Copyright © 2011-2022 走看看