python 装饰器,生成器,迭代器

时间:2022-03-16 11:31:17

装饰器

  • 作用:当我们想要增强原来已有函数的功能,但不想(无法)修改原函数,可以使用装饰器解决

  • 使用:

    • 先写一个装饰器,就是一个函数,该函数接受一个函数作为参数,返回一个闭包,而且闭包中执行传递进来的函数,闭包中可以在函数执行的前后添加一些内容。

    • 在需要装饰的函数前添加@装饰器名就可以使用了,如:

      @zhuangshiqi
      def show():
      pass
      • 再使用原函数时,就已经是装饰过的了

  • 示例1:无参无返回值

    def shuai(func):
       def wrapper():
           print('拉风的墨镜')
           func()
           print('脚穿大头鞋')
       return wrapper

    @shuai
    def mugai():
       print('木盖,屌丝一枚')

    mugai()
  • 示例2:带参函数的装饰器

    # 带参函数的装饰器
    def zhuangshiqi(func):
       def wrapper(*args, **kwargs):
           print('今天天气不错,出门就打到车了')
           func(*args, **kwargs)
       return wrapper

    @zhuangshiqi
    def test(n):
       print('我的幸运数字为:{}'.format(n))

    test(7)
  • 示例3:带参有返回值的装饰器

    def zhuangshiqi(func):
       def wrapper(*args, **kwargs):
           return func(*args, **kwargs) + 10
       return wrapper

    @zhuangshiqi
    def pingfang(n):
       return n*n

    print(pingfang(4))

生成器(generator)

  • 列表生成式,可以快速的生成列表

    # 数据量非常小,内存占用不大
    l = [i for i in range(10)]

    # 数据量特别大时,会造成内存占用突然增大
    l2 = [i for i in range(10000)]
  • 为了解决内存突然增大问题,python引入了生成器

  • 产生方式:

    • 将列表生成式的[]改为()

    # 数据量非常小,内存占用不大
    l = [i for i in range(10)]

    # 数据量特别大时,会造成内存占用突然增大
    # l2 = [i for i in range(10000)]
    # 生成器
    l2 = (i for i in range(2))

    print(type(l))
    print(type(l2))

    # 可以转换为列表
    # print(list(l2))

    # 使用next获取生成器中值,一次一个,遍历结束会报错StopIteration
    # print(next(l2))
    # print(next(l2))
    # print(next(l2))

    # 可以使用for-in遍历
    for i in l2:
       print(i)
    • 通过在函数中使用yield关键字

    def test(n):
       l = []
       for i in range(1, n+1):
           l.append(i)
       return l

    # print(test(5))

    def test2(n):
    for i in range(1, n+1):
        yield i t = test2(5)

    for j in t:
    print(j)
  • 特性:

    • 可以使用next获取数据,一次一个,结束时会报错

    • 只能遍历一遍

    • 可以转换为列表

    • 可以使用for-in遍历

迭代器(Iterator)

  • 定义:就是可以使用for-in进行遍历,并且可以使用next依次获取元素的对象

  • 说明:

    • 生成器就是一种特殊的迭代器

    • 判断是否是迭代器

    from collections import Iterator

    l = (i for i in range(10))
    print(isinstance(l, Iterator))
    • 字符串、列表、元组、集合、字典等都不是迭代器,他们都是可迭代对象。

可迭代对象

  • 定义:可以使用for-in遍历的对象,我们都称之为可迭代对象

  • 判断一个对象是否是可迭代对象

    from collections import Iterable
    print(isinstance(l, Iterable))
    print(isinstance(lt, Iterable))

iter函数

  • 作用:将可迭代对象转换为迭代器

  • 使用:

    lt2 = iter(lt)
    print(isinstance(lt2, Iterator))

python 装饰器,生成器,迭代器的更多相关文章

  1. Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle

    目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...

  2. Python装饰器、迭代器&生成器、re正则表达式、字符串格式化

    Python装饰器.迭代器&生成器.re正则表达式.字符串格式化 本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用 ...

  3. python装饰器、迭代器、生成器

    装饰器:为已存在的函数或者或者对象添加额外的功能 def wrapper(f): #装饰器函数,f是被装饰的函数 def inner(*args,**kwargs): '''在被装饰函数之前要做的事' ...

  4. 跟着ALEX 学python day4集合 装饰器 生成器 迭代器 json序列化

    文档内容学习于 http://www.cnblogs.com/xiaozhiqi/  装饰器 : 定义: 装饰器 本质是函数,功能是装饰其他函数,就是为其他函数添加附加功能. 原则: 1.不能修改被装 ...

  5. python三大器(装饰器/生成器/迭代器)

    1装饰器 1.1基本结构 def 外层函数(参数): def 内层函数(*args,**kwargs); return 参数(*args,**kwargs) return 内层函数 @外层函数 def ...

  6. python — 装饰器、迭代器

    目录 1 装饰器 2 迭代器 3 可迭代对象 1 装饰器 1.1目的.应用场景: 目的: 在不改变原函数内部代码的基础上,在函数执行前后自定义功能. 应用场景: 想要为函数扩展功能时,可以选择用装饰器 ...

  7. python第六章:三大利器(装饰器,迭代器,生成器)--小白博客

    python装饰器 什么是装饰器?在不修改源代码和调用方式的基础上给其增加新的功能,多个装饰器可以装饰在同一个函数上 # 原理(个人理解):将原函数(bar)的内存地址重新赋值,进行覆盖.新值为装饰器 ...

  8. Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器)

    Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器) 1.初始函数 2.函数嵌套及作用域 3.装饰器 4.迭代器和生成器 6.内置函数 7.递归函数 8.匿名函数

  9. Python之装饰器、迭代器和生成器

    在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器.迭代器和生成器理解进行解释. 为什么要使用装饰器 什么是装饰器?“装饰”从字面意思 ...

  10. python装饰器,迭代器,生成器,协程

    python装饰器[1] 首先先明白以下两点 #嵌套函数 def out1(): def inner1(): print(1234) inner1()#当没有加入inner时out()不会打印输出12 ...

随机推荐

  1. php面试题

    1.用PHP打印出前一天的时间格式是2006-5-10 22:21:21(2分) <?php date_default_timezone_set('Asia/shanghai'); echo d ...

  2. 数据结构之图 Part3 – 1 遍历

    DFS using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...

  3. awr报告生成方法

    以上是在linux的oracle的命令截图. 如果是在unix的命令,则需要在命令前面加上\符号,变成了\@$ORACLE_HOME/rdbms/admin/awrrpt.sql

  4. 【HDOJ】4333 Revolving Digits

    扩展KMP基础题目. /* 4333 */ #include <iostream> #include <sstream> #include <string> #in ...

  5. Ubuntu小技巧——怎样安装谷歌Chrome浏览器

    对于刚刚开始使用Ubuntu并想安装谷歌Chrome浏览器的新用户来说,本文所介绍的方法是最快捷的.在Ubuntu上安装谷歌Chrome的方法有很多.一些用户喜欢直接在谷歌Chrome下载页面获得 d ...

  6. 设计模式(七):Adapter 适配器模式 -- 结构型模式

    1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化.  例子1:iphone4,你即可以 ...

  7. JavaScript学习之自动轮播图片

    定时器 在实现轮播图之前需要首先了解一下JavaScript的定时器 setInterval()和clearInterval() 1.setInterval() 方法可按照指定的周期(以毫秒计)来调用 ...

  8. Jenkins 邮箱配置及问题解决

    Failed to send out e-mail javax.mail.MessagingException: Could not connect to SMTP host: smtp.rytong ...

  9. 【oracle】关于创建表时用default指定默认值的坑

    刚开始学create table的时候没注意,学到后面发现可以指定默认值.于是写了如下语句: 当我查询的时候发现,查出来的结果是这样的.. 很纳闷有没有,我明明指定默认值了呀,为什么创建出来的表还是空 ...

  10. Java学习个人备忘录之关键字static

    被static标记的东西会放在内存中被共享的,对象用到时,就会来取的. class Person { String name; //成员变量,实例变量 static String country = ...