【python生成器与模块】

本文详细介绍了Python中生成器的概念、使用yield的关键字创建生成器对象,以及生成器表达式的应用。此外,还探讨了模块和包的定义、作用、分类及导入方式,帮助读者理解代码组织和模块管理的重要性。

生成器

在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值