可以直接作用于for循环的对象统称为可迭代对象(Iterable)
1、集合数据类型(list、tuple、dict、set、string) 2、generator a、生成器 b、带yield的generator function
Iterable表示可迭代类型
from collections import Iterable
# 格式
# isinstance(obj, type):判断obj是否属于type类型
print(isinstance([], Iterable))
print(isinstance((), Iterable))
print(isinstance({}, Iterable))
print(isinstance("", Iterable))
print(isinstance(range(10), Iterable))
print(isinstance(100, Iterable))
1、可以被next()函数调用并返回一个值的对象为迭代器对象 2、迭代器不但可以用于for,还可以用于next()
实例:
#转成Iterator对象
li = [1,2,3,4,5]
g = iter(li)
print(g, type(g))
print(next(g))
print(next(g))
Iterator对象表示的是一个流数据,Iterator对象可以被next()调用并返回一个数据,直到抛出StopIteration异常错误则停止。可以把数据流看成一个有序的序列,但是不确定这个序列的长度,只能通过next()函数不断计算求值,Iterator可以表示一个无限大的数据流,而list等永远不可能存储无限的数据
生成列表
只能生成简单的列表
print(list(range(1,11)))
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
循环生成列表
li = []
for i in range(1, 11):
li.append(pow(i, 2))
print(li)
缺点:循环比较繁琐
列表生成式
作用
列表推导式提供了从序列创建列表的简单途径。
一般形式
li2 = [x * x for x in range(1, 11)]
print(li2)
添加判断
li3 = [x * x for x in range(1, 11) if x % 2 == 0]
print(li3)
多层循环
li4 = [x + y for x in "ABC" for y in "123"]
print(li4)
拆分
<span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> <span class="hljs-string">"ABC"</span>:
<span class="hljs-keyword">for</span> y <span class="hljs-keyword">in</span> <span class="hljs-string">"123"</span>:
ret = x + y
推导的算法比较复杂,用给列表生成式的for循环无法实现的时候,可以选择使用函数得到生成器
使用函数实现
#函数
def func1():
print("zutuanxue_com is a good man")
print("zutuanxue_com is a nice man")
print("zutuanxue_com is a cool man")
print("zutuanxue_com is a handsome man")
return 1
#生成器函数
def func2():
print("zutuanxue_com is a good man")
print("zutuanxue_com is a nice man")
print("zutuanxue_com is a cool man")
print("zutuanxue_com is a handsome man")
yield 2
def func3():
print("zutuanxue_com is a good man")
yield 1
print("zutuanxue_com is a nice man")
yield 2
print("zutuanxue_com is a cool man")
yield 3
print("zutuanxue_com is a handsome man")
yield 4
res1 = func1()
res2 = func2()
res3 = func3()
print(res1, type(res1))
print(res2, type(res2))
print(res3, type(res3))
print("------------------")
print(next(res3))
print(next(res3))
print(next(res3))
print(next(res3))
def func4():
for i in range(1, 11):
yield pow(i, 2)
g2 = func4()
for x in g2:
print("-----------", x)
使用列表生成式实现
g1 = (x * x for x in range(1, 11))