生成器
在Python中,生成器和迭代器被看作一种工具,生成器的本质就是迭代器。唯一的区别就是生成器是程序员自己用Python代码构建的数据结构,而迭代器是Python内置提供或转化而来的。
生成器对象
生成器对象也是节省存储空间的 特性与迭代器对象一致
当函数体代码中含有yield关键字
第一次调用函数并不会执行函数体代码
而是将函数变成了生成器
如何验证?
是否有iter()和next()方法
yield关键字
只要函数中使用了yield关键字,这个函数就是生成器函数,生成器函数使用函数名称()不执行生成器函数。在生成器函数内部,通过关键字yield生成需要返回的值;生成器函数外,通过__next__(调用生成器函数)来获取一个yield的值,获取yield值的过程中,执行yield关键字之上的所有代码,直到遇到yield停止代码的执行(但不会结束函数),返回yield的值,注意,使用一个__next__(调用函数),对应获取一个yield值。
def eat(name):
print(f'{name}准备干饭')
while True:
food = yield
print(f'{name}正在吃{food}')
res = eat('赵公子')
# 想执行一次代码 如果想执行多次直至结束 可以直接用for循环
res.__next__()
# res.__next__() 赵公子正在吃None
# res.__next__() 赵公子正在吃None
res.send('生日蛋糕') # 可以给yield传值 并且自动调用一次__next__方法
res.send('大鸡腿') # 可以给yield传值 并且自动调用一次__next__方法
yield关键字的作用:;
1.在函数体代码中出现 可以将函数变成生成器
2.在执行过程中 可以将后面的值返回出去 类似于return
3.还可以暂停住代码的运行
4.还可以接收外界的传值(了解)
生成器表达式
生成器表达式与列表推导式的写法几乎一摸一样,将列表推导式的[]换成()就是生成器表达式,生成器表达式也有循环模式和筛选模式,多层循环构建。
列表推导式与生成器表达式的区别在于,生成器表达式更省内存。
res = (i for i in 'jason')
print(res) # <generator object <genexpr> at 0x1130cf468>
"""
生成器内部的代码只有在调用__next__迭代取值的时候才会执行
"""
print(res.__next__())
模块与包
什么是模块
模块就是 Python文件 ,里面定义了很多的函数、类、变量 。一个完整大型的python程序是由 模块和包 的形式组织起来的,可见模块在python中的重要性。
模块的作用
在python交互式解释器中操作输入的代码,在退出python时是不会被保存的; 而模块文件中的代码是 永久存在 的。减少重复代码, 减少工作量(写的量、改的量)、代码更优雅、拿来主义
模块的分类
(1)、内置的模块(标准模块),无需安装和编写,自动导入就有的模块,比如说random,math
(2)、第三方模块,别人写到的发布到平台上的模块,需要安装的模块,比如,requests,需要pip安装的
(3)、自定义模块,自己写的模块
什么是包
Python包实际上是一个目录,包含python的目录
模块的两种导入方式
<1> import…句式
two.py是执行文件 one.py是被导入文件(模块)
导入模块内部到底发送了什么事情
1.执行当前文件 产生一个当前文件的名称空间
2.执行import句式 导入模块文件(即执行模块文件代码产生模块文件的名称空间)
3.在当前文件的名称空间中产生一个模块的名字 指向模块的名称空间
4.通过该名字就可以使用到模块名称空间中的所有数据
ps:相同的模块反复被导入只会执行一次
import one
<2> from…import…句式
从one.py里单独导入具体的变量或者函数
from one import name
print(name)
注意:
1.重复导入也只会导入一次
2.使用模块名称空间中的名字不需要加模块名前缀 直接使用即可
3.但是from…import的句式会产生名字冲突的问题
在使用的时候 一定要避免名字冲突
4.使用from…import的句式 只能使用import后面出现的名字
导入所有函数(模糊导入)
表示one.py里面所有的名字 from…import的句式也可以导入所有的名字
如果模块文件中使用了__all__限制可以使用的名字 那么*号就会失效 依据__all__后面列举的名字
import one *
给模块取别名
import one as o
from one import name as n
连续导入多个模块或者变量名
import time, sys, md
from one import name, read1, read2