python学习七(基础知识)

python基础学习七


本章内容

  1. 装饰器
  2. 生成器
  3. 迭代器

1.装饰器

 装饰器 decorator

或者称为包装器,是对函数的一种包装。

它能使函数的功能得到扩充,而同时不用修改函数本身的代码。

它能够增加函数执行前、执行后的行为,而不需对调用函数的代码做任何改变

def showtime(f):
    def inner():
        start = time.time()
        f()
        end = time.time()
        print("spend %s" % (end - start))
    return inner

@showtime #bar=showtime(bar)
def bar():
    print('bar....')
    time.sleep(3)
bar()

#结果

  bar....
  spend 3.000171661376953

 

import time

def showtime(f):
    def inner(x,y):
        start = time.time()
        f(x,y)
        end = time.time()
        print("spend %s" % (end - start))
    return inner

@showtime #add=showtime(add)
def add(a,b):
    print(a+b)
    time.sleep(1)

add(1,2)

#结果
3
spend 1.0000572204589844
import time

def showtime(f):
    def inner(*x,**y):
        start = time.time()
        f(*x,**y)
        end = time.time()
        print("spend %s" % (end - start))
    return inner

@showtime #bar=showtime(bar)
def add1(*a,**b):
    sums = 0
    for i in a:
        sums += i
    print(sums)
    time.sleep(2)

add1(1,2,5,7,9)
#结果

  24
  spend 2.0001144409179688

import time

#装饰器参数
def logger(flag=''):
    def showtime(f):
        def inner(*x, **y):
            start = time.time()
            f(*x, **y)
            end = time.time()
            print("spend %s" % (end - start))
            if flag == "true":
                print("日志记录")
        return inner
    return showtime

@logger("true")#showtime
def add1(*a,**b):
    sums = 0
    for i in a:
        sums += i
    print(sums)
    time.sleep(2)

add1(1,2,5,7,9)
#结果

  24
  spend 2.0001144409179688
  日志记录

2.生成器

 在 Python 中,使用了 yield 的函数被称为生成器(generator)

生成器都是迭代器,迭代器不一定是生成器

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。

def f():
    print("ok")
    yield 1

    print("ok")
    yield 2

    return None

g = f()
print(g) #<generator object f at 0x0000000001E4F5E8>
next(g)
next(g)
next(g) #报StopIteration

使用 yield 实现斐波那契数列:

import sys

def fib(max):
    n,a,b = 0,0,1

    while n < max:
        yield  a
        a,b = b,a+b
        n += 1

f = fib(7) #f 是一个迭代器,由生成器返回生成
print(f) #<generator object fib at 0x0000000001D125E8>
while True:  #0 1 1 2 3 5 8
    try:
        print(next(f),end=" ")
    except StopIteration:
        sys.exit()

 

3.迭代器

 代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束,而在一系列结果的末尾时,会引发StopIteration错误。迭代器只能往前不会后退。

迭代器有两个基本的方法:iter() 和 next()

可以直接作用于for循环的对象统称为可迭代对象:

一类是集合数据类型,如list、tuple、dict、set、str等

一类是generator,包括生成器和带yield的generator function。

l=[1,2,3,5]
d = iter(l) # 创建迭代器对象
print(d) #<list_iterator object at 0x0000000001D969B0>

print(next(d)) # 输出迭代器的下一个元素
print(next(d))
print(next(d))
print(next(d))
print(next(d)) #报StopIteration
View Code

 自定义迭代器

把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__():

__iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。

__next__() 方法(Python 2 里是 next())会返回下一个迭代器对象。

class MyNum:
    def __iter__(self):
        self.a = 1
        return self

    def __next__(self):
        if self.a <= 20:
            x = self.a
            self.a += 1
            return x
        else:
            raise StopIteration
mynum = MyNum()
itr = iter(mynum)

for x in itr:
    print(x)

 

posted @ 2019-07-30 11:12  hzw2019  阅读(34)  评论(0)    收藏  举报