共计 2120 个字符,预计需要花费 6 分钟才能阅读完成。
一、可迭代对象
1、概念
可以直接作用于 for 循环的对象统称为可迭代对象 (Iterable)
2、可以直接作用于 for 循环的数据类型
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、概念
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))
2、为什么 list、tuple、dict、string、set 等数据类型不是 Iterator?
Iterator 对象表示的是一个流数据,Iterator 对象可以被 next() 调用并返回一个数据,直到抛出 StopIteration 异常错误则停止。可以把数据流看成一个有序的序列,但是不确定这个序列的长度,只能通过 next() 函数不断计算求值,Iterator 可以表示一个无限大的数据流,而 list 等永远不可能存储无限的数据
三、列表生成式
1、概述
生成列表
2、回顾
只能生成简单的列表
print(list(range(1,11)))
3、需求
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
4、实现
-
循环生成列表
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)
拆分
for x in "ABC": for y in "123": ret = x + y
四、生成器
1、概述
推导的算法比较复杂,用给列表生成式的 for 循环无法实现的时候,可以选择使用函数得到生成器
2、注意
- 函数时顺序执行,遇到 return 语句后者最后一行代码就返回
- 如果想让一个函数变为生成器函数,只需将函数中的 return 改为 yield
- 执行生成器函数不会执行函数代码,得到一个生成器
- 在每次调用 next() 的时候,会执行生成器函数,遇到 yield 语句就返回,如果再次执行 next()
3、实现
使用函数实现
# 函数
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))
正文完
星哥说事-微信公众号