python 面试生成器和迭代器_【python】迭代器&生成器

本文深入探讨Python中的迭代器和生成器。迭代器遵循可迭代和迭代器协议,允许按需逐个获取元素,节省内存。生成器是自定义迭代器的一种方式,使用`yield`关键字实现,能阶段性生成值。通过实例解析了生成器函数的用法,包括send()方法的应用,以及如何利用生成器实现惰性计算和预激。最后讨论了生成器在面试中的常见问题和实际应用,如文件监听和多层生成器组合。
摘要由CSDN通过智能技术生成

目录

一. 迭代器

1.可迭代协议&迭代器协议(Iterable/Iterator)

只要是能被for循环的数据类型就一定拥有iter方法

【==可迭代协议(Iterable)==】只要含有iter方法的都是可迭代的(就可以被for循环)

判断是否含有iter方法(是否可以被for循环)

print('__iter__' in dir(dict))

>>> True

for 循环先去找iter方法,找到后开始遍历,如果没找到就报错

for循环实际是在使用迭代器

可以被for循环的东西

list

dict

str

set

tuple

f = open() #文件

range()

enumerate

(可迭代的东西).__iter__() >>> 迭代器

一个列表执行了iter()之后的返回值就是一个迭代器

[].__iter__() #迭代器

迭代器包含·的方法有:

#【1】__setstate__

#【2】__next__ #通过next可以从迭代器中一个一个的取值

#【3】__length_hint__

[0,1].__iter__().__length_hint__() #元素个数

>>> 2

【==迭代器协议(Iterator)==】内部同时含有next和iter方法的就是迭代器

from collections import Iterator

class A:

def __iter__(self): pass

def __next__(self): pass

a = A()

print(isinstance(a, Iterator))

>>> True

模拟for循环

list1 = [1,2,3,4]

iterator = list1.__iter__()

while True:

print(iterator.__next__())

2.迭代器的好处

从容器类型中一个一个的取值,会把所有值都取到

节省内存空间

迭代器并不会在内存中再占用一大块内存

而是随着循环 每次生成一个

每次next每次给我一个

range(10000000000) #类似定义,但还未读取占空间

print(list(range(10000000000)))

二. 生成器(自己写的迭代器)

1.生成器函数(自己写的函数)

含有yield关键字的函数,是生成器函数

特点:

调用函数之后,函数不执行,返回一个生成器

每次调用next方法的时候会取到一个值

直到取完最后一个,再执行next会报错

yield不能与return共用,且需要写在函数内部

return会会结束

yelid后不会结束

def generator(): #1.定义生成器函数

print(1)

yield

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值