3.24python笔记

生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)。跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

调用一个生成器函数,返回的是一个迭代器对象。

def fibonacci(n): # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n): 
            return
        yield a  #执行一次__next__返回后面的值并且让代码停留在yield位置 
        a, b = b, a + b
        counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
print (next(f), end=" ")
'''生成器对象也是节省存储空间的 特性与迭代器对象一致'''
"""
当函数体代码中含有yield关键字
    第一次调用函数并不会执行函数体代码
    而是将函数变成了生成器
如何验证?
    是否有iter()和next()方法
"""
可以使用__next__方法 和迭代器一样
     print(f.__next__())  
     print(f.__next__())  
     print(f.__next__())  
     print(f.__next__())
也可以使用for循环 因为本质也是一个迭代器
    for i in f:
        print(i,end=" ")

微信截图_20220324211722

yield关键字作用

# 1.在函数体代码中出现 可以将函数变成生成器
# 2.在执行过程中 可以将后面的值返回出去 类似于return
# 3.还可以暂停住代码的运行
# 4.还可以接收外界的传值(了解)
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__方法

生成器表达

简便写法:
 res = (i for i in 'jason')
 print(res)  # <generator object <genexpr> at 0x1130cf468>
 print(res.__next__())
"""生成器内部的代码只有在调用__next__迭代取值的时候才会执行"""

生成器的面试题

def add(n, i):
    return n + i
def test():
    for i in range(4):
        yield i
g = test()  # 将test函数变成生成器对象
for n in [1, 10]:
    g = (add(n, i) for i in g)
res = list(g)  # list底层就是for循环 相当于对g做了迭代取值操作
print(res)
问:最后结果是什么?
#A. res=[10,11,12,13]
#B. res=[11,12,13,14]
#C. res=[20,21,22,23]
#D. res=[21,22,23,24]
正确答案是C  诀窍就是抓n是多少即可
"""
第一次for循环
	g = (add(n, i) for i in g)
第二次for循环
	g = (add(10, i) for i in (add(10, i) for i in g))
这时候还没进行迭代取值g后面的都可以不用看,这就是这道题的关键
"""

模块

Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。
模块让你能够有逻辑地组织你的 Python 代码段。
把相关的代码分配到一个模块里能让你的代码更好用,更易懂。
模块能定义函数,类和变量,模块里也能包含可执行的代码。
# 1.什么是模块?
	模块就是一系列功能的结合体 可以直接使用
# 2.为什么要用模块?
	极大地提升开发效率(拿来主义>>>:站在巨人的肩膀上)
# 3.模块的三种来源
	1.内置的模块
  	无需下载 解释器自带  直接导入使用即可
  2.自定义模块
  	自己写的代码 封装成模块 自己用或者发布到网上供别人使用
  3.第三方模块
  	别人写的发布到网上的 可以下载使用的模块(很多牛逼的模块都是第三方)
# 4.模块的四种表现形式(大白话:长啥样子)
  1.使用python代码编写的py文件		 
  2.多个py文件组成的文件夹(包)     
  3.已被编译为共享库或DLL的c或C++扩展
  4.使用C编写并链接到python解释器的内置模块

模块的两种导入方式

# 方式1>>>:import...句式
 import md
 print(md.name)
 md.read1()
# 方式2>>>:from...import...句式
from md import name,money,read1
 print(name)  # jasonNB
 name = 'kevin'
 print(name)  # kevin

导入补充

# 1.可以给模块起别名(使用频率很高)
'''比如模块名或者变量名很复杂 可以起别名简写'''
# import md as m
# print(m.name)
# from md import name as n
# print(n)

# 2.连续导入多个模块或者变量名
# import time, sys, md
# from md import name, read1, read2
"""连续导入多个模块 这多个模块最好有相似的功能部分 如果没有建议分开导入
    如果是同一个模块下的多个变量名无所谓!!!
"""
# import time
# import sys
# import md

# 3.通用导入
from md import *
'''*表示md里面所有的名字   from...import的句式也可以导入所有的名字
如果模块文件中使用了__all__限制可以使用的名字  那么*号就会失效 依据__all__后面列举的名字
'''
print(name)
print(money)
posted @   槐序八  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示