广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python学习之三大名器-装饰器、迭代器、生成器
  • 385
分享到

Python学习之三大名器-装饰器、迭代器、生成器

2023-06-02 03:06:31 385人浏览 独家记忆

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

摘要

一、装饰器装饰,顾名思义就是在原来的基础上进行美化及完善,器这里指函数,所以说装饰器就是装饰函数,也就是在不改变原来函数的代码及调用方式的前提下对原函数进行功能上的完善。其核心原理其实是利用闭包。格式 @关键字+装饰函数被装饰函数()注意:

一、装饰器

装饰,顾名思义就是在原来的基础上进行美化及完善,器这里指函数,所以说装饰器就是装饰函数,也就是在不改变原来函数的代码及调用方式的前提下对原函数进行功能上的完善。其核心原理其实是利用闭包。

格式 @关键字+装饰函数

被装饰函数()

注意:@行必须顶头写而且是在被装饰函数的正上方

按照形式可以分为:无参装饰器和有参装饰器,有参装饰器即给装饰器加上参数

以下示例是一个无参装饰器,为原函数添加了统计运行时间的功能

import time#定义装饰器 def timer(func):    def wrapper(*args,**kwargs):        start_time = time.time()        res = func(*args,**kwargs)        stop_time = time.time()        print("run time is %s" %(stop_time-start_time))        return res    return wrapper#调用装饰器@timerdef index():    l = []    for i in range(10000000):        l.append(i)#调用阶段 index()

以下是一个有参装饰器,实现简单的认证功能,#数字表示程序依次执行顺序

def auth3(auth_type): #1 #3    def auth(func): #4 #6        def wrapper(*args,**kwargs): #7 #10            if auth_type == 'file': #11                name=input('username: ')                passWord=input('password: ')                if name == 'zhejiangF4' and password == '666':                    print('auth successfull')                    res=func(*args,**kwargs)                    return res                else:                    print('auth error')            elif auth_type == 'sql': #12                print('nothing!') #13        return wrapper #8    return auth #5@auth3(auth_type='sql') #2def index():    print('welcome to inex page') index() #9

二、迭代器

迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址**。———百度百科**

可迭代的:只要对象本身有iter方法,那它就是可迭代的

执行对象下的iter方法,得到的结果就是迭代器如果你依然在编程的世界里迷茫,不知道自己的未来规划可以加入我们的Python秋秋裙去784掉758文214字看看前辈们如何学习的!交流经验!自己是一名高级python开发工程师,从基础的python脚本到web开发、爬虫、django、数据挖掘等,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!分享一些学习的方法和需要注意的小细节

为什么要用迭代器:
优点
1:迭代器提供了一种不依赖于索引的取值方式,这样就可以遍历那些没有索 引的可迭代对象了(字典,集合,文件)
2:迭代器与列表比较,迭代器是惰性计算的,更节省内存

    **缺点:1:无法获取迭代器的长度,使用不如列表索引取值灵活2**:**一次性的,只能往后取值,不能倒着取值**

查看s对象是否是迭代器:print(isinstance(s,Iterator)) 返回True就是迭代器

from collections import Iterable,Iterators='hello'l=[1,2,3]t=(1,2,3)d={'a':1}set1={1,2,3,4}f=open('a.txt')
s.__iter__()l.__iter__() t.__iter__()d.__iter__()set1.__iter__()f.__iter__()print(isinstance(s,Iterable))print(isinstance(l,Iterable))print(isinstance(t,Iterable))print(isinstance(d,Iterable))print(isinstance(set1,Iterable))print(isinstance(f,Iterable))print(isinstance(s,Iterator))print(isinstance(l,Iterator))print(isinstance(t,Iterator))print(isinstance(d,Iterator))print(isinstance(set1,Iterator))print(isinstance(f,Iterator))

运行结果如下:

Python学习之三大名器-装饰器、迭代器、生成器

可以看出,字符串、列表、字典、集合、元组、文件都是可迭代的,但是只有文件是迭代器

三、生成器

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

函数中包含yield语句的我们称其为生成器函数

yield与return有何区别?
return只能返回一次函数就彻底结束了,而yield能返回多次值
yield到底干了什么事情:
yield把函数变成生成器(生成器就是迭代器)
函数在暂停以及继续下一次运行时的状态是由yield保存

下例是两个生成器的应用,一个用来不断的输入url,不断的解析,另外一个则模仿Linux中的管道命令(实质是将一个函数的运行结果传给下一个函数做处理,实现的比较简单粗暴,多包涵,哈哈)

例1:

from urllib.request import urlopendef get(url):    while True:        def index():            return urlopen(url).read()        url = yield index()g = get('Http://www.baidu.com')next(g)def run():    while True:        url = input("请输入URL:")        if 'http://' not in url:            print(g.send('http://'+url))        else:            print(g.send(url))run()

例2:

def cat(filename):    with open(filename,'r') as f:        while True:            line = f.readline()            if not line:                break            else:                yield linedef grep(string,lines):    for line in lines:        if string in line:            yield lineg1 = cat('a.txt')g2 = grep('Mac',g1)if __name__ == '__main__':    m = input("请输入命令:").strip()    if m == "cat a.txt |grep mac":        for i in g2:            print(i)

补充:协程

如果在一个函数内部yield的使用方式是表达式形式的话,如x=yield,那么该函数成为协程函数

直接看例子吧

def hello(func):    def wrapper(*args,**kwargs):        res = func(*args,**kwargs)        next(res)        return res    return wrapper@hellodef eater(name):    print('%s start to eat food' %name)    food_list=[]    while True:        food=yield food_list        print('%s get %s ,to start eat' %(name,food))        food_list.append(food)    print('done')e=eater("somebody")print(e.send('巧克力'))print(e.send("香蕉"))

--结束END--

本文标题: Python学习之三大名器-装饰器、迭代器、生成器

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

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

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

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

下载Word文档
猜你喜欢
  • Python学习之三大名器-装饰器、迭代器、生成器
    一、装饰器装饰,顾名思义就是在原来的基础上进行美化及完善,器这里指函数,所以说装饰器就是装饰函数,也就是在不改变原来函数的代码及调用方式的前提下对原函数进行功能上的完善。其核心原理其实是利用闭包。格式 @关键字+装饰函数被装饰函数()注意:...
    99+
    2023-06-02
  • python三大器之迭代器、生成器、装饰器
    目录迭代器生成器装饰器(非常实用!)迭代器 聊迭代器前我们要先清楚迭代的概念:通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一次迭...
    99+
    2022-11-12
  • Python学习之迭代器和生成器
    迭代器 在Python如果一个对象可被循环(遍历)该对象中每一个元素的过程叫做迭代。例如 ,字典、字符串、列表、元祖、集合等。他们可被迭代的原因是,都有一个共同的内置函数__iter__。通过执行内置对象的__next__函数,可以依次打...
    99+
    2023-01-30
    生成器 迭代 Python
  • python学习之可迭代对象、迭代器、生成器
    Iterable – 可迭代对象 能够逐一返回其成员项的对象。 可迭代对象的例子包括所有序列类型 (例如 list, str 和 tuple) 以及某些非序列类型例如 dict, 文...
    99+
    2022-11-12
  • Python学习 :迭代器&生成器
    列表生成式 列表生成式的操作顺序: 1、先依次来读取元素 for x 2、对元素进行操作 x*x 3、赋予变量 Eg.列表生成式方式一 a = [x*x for x in range(10)] print(a) >>&g...
    99+
    2023-01-30
    生成器 迭代 Python
  • python-装饰器&生成器&迭代器&推
     一:普通装饰器 概念:在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能,为已存在的对象添加某个功能 普通装饰器编写的格式 def 外层函数(参数) def 内层函数(*args,**kwargs) ...
    99+
    2023-01-31
    生成器 迭代 python
  • 生成器,迭代器,装饰器
    生成器 (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中的生成器、迭代器、装饰器详解
    一、装饰器 由于一个函数能实现一种功能,现在想要在不改变其代码的情况下,让这个函数进化一下,即能保持原来的功能,还能有新的"技能",怎么办? 现已经存在一个自定义...
    99+
    2022-11-11
  • python中的迭代器,生成器与装饰器详解
    目录迭代器生成器装饰器总结迭代器 每一个可迭代类内部都要实现__iter__()方法,返回一个迭代类对象,迭代类对象则定义了这个可迭代类如何迭代。 for循环调用list本质上是是调...
    99+
    2022-11-13
  • python的迭代器,生成器和装饰器你了解吗
    python 迭代器与生成器,装饰器 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。 迭代器有两个基本的方法:iter() 和 next()。 字符串,列表或元组...
    99+
    2022-11-13
  • python中的迭代器,生成器与装饰器怎么用
    这篇文章主要讲解了“python中的迭代器,生成器与装饰器怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python中的迭代器,生成器与装饰器怎么用”吧!迭代器每一个可迭代类内部都要实...
    99+
    2023-06-29
  • python中的生成器、迭代器、装饰器怎么使用
    本篇内容介绍了“python中的生成器、迭代器、装饰器怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、装饰器由于一个函数能实现一种...
    99+
    2023-07-02
  • python三大器之装饰器详解
    目录装饰器总结装饰器 讲装饰器之前要先了解两个概念: 对象引用 :对象名仅仅只是个绑定内存地址的变量 def func(): # 函数名仅仅只是个绑定内存地址的...
    99+
    2022-11-12
  • 带参装饰器,迭代器,生成器,枚举对象
    一,复习 ''' 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 装饰器:装饰器...
    99+
    2023-01-31
    生成器 对象 迭代
  • Python学习之迭代器详解
    目录什么是迭代器如何生成迭代器迭代器函数 - iter() 函数 与 next() 函数可迭代的对象生成迭代器迭代器的用法 - 演示案例什么是迭代器 迭代是 python 中访问集合...
    99+
    2022-11-13
  • Python学习之装饰器与类的装饰器详解
    目录装饰器装饰器的定义装饰器的用法类中的装饰器类的装饰器 - classmethod类的装饰器 - staticmethod类的装饰器 - property通过学习装饰器可以让我们更...
    99+
    2022-11-13
  • python基础之迭代器与生成器
    目录1. 迭代器1.1 迭代器的使用1.2 创建类的迭代器2. 生成器2.1 生成器的使用2.2 生成器表达式总结 1. 迭代器 1.1 迭代器的使用 迭代器对象从集合的第一个元素开...
    99+
    2022-11-12
  • python学习系列之python装饰器
    一、常规的装饰器,比如 @auth,执行2步操作:1、执行auth函数,并传参func进来2、获取返回值,并赋值给被装饰器的函数的函数名(如让fetch_server_list等于返回值)二、而带参数的装饰器,比如 @auth(before...
    99+
    2023-01-31
    系列之 python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作