python日记——函数工具(DIG)

DIG:Decorator(装饰器)、Iterator(迭代器)、Generator(生成器)

老师说这是真正掌握python的关键,所以有必要清楚的整理一下笔记。

迭代器(Iterator):

#迭代器是个Object,写迭代器时,写的是Class

内建函数:iter()

函数作用:把“可迭代对象”(Iterable)装换成“迭代器”(Iterator)

注:python中的容器都是可迭代的(可以通过遍历迭代每一个元素):

string = "this is a string."       
list = ['item 1', 'item 2', 3, 5]
set = (1, 2, 3, 4, 5)
for c in string:
    print(c, end=', ')
print()
for L in list:
    print(L, end=', ')
print()
for s in set:
    print(s, end=', ')
print()

转换为迭代器:

i = iter('Python')
s = iter((1, 2, 3, 4))
L = iter(['item 1', 'item 2', 3, 5])

迭代器的使用:

使用next()函数:

i = iter("Python")
next(i)
next(i)
next(i)
next(i)
next(i)
next(i)
#next(i) 前面已经到 'n' 了,再调用就会有 StopIteration 错误提示。

自己写一个迭代器(计数的例子):

class Counter(object):
    def __init__(self,start, stop):
        self.current = start
        self.stop = stop
    def __iter__(self):
        return self
    def __next__(self):
        if self.current > self.stop
            raise StopIteration
        else:
            c = self.current
            self.current += 1   
        return c

以上代码中,重点在于两个函数的存在,__iter__(self)__next__(self),这两句是约定俗成的写法,写上它们,Counter 这个类就被会被识别为 Iterator 类型。而后再有 __next__(self) 的话,它就是个完整的迭代器了。

 

生成器(Generator):

生成器表达式:

生成器表达式必须在括号内使用,even 就是用生成器创造的迭代器(Iterator),若是用了方括号,那就是用生成器创造的列表(List)—— 当然用花括号 {} 生成的就是集合(Set)

even = (e for e in range(10) if not e % 2)    #generator=生成器
# odd = (o for o in range(10) if o % 2)
print(even)
for e in even:
    print(e)

知识点:"yield"语句和return语句最大的不同在于“yield”之后的语句依然会被执行——而return后面的语句会直接被忽略。

示例(计数例子):

def counter(start, stop):
    while start <= stop:
        yield start
        start += 1
for i in counter(101, 105):
    print(i)

装饰器(Decorator):

操作符:@

代码示例:

def a_decorator(func):
    def wrapper():
        print('We can do sth. before calling a_func...')
        func()
        print('... and we can do sth. after it was called...')
    return wrapper

@a_decorator
def a_func():
    print("Hi, I'm a_func!")
    
a_func()

函数本身也是对象(即,Python 定义的某个 Class 的一个 Instance)。

装饰器的用途

Decorator 最常用的场景是什么呢?最常用的场景就是用来改变其它函数的行为。

你可能感兴趣的:(Python之路)