广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python中的迭代器,生成器与装饰器详解
  • 934
分享到

python中的迭代器,生成器与装饰器详解

2024-04-02 19:04:59 934人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录迭代器生成器装饰器总结迭代器 每一个可迭代类内部都要实现__iter__()方法,返回一个迭代类对象,迭代类对象则定义了这个可迭代类如何迭代。 for循环调用list本质上是是调

迭代器

每一个可迭代类内部都要实现__iter__()方法,返回一个迭代类对象,迭代类对象则定义了这个可迭代类如何迭代。

for循环调用list本质上是是调用了list的迭代器进行迭代。

# 对list进行for循环本质上是调用了list的迭代器
list = [1,2,3,4]

# for 循环调用
for elem in list:
    print(elem)

# 迭代器调用
list_iter = list.__iter__()
while True:
   try:
    print(next(list_iter)) 
   except StopIteration:
       break

实现一个自己自定的迭代类,规定迭代一个可迭代的数据结构为“倒计时”模式。

# 可迭代对象类
class CountDown(object):
    def __init__(self,num):
        self.num = num
    def __iter__(self):
        return MyIterator(self.num)

# 迭代类
class MyIterator(object):
    def __init__(self,num):
        self.NUM= num
        self.FINAL = 0
        self.now = num
        
    def __iter__(self):
        return self
    
    def __next__(self):
        step = 1 if self.NUM<self.FINAL else -1
        while self.now != self.FINAL:
            self.now += step
            return self.now - step
        raise StopIteration
        
cd_pos = CountDown(5)
cd_neg = CountDown(-5)
for i,j in zip(cd_pos,cd_neg):
    print(f'pos:{i}\tneg:{j}')

生成器

含有yield指令的函数可以称为生成器,它可以将函数执行对象转化为可迭代的对象。这样就可以像debug一样一步一步推进函数。可以实现的功能是可以实现让函数内部暂停,实现了程序的异步功能,这样可以及进行该函数与外部构件的信息交互,实现了系统的解耦。

from  collections import Iterable
def f():
    pass
# 含有yield指令的函数可以称为生成器
def g():
    yield()
print(type(f()),isinstance(f(),Iterable))
print(type(g()),isinstance(g(),Iterable))

使用生成器可以降低系统的耦合性

import os
# 生成器是迭代器的一种,让函数对象内部进行迭代
# 可以实现让函数内部暂停,实现了程序的异步功能,同时也实现了解耦。

def my_input():
    global str    
    str = input('input a line')
    pass

def my_write():
    with open('workfile.txt','w') as f:
        while(str):
            f.write(str+'\n')
            yield()
        return 


mw = my_write()
while(True):
    my_input()
    try:
        next(mw)
    except StopIteration:
        pass
    if not str:
        break   

装饰器

装饰器封装一个函数,并且用这样或者那样的方式来修改它的行为。

不带参数的装饰器

# 不带参数的装饰器
from functools import wraps
# 装饰器封装一个函数,并且用这样或者那样的方式来修改它的行为。
def mydecorator(a_func):
    @wraps(a_func)  #声明这个注解就可以不重写传入的函数,只是调用的时候wrap一下。不加的话,a_func函数可以看作被重写为wrapTheFunction.
    def wrapTheFunction():
        print(f"function in {id(a_func)} starts...")
        a_func()
        print(f"function in {id(a_func)} ends...")
    return wrapTheFunction

# 在函数定义前加入此注解就可以将函数传入装饰器并包装
@mydecorator
def f():
    print('hi')
    pass

f()
print(f.__name__)

带参数的装饰器(实现输出到自定义的日志文件)

# 带参数的装饰器(实现输出到自定义的日志文件)
from functools import wraps

def logit(logfile='out.log'):
    def mydecorator2(a_func):
        @wraps(a_func)
        def wrapTheFunction(*args, **kwargs):   # 这个保证了函数可以含有任意形参
            log_string = a_func.__name__ + " was called"
            print(log_string)
            # 打开logfile,并写入内容
            with open(logfile, 'a') as opened_file:
                # 现在将日志打到指定的logfile
                opened_file.write(log_string + '\n')
                return a_func(*args, **kwargs)
        return wrapTheFunction
    return mydecorator2

# func group1 
@ logit('out1.log')
def func1(str):
    print(str)
    pass
@ logit('out2.log')
def func2(): pass
            
func1('I have a foul smell')
func2()        

实现一个装饰器类(这样写可以简化装饰器函数,并且提高封装性)

# 带参数的装饰器(实现输出到自定义的日志文件)
from functools import wraps

def logit(logfile='out.log'):
    def mydecorator2(a_func):
        @wraps(a_func)
        def wrapTheFunction(*args, **kwargs):   # 这个保证了函数可以含有任意形参
            log_string = a_func.__name__ + " was called"
            print(log_string)
            # 打开logfile,并写入内容
            with open(logfile, 'a') as opened_file:
                # 现在将日志打到指定的logfile
                opened_file.write(log_string + '\n')
                return a_func(*args, **kwargs)
        return wrapTheFunction
    return mydecorator2

# func group1 
@ logit('out1.log')
def func1(str):
    print(str)
    pass
@ logit('out2.log')
def func2(): pass
            
func1('I have a foul smell')
func2()        
    

总结

到此这篇关于python中的迭代器,生成器与装饰器详解的文章就介绍到这了,更多相关Python迭代器,生成器与装饰器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: python中的迭代器,生成器与装饰器详解

本文链接: https://www.lsjlt.com/news/139662.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python中的迭代器,生成器与装饰器详解
    目录迭代器生成器装饰器总结迭代器 每一个可迭代类内部都要实现__iter__()方法,返回一个迭代类对象,迭代类对象则定义了这个可迭代类如何迭代。 for循环调用list本质上是是调...
    99+
    2022-11-13
  • python中的生成器、迭代器、装饰器详解
    一、装饰器 由于一个函数能实现一种功能,现在想要在不改变其代码的情况下,让这个函数进化一下,即能保持原来的功能,还能有新的"技能",怎么办? 现已经存在一个自定义...
    99+
    2022-11-11
  • python中的迭代器,生成器与装饰器怎么用
    这篇文章主要讲解了“python中的迭代器,生成器与装饰器怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python中的迭代器,生成器与装饰器怎么用”吧!迭代器每一个可迭代类内部都要实...
    99+
    2023-06-29
  • python-装饰器&生成器&迭代器&推
     一:普通装饰器 概念:在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能,为已存在的对象添加某个功能 普通装饰器编写的格式 def 外层函数(参数) def 内层函数(*args,**kwargs) ...
    99+
    2023-01-31
    生成器 迭代 python
  • python迭代器与生成器详解
    例子 老规矩,先上一个代码: def add(s, x): return s + x def gen(): for i in range(4): yield i base = gen() ...
    99+
    2022-06-04
    生成器 详解 迭代
  • 生成器,迭代器,装饰器
    生成器 (generator) 概念 在Python中, 一边循环一边计算的机制, 称为生成器: generator 创建生成器: G = ( x*2 for x in range(5)) 可以通过 next(生成器) 函数获得生成...
    99+
    2023-01-31
    生成器 迭代
  • Python3 迭代器,生成器,装饰器
    1.迭代器 迭代器有两个基本方法,iter()和next(),next()完成后会引发StopIteration异常 a='abcdef' b=iter(a) #创建迭代器对象 print(type(b)) while True: t...
    99+
    2023-01-30
    生成器 迭代
  • python3 迭代器、生成器、装饰器、
    本节内容迭代器&生成器装饰器Json & pickle 数据序列化软件目录结构规范作业:ATM项目开发 1.列表生成式迭代器&生成器列表生成式孩子我现在有个需求看列表[0, 1, 2, 3, 4, 5, 6, 7, ...
    99+
    2023-01-31
    生成器 迭代
  • python的迭代器,生成器和装饰器你了解吗
    python 迭代器与生成器,装饰器 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。 迭代器有两个基本的方法:iter() 和 next()。 字符串,列表或元组...
    99+
    2022-11-13
  • Python 中迭代器与生成器实例详解
    Python 中迭代器与生成器实例详解 本文通过针对不同应用场景及其解决方案的方式,总结了Python中迭代器与生成器的一些相关知识,具体如下: 1.手动遍历迭代器 应用场景:想遍历一个可迭代对象中的所...
    99+
    2022-06-04
    生成器 详解 实例
  • Python 迭代器与生成器实例详解
    Python 迭代器与生成器实例详解 一、如何实现可迭代对象和迭代器对象 1.由可迭代对象得到迭代器对象 例如l就是可迭代对象,iter(l)是迭代器对象 In [1]: l = [1,2,3,4] ...
    99+
    2022-06-04
    生成器 详解 实例
  • python三大器之迭代器、生成器、装饰器
    目录迭代器生成器装饰器(非常实用!)迭代器 聊迭代器前我们要先清楚迭代的概念:通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一次迭...
    99+
    2022-11-12
  • Python生成器与迭代器详情
    目录1、生成器 2、迭代器与可迭代的生成器1、生成器 现在可以通过生成器来直接创建一个列表,但是由于内存的限制,列表的容量肯定是有限的,如果我们需要一个包含几百个元素的列表,但是每...
    99+
    2022-11-12
  • python迭代器,生成器详解
    目录迭代器 生成器 总结迭代器 聊迭代器前我们要先清楚迭代的概念:通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一次迭代得到的结...
    99+
    2022-11-12
  • python中的生成器、迭代器、装饰器怎么使用
    本篇内容介绍了“python中的生成器、迭代器、装饰器怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、装饰器由于一个函数能实现一种...
    99+
    2023-07-02
  • Python迭代器与生成器
    生成器仅仅拥有生成某种东西的能力,如果不用__next__方法是获取不到值得。创建一个生成器函数>>> def scq(): ...    print("11") # 当函数代码块中遇到yield关键字的时候,这个函数就是...
    99+
    2023-01-31
    生成器 迭代 Python
  • Python元类与迭代器生成器案例详解
    1.__getattr__和__getattribute__魔法函数 __getattr__是当类调用一个不存在的属性时才会调用getattr魔法函数,他传入的值item就是你这个调...
    99+
    2022-11-12
  • Python学习之三大名器-装饰器、迭代器、生成器
    一、装饰器装饰,顾名思义就是在原来的基础上进行美化及完善,器这里指函数,所以说装饰器就是装饰函数,也就是在不改变原来函数的代码及调用方式的前提下对原函数进行功能上的完善。其核心原理其实是利用闭包。格式 @关键字+装饰函数被装饰函数()注意:...
    99+
    2023-06-02
  • JavaScript迭代器与生成器使用详解
    目录迭代器 (Iterator)Iterator工作原理自定义遍历数据生成器 (Generator)生成器参数传递使用生成器实现回调地狱功能生成器函数实例生成器—thro...
    99+
    2022-11-13
    JavaScript迭代器与生成器 JavaScript生成器 JavaScript迭代器
  • 详解Python中迭代器和生成器的原理与使用
    目录1.可迭代对象、迭代器1.1概念简介1.2可迭代对象1.3迭代器1.4区分可迭代对象和迭代器1.5可迭代对象和迭代器的关系1.6可迭代对象和迭代器的工作机制1.7自己动手创建可迭...
    99+
    2022-11-11
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作