Day17
总结
生成器对象
# 本质上还是迭代器
def index():
print('1')
yield 2
yield 3
print('4')
yield 5, 6
res = index() # 加括号调用并接收结果:不执行代码 而是变成生成器对象
print(res.__next__()) # 1 2
print(res.__next__()) # 1 2 3
print(res.__next__()) # 1 2 3 4 (5, 6)
print(res.__next__()) # 报错 StopIteration
'''
当函数体代码有yield关键字时,第一次调用函数并不会执行函数体代码,而是将函数变成生成器
函数体代码中含有多个yield关键字 执行一次__next__返回后面的值并且让代码停留在yield位置
再执行__next__则基于上次位置继续往后执行到下一个yield关键字处
如果没有yield再执行__next__就会报错
'''
自定义range方法
# 用生成器模拟range方法(range方法本质是一个可迭代对象)
def my_range(start, end=None, step=1):# end设为默认可以满足一个参数的情况
if not end: # 没有给end传值
end = start
start = 0
while start < end:
yield start
start += step
for i in my_range(10):
print(i)
yield关键字
'''
1.可以将函数变成生成器
2.在执行过程中,可以将后面的值返回出去 类似return
3.暂停代码的运行
4.接受外界的传值(send)
'''
def func(name):
print(f'{name}准备上课了')
while True:
lesson = yield
print(f'{name}要上{lesson}')
res = func('jason')
res.__next__() # jason准备上课了
res.send('英语课') # jason要上英语课 send可以给yield传值,并且自动执行一次__next__()
生成器表达式
# 节省存储空间,在代码优化时实用
res = (i for i in 'abcde')
print(res) # <generator object <genexpr> at 0x000001A981F93CA8>
print(res.__next__()) # a
# 生成器内部的代码只有在调用__next__迭代取值的时候才会执行
模块
# 1.模块就是一系列功能的综合体,可以极大效率提升开发效率
# 2.模块的来源
1.内置模块
解释器自带的
2.自定义模块
自己写的代码封装的模块
3.第三方模块
别人发布到网上的
# 3.模块的四种表现形式
1.python代码编写的py文件
2.多个py文件组成的包
3.已被编译为共享库或DLL的c或C++扩展
4.使用C编写并链接到python解释器的内置模块
模块的导入方式
# 1.import...
import 导入的是被导入文件,import所在的是执行文件
import md # i = 1
i = 2
print(md.i) # 1
print(i) # 2
# 2.from...import... 可以导入指定的字段
from md import i # i = 1
print(i) # 1
i = 2
print(i) # 2
'''
重复导入只会导入一次
在使用from...import... 时一定要避免名字冲突
使用from...import...只能拿里面存在的,不然会报错
'''
# 3.可以给模块起别名
import panda as pd
# 4.连续导入多个模块
import time,md
模块之间有相似之处可以连续导入多个模块,没有的话最好分开导入
# 5.通用导入
from md import *
'''
如果模块文件使用了__all__限制可以使用的名字,*就会失效,根据__all__后规定的名字导入
'''
作业
:
:
明天周五了,不能松懈啊
:

浙公网安备 33010602011771号