vlambda博客
学习文章列表

你用过这样的Python推导式吗?

使用元组推导式可以快速生成一个元组,它的表现形式和列表推导式类似,只是将列表推导式中的“[]”修改为“()”。例如,我们可以使用下面的代码生成一个包含10个随机数的元组。

import random                             # 导入random标准库

randomnumber = (random.randint(10,100) for in range(10))

print("生成的元组为:",randomnumber)


执行结果如下:

生成的元组为: <generator object <genexpr> at 0x0000000003056620>


从上面的执行结果中,可以看出使用元组推导式生成的结果并不是一个元组或者列表,而是一个生成器对象,这一点和列表推导式是不同的。要使用该生成器对象可以将其转换为元组或者列表。其中,转换为元组使用tuple()函数,而转换为列表则使用list()函数。


例如,使用元组推导式生成一个包含10个随机数的生成器对象,然后将其转换为元组并输出,可以使用下面的代码:

import random                        # 导入random标准库

randomnumber = (random.randint(10,100) for in range(10))

randomnumber = tuple(randomnumber)                # 转换为元组

print("转换后:",randomnumber)


执行结果如下:

转换后: (76, 54, 74, 63, 61, 71, 53, 75, 61, 55)


要使用通过元组推导器生成的生成器对象,还可以直接通过for循环遍历或者直接使用__next__()方法进行遍历。


说明:在Python 2.x中,__next__()方法对应的方法为next()方法,也是用于遍历生成器对象的。


例如,通过生成器推导式生成一个包含3个元素的生成器对象number,然后调用3次__next__()方法输出每个元素的值,再将生成器对象number转换为元组输出,代码如下:


number = (i for in range(3))

print(number.__next__())                  # 输出第1个元素

print(number.__next__())                  # 输出第2个元素

print(number.__next__())                   # 输出第3个元素

number = tuple(number)                  # 转换为元组

print("转换后:",number)

上面的代码运行后,将显示以下结果:

0

1

2

转换后: ()

再如,通过生成器推导式生成一个包括4个元素的生成器对象number,然后应用for循环遍历该生成器对象,并输出每一个元素的值,最后再将其转换为元组输出,代码如下:

number = (i for in range(4))          # 生成生成器对象

for in number:                          # 遍历生成器对象

    print(i,end=" ")                      # 输出每个元素的值

print(tuple(number))                   # 转换为元组输出

执行结果如下:

0 1 2 3 ()

从上面的两个示例中可以看出,无论通过哪种方法遍历,如果再想使用该生成器对象,都必须重新创建一个生成器对象,因为遍历后原生成器对象已经不存在了。


更多有价值资源

↓点击阅读原文进入【程序开发资源库】