可以被for循环的对象都是可迭代对象,这句话不正确,(字符串,列表,元组,字典,集合,文件) 都不是可迭代对象,为什么,whye
因为可迭代对象首先要遵循可迭代协议,可迭代协议中必须有一个next方法 就是说可迭代对象必须有next方法,来遍寻所有元素。但是上面这些类型都没有这个方法
for 循环其实就是先把上面的类型变成可迭代对象,再把超出可迭代对象的报警处理掉 ,这样就能把对象里面的元素全部取出来。但是while循环也可以依依取出元素,要for循环干嘛。while循环无法取出无序的字典,集合,文件。
for 循环的目的其实就是统一了可迭代类型变成可迭代对象,实现依依取元素的目的。
a = ‘huangjian‘
b = a.__iter__() #先把对象变成可迭代对象(iter方法),再一次使用next方法取值。
print(type(b))
print(b.__next__())
print(b.__next__()) #也可以用系统自带函数next(b)
#超出就会报警,但是for循环变我们过滤掉报警并且停止循环
由以上的说明可知,for循环是你用一次next取一次值,如果值有地方存放,就会存放在内存中,如果没有内存就会销毁。这样的好处对取数据比较大的对象里面的元素比较好,不会一次读完所有数据存着再去取里面的元素(有可能数据太大内存被撑爆),而是按你next的次数,取得值存在与否看你是不是存着
迭代器就是可迭代对象
生成器
生成器就是可迭代对象,他直接是可迭代对象,不像其余的类型(字典什么的还要iter方法来实现自己是迭代器)。
有哪些类型生成器
1.函数生成器 把return 换成yield 则变成了生成器。每次执行函数yield 返回其值,暂停函数。再次执行就会继续执行下面的函数程序
2.生成器表达式和列表解析
三元运算
myname = ‘huangjian‘
aa = print("ture") if ‘huangjian‘ == myname else ‘错误‘ #三元运算 其实就是函数三步操作的简单化 必须符合函数逻辑格式 这个aa的值没有任何意义,只是记录了一个函数的过程 必须三元,多少都不行
列表解析
a = [i for i in range(5) ] #列表解析 里面是三元运算得到i值,在外面套一层列表就会制动加入列表 可以少一元,但是不能多一元
变成生成器
c = (i for i in range(5)) #用()把类表解析变成了可迭代对象,就是生成器。这个只占用很小的内存空间
其实就是把列表解析变成了一个生成器 ,列表解析又用到了三元表达式
原文:https://www.cnblogs.com/huangjianfir/p/13178844.html