<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Python 进阶
1 迭代器、生成表达式和生成器
1.1 迭代器（iterators)
迭代器对象拥有个next方法用来表达下一个对象，并且如果导到了最后一个，将会抛出一个StopIteration的异常
Step1:  通过for语句可以来进行迭代整个迭代器的对象。
1.2 生成表达式（generate expression)
生成迭代器的另外一种方法是通过生成表达式
Step2:  不仅仅可以生成列表，还有生成集合（set）或者是字典，只要在外边添加一组｛｝即可
Step3:  1.3 生成器（generator）
生成器函数通过yield关键字来处理迭代器的生成，每当next函数被调用，将会执行一次yield操作，直至yield操作全部完成。
Step4:  再看一个生成器的实例，观察该函数如何被调用的
Step5:  在gen=f()处，函数并没有被调用，而是在第一次调用next()函数的时候，执行print '---first---'语句，当执行最后的next()语句的时候执行了最后的print '---finish---'语句。
2 装饰器
由于在Python中函数也是一种对象，所以可以将其进行传递，通过装饰器可以修改一个函数的行为。
Step6:  需要装饰的函数会有一些参数，可以使用通用的参数形式*args,**kw来适应所有情况
Step7:  有时装饰器函数也接受参数，则装饰器函数需要进一步封装。
Step8:  通常通过装饰器处理的函数，会改变整个函数的签名，为了不改变被装饰函数的签名，需要进一步处理。
Step9:  2.1 标准库中的装饰器
classmethod   
方法中如果标记为 @classmethod 那么该函数将被类调用，而不是被类的实例对象调用。该方法参数中不用self,而是cls
Step10:  staticmethod  
可以通过类所在的命名空间方位该函数，通常来讲用来该函数的前缀为_，用来表明该函数与这个类相关，虽然这个函数不是必须的。
Step11:  property  
通过property的装饰器，可以使用简介的set和get操作，方便使用。
2.2 添加deprecate信息
如果一个函数如果已经被丢弃，当用户在第一次使用该函数的时候，输出相关信息。
类实现
Step12:  函数实现
<ASSISTANT_TASK:>
Python Code:
num=[1,2,3]
iter(num)
num.__iter__()
num.__reversed__()
it = iter(num)
print it.next()
print it.next()
print it.next()
print it.next()
Explanation: Python 进阶
1 迭代器、生成表达式和生成器
1.1 迭代器（iterators)
迭代器对象拥有个next方法用来表达下一个对象，并且如果导到了最后一个，将会抛出一个StopIteration的异常
End of explanation
(i for i in num)
[i for i in num]
Explanation: 通过for语句可以来进行迭代整个迭代器的对象。
1.2 生成表达式（generate expression)
生成迭代器的另外一种方法是通过生成表达式
End of explanation
{i for i in range(3)}
{i:i**2 for i in range(3)}
Explanation: 不仅仅可以生成列表，还有生成集合（set）或者是字典，只要在外边添加一组｛｝即可
End of explanation
def f():
    yield 1
    yield 2
f()
gen=f()
gen.next()
gen.next()
gen.next()
Explanation: 1.3 生成器（generator）
生成器函数通过yield关键字来处理迭代器的生成，每当next函数被调用，将会执行一次yield操作，直至yield操作全部完成。
End of explanation
def f():
    print '---first---'
    yield 3
    print '---middle---'
    yield 4
    print '---finish---'
gen=f()
gen.next()
gen.next()
gen.next()
Explanation: 再看一个生成器的实例，观察该函数如何被调用的
End of explanation
def simple_decorator(f):
    print 'decorator'
    return f
@simple_decorator
def f():
    print 'origin function'
f()
Explanation: 在gen=f()处，函数并没有被调用，而是在第一次调用next()函数的时候，执行print '---first---'语句，当执行最后的next()语句的时候执行了最后的print '---finish---'语句。
2 装饰器
由于在Python中函数也是一种对象，所以可以将其进行传递，通过装饰器可以修改一个函数的行为。
End of explanation
def para_decorator(f):
    def _wrapper(*args,**kw):
        print 'para decorator'
        return f(*args,**kw)
    return _wrapper
@para_decorator
def f(name):
    print 'name is {}.'.format(name)
f('gaufung')
Explanation: 需要装饰的函数会有一些参数，可以使用通用的参数形式*args,**kw来适应所有情况
End of explanation
def paras_decorator(value):
    def para_decorator(f):
        def _wrapper(*args,**kw):
            print value
            return f(*args,**kw)
        return _wrapper
    return para_decorator
@paras_decorator('zhangsan')
def f(name):
    print 'name is {}.'.format(name)
f('gaufung')
Explanation: 有时装饰器函数也接受参数，则装饰器函数需要进一步封装。
End of explanation
import functools
def decorator_f(f):
    @functools.wraps(f)
    def _wrapper(*args,**kw):
        return f(*args,**kw)
    return _wrapper
@decorator_f
def f():
    pass
Explanation: 通常通过装饰器处理的函数，会改变整个函数的签名，为了不改变被装饰函数的签名，需要进一步处理。
End of explanation
class A(object):
    def __init__(self,args):
        self._args = args
    @classmethod
    def say(cls):
        print 'say hello'
A.say()
Explanation: 2.1 标准库中的装饰器
classmethod   
方法中如果标记为 @classmethod 那么该函数将被类调用，而不是被类的实例对象调用。该方法参数中不用self,而是cls
End of explanation
class B(object):
    def __init__(self,arg):
        self._args = arg
    @staticmethod
    def speak():
        print 'speak hello'
B.speak()
Explanation: staticmethod  
可以通过类所在的命名空间方位该函数，通常来讲用来该函数的前缀为_，用来表明该函数与这个类相关，虽然这个函数不是必须的。
End of explanation
class deprecated(object):
    def __call__(self,func):
        self.func = func
        self.count = 0
        return self._wrapper
    def _wrapper(self,*args,**kw):
        self.count += 1
        if self.count == 1:
            print self.func.__name__,'is deprecated.'
        return self.func(*args,**kw)
@deprecated()
def f():
    pass
f()
Explanation: property  
通过property的装饰器，可以使用简介的set和get操作，方便使用。
2.2 添加deprecate信息
如果一个函数如果已经被丢弃，当用户在第一次使用该函数的时候，输出相关信息。
类实现
End of explanation
def deprecated(func):
    count = [0]
    def _wrapper(*args,**kw):
        count[0] += 1
        if count[0] == 1:
            print func.__name__,'is deprecated'
        return func(*args,**kw)
    return _wrapper
@deprecated
def f():
    pass
f()
Explanation: 函数实现
End of explanation
<END_TASK>