迭代器(iter)
迭代器定义
- 迭代器是容器型数据类型,可以同时保存多个数据;可以被遍历,也可以转换成列表和元组;
- 打印迭代器的时候无法显示与打印里面的元素;迭代器不支持len操作;
- 如果需要迭代器中的元素,必须将元素从迭代器取出,而且一旦取出元素,迭代器中的这个元素就不存在了;
创建迭代器
-
通过iter将其他序列转换成迭代器;
-
创建生成器对象(生成器可以看成是一种特殊的迭代器);
iter1 = iter('abc')
print(iter1) # <str_iterator object at 0x000001F1C03E4B20>
# print(len(iter1)) # TypeError: object of type 'str_iterator' has no len()
获取迭代器中的元素
- 获取单个元素 - next(迭代器)
- 当迭代器中没有元素后使用next函数会报错,StopIteration
- for 循环遍历
iter1 = iter('abc')
print(next(iter1)) # a
print(next(iter1)) # b
print(next(iter1)) # c
# print(next(iter1))
iter2 = iter([10, 20, 30, 40])
for x in iter2:
print(f'x:{x}')
iter3 = iter('hello')
print(list(iter3)) # ['h', 'e', 'l', 'l', 'o'] 元素已经被取完
# print(next(iter3)) # 因为没有元素所以报错
生成器(generator)
生成器定义
-
生成器是具备能够产生多个数据能力的一种容器;
-
生成器在获取数据的时候和迭代器一样;
创建生成器
-
调用一个带有yieid关键字的函数就可以得到一个生成器对象;
-
如果一个函数中yieid,那么这个函数在调用的时候不会执行函数体,也不会获取返回值,而是得到一个生成器;
def func1():
print('===')
print('+++')
result1 = func1()
print(result1) # === +++ None
def func2():
print('===')
yield
print('+++')
result2 = func2()
print(result2) # <generator object func2 at 0x000001776D748350>
生成器数据的产生
- 执行生成器对应的函数会遇到几次yieid,这个生成器就能产生多少个数据,yieid后面的值就是对应可以产生的数据;
# 遇到几次就产生几次数据,后面的值就是返回值
def func31():
yield 100
for i in range(4):
yield i
for x in func31():
print('===', x)
"""-------------------------------"""
def func32():
yield 100
yield 200
yield 300
# 只会不断创建生成器,然后获取第一个能获取的数据
print(next(func32())) # 100
print(next(func32())) # 100
print(next(func32())) # 100
# 用变量获取到生成器后就可以逐一获取生成器的数据
gen3 = func32()
print(next(gen3)) # 100
print(next(gen3)) # 200
print(next(gen3)) # 300
"""-------------------------------"""
# 练习1:创建一个生成器,可以产生前N个偶数
def get_even(num):
for even in range(0, num * 2, 2):
yield even
# even = 0
# for _ in range(num):
# yield even
# even += 2
gen_get_even = get_even(5)
for x in gen_get_even:
print(x)
生成器产生数据的原理
-
在通过生成器对象获取数据的时候,程序才会执行生成器对应的函数;
-
每次遇到yieid就会停止,将yieid后面的数据作为这次获取到的数据并记录结束位置;
-
下一次获取数据的时候直接从上一次结束的位置开始执行;
def func4():
print('-' * 10, '1', '-' * 10)
yield 100
print('-' * 10, '2', '-' * 10)
yield 200
print('-' * 10, '3', '-' * 10)
yield 300
print('-' * 10, 'end', '-' * 10)
gen5 = func4()
print(gen5) # <generator object func4 at 0x000001E12EC7D4A0>
print('取元素:', next(gen5))
print('可以执行其他代码')
print('取元素:', next(gen5))
print('取元素:', next(gen5))
# print('取元素:', next(gen5)) # StopIteration,因为函数体最后没有yieid
gen1 = (i for i in range(0, 20, 2))
print(gen1)
模块
- Python中一个py文件就是一个模块;
模块的使用
-
注意:如果一个模块能够被其他模块使用,那么模块的文件名必须是标识符且不是关键字;
-
模块导入后,模块可以使用被导入模块中所有的全局变量;
导入模块
- import 模块名
- 导入指定模块,导入后可以通过“模块名.”方式来使用该模块的所有全局变量。
- import 模块名 as 新模块名 - 对模块重命名
- 当该模块内有变量与被导入模块名重复产生冲突时,可以通过该方式对被导入的模块重命名;
- from 模块名 import 全局变量1,全局变量2,…,全局变量N
- 导入指定模块,导入后可以直接使用指定的全局变量
- from 模块名 import *
- 导入指定模块,可以使用所有全局变量;
- from 模块名 import 全局变量1 as 新全局变量1, 全局变量2, …
- 变量名产生冲突可以对指定变量重命名,不影响其他导入的变量;
# # 导入方式1
import test_import
print(test_import.a)
print(test_import.x)
# # 导入方式2
from test_import import a
print(a)
# # 导入方式3
from test_import import *
print(a)
print(x)
print(func1())
# # 导入方式4 - 对模块重命名
import test_import as test1
test_import = 1
test1.func1()
# 导入方式5 - 对变量重命名
from test_import import a as a1, x
print(a1)
print(x)
导入模块的原理
- 当通过import或者from import导入一个模块的时候,系统会自动将这个模块中的代码全部执行一遍;
# import test_import
from test_import import a
- 被导入的PY文件
print('-------------start---------------')
a = 100
def downland1():
print('1')
print('2')
print('3')
def func1():
print('func1')
print('-------------end---------------')
# 这个if语句中的代码在被别的模块导入的时候不会被执行,直接运行当前米快的时候才会被执行
if __name__ == '__main__':
for x in range(5):
print('x:', x)
downland1()
包的使用
什么是包
- 包就是包含__init__.py文件的文件夹;
导入包中的模块(使用包中的内容)
- import 包名
- 直接导入包
- import 包.模块
- 可以通过“包.模块.变量”去使用指定模块中的所有全局变量
- from 包 import 模块1, 模块2
- from 包.模块 import 模块中的内容(全局变量)
# 2.1 直接导入包
import package
# 2.2 通过包导入模块
import package.json
package.json.read_json()
# 2.3 通过包导入模块并重命名
import package.json as packjson
packjson.read_json()
# 2.4 通过包导入模块
from package import excel, json
excel.read_excel()
json.read_json()
# 2.5 通过包导入模块中的内容
from package.json import read_json
read_json()
导入包的原理
- 通过包导入包中的模块的时候,程序会先执行包中__init__.py文件中所有的代码,然后再执行对应模块中的代码;
在__init__.py中创建部分方法的快捷键
# 先在__init__.py 导入一次包里的某些内容
from package.excel import read_excel - 在__init__.py 中
from package import read_excel # 再在其他使用这些内容的地方导入对应的内容
read_excel()
在__init__.py中封装通用的函数或者数据
- 这个包里通用的一些内容或者方法,比如打开文件与关闭文件等;