解析式和生成器表达式列表解析式

列表解析式List ,也叫列表推导式

#生成一个列表,元素0-9,将每个元素加1后的平方值组成新的列表
x = []
for i in range(10):
    x.append((i+1)**2)
print(x

# 列表解析式
[(i+1)**2 for i in range(10)]

语法

列表解析式是一种语法糖

[expr for item in iterable if cond1 if cond2]
等价于
ret = []
for item in iterable:
    if cond1:
if cond2:
ret.append(expr) 
#
[expr for i in iterable1 for j in iterable2 ]
等价于
ret = []
for i in iterable1:
    for j in iterable2:
ret.append(expr)

# 请问下面3种输出各是什么?为什么
[(i,j)  for i in range(7) if i>4 for j in range(20,25) if j>23]
[(i,j)  for i in range(7) for j in range(20,25) if i>4 if j>23]
[(i,j)  for i in range(7) for j in range(20,25) if i>4 and j>23]

集合解析式

语法

{(x, x+1) for x in range(10)}
{[x] for x in range(10)} # 可以吗?

字典解析式

语法

{x:(x,x+1) for x in range(10)}
{x:[x,x+1] for x in range(10)}
{(x,):[x,x+1] for x in range(10)}
{[x]:[x,x+1] for x in range(10)} 
# {str(x):y for x in range(3) for y in range(4)} # 输出多少个元素?

生成器表达式

语法

和列表解析式的区别

生成器对象

生成器表达式

列表解析式

延迟计算

立即计算

返回可迭代对象迭代器,可以迭代

返回可迭代对象列表,不是迭代器

只能迭代一次

可反复迭代

生成器表达式和列表解析式对比总结

一般来说,应该多应用解析式,简短、高效。如果一个解析式非常复杂,难以读懂,要考虑拆解成for循环。

生成器和迭代器是不同的对象,但都是可迭代对象。

如果不需要立即获得所有可迭代对象的元素生成器和迭代器的区别,在 3中生成器和迭代器的区别,推荐使用惰性求值的迭代器。

内建函数

函数签名

说明

([, key][, ])

默认升序,对可迭代对象排序

# 排序一定是容器内全体参与
print(sorted([1,2,3,4,5]))
print(sorted(range(10, 20), reverse=True))
print(sorted({'a':100, 'b':'abc'}))
print(sorted({'a':100, 'b':'abc'}.items()))
print(sorted({'a':'ABC', 'b':'abc'}.values(), key=str, reverse=True))
print(sorted({'a':2000, 'b':'201'}.values(), key=str))
print(sorted({'a':2000, 'b':'201'}.values(), key=int))

练习

def sorter(x,y,z):
    if x>y: #x,y
        if x>z: #(x,(z.y))
            if y>z:
                return x,y,z
            else:
                return z,z,y
    else: # y,x
        if y>z: #(y,(x,z))
            if x>z:
                return y,x,z
            else:
                return y,z,x
#或
def sorter(x,y,z):
    return sorted((x,y,z),key=int,reverse=False)

if __name__ == '__main__':
    lst = [1,4,9,16,2,5,10,15]  
    print([lst[i]+lst[i+1] for i in range(len(lst)-1)])

import random
import string
if __name__ == '__main__':
    alphabet=string.ascii_lowercase
    for i in range(100):
        print('{:0>6}.{}'.format(i,''.join(random.choices(alphabet,k=10))))

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注