python基础---->迭代器、生成器、装饰器

时间:2021-07-23 19:49:42

一、迭代器(iterator)

特点:

  • 迭代器是访问集合元素的一种方式,迭代器对象从集合的第一个元素开始访问,直到
    所有的元素被访问完结束。
  • 迭代器只能往前不会后退;
  • 不要求先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,在这之前或之后元素可以不存在或者被销毁;
  • 访问者不需要关心迭代器内部的结构,仅需通过 .__next__()方法不断去取下一个内容,通过 .__iter__() 返回迭代器自身
  • 不能随机访问集合中的某个值 ,只能从头到尾依次访问;

实例

>>> city = ['wuhan','shenzhen','chongqing','huanggang']
>>> city 
<list_iterator object at 0x101402630>
>>> city .__next__()  #方法一:使用next方法来使用迭代器
'wuhan'
>>> city .__next__()
'shenzhen'
>>> city .__next__()
'chongqing'
>>> city .__next__()
'huanggang'
>>> city .__next__()   # 如果容器中没有更多元素了,则抛出StopIteration异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration


# 方法二:使用for循环来使用迭代器
it = iter(city)
for x in it:
    print(x)

二、生成器(generator)

定义:

一个包含了yield关键字的函数就是一个生成器,该函数也叫生成器函数。当生成器函数被调用时,在函数体中的代码不会被执行,而会返回一个迭代器。每次请求一个值,就会执行生成器中代码,直到遇到一个yield表达式或return语句。yield表达式表示要生成一个值,return语句表示要停止生成器。换句话说,生成器是由两部分组成,生成器的函数和生成器的迭代器。生成器的函数是用def语句定义的,包含yield部分;生成器的迭代器是这个函数返回的部分。二者合起来叫做生成器。

实例一:

a = [i*i for i in range(1,10)]
print(a)

# 结果:[1, 4, 9, 16, 25, 36, 49, 64, 81]

实例二:利用生成器自定义range

def drange(num):
    temp = -1
    while True:
        temp = temp + 1
        if temp >= num:
            return
        else:
            yield temp

三、装饰器

特点:

  • 不能修改被装饰的函数的源代码
  • 不能修改被装饰的函数的调用方式
  • 满足上面的两种情况下给程序增添功能

实例一:一个简单装饰器实现计算函数运行的时间

# -*- coding:utf-8 -*-
# @Author  : Clint
# @File    : calculate_time.py
import time


def cal_time(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        x = func(*args, **kwargs)
        end_time = time.time()
        print(func.__name__+"的time cost:", end_time-start_time)
        return x
    return wrapper


@cal_time    #语法糖  test=timer(test)
def test_func(): 
time.sleep(
3)
print("fun_test...") # 结果 test_func的time cost:3.000171661376953

实例一:装饰有参函数

import time

def timer(func):
    def deco(*args,**kwargs):
        start_time = time.time()
        func(*args,**kwargs)
        stop_time = time.time()
        print(stop_time-start_time)
    return deco

@timer
def test(parameter):
    time.sleep(3)
    print("test is running")
test("添加参数")