Loading

Python解析式和生成式

python三元表达式

  • python中没有像其他语言中一样的三元表达式或者三目运算符,但有类似的实现方式

  • 其他语言中,一般语法格式是"判断条件?为真时的结果:为假时的结果"

  • 在python中,格式是为真时结果 if 判断条件 else 为假时的结果

    In [21]: True if 1 > 0 else False
    Out[21]: True
    

python列表解析式

语法

  • [返回值] for 元素 in 可迭代对象 if 条件]
  • 使用[],内部时for循环,if可选
  • 返回一个新列表

列表解析式是一种语法糖

  • 编译器会优化,不会因为简写影响代码效率
  • 简化语法和代码
# 求1-9的平方的值
# 不实用列表解析时
In [22]: newlist = []
In [23]: for i in range(10):
    ...:     newlist.append((i+1)**2)
    ...:
In [24]: newlist
Out[24]: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]


# 使用列表解析的实现
In [27]: newlist1 = [(i+1)**2 for i in range(10)]

In [28]: newlist1
Out[28]: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
  
# 获取10以内的偶数,配合if条件语句
In [43]: even = []
In [45]: for x in range(10):
    ...:     if x % 2 == 0:
    ...:         even.append(x)
In [46]: even
Out[46]: [0, 2, 4, 6, 8]
  
  
# 使用列表解析实现
In [50]: [x for x in range(10) if x % 2 == 0]
Out[50]: [0, 2, 4, 6, 8]

列表解析式进阶

  • [expr for i in iterables1 for j in iterables2]

    等价于

ret = []
for i in iterables1:
    for j in iterables2:
        ret.append(i*j)
  • 示例

    • [(x,y) for x in 'abcde' for y in range(5)]
    • [(i,j) for i in range(7) for j in range(20,25) if i>4 and j>23]
  • 演示

    • 既能被2整除又能被3整除的数
    In [53]: [i for i in range(20) if i%2 == 0 if i%3 ==0]
    Out[53]: [0, 6, 12, 18]
    
  • 获取列表两两相邻的和并输出新列表

  lst = [1, 4, 9, 16, 2, 5, 10, 15]
  newlist = [lst[index] + lst[index + 1] for index in range(len(lst) - 1)]
  print(newlist)
  • 获取九九乘法表
# 一
print('\n'.join(["".join(["{}*{}={:<4}".format(j, i, i * j) for i in range(1, j + 1)]) for j in range(1, 10)]))
# 二
[print('{}*{}={:<4}{}'.format(j, i, i * j, '\n' if i == j else ''), end='') for i in range(1, 10) for j in range(1, i + 1)]
  • 按照0001.abcdbfsf的格式生成ID
print(["{:>04}.".format(j) + "".join([random.choice(string.ascii_lowercase) for i in range(10)]) for j in range(1, 100)])

生成器表达式

  • 语法

    • (返回值 for 元素 in 可迭代对象 if 条件)
    • 将列表解析式中的中括号换成小括号
    • 返回一个生成器
  • 生成器表达式和列表解析式的区别

    • 计算方式
      • 生成器表达式是按需计算(惰性求值、延迟计算,需要的时候草计算值)
      • 列表解析式是全部立即返回值
      • 生成器返回迭代器,可以迭代,列表解析式返回的也可以迭代,但不是迭代器
      • 迭代器只可迭代一遍,列表解析式可以重复迭代
    • 内存占用
      • 生成器表达式更加节省内存,列表解析式返回新列表
    • 计算速度
      • 生成器表达式耗时较短,列表解析式耗时长
      • 生成器本身并没有返回值,只返回了一个生成器对象
    # 列表解析式直接返回
    In [1]: [x for x in range(5)]
    Out[1]: [0, 1, 2, 3, 4]
    In [6]: lst = [x for x in range(5)]
    In [7]: for i in lst:
       ...:     print(i)
    0
    1
    2
    3
    4
    
    # 生成器返回一个可迭代对象
    In [2]: (x for x in range(5))
    Out[2]: <generator object <genexpr> at In [3]: g = (x for x in range(5))
    In [4]: next(g)
    Out[4]: 0
    In [5]: next(g)
    Out[5]: 1
    
  • 生成器

    • 可迭代对象
    • 迭代器

集合解析式

  • 语法
    • 列表解析式中括号换成{}
    • 立即返回一个集合
  • 示例
In [92]: {x for x in range(10)}
Out[92]: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

字典解析式

  • 语法
    • 使用key:value形式
    • 返回一个字典
  • 示例
In [93]: {x:x+1 for x in range(10)}
Out[93]: {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}
posted @ 2021-07-14 11:05  勤俭持家亮公子  阅读(54)  评论(0)    收藏  举报