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

    目录

    1. 装饰器

    2. 生成器

    3. 迭代器

    1. 装饰器

      什么是装饰器?

        装饰器本质是函数,用来给其他函数添加新的功能

        特点:不修改调用方式、不修改源代码

      装饰器的应用场景? 

        用户认证,判断用户是否登录

        计算函数运行时间(算是一个功能、在项目里用的不多)

        插入日志的时候

        redis缓存

      为什么使用装饰器?

        结合应用场景说需求

        比如提高代码复用性,节省内存空间

      如何使用装饰器?

        装饰器求函数运行时间

     1 import time
     2 def timer(func):   #timer(test1)  func=test1
     3     def deco(*args,**kwargs):
     4         start_time = time.time()
     5         func(*args,**kwargs)      #run test1
     6         stop_time = time.time()
     7         print("running time is %s"%(stop_time-start_time))
     8     return deco
     9 
    10 # @timer     # test1=timer(test1)
    11 def test1():
    12     time.sleep(3)
    13     print("in the test1")
    14 test1()

        三级装饰器

     1 #! /usr/bin/env python
     2 # -*- coding: utf-8 -*-
     3 import time
     4 def auth(auth_type):
     5     print("auth func:",auth_type)
     6     def outer_wrapper(func):
     7         def wrapper(*args, **kwargs):
     8             print("wrapper func args:", *args, **kwargs)
     9             print('运行前')
    10             func(*args, **kwargs)
    11             print('运行后')
    12         return wrapper
    13     return outer_wrapper
    14 
    15 @auth(auth_type="local") # home = wrapper()
    16 def home():
    17     print("welcome to home  page")
    18     return "from home"
    19 home()

    2. 生成器

      什么是生成器?

        生成器就是一个特殊的迭代器

        一个有yield关键字的函数就是一个生成器

          生成器,是这样一个函数,它记住上一次返回时在函数体中的位置。

          对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。

      生成器哪些场景应用?

        生成器是一个概念,我们平常写代码可能用的并不多,但是python源码大量使用

        比如我们tornado框架就是基于 生成器+协程

        在我们代码中使用举例

        比如我们要生成一百万个数据,如果用生成器非常节省空间,用列表浪费大量空间

    1 import time
    2 t1 = time.time()
    3 g = (i for i in range(100000000))
    4 t2 = time.time()
    5 lst = [i for i in range(100000000)]
    6 t3 = time.time()
    7 print('生成器时间:',t2 - t1)  # 生成器时间: 0.0
    8 print('列表时间:',t3 - t2)    # 列表时间: 5.821957349777222

      为什么使用生成器

        节省空间

        高效

      如何使用?

     1 #!/usr/bin/python
     2 # -*- coding: utf-8 -*-
     3 def read_big_file_v(fname):
     4     block_size = 1024 * 8
     5     with open(fname,encoding="utf8") as fp:
     6         while True:
     7             chunk = fp.read(block_size)
     8             # 当文件没有更多内容时,read 调用将会返回空字符串 ''
     9             if not chunk:
    10                 break
    11             print(chunk)
    12 path = r'C:aaalutingedc-backend	ttt.py'
    13 read_big_file_v(path)

    3. 迭代器

      什么是迭代器?

        迭代器是访问集合内元素的一种方法

          总是从集合内第一个元素访问,直到所有元素都被访问过结束,当调用 __next__而元素返回会引发一个,StopIteration异常
        有两个方法:_iter_ _next_

          _iter_ : 返回迭代器自身

          _next_: 返回下一个元素

      应用场景

        一些可以直接利用的迭代器

    1 无线迭代器生产:
    2     无线迭代器------> from itertools import count(接受俩个参数起点和步长)
    3     每次调用count都是2从1递增,将所有的基数打印出来,如果说你的内存足够大的话,可以无限迭代下去(可以使用for循环或者next测试),这里推荐使用next,因为它比较直观。

        手机号(count)

         cycle(塞口),每次调用都会字符串下一个值创建出来,而创建完最后一个,他会返回到开头,像一个圈状的数据类型不停去创建一个新的值

       有限迭代器

    1 iter()
    2 from itertools import islice
    3 islice(iterable,stop) 接受参数(可迭代对象,终点值)
    4 islice(iterable,start,stop[,step]) 接受参数(可迭代对象,索引,也可以加步长)

      基于可迭代对象创建 iter()

       使用islice方法

       自定义迭代器(斐波那契数列)

  • 相关阅读:
    【Educational Codeforces Round 101 (Rated for Div. 2) C】Building a Fence
    【Codeforces Round #698 (Div. 2) C】Nezzar and Symmetric Array
    【Codeforces Round #696 (Div. 2) D】Cleaning
    【Codeforces Round #696 (Div. 2) C】Array Destruction
    【Educational Codeforces Round 102 D】Program
    【Educational Codeforces Round 102 C】No More Inversions
    【Good Bye 2020 G】Song of the Sirens
    【Good Bye 2020 F】Euclid's nightmare
    使用mobx入门
    requestAnimationFrame 控制速度模拟setinterval
  • 原文地址:https://www.cnblogs.com/xinzaiyuan/p/12665090.html
Copyright © 2011-2022 走看看