迭代器与生成器

1.迭代器

1.1迭代器说明

1.1.1迭代器也是容器型数据类型,可以遍历,可以转化成列表和元组

1.1.2打印迭代器的时候无法打印里面的元素,迭代器不支持len操作

1.1.3如果需要迭代器中的元素,需要从迭代器中取出,取出之后迭代器中就没有了,且不能添加回去

1.2创建迭代器

1
2
方式1:通过iter将其他序列转换成迭代器
方式2:创建生成器对象(生成器是一种特殊的迭代器)

1.3获取迭代器的元素

1.3.1获取单个元素:next(迭代器)

1
2
3
4
iter1 = iter('abc')
print(next(iter1)) #a
print(next(iter1)) #b
print(next(iter1)) #c

1.3.2获取多个元素:通过循环遍历得到

2.生成器(generator)

2.1生成器是具备能够产生多个数据能力的一种容器。

2.2生成器在获取数据的时候和迭代器一样

2.3创建生成器 - 调用一个带有yield关键字的函数就可以得到一个生成器对象

2.4如果一个函数中存在yield,函数调用过程中不会执行函数体,也没有返回值,而是一个生成器对象

1
2
3
4
5
6
7
def func1():
print('=====')
yield
print('+++++')
## 任意一个函数加上yield之后都是一个生成器对象
result = func1()
print('result:',result)

2.5 控制生成器产生数据的能力

执行生成器对应的函数会遇到几次yield,这个生成器就能产生多少个数据

每次遇到yield的时候,yield后面值就是对应产生的数据

1
2
3
4
5
6
7
def func2():
yield 100
for i in range(4):
yield i
gen2 = func2()
for j in gen2:
print(f'产生的数据:{j}')

练习1:创建一个生成器函数,可以产生前N个偶数,偶数从0开始

1
2
3
4
5
6
7
8
9
10
def func3(n):
k = 0
for i in range(n):
yield k
k += 2

gen3 = func3(5)

for x in gen3:
print(x)

2.6生成器产生数据的原理

2.6.1通过生成器对象获取数据的时候,才会执行对应的函数,每次遇到yield的时候返回yield后面的数据

并记录该位置,然后从这里停止,下一次获取数据的时候从上一次结束的位置开始到下一个yield

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def func4():
print('--------1---------')
yield 100
print('--------2---------')
yield 200
print('--------3---------')
yield 300
print('--------end---------')

gen4 = func4()
print(gen4)
print("取元素:", next(gen4))
print("==================")
print("取元素:", next(gen4))
print("+++++++++++++++++")
print("取元素:", next(gen4))

## print("取元素:",next(gen4)) ## 报错,此时元素已经取完了

3.模块

3.1 python中一个Py文件就是一个模块

3.2如何在一个模块中使用另一个模块的内容

1
2
3
4
5
6
7
1.首先被使用的模块的模块名必须是标识符并且不是关键字
2.一个模块可以使用另一个模块中的所有全局变量,使用之前要先导入
3.导入模块 import 模块名 - 导入指定模块 导入后通过'模块名.'的方式使用该模块中所有的全局变量
4.from 模块名 import 全局变量1,全局变量2... - 导入指定模块,可以直接使用指定全局变量
5.form 模块名 import * 导入指定模块,可以使用模块中的所有全局变量
6.import 模块名 as 新模块名 将原来的模块名改名作为一个新对象
7.from 模块名 import 全局变量名 as 新全局变量名

3.3导入模块的原理

3.3.1当通过import或者from-import导入一个模块时,系统会自动将这个模块中的代码执行一遍

1
2
import test_2
print(test_2.a)

4.包的使用 - 包就是包含__init__.py 文件的文件夹

4.1包的导入

1
2
3
4
5
6
7
## 直接导入包
import 包名
## 通过包导入模块
import 包名.模块名 - 可以通过'包.模块.' 去使用指定模块中的所有全局变量
import 包名.模块名 as 新名称
fromimport 模块名/* (as新名称)
from 包.模块 import 变量名1,变量名2 (as新名称)

4.2包的导入原理

1
2
3
通过包导入包中的模块的时候,
程序会先执行包中的__init__.py文件中的所有代码
然后在执行导入的模块的所有代码

4.3直接使用包中的快捷键

1
2
3
4
from files import read_excel
read_excel()

files.excel.read_excel()