Day013 - 迭代器生成器与模块

迭代器(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中封装通用的函数或者数据

  • 这个包里通用的一些内容或者方法,比如打开文件与关闭文件等;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值