生成器对象与初入模块


注释.生成器的本质其实还是迭代器,方法只不过是变了是通过我们自己写的代码产生

一.生成器对象

我们在知道迭代器里有
iter
next 方法

def index():
    print('还在么?')
    yield 111
    print('还在?')
    yield 666
当函数体代码中有'yield'关键字的
一次调用函数是不会执行函数体代码的

而是是将函数变成了生成器,可以用__iter__ .__next__方法验证

for循环底层也是迭代器验证

"""yield和return功能挺像都可以终止函数体代码运行 并且可以返回多个元素都已元组的方式进行存放,如果函数中有多个yield关键字,那么执行一次__next__后边的值就让他停留在yield位置上,再次执行__next__后再次执行到yield处停止如果值取完了则报错

二.自定义range方法

range之前说过就是相当于一个‘集合体要什么给什么不占用内存空间’其实range也是一个可迭代对象


#两个参数
def outer(a,b):
    while a < b:
        yield a
        a += 1
for list in outer(0,10):
    print(list) 结果是 0~9
#一个参数
def outer1(a, b=None):
    if not b:
        b = a
        a = 0
    while a < b:
        yield a
        a += 1
for list in outer1(10):
    print(list) 结果是0~9
# 三个参数
def outer2(a,b=None, c=1):
    if not b:
        b = a
        a = 0
    while a < b:
        yield a
        a += c
for list in outer2(0, 15, 1):
    print(list) 结果 1~14

三.yield关键字作用

1.在函数体代码中出现 可以将函数变成生成器
2.在执行过程中 可以将后面的值返回出去 类似于return
3.还可以暂停住代码的运行
4.还可以接收外界的传值

四.生成器表达式

"""其实也是节省存储空间的"""

res = (i for i in 'jason')
print(res)
print(next(res))
结果
<generator object <genexpr> at 0x0000000002150BF8>
j

"""生成器内部的代码只有在调用的__next__迭代器的时候才会执行"""

五.模块

1.什么是模块:模块就是一系列功能集合体,可以直接使用
2.为什么要用模块:极大的提升了开发效率
3.模块的来源:内置模块(解释器子代) 自定义模块(自己写) 第三方模块(网上找)
4.模块的表现形式:
1.python代码编写的py文件
2.采用多个py文件组成的文件夹(称为包)
3.已被编译为共享库或DLL的c或C++扩展
4.使用C编写并链接到python解释器的内置模块

5.使用模块的方法:
import--(你写的模块一个py文件)
比如import md # 导入模块
print(md.name) # 被导入的文件(模块)
相同模块反复导入只会执行一次

1.执行当前文件产生一个名称空间
2.执行导入语句 运行模块文件产生名称空间存放运行过程中的所有名字
3.将import后面的名字直接拿到当前执行文件中
4.重复导入也只会导入一次
5.使用模块名称空间中的名字不需要加模块名前缀 直接使用即可
6.但是from...import的句式会产生名字冲突的问题
在使用的时候 一定要避免名字冲突
7.使用from...import的句式 只能使用import后面出现的名字
from...import...可以简单的翻译成中文
从...里面拿...来用 没有提到的都不能用'指名道姓'

5.1导入补充

# 1.可以给模块起别名(使用频率很高)
'''比如模块名或者变量名很复杂 可以起别名简写'''
# import md as m
# print(m.name)  # 原来是# ptint(md.name)
# 2.可以导入多个模块或者变量名
# import time, sys, md
# from md import name, read1, read2
"""连续导入多个模块 这多个模块最好有相似的功能部分 如果没有建议分开导入
    如果是同一个模块下的多个变量名无所谓!!!
# 3.通用导入
from md import *
'''*表示md里面所有的名字   from...import的句式也可以导入所有的名字
如果模块文件中使用了__all__限制可以使用的名字  那么*号就会失效 依据__all__后面列举的名字
"""只能导入在模块中收限制的变量名"""
posted @ 2022-03-24 18:26  笑舞狂歌  阅读(20)  评论(0编辑  收藏  举报