装饰器是什么? 有什么用? 为什么要用? 真的有用吗?
1、装饰器:
生成器
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]
改成()
,
>>> L = [x * x for x in range(10)] # 通过迭代-->列表生成式
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10)) # 生成器
>>> g
<generator object <genexpr> at 0x1022ef630>
迭代是什么? 原谅我的无知。。。
迭代器Iterable|iteror、生成器generator
http://www.cnblogs.com/alex3714/articles/5765046.html#3616312
list\tuple\str等都是可迭代对象、但并不是生成器,使用iter可转换。
迭代器
我们已经知道,可以直接作用于for
循环的数据类型有以下几种:
一类是集合数据类型,如list
、tuple
、dict
、set
、str
等;
一类是generator
,包括生成器和带yield
的generator function。
这些可以直接作用于for
循环的对象统称为可迭代对象:Iterable
。
迭代器
凡是可作用于for
循环的对象都是Iterable
类型;
凡是可作用于next()
函数的对象都是Iterator
类型,它们表示一个惰性计算的序列;
集合数据类型如list
、dict
、str
等是Iterable
但不是Iterator
,不过可以通过iter()
函数获得一个Iterator
对象。
Python的for
循环本质上就是通过不断调用next()
函数实现的
迭代器似乎大小可预见且量小。生成器看起来大小不可预定、不可预见如裴波那切。函数中有yeid的就是生成器
白了句: yield又是哪位大大?……不说了看连接http://www.cnblogs.com/alex3714/articles/5765046.html#3616312
#
回到装饰器:
看例子
#-*- coding: utf-8 -*-
# Wind clear raise
# 2017/2/11 下午1:23 # 装饰器 复习 def auth(auth_type):
print("auth interface:", auth_type)
if auth_type == "weixin":
print("weixin interface, 搞点啥呢")
else:
print("default")
def wrapper(func): # func接收被装饰的函数
def wrapper(args): # 被装饰的函数的参数
# 调用func..home前干点啥,比如认证,跟认证结果等来确定 home的执行方式或者是不执行
print("调用home干啥?")
func(args)
print("home完了?,再给补个刀")
return wrapper
return wrapper @auth("weixin")
# @auth相当于下面这两行, 有什么鸟用? auth那里需要条件判断的,比如微信接口、微博等
# f = auth("webchart")
# auth = f(home) def home(args):
print("in home: ", args) home("Lucy") # 简单装饰器
def auth(func):
def wrapper(name=''):
print("前戏。。")
func(name) #
print("收拾一下")
return wrapper
@auth
def index(name):
print("开搞", name) index("Lucy")
index()
装饰器:函数嵌套、高阶函数组合而成的