Day13 of learning python--迭代器和生成器的补充

1.复习

1)函数的定义和调用:

def 函数名(形参):
    函数体
    return 返回值
调用 函数名(实参)

站在形参的角度:位置参数,*args,默认参数(陷阱),**kwargs

站在实参的角度:按位值传,按关键字传

返回值:没有返回值,返回一个值,返回多个值

接收返回值:没有返回值不接收,返回一个值用一个变量接收,返回多个值用一个变量或者对应数目的变量接收

闭包函数--在内部函数引用外部函数的变量

2)装饰器:--一定是闭包函数

  装饰器的作用是:在不改变原来函数的调用方式情况下,在这个函数的前后添加新的功能

  完美的符合一个开发原则:开放封闭原则(对扩展是开放的,对修改是封闭的)

3)基础的装饰器公式

from functools import wraps
    def wrapper(func):
        @wraps(func)    #func.__doc__(),func.__name__()还是原函数的使用
        def inner(*args,**kwargs):
            '''在函数被调用之前添加的代码'''
            ret = func(*args,**kwargs)      # func是被装饰的函数,在这里被调用
            '''在函数被调用之后添加的代码'''
            return ret
        return inner
@wrapper
func():
函数体

 

4)带参数的装饰器

@wrapper --> @warpper(argument)
三层嵌套函数
def outer(形参):    #比如传入一flag,用来控制innner()函数内部的使用
    def wrapper(func):
        def inner(*args,**kwargs):
            '''在函数被调用之前添加的代码'''
            ret = func(*args,**kwargs)      # func是被装饰的函数,在这里被调用
            '''在函数被调用之后添加的代码'''
            return ret
        return inner

@outer(True)
func():
函数体

 

 

2.迭代器

print(dir([])  #告诉我列表拥有的所有方法

可以for循环的:list ,dict ,set ,tuple ,enumerate([]) ,range(10), str, f(文件句柄)

只要是能被for 循环的数据类型,就一定拥有__iter__方法

只要含有__iter__方法都是可迭代的 -- 可迭代协议,

 [].__iter__()迭代器,--> __next__ 通过next就可以从迭代器中一个一个的取值

迭代器协议 -- 内部含有__next__和__iter__方法就是迭代器

当我们遇到一个新的变量,不确定能不能for循环的时候,就判断它是否可迭代,是否有iter方法

1 # print('__iter__' in dir(dict))
2 # print([].__iter__())
3 # 一个列表执行了__iter__()之后的返回值就是一个迭代器
4 print(dir([]))
5 print(dir([].__iter__()))
6 print(set(dir([].__iter__())) - set(dir([])))

 

迭代器的好处:

  从容器类型中一个一个的取值,会把所有的值都取到

  节省内存空间(range,f)

    迭代器并不会在内存中再占用一大块内存(而是随着循环,每次生成一个,每次next每次给一个)

3.生成器 -- 迭代器

生成器函数--本质上是我们写的函数

1 # 只要含有yield关键字的函数都是生成器函数
2 # yield不能和return共用且需要写作函数内
3 def generator():
4     print(1)
5     yield 'a'
6 # 生成器函数:执行之后会得到一个生成器作为返回值
7 ret = generator()
8 print(ret)
9 print(ret.__next__())

 

 1 def generator():  # 生成器函数
 2     print(1)
 3     yield 'a'
 4     print(2)
 5     yield 'b'
 6 g = generator()    #生成器
 7 # ret = g.__next__()
 8 # print(ret)
 9 # ret = g.__next__()
10 # print(ret)
11 for i in g:
12     print(i)
def wahaha():
    for i in range(2000000):
        yield 'wahaha%d'%i

g = wahaha()
for i in g:
    print(i)

 

监听文件输入例子

 1 def tell(filename):
 2     f = open(filename,'r',encoding='gbk')
 3     while True:  # for循环只能读存在的,不能读新写
 4         line = f.readline()
 5         if line.strip():    # strip(),默认去掉空格,换行符。或者去掉特定字符串
 6             yield line.strip()
 7 
 8 g = tell('F:\hi.txt')    # 该迭代器可以对文件中的内容进行操作
 9 for i in g:
10     print('***',i)

 

posted on 2018-10-10 17:07  smile大豆芽  阅读(91)  评论(0)    收藏  举报