zoukankan      html  css  js  c++  java
  • python 装饰器,生成器,迭代器

    装饰器

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

    • 使用:

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

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


        @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))
  • 相关阅读:
    【学习笔记/题解】树上启发式合并/CF600E Lomsat gelral
    【学习笔记/题解】虚树/[SDOI2011]消耗战
    【题解】 [GZOI2017]小z玩游戏
    【题解】CF1426E Rock, Paper, Scissors
    【题解】CF1426D Non-zero Segments
    【题解】NOIP2018 填数游戏
    【题解】NOIP2018 旅行
    【题解】NOIP2018 赛道修建
    【题解】时间复杂度
    【题解】「MCOI-02」Convex Hull 凸包
  • 原文地址:https://www.cnblogs.com/kiki5881/p/8550047.html
Copyright © 2011-2022 走看看