迭代器、可迭代对象、迭代器对象、生成器、生成器表达式和相关的面试题

迭代器:

迭代的工具。迭代是更新换代,如你爷爷生了你爹,你爹生了你,迭代也可以说成是重复,并且但每一次的重复都是基于上一次的结果来的。如计算机中的迭代开发,就是基于软件的上一个版本更新。以下代码就不是迭代,它只是单纯的重复

可迭代对象

python中一切皆对象,对于这一切的对象中,但凡有__iter__方法的对象,都是可迭代对象。

可迭代的对象:Python内置str、list、tuple、dict、set、file都是可迭代对象。

迭代器对象

只有字符串和列表都是依赖索引取值的,而其他的可迭代对象都是无法依赖索引取值的。因此我们得找到一个方法能让其他的可迭代对象不依赖索引取值。

在找到该方法前,首先我们给出迭代器对象的概念:可迭代的对象执行__iter__方法得到的返回值。并且可迭代对象会有一个__next__方法。

一定次数后要是__next__() 调用超出上限会导致无值可取 报错StopIteration

但是在我们可以使用while循环精简下。其中使用的try...except...为异常处理模块

总结

迭代器对象:执行可迭代对象的__iter__方法,拿到的返回值就是迭代器对象。

特点:

内置__next__方法,执行该方法会拿到迭代器对象中的一个值
内置有__iter__方法,执行该方法会拿到迭代器本身
文件本身就是迭代器对象。
缺点:

取值麻烦,只能一个一个取,并且只能往后取,值取了就没了
无法使用len()方法获取长度

for循环原理

for循环称为迭代器循环,in后必须是可迭代的对象。
将in后面的对象调用__iter__转换成迭代器对象
调用__next__迭代取值
内部有异常捕获StopIteration,当__next__报这个错 自动结束循环

迭代器对象无论执行多少次__iter__方法得到的还是迭代器对象本身(******)

迭代器取值的特点
1.只能往后依次取 不能后退

特别注意类型:文件类型

文件类型本身就是一个迭代器对象

问:__iter__方法就是用来帮我们生成迭代器对象
而文件对象本身就是迭代器对象,为什么还内置有__iter__方法???
解答:for 循环 时候必须要有__iter__方法 这是必须步骤 ,所以~~~~
# f = open(‘xxx.txt‘,‘r‘,encoding=‘utf-8‘)
# iter_f = f.__iter__()
# print(iter_f.__next__())
# print(iter_f.__next__())
# print(iter_f.__next__())
# print(iter_f.__next__())
# print(iter_f.__next__())

生成器

yield    1.帮你提供了一种自定义生成器方式    2.会帮你将函数的运行状态暂停住    3.可以返回值

与return之间异同点    相同点:都可以返回值,并且都可以返回多个    不同点:        yield可以返回多次值,而return只能返回一次函数立即结束        yield还可以接受外部传入的值

用户自定义的迭代器,本质就是迭代器

生成器的自主yield 传值

# def func():
#     print(‘first‘)
#     yield  666  # 函数内如果有yield关键字,那么加括号执行函数的时候并不会触发函数体代码的运行
#     print(‘second‘)
#     yield  777
#     print(‘third‘)
#     yield  888
#     print(‘forth‘)
#     yield
#     yield
# # yield后面跟的值就是调用迭代器__next__方法你能得到的值
# # yield既可以返回一个值也可以返回多个值 并且多个值也是按照元组的形式返回
# g = func()  # 生成器初始化:将函数变成迭代器
# print(g)
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())

迭代yield生成后取数例子

def my_range(start,end,step=1):
    while start < end:
        yield start
        start += step

for j in my_range(1,100,2):
    print(j)

yield支持外界为其传参

def dog(name):    print(‘%s 准备开吃‘%name)    while True:        food = yield        print(‘%s 吃了 %s‘%(name,food))# def index():#     pass

# 当函数内有yield关键字的时候,调用该函数不会执行函数体代码# 而是将函数变成生成器# g = dog(‘egon‘)# g.__next__()  # 必须先将代码运行至yield 才能够为其传值# g.send(‘狗不理包子‘)  # 给yield左边的变量传参  触发了__next__方法# g.send(‘饺子‘)

生成式表达式

()    

# 生成器不会主动执行任何一行代码# 必须通过__next__触发代码的运行

列子如

# res = (i for i in range(1,100000000) if i != 4)  # 生成器表达式
# print(res)
# f = open(‘xxx.txt‘,‘r‘,encoding=‘utf-8‘)
# data = f.read()
# print(len(data))
# f.close()

# with open(‘xxx.txt‘,‘r‘,encoding=‘utf-8‘) as f:
#     # n = 0
#     # for line in f:
#     #     n += len(line)
#     # print(n)
#     g = (len(line) for line in f)
#     # print(g.__next__())
#     # print(g.__next__())
#     # print(g.__next__())
#     # print(g.__next__())
#     print(sum(g))

列子

生成器和迭代器的结合面试题

还有要注意  list()  list分为3步骤  转化为 迭代器对象 然后迭代 然后添加入列表   他会执行__next__ 会把老母鸡的蛋给偷走!!!!!!!!!!!!!!!!!!!!!!!!!

原文地址:https://www.cnblogs.com/jinpan/p/11192284.html

时间: 2024-11-08 06:17:52

迭代器、可迭代对象、迭代器对象、生成器、生成器表达式和相关的面试题的相关文章

迭代器/可迭代对象/生成器

先上本文主题: 迭代器一定是可迭代对象,可迭代对象不一定是迭代器; 可迭代对象要满足什么条件才能使用 for 正确遍历; 生成器一定是迭代器. 如何判断是否是迭代器/可迭代对象 from collections.abc import Iterator,Iterable t = [] # 是否为迭代器 isinstance(t,Iterator) # 是否为可迭代对象 isinstance(t,Iterable) 可迭代对象 实现了__iter__魔法方法,就是可迭代对象. class Test:

python开发函数进阶:可迭代的&amp;迭代器&amp;生成器

一,可迭代的&可迭代对象 1.一个一个的取值就是可迭代的   iterable#str list tuple set dict#可迭代的 --对应的标志 __iter__ 2.判断一个变量是不是一个可迭代的 # print('__iter__' in dir(list))# print('__iter__' in dir([1,2,3])) 3.可迭代协议--凡是可迭代的内部都有一个__iter__方法 二,迭代器 1.将可迭代的转化成迭代器 1 #!/usr/bin/env python 2

python当中的 可迭代对象 迭代器

学习python有一段时间了,在学习过程中遇到很多难理解的东西,做一下总结,希望能对其他朋友有一些帮助. 完全是个人理解,难免有错,欢迎其他大神朋友们批评指正. 1 迭代 什么是迭代呢??我们可以这样理解,一个容器类型的数据,比如 列表[ ]  .元组 () 和 字典 { }, 我们可以把这样类型的数据放入for temp in [1,2,3] 当中,temp 被一次一次的赋值成为后面容器内数据,然后我们拿到temp进行一些想做的事情.那么for 循环中自动的帮我们把数据一次一次的取出来,可以理

迭代器&amp;可迭代对象

迭代器 能够被next调用, 并不断返回值的一个对象惰性排序, 一次只获取一个数据, (占用一个空间)迭代器可以遍历无限量的数据 特点: 1.惰性序列, 节省内存 2.遍历使用next, 方向不可逆 3.迭代器可以遍历无限量大的数据 1. 可迭代对象 1 # 判断是不是可迭代对象 2 # 使用dir(obj) 看是否实现__iter__ 3 setvar = {1, 2, 4, 5} 4 print('__iter__' in dir(setvar)) 5 6 7 """ 8

11.Python初窥门径(函数名,可迭代对象,迭代器)

Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return l print(func(1)) # [1] print(func(2)) # [1,2] print(func(3)) # [1,2,3] 二.函数名的应用 函数名指向的是函数的内存地址,加上()就执行这个函数 def func(args): return args print(func) #

Python——迭代器&amp;可迭代对象

可迭代对象 什么是对象: Python中,一切皆对象.一个变量,一个列表,一个字符串,文件句柄,函数等等都可称为一个对象.一个对象就是一个实例,就是实实在在的东西. 什么是迭代 迭代就是一个重复的过程,但还不是单纯的重复,就像是父亲,自己,儿子,孙子的关系,都是复制,但结果是不一样的.还有使用的APP,微信,抖音等隔一段时间就会基于上一次做一些更新,那么这就是迭代. 结论: 可迭代对象从字面意思就是一个可以重复取值的实施在在的东西. 不可迭代的有: 在Python中,有很多可迭代对象,那么就说说

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

函数嵌套名称空间与作用域闭包函数装饰器迭代器生成器三元表达式,列表解析,生成器表达式递归与二分法内置函数--------------------------------------------函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数def max(x,y): if x>y: return x else: return ydef max1(a,b,c,d): res=max(a,b) res2=max(res,c) res3=ma

迭代器iter(db),db为实例化的类对象,类对象中没有__iter__,但有__getitem__

def main(): import visdom import time viz = visdom.Visdom() db = Pokemon('pokeman', 224, 'train') x,y = next(iter(db)) ## print('sample:',x.shape,y.shape,y) viz.image(x,win='sample_x',opts=dict(title='sample_x')) ##类 class Pokemon(Dataset): def __ini

数组、对象迭代器

前端的朋友应该都用过一些迭代器,比如jQuery中的$.each()或underscore中的_.each();今天我们就来自己实现一个简单的迭代器: 我们仿照一些JS库的接口风格:each(arrOrObj, function(){}) 1 var each = function(obj, fn){ 2 var len = obj.length,i = 0; 3 if( typeof(len) == 'undefined' ){ 4 //如果是对象 ,对象没有length属性 5 for( i