Python:列表推导式、生成器、迭代器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jv1jR5gT-1596362186381)(F:\JianShu_material\Python\图片\列表推导式、生成器、迭代器\列表推导式、生成器、迭代器.png)]

1. 列表推导式

列表推导式是通过旧的列表通过公式推导出新的列表

还有集合推导式、字典推导式,与列表推导式类似

格式为:

[表达式 for 变量 in 旧列表]
[表达式 for 变量 in 旧列表 if条件]
# 过滤掉长度小于或等于3的人名
names = ['tom','lily','abc','jack','steven']
result = [name for name in names if len(name) > 3]
print(result) #['lily', 'jack', 'steven']

# 过滤掉长度小于或等于3的人名,并使每个人名首字母大写
result = [name.capitalize() for name in names if len(name) > 3]
print(result) #['Lily', 'Jack', 'Steven']
# 将1-100之间能被3整除,组成一个新的列表
newlist = [i for i in range(1,101) if i % 3 == 0 and i % 5 ==0]

# 将0-5的偶数,0-10的奇数组成元组,添加到新的列表中
newlist = [(x,y) for x in range(5) if i%2 == 0 for y in range(10) if y % 2 != 0]

# 如果判断条件有else,如果写推导式
newlist = [i+1 if i > 3 else i-1 for i in range(5)]

2. 生成器

2.1 生成器的概念

通过列表生成式(列表推导式),我们可以直接创建一个列表。

但是,受到内存限制,列表容量肯定是有限的。

而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间部白白浪费了。

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?

这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

2.2 创建生成器

通过列表推导式创建

# 通过:(列表推导式)可以得到生成器
g = (x*3 for x in range(20))
print(type(g))
print(g)

# 方式1:通过调用__next()__方式得到元素
print(g.__next__()) #0
print(g.__next__()) #3
print(g.__next__()) #6

# 方式2:通过next(生成器对象)方法
print(next(g)) #6
print(next(g)) #12
print(next(g)) #15

借助函数创建

只要函数中出现了yield,说明函数就不是函数,变成了生成器

创建步骤:

  1. 定义一个函数,在函数中使用yield关键字
  2. 调用函数,接收调用结果
  3. 得到的结果就是生成器
  4. 借助于next()、__next()__得到元素
def func():
    n = 0
    while True:
        n += 1
        yield n # 相当于return n + 暂停

g = func()
print(g) #<generator object func at 0x000002687B393DC8>
print(next(g)) #1
print(next(g)) #2
print(next(g)) #3

2.3 生成器的作用

实现线程下协程的操作

def task1(n):
    for i in range(n):
        print("正在听第{}首歌".format(i))
        yield None

def task2(n):
    for i in range(n):
        print("正在搬第{}块转".format(i))
        yield None

g1 = task1(5)
g2 =task2(5)

while True:
    try:
        g1.__next__()
        g2.__next__()
    except:
        pass

3. 迭代器

3.1 可迭代对象

生成器、元组、列表、字典、集合、字符串都是可迭代的

判断是否可迭代可用方法isinstance()

3.2 迭代器的概念

迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。

迭代器只能往前不会后退。

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

可迭代对象不一定是迭代器,列表是可迭代对象,但不是迭代器;生成器是可迭代对象,也是是迭代器

3.3 迭代器的创建

通过iter()函数将可迭代对象变成迭代器

list = [1,3,4,6]
list1 = iter(list)

print(next(list1))
print(next(list1))
print(next(list1))
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值