Python基础知识之生成器

Python基础知识之生成器,第1张

九、迭代器与生成器 (一)迭代器

1.可迭代器对象 iterable

(1)迭代--每一次对过程的重复,每一次迭代得到的结果会作为下一次迭代的初始值

(2)可迭代器对象--具有iter函数的对象

(3)语法

"""--创建:.
    class可迭代对象名称: 
        def__iter__(self):
            return迭代器
--使用:.
    for变量名in可迭代对象: #原理:迭代器 = 可迭代对象.__iter__()
        语句.
"""
"""面试题:
​
1.for循环的原理?
​
    
"""
#获取迭代器
it = list02.__iter__()
#循环获取下一个元素
while True:
    try:
        item = it.__next__()
        print(item)
    except Stopiteration:
        break
        #遇到异常停止迭代
"""     
2.可以被for的条件是什么?
答:有.__iter__()方法的容器
"""   
​
​
#练习
lists = ["林黛玉","贾元春","贾迎春","贾探春","贾惜春"]
iterable = lists.__iter__()  #获取迭代器对象
#循环获取下一个元素
while True:
    try:
        temp = iterable.__next__()
        print(temp)
    except Stopiteration:
        break #遇到异常停止迭代
​
#练习2
dicts = {"林黛玉":101,"贾元春":102,"贾迎春":103,"贾探春":104,"贾惜春":105}
iterable = dicts.__item__()
while True:
    try:
        temp = iterable.__next__()
        print(temp,dicts[temp])
    except StopIteration:
        break

2.迭代器对象 iterator

(1)可以被next()函数调用并返回下一个值得对象

(2)语法

class 迭代器类名:
    def __init__(self,聚合对象):
        self.聚合对象 = 聚合对象
    
    def __next__(self):
        if 没有元素:
            raise StopIteration
        return 聚合对象元素
​
    
#练习 学生管理器  记录了多个学生 迭代出学生
class StudentModel:
    def __init__(self,id,name,sex):
        pass
    
class StudentManager:
    def __init__(self):
        self.__list_stu = []
    def insert(self,stu):
        if isinstance(stu,StudentModel):
            self.__list_stu.append(stu)
        else:
            raise ValueError()
    def __item__(self):
        return StudentIterator(self.__list_stu) #1.返回迭代器
​
class StudentIterator:   #迭代器
    def __init__(self,lists):
        self.__lists = lists
        count = 0
    def __next__(self):
        if count
​
​

(二)生成器

1.构成 可迭代对象+迭代器

2.定义

next(循环)一次,计算一次,返回一次 ​ 动态提供数据的可迭代对象,节省内存空间

3.原理

"""
生成器语法:
def 函数():
​
    yield 数据
​
for item in 函数名():
    语句
"""
#1.定义Myrange类,实现range的功能   过渡版
class MyRange:
    def __init__(self,end):
        self.end = end
    def __item__(self):
        return RangeIterator(self.end)
​
class RangeIterator: #迭代器
    def __init__(self,end):
        self.__begin = 0
        self.__end = end
    def __next__(self):
        if self.__begin 

4.优缺点

优:节省内存 ​ 缺:不能使用索引、切片访问结果

5.惰性 *** 作->立即 *** 作

list_result=list(<生成器>)

6.表达式 ​ re = (item for item in list01 if type(item) == int)#生成器对象

for item in re:

print(item)

7.生成器与迭代器关系

class 可迭代关系:
​
    def __iter__():
​
        return 迭代器对象
​
class 迭代器:
​
    def __next__():
​
调用
​
for  in 
​
# 面试题:
​
# 请简述,生成器与迭代器
​
# 生成器 本质就是 迭代器 + 可迭代对象.
​
# 而可迭代对象就是为了可以迭代(for),而迭代的本质就是不断调用迭代器next方法.
​
# 生成器最重要的特点调用一次next,计算一次结果,返回一个数据,
​
# 这个过程称之为惰性 *** 作/延迟 *** 作.
​
# 在海量数据下,可以大量节省内存.
​
​
# 惰性 *** 作 --> 立即 *** 作(灵活获取结果)
​
# list(生成器)
​
​

十、软件开发的目录规范

项目文件夹

bin #存放可执行文件

start.py

conf #项目的配置文件 如数据库路径、日志路径

settings.py

db #数据库文件夹

lib #共享库,公用区 common.py

core #核心代码逻辑 core.py

log #日志文件夹

api #

api.py

run.py

setup.py

requirements.txt

README

注:

  • core/:存放业务逻辑相关代码

  • api/:存放接口文件,接口主要用于为业务逻辑提供数据 *** 作。

  • db/:存放 *** 作数据库相关文件,主要用于与数据库交互

  • lib/t:存故程序中常用的自定义模块

  • conf:存放配置文件

  • run.py:程序的启动文件,一般放在项目的根目录下,因为在运行时会默认将运行文件所在的文件夹作为sys.path的第一个路径,这样就省去了处理环境变量的步骤 . setup.py:安装、部署、打包的脚本。

  • requirements.txt:存放软件依赖的外部Python包列表。 -README:项目说明文件。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/729243.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)