我的编程空间,编程开发者的网络收藏夹
学习永远不晚

生成器,迭代器,装饰器

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

生成器,迭代器,装饰器

生成器 (generator)

  • 概念

    • 在Python中, 一边循环一边计算的机制, 称为生成器: generator 创建生成器: G = ( x*2 for x in range(5)) 可以通过 next(生成器) 函数获得生成器的下一个返回值 没有更多的元素时, 抛出 StopIteration 的异常 生成器也可以使for 循环,因为生成器也是可迭代对象
  • 生成器的生成方式1:

    list2 = [x for x in range(10)]
    print(type(list2))
    # 得到一个生成器对象
    g = (x*2 for x in range(10))
    print(type(g))
    # 打印生成器生成的第一个数字
    print(next(g))
    print(next(g))
    print(next(g))
    一共10个数字,打印超出报StopIteration异常
    
    • 应用: 求斐波那契数列的第n个数
    def fibo(n):
    a,b=1,1
    i = 3
    while i <= n:
        if i == 1 or i == 2:
            return 1
        else:
            a,b = b,a+b
            i += 1
    else:
        print(b)

     

  • 生成器的生成方式2(包含yield关键字的函数):

    def getNum():
         for i in range(10):
            yield i

     

  • 生成器中元素的访问方式:

    • 1.next()
    • 2.g.__next()
    • 3.g.send('发送的参数')
    def gen():
        print('a')
        count = yield 1
        print ('--->',count)
        print ('b')
        yield 2
    #注意打印结果
    g = gen()
    next(g)
    g.send('123')
    next(g)

     

  • 其他使用场景:(携程,实现两个任务的交替调用)

def save():
    while True:
        yield
        print ('save')
def draw():
    while True:
        yield
        print ('draw')

g1 = save()
g2 = draw()
while True:
    next(g1)
    next(g2)

 

迭代器 (Iterator)

  • 概念: 拥有__iter__方法和__next__方法的对象就是迭代器
    • 迭代
      • 迭代是访问集合元素的一种方式,可以将某个数据集内的数据“一个挨着一个的取出来”,就叫做迭代
    • 可迭代协议
      • 协议就是互相规定好的。可迭代协议的定义非常简单,就是内部实现了 __iter__方法。
    • 迭代器协议
      • 迭代器协议:必须拥有__iter__方法和__next__方法
    • 可以通过dir(对象)查看是否实现了__iter__,__next__等方法来判断对象是否为迭代器
    • 也可以使用 isinstance(Iterator)来判断
    • 练习:
      • 查看__iter__()的返回值
      • 查看__iter__()包含的方法
      • 分别查看迭代器与列表的方法
  • for循环的本质
    • 通过__iter__()获取该对象的一个迭代器对象
    • 通过__next__()函数,依次获取下一个元素

闭包

  • 什么是闭包?
    • 在 python 中创建一个闭包一般有 3 个要求:
      • 1.闭包函数必须有内嵌函数。
      • 2.内嵌函数必须要引用外层函数的变量。
      • 3.闭包函数返回内嵌函数的地址(函数名称)
  • 创建一个闭包函数:
def funcOut():
    name = 'Jery'
    def funcIn():
        print(name)
    return funcIn
f = funcOut()
f()

 

  • 判断是否为闭包函数
def funcOut():
    name = 'abc'
    def funcIn():
        print(name)
        pass
    #如果打印None,则不是闭包函数
    print(funcIn.__closure__)
    return funcIn
f=funcOut()
f()

 

装饰器

  • 装饰器的本质:(闭包函数)
  • 装饰器的作用:
    • 在不修改原函数及其调用方式的情况下对原函数功能进行扩展
  • 装饰器的使用:
    • 需求:为现有功能fun1增加日志功能
    • 传统方案解决
    • 使用闭包解决
    def outfunc(func):
        def infunc():
            writeLog()
            func()
        return infunc
    def fun1():
        print("使用功能1")
    def fun2():
        print("使用功能2")
    
    # 注意名字的问题,需要分析
    fun1 = outfunc(fun1)
    # 装饰器(闭包)
    fun1()
    使用装饰器(语法糖)解决
    def outfunc(func):
        def infunc():
            writeLog()
            func()
        return infunc
    @outfunc
    def fun1():
        print("使用功能1")
    @outfunc
    def fun2():
        print("使用功能2")
    
    fun1()
    fun2()

     

  • 多个装饰器的使用
def add1(fc):
    print("add1正在装饰")
    def wrapped():
        return "《"+fc()+"》"
    return wrapped
def add2(fc):
    print("add2正在装饰")
    def wrapped():
        return '*'+fc()+'*'
    return wrapped
#看到这个,开始进行装饰,而不是等到调用时
@add1
@add2
def test1():
    return '金陵十三钗'
print(test1())

 

  • 对有参数的函数进行装饰
def func(fn):
    print("func")
    def func_in(aa, bb):
        print("func_in1")
        fn(aa,bb)
        print("func_in2")
    return func_in
@func
def test(a, b):
    print("a=%d,b=%d" % (a, b))
# 装饰器装饰之后,这不是直接调用test方法,而是调用func_in方法
test(1,2)

 

  • 通用装饰器的使用
def func(fn):
    # 需要有参数,*args,**kwargs
    def func_in(*args,**kwargs):
        print("记录日志")
        print('访问方法:'+fn.__name__)
        # 需要有参数,*args,**kwargs
        xx = fn(*args,**kwargs)
        # 需要有返回值
        return xx
    return func_in

 



# 待装饰函数:无参数,无返回值
@func
def test1():
    print("test1")
test1()
@func
def test2():
    return "Hello"
print(test2())
@func
def test3(a):
    print('a=%d'%a)
test3(1)

 

类方法静态方法

  • 静态方法:
    • 1.格式:在方法上面添加 @staticmethod
    • 2.参数:静态方法可以有参数也可以无参数
    • 3.应用场景:一般用于和类对象以及实例对象无关的代码。
    • 4.使用方式: 类名.类方法名(或者对象名.类方法名)
    • 使用示例: 比如:学生管理系统的展示主菜单
  • 类方法:
    • 无需实例化,可以通过类直接调用的方法,但是方法的第一个参数接收的一定是类本身
    • 1.在方法上面添加@classmethod
    • 2.方法的参数为 cls 也可以是其他名称,但是一般默认为 cls
    • 3.cls 指向 类对象(也就是 Goods)
    • 4.应用场景:当一个方法中只涉及到静态属性的时候可以使用类方法(类方法用来修改类属 性)。
    • 5.使用 可以是 对象名.类方法名。或者是 类名.类方法名
    • 使用示例:
      • 修改所有商品的折扣
      class Goods():
      discount = 1
      def __init__(self,price,name):
          self.name = name
          self.price = price
      def price_discount(self):
          return self.price * Goods.discount
      @classmethod
      def change_discount(cls,new_discount):
          cls.discount = new_discount

       

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

生成器,迭代器,装饰器

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

下载Word文档

猜你喜欢

生成器,迭代器,装饰器

生成器 (generator)概念在Python中, 一边循环一边计算的机制, 称为生成器: generator 创建生成器: G = ( x*2 for x in range(5)) 可以通过 next(生成器) 函数获得生成器的下一个返
2023-01-31

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

1.迭代器迭代器有两个基本方法,iter()和next(),next()完成后会引发StopIteration异常a='abcdef'b=iter(a)#创建迭代器对象print(type(b))while True:try:print(n
2023-01-30

python3 迭代器、生成器、装饰器、

本节内容迭代器&生成器装饰器Json & pickle 数据序列化软件目录结构规范作业:ATM项目开发 1.列表生成式迭代器&生成器列表生成式孩子我现在有个需求看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],我要求你把列
2023-01-31

python-装饰器&生成器&迭代器&推

一:普通装饰器概念:在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能,为已存在的对象添加某个功能普通装饰器编写的格式def 外层函数(参数) def 内层函数(*args,**kwargs) #函数
2023-01-31

带参装饰器,迭代器,生成器,枚举对象

一,复习'''函数的嵌套定义:在函数内部定义另一个函数闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变装饰器:装饰器名就是外层函数 @out
2023-01-31

python中的迭代器,生成器与装饰器怎么用

这篇文章主要讲解了“python中的迭代器,生成器与装饰器怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python中的迭代器,生成器与装饰器怎么用”吧!迭代器每一个可迭代类内部都要实
2023-06-29

python中的生成器、迭代器、装饰器怎么使用

本篇内容介绍了“python中的生成器、迭代器、装饰器怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、装饰器由于一个函数能实现一种
2023-07-02

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

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

python3--迭代器,生成器

一 迭代器1 什么是可迭代对象?字符串,列表,元组,字典,集合都可以被for循环,说明他们都是可迭代的怎么来证明这一点呢?注释:type只能判断是什么类型isintance判断方面更广,不仅能判断类型,还能判断是否可迭代Iterable是否
2023-01-30

python 生成器&迭代器

一、生成器1、列表生成器:列表生成式就像是一个厨师,他只会做这n(n为任意整数)道菜,想吃甚麽做甚麽,不吃不做,不浪费空间;而列表表达式就相当于已经做好的n盘菜,占用空间。2、生成器的创建方法:s = (x*2 for x in range
2023-01-30

迭代器与生成器

这一部分待加强!                (一)迭代器    一:简介    迭代是Python最强大的功能之一,是访问集合元素的一种方式。    迭代器是一个可以记住遍历的位置的对象。    迭代器对象从集合的第一个元素开始访问,直
2023-01-30

python迭代器和生成器

1.经典迭代器import reRE_WORD = re.compile('\w+')class Sentence: def __init__(self, text): self.text = text s
2023-01-30

Python迭代器与生成器

生成器仅仅拥有生成某种东西的能力,如果不用__next__方法是获取不到值得。创建一个生成器函数>>> def scq():...    print("11")# 当函数代码块中遇到yield关键字的时候,这个函数就是一个生成器函数... 
2023-01-31

python3.7 迭代器和生成器

#!/usr/bin/env python__author__ = "lrtao2010"#python3.7 迭代器和生成器#迭代器协议:'''1、迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起
2023-01-30

Python3 迭代器与生成器

Edit笔记内容:Python3 迭代器与生成器 笔记日期:2017-10-28迭代器迭代是Python最强大的功能之一,是访问集合元素的一种方式。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元
2023-01-31

python3迭代器和生成器

迭代对象:在我看来就是可以用for循环依次取值的一个序列就叫可迭代对象迭代器:就是可以用next()来进行取值的对象生成器:我的理解就是在迭代器的基础上给了与暂停功能的函数生成器其实就是一种特殊的迭代器。它使一种更为高级、更为优雅的迭代器。
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录