迭代器、生成器、闭包

发布时间 2023-08-31 21:33:11作者: csh逐梦

课题:迭代器、生成器与包管理

目的:了解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必备的包管理

官网:https://pypi.org/

基本使用:

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__