迭代器、生成器、闭包
课题:迭代器、生成器与包管理
目的:了解for循环的原理与生成器的作用,理解包的含义
知识点一:迭代器
百科:迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。
for i in range(100): # 依次拿东西 这就是迭代的过程
print(i)
li = [1,2,3,4,5,6]
index = 0
while index < len(li): # 也能实现迭代过程
print(li[index])
index +=1
问题:for 是怎么实现迭代的?
从可迭代对象生成一个迭代器
迭代器=iter(可迭代对象)
下个值=next(迭代器)
a = iter(li)
print(a)
print(next(a)) # 超过就会溢出 报错
当一个对象有__iter__ __next__ 两个魔法方法 就叫做迭代器
如果没有 next 只有iter 就叫做迭代对象
1、For循环原理
可迭代对象与迭代器的区别 ?器---容器
a=iter(li)# 迭代器
print(next(a))# 单次取一个
# 怎么取.不用管下标,只能依次取值,取完之后会抛出异常,迭代完毕
# 只能用一次
# 调用:迭代器:__iter___
# next:__next__ dir(next)
# 迭代器:__next__和__iter__
# 可迭代对象:__iter__
For 怎么实现的
# 逻辑
index = 0
var = None
while index < len(li):
var=li[index]
print(var)
index+=1
for
itr = iter(li)
try:
while True:
b = next(itr)
print(b)
except StopIteration:
pass
可迭代对象怎么区分 一定有 __iter__
迭代器 有 __iter__ __next__
知识点二:生成器
跟函数非常类似
支持显式的暂停与恢复
隐式的支持迭代协议
def func():
yield 1
yield 2
yield 3
yield 4
yield 5
yield 6
a = func()
print(a)
print(next(a))
1、yield
def cycke(a,n):
count = 0
while True:
if count < n:
count += 1
yield a
else:
break
a = cycke('qiye',100)
for i in a:
print(i)
遇到yield 就会返回出来
后面的代码没有被执行, 他会暂停, 再运行next 恢复 代码会继续往下执行
你有几个next就能执行几个yield
li = [1,2,3,4,.......,100000]
直接存是不是很占内存
生成器 在不运行它 只是一串代码 表达式而已
def func():
yield [1,2,3,4]
print(next(func()))
# yield 后面只有一个对象
总结
关系
- 可迭代对象(
__iter__
)- 迭代器(
__iter__/__next__
)- 生成器
- 序列类型
- 字典
- 迭代器(
1)可迭代对象包含迭代器。
2)如果一个对象拥有 __iter__
方法,则是可迭代对象;如果一个对象拥有__next__
方法,则是迭代器。
3)定义可迭代对象,必须实现__iter__
方法;定义迭代器,必须实现__iter__
和__next__
方法。
知识点三:包跟包管理
什么是包?
包体现了模块的结构化管理思想,包由模块文件构成,将众多具有相关功能的模块文件结构化组合形成包。
什么是模块?
模块是一种以.py为后缀的文件,在.py文件中定义了一些常量和函数。模块的名称是该.py文件的名称。
什么是库?
Python中的库是借用其他编程语言的概念,没有特别具体的定义,Python库着重强调其功能性。在Python中,具有某些功能的模块和包都可以被称作库。模块有诸多函数组成,包由诸多模块机构化组成,库中也可以包含包、模块和函数。
pip --- python必备的包管理
基本使用:
pip -V # 版本
pip list #本地安装包
pip install [package_name] # 包安装
#包更新
pip install -U [package_name]
#包卸载
pip uninstall [package_name]
#包检索(服务器端)
pip search [package_keyword]
#输出安装包的详细信息
pip freeze
#显示本地安装包的详细信息
pip show [package_name]
#pip自身更新
pip install --upgrade pip
#帮助信息
pip--help
from deatetime import datetime # 部分导入
from datetime import * # 所有的模块
import datetime as dt # 取别名
deatetime.now()
# 多个包
import time,deatetime
import sys
print(sys.path)
# 只有放在这些路径下面才能被导入
同级导包
import 文件名
# 文件夹要有__init__.py
python 内置的包都是这么导入的
if __name__ == '__main__':
print(__name__)
__name__ 自身调用就用__main__
别人调用不了,就会变成包的名字,不会执行__main__
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App