新手小白 python之路 Day6 (装饰器、生成器、迭代器)

简单的整理了下装饰器、生成器、迭代器

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: linghanchujian

import time

# 装饰器
def fun(function):
    def funs(*args,**kwargs):
        Start_Time = time.time()
        res=function(*args,*kwargs)
        End_Time = time.time()
        print("run fun time is %s"%(End_Time-Start_Time))
        return res
    return funs
    pass

def func():
    time.sleep(0.5)
    print("the is func!!")
    pass

@fun # 相当于  func1 = fun(func1)
def func1(name):
    func()
    time.sleep(0.5)
    print("the is func1!!",name)
    return 100
    pass

print(func1("Linghanchujian")) #实际上执行的是funs()这个函数

# 装饰器

def func3(isFunc):
    def func4(Func):
        def func5(*args,**kwargs):
            if isFunc:
                print("isFunc is True!!")
                res = Func(*args, **kwargs)
            else:
                print("isFunc is False!!")
                res = Func(*args, **kwargs)
            return res
            pass
        return func5
        pass
    return func4
    pass

@func3(isFunc=True)
def func(Name):
    print("the is func!! My name is %s"%Name)
    pass

@func3(isFunc=False)
def func1(Name,age):
    print("the is func1!! My name is %s and age is %s"%(Name,age))
    pass

func("Linghanchujian")
func1("Linghanchujian",22)

# 列表生成器
array = [i*2 for i in range(10)]  # 会一次性生成所有列表数据 可以通过 array[i] 来取值
print(array[8])
array1 = (i*2 for i in range(10)) # 不会生成数据,只会创建地址保存算式 可以通过 __next__() 一个个取值 但是一般是用 for in
for j,k in enumerate(array1):
    if j==8:
        print(k)
        break

 # 直接打印
def SeriseOne(Max):
    i,a,b,c = 0,0,1,0
    while i<Max:
        print(b)
        c = a
        a = b
        b = c+a
        i += 1
    pass
SeriseOne(10)
 # 函数生成器
def SeriseTwo(Max):
    i,a,b = 0,0,1
    while i<Max:
        yield b
        a,b = b,a+b
        i += 1
    return "明天会更好"
    pass

print(SeriseTwo(100))
Serise = SeriseTwo(10)
while True:
    try:
        print(Serise.__next__())
    except StopIteration as e:
        print("SeriseTwo 的返回值: %s"%e.value)
        break

# 携程 (生成器并行效果)
# 消费者
def comsume(name):
    print("%s 准备吃霸王餐!!!"%name)
    while True:
        res = yield
        print("霸王餐[%s]被[%s]吃了"%(res,name))
    pass

# 生产者
def producer():
    print("开始生产霸王餐!!!")
    c = comsume("Linghan")
    c1 = comsume("Chujian")
    c.__next__()
    c1.__next__()
    for i in range(10):
        time.sleep(3)
        print("3秒生产二份霸王餐!!!")
        c.send(i)
        c1.send(i)
    pass

producer()

# 迭代器
# 可以直接作用于for循环的对象统称为可迭代对象: Iterable (如:list列表 str字符串 dict字典 tuple元祖 set集合)
# 满足上述条件 并且可以被__next__() (注:2.x 为next())函数调用并且不断返回下一个值的对象称为迭代器:Iterator
# isinstance() 判断是否为迭代器(如:isinstance(list,Iterator))  iter()可以将list str dict 变成迭代器 (如:iter(list))

 

posted @ 2017-07-19 19:58  凌寒初见  阅读(212)  评论(0)    收藏  举报