No.17迭代器&生成器
No.17
今日概要
- 迭代器 ▲
- 生成器 ▲▲
- 装饰器 ▲▲▲
- 项目结构
- loggoing模块
内容回顾和补充
1函数
-
基本结构
def func(a1,a2): pass- 参数
- 返回值
- 执行函数
-
函数小高级
- 函数作变量
- 函数作参数
-
函数中高级
- 函数作返回值
- 函数的嵌套
-
装饰器 & 闭包
-
递归
-
匿名函数
-
内置函数
2模块
-
定义模块
- 内置 json / time / datetime / os / sys ...
- 第三方
- 安装:
- pip包管理工具:
- pip install xlrd
- 源码安装:
- 下载源码包:压缩文件
- 解压文件
- 打开cmd,进入文件的目录 → cd 解压文件路径
- 执行:python37 setup.py build
- 执行:python37 setup.py install
- pip包管理工具:
- 安装路径:D:\Python37\Lib\site-packages
- 你了解的第三方模块
- xlrd
- requests
- 安装:
- 自定义
- py文件
- 文件夹
__init__.py
-
调用模块
-
import
- import 模块1 模块1.函数()
- import 模块1.模块2.模块3 模块1.模块2.模块3.函数()
-
from xxx import xxx
- from 模块.模块 import 函数 函数()
- from 模块.模块 import 函数 az f f()
- from 模块.模块 import * 函数1() 函数2()
- from 模块 import 模块 模块.函数()
- from 模块 import 模块 as m m.函数()
-
特殊情况
-
import 文件夹(加载
__init__.py)![]()
-
from 文件夹 import *
![]()
-
-
3其它
- 两个值数据交换 a,b = b,a
- 推导式
- 列表 ▲
- 字典
- 集合
4.总结
- 基础知识
- 逻辑能力
- 面试题
5.作业
-
列举你常见的内置函数。
-
列举你常见的内置模块?
-
json序列化时,如何保留中文?
-
程序设计:用户管理系统
""" 功能: 1.用户注册,提示用户输入用户名和密码,然后获取当前注册时间,最后将用户名、密码、注册时间写入到文件。 2.用户登录,只有三次错误机会,一旦错误则冻结账户(下次启动也无法登录,提示:用户已经冻结)。 """ -
有如下文件,请通过分页的形式将数据展示出来。【文件非常小】
1|飞机|1000 2|大炮|2000 3|迫击炮|1000 4|手枪|123 ... -
有如下文件,请通过分页的形式将数据展示出来。【文件非常大】
1|飞机|1000 2|大炮|2000 3|迫击炮|1000 4|手枪|123 ... -
程序设计:购物车
""" 有如下商品列表 GOODS_LIST,用户可以选择进行购买商品并加入到购物车 SHOPPING_CAR 中且可以选择要购买数量,购买完成之后将购买的所有商品写入到文件中【文件格式为:年_月_日.txt】。 注意:重复购买同一件商品时,只更改购物车中的数量。 """ # 购物车 SHOPPING_CAR = {} # 商品列表 GOODS_LIST = [ {'id':1,'title':'飞机','price':1000}, {'id':3,'title':'大炮','price':1000}, {'id':8,'title':'迫击炮','price':1000}, {'id':9,'title':'手枪','price':1000}, ] -
程序设计:沙河商城
""" 功能: 1.用户注册,提示用户输入用户名和密码,然后获取当前注册时间,最后将用户名、密码、注册时间写入到文件。 2.用户登录,只有三次错误机会,一旦错误则冻结账户(下次启动也无法登录,提示:用户已经冻结)。 3.商品浏览,分页显示商品(小文件); 用户可以选择商品且可以选择数量然后加入购物车(在全局变量操作), 不再购买之后,需要讲购物车信息写入到文件,文件要写入到指定目录: shopping_car(文件夹) - 用户名A(文件夹) 2019-11-11-09-59.txt 2019-11-12-11-56.txt 2019-12-11-11-47.txt - 用户B(文件夹) 2019-11-11-11-11.txt 2019-11-12-11-15.txt 2019-12-11-11-22.txt 注意:重复购买同一件商品时,只更改购物车中的数量。 4.我的购物车,查看用户所有的购物车记录,即:找到shopping_car目录下当前用户所有的购买信息,并显示: 2019-11-11-09-59 飞机|1000|10个 大炮|2000|3个 2019-11-12-11-56.txt 迫击炮|10000|10个 手枪|123|3个 5.用户未登录的情况下,如果访问 浏览商品 、我的购物车 时,提示登录之后才能访问,让用户先去选择登录(装饰器实现)。 """ -
请使用第三方模块xlrd读取一个excel文件中的内容。【课外】
内容详细
1.迭代器
自己不会写迭代器,只会使用。
任务:请展示列表中所有的数据。
-
while + 索引 + 计数器
-
迭代器:对 某种对象(str/list/tuple/dict/set类创建的对象)-可迭代对象 中的元素进行逐一获取。表象:具有
__next__()方法且每次调用都获取可迭代对象中的元素(从前到后一个一个获取)。-
列表转换成迭代器:
- v1 = iter([11,22,33,44])
- v1 =
[11,22,33,44].__iter__()
-
迭代器想要获取每个值:反复调用
val = v1.__next__()#示例一 v1 = [11,22,33,44] v2 = iter(v1) #列表转换成迭代器 print(type(v2)) result1 = v2.__next__() print(result1) result2 = v2.__next__() print(result2) result3 = v2.__next__() print(result3) result4 = v2.__next__() print(result4) result5 = v2.__next__() #报错 print(result5) #示例二 v1 = 'alex' v2 = iter(v1) while True: try: val = v2.__next__() print(val) except Exception as e: pass -
直到报错:StopIteration错误,表示已经迭代完毕。
-
如何判断一个对象是否是迭代器:内部是否有
__next__方法。
-
-
for 循环
lst = [11,22,33] # 1.内部会将v1转换成迭代器 for item in lst: # 2.内部反复执行 迭代器.__next__() print(item) # 3.取完不报错
2.可迭代对象
-
内部具有
__iter__()方法且返会一个迭代器 ▲v1 = [11,22,33,44] result = v1.__iter__() -
可以被for循环
![]()
3.生成器(函数的变异)
#函数
def func():
return 123
func()
#生成器函数(内部是否包含yield)
def func():
print('f1')
yield 1
print('f2')
yield 2
print('f3')
yield 100
print('f4')
#函数的内部代码不会执行,返回一个生成器对象。
v = func()
#生成器可以被for循环,一旦开始循环那么函数内部代码就会开始执行。
for item in v:
print(item)
#遇到yield就终止,把yield值返回给item,接着开始下一次循环只会执行上次yield后面的代码,直到最后yield的值赋给了item。
def func():
count =1
while True:
yield count
count += 1
val = func() # 调用函数返回生成器,val就是一个生成器对象。
for item in val:
print(tiem)
总结:函数中如果存在yield,那么该函数就是一个生成器函数,调用生成器函数会返回一个生成器,生成器只有被for循环时,生成器函数内部的代码才会执行,每次循环都会获取yield返回的值。
def func():
count = 1
while True:
yield count
count += 1
if count == 100:
return
val = func()
for item in val:
print(item)
示例:读文件 ▲
def func():
'''
分批读取文件中的内容,将文件中的内容返回给调用者。
:return:
'''
cursor = 0
while True:
f = open('y.txt','r',encoding='utf-8') # 通过网路链接上redis
# 代指redis[0:10]
f.seek(cursor)
data_list = []
for i in range(10):
line = f.readline()
if not line:
return
data_list.append(line)
cursor = f.tell()
f.close() # 关闭与redis的链接
for j in data_list:
yield j
for item in func():
print(item)
redis源码示例 ▲

其他知识
- yield from 关键字
- 生成器推导式
总结
-
迭代器: 对可迭代对象中的元素进行逐一获取,迭代器对象的内部都有一个
__next__()方法,用于以一个个获取数据。 -
可迭代对象:可以被for循环且此类对象中都有
__iter__()方法且要返回一个迭代器(生成器)。 -
生成器:函数内部有yield则就是生成器函数,调用函数则返回一个生成器,循环生成器时则函数内部代码才会执行。
特殊的迭代器 ▲
def func(): yield 1 yield 2 yield 3 v = func() result = v.__next__() print(result) result = v.__next__() print(result) result = v.__next__() print(result)特殊的可迭代对象
def func(): yield 1 v = func() result = v.__iter__() print(result)




浙公网安备 33010602011771号