python迭代器生成器

iterator

lis = [1,2,3,4,5]
tup = (1,2,3,4,5)
dic = {'a':1,'b':2,'c':3,'d':4,'e':5}


iter_lis = iter(lis)
iter_tup = iter(tup)
iter_dic = iter(dic)

print(iter_lis)
print(iter_tup)
print(iter_dic)

for i in range(5):
    print(next(iter_lis))
    print(next(iter_tup))
    print(next(iter_dic))
<list_iterator object at 0x794782a8e230>
<tuple_iterator object at 0x794782a8c8e0>
<dict_keyiterator object at 0x794782ab3560>
1
1
a
2
2
b
3
3
c
4
4
d
5
5
e

Generator

import os
import psutil

def show_memory_info(hint):
  pid = os.getpid()
  p = psutil.Process(pid)

  info = p.memory_full_info()
  memory = info.uss / 1024. / 1024
  print(f"[{time.ctime()}] {hint} memory used: {memory:.2f} MB")
#test_iterator,test_generator
import time

def test_iterator():
  show_memory_info("initing iterator")
  list_1 = [i for i in range(100000000)]
  show_memory_info("after iterator initiated")
  print(sum(list_1))
  show_memory_info("after sum called")

def test_generator():
  show_memory_info("initing generator")
  list_2 = (i for i in range(100000000))
  show_memory_info("after generator initiated")
  print(sum(list_2))
  show_memory_info("after sum called")

%time test_iterator()
%time test_generator()
[Tue Aug 27 09:24:13 2024] initing iterator memory used: 190.07 MB
[Tue Aug 27 09:24:23 2024] after iterator initiated memory used: 3984.98 MB
4999999950000000
[Tue Aug 27 09:24:24 2024] after sum called memory used: 3984.98 MB
CPU times: user 6.02 s, sys: 6.4 s, total: 12.4 s
Wall time: 12.5 s
[Tue Aug 27 09:24:26 2024] initing generator memory used: 211.91 MB
[Tue Aug 27 09:24:26 2024] after generator initiated memory used: 211.91 MB
4999999950000000
[Tue Aug 27 09:24:35 2024] after sum called memory used: 209.95 MB
CPU times: user 7.75 s, sys: 8.37 ms, total: 7.76 s
Wall time: 9.38 s

它还真的是一个Generator

list_2 = (i for i in range(100000000))
type(list_2)
generator

生成器 yield

def generator(k):
    i = 1
    while True:
        yield i ** k
        i += 1

gen_1 = generator(1)
gen_3 = generator(3)
print(gen_1)
print(gen_3)

def get_sum(n):
    sum_1, sum_3 = 0, 0
    for i in range(n):
        next_1 = next(gen_1)
        next_3 = next(gen_3)
        print('next_1 = {}, next_3 = {}'.format(next_1, next_3))
        sum_1 += next_1
        sum_3 += next_3
    print(sum_1 * sum_1, sum_3)

get_sum(8)

<generator object generator at 0x794782ac3ae0>
<generator object generator at 0x794782ac3b50>
next_1 = 1, next_3 = 1
next_1 = 2, next_3 = 8
next_1 = 3, next_3 = 27
next_1 = 4, next_3 = 64
next_1 = 5, next_3 = 125
next_1 = 6, next_3 = 216
next_1 = 7, next_3 = 343
next_1 = 8, next_3 = 512
1296 1296

生成器Generator的应用

def index_normal(L, target):
    result = []
    for i, num in enumerate(L):
        if num == target:
            result.append(i)
    return result

print(index_normal([1, 6, 2, 4, 5, 2, 8, 6, 3, 2], 2))

[2, 5, 9]
def index_generator(L, target):
    for i, num in enumerate(L):
        if num == target:
            yield i

print(list(index_generator([1, 6, 2, 4, 5, 2, 8, 6, 3, 2], 2)))

[2, 5, 9]
## 算法题

def is_subsequence(a, b):
    b = iter(b)
    return all(i in b for i in a)

print(is_subsequence([1, 3, 5], [1, 2, 3, 4, 5]))
print(is_subsequence([1, 4, 3], [1, 2, 3, 4, 5]))

True
False
def is_subsequence(a, b):
    b = iter(b)
    print(b)

    gen = (i for i in a)
    print(gen)

    for i in gen:
        print(i)
    # (i in b ) 判断i是否在b中
    gen = ((i in b) for i in a)
    print(gen)

    for i in gen:
        print(i)

    return all(((i in b) for i in a))

print(is_subsequence([1, 3, 5], [1, 2, 3, 4, 5]))
#print(is_subsequence([1, 4, 3], [1, 2, 3, 4, 5]))

<list_iterator object at 0x7878b7331030>
<generator object is_subsequence.<locals>.<genexpr> at 0x7878b733c4a0>
1
3
5
<generator object is_subsequence.<locals>.<genexpr> at 0x7878b733c510>
True
True
True
False

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值