在上一节的合集中,我们了解了Python的元组 中元素的访问及修改的相关知识,本节我们将进一步了解一下Python元组的推导式的相关知识。
1.元组推导式
使用元组推导式可以快速生成一个元组,他的表现形式与列表推导式类似,只是将列表推导式中使用 [] 修改为 () 。
例如:我们使用下面的代码生成一个包含10个随机数的元组。
import random randomunmber=(random.randint(10,100) for i in range(10)) print("生成的元组为:",randomnumber)
执行的结果为:
生成的元组为:<generator object <genexpr> at ox0000000003056620>
从上面的例子中可以看出,使用元组推导式生成的结果并不是一个元组或者列表,而是一个生成器对象,这一点和列表推导式是不同的,要是用该生成器将其转换为元组或者列表。其中转换为元组使用tuple()函数,而转换为列表使用list()函数。
例如:使用元组推导式生成一个包含10个随机数的生成器对象,然后将其转换为元组并输出,可以使用下面的代码实现:
import random randomnumber=(random.randint(10,100) for i in range(10)) randomnumber=tuple(randomnumber) print("转换后:",randomnumber) 执行后的结果为: 转换后:(76,54,74,63,61,71,53,75,61,55)
要使用通过元组推导器生成的生成器对象,还可以通过for循环遍历或者直接使用__next__()方法进行遍历。
注:在Python2.X中__next__()方法对应的方法为next()方法,也是用于遍历生成器对象的
例如:通过生成器推导式生成一个包含3个元素的生成器对象number,然后调用3次__next__()方法输出每个元素的值,再将生成器对象number转换为元组输出,代码如下
number=(i for i in range(3)) print(number.__next__()) print(number.__next__()) print(number.__next__()) number=tuple(number) print("转换后:",number) 执行结果如下: 0 1 2 转换后:()
通过生成器推导式生成一个包含4个元素的生成器对象number,然后应用for循环遍历该生成器对象,并输出每一个元素的值,最后将其转换为元组输出,代码如下:
number=(i for i in range(4)) for i in number : print(i,end=" ") print(tuple(number)) 执行结果如下: 0 1 2 3 ()
从上面的示例中可以看出,无论通过哪种方法遍历,如果再想使用该生成器兑现,都必须重新创建一个生成器对象,因为遍历后原生成器对象已经不存在了。
2.元组与列表的区别
元组和列表都属于序列,而且他们又都可以按照特定的顺序存放一组元素,类型不受限制,只要是Python支持的类型都可以,那么他们之间的区别是什么呢?
列表与元组的区别主要有以下几个方面:
- 列表属于可变序列,他的元素随时可以修改或者删除,元组属于不可变序列,其中元素不可以修改,除非整体替换。
- 列表可以使用append()、extend()、insert()、remove()和pop()等方法实现添加和修改列表元素,而元组没有这几个方法,所以不能向元组中添加和修改元素,同样元组也不能删除元素。
- 列表可以使用切片访问和修改元素,元组也支持切片,但是他只支持通过切片访问元组中的元素,不可以修改。
- 元组比列表的访问和处理速度快,所以当只是需要对其中元素进行访问,而不进行任何修改时,建议采用元组。
- 列表不能作为字典的键,而元组可以。
花絮:
本期的Python 元组推导式及与列表的区别就分享到这里,下期我们将继续分享Python字典的相关知识,感兴趣的朋友可以关注我。
同时也可以关注下我的个人 微信订阅号,园子里面的文章也会第一时间在订阅号里面进行推送跟更新。