• python学习day-8 迭代器 生成器 装饰器


    http://www.cnblogs.com/linhaifeng/articles/7580428.html    
    迭代器

    #迭代器即迭代的工具,那什么是迭代呢?
    #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值
    1、为何要有迭代器?
    对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器
    
    2、什么是可迭代对象?
    可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__,如下
    'hello'.__iter__
    (1,2,3).__iter__
    [1,2,3].__iter__
    {'a':1}.__iter__
    {'a','b'}.__iter__
    open('a.txt').__iter__
    
    3、什么是迭代器对象?
    可迭代对象执行obj.__iter__()得到的结果就是迭代器对象
    而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象
    
    文件类型是迭代器对象
    open('a.txt').__iter__()
    open('a.txt').__next__()
    
    
    4、注意:
    迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象

    5.用法
    dic={'a':1,'b':2,'c':3}
    iter_dic=dic.__iter__() #得到迭代器对象,迭代器对象即有__iter__又有__next__,但是:迭代器.__iter__()得到的仍然是迭代器本身
    iter_dic.__iter__() is iter_dic #True
    
    print(iter_dic.__next__()) #等同于next(iter_dic)
    # print(iter_dic.__next__()) #抛出异常StopIteration,或者说结束标志


    6.for循环
    #基于for循环,我们可以完全不再依赖索引去取值了
    dic={'a':1,'b':2,'c':3}
    for k in dic:
        print(dic[k])
    
    for循环的工作原理
    1:执行in后对象的dic.__iter__()方法,得到一个迭代器对象iter_dic
    2: 执行next(iter_dic),将得到的值赋值给k,然后执行循环体代码
    3: 重复过程2,直到捕捉到异常StopIteration,结束循环




    生成器
    只要函数内部包含有yield关键字,那么函数名()的到的结果就是生成器,并且不会执行函数内部代码
    yield相当于return 程序就停住了
    生成器就是迭代器



    三元表达式
    name=input('姓名>>: ')
    res='SB' if name == 'alex' else 'NB'
    print(res)



    装饰器
    1.高阶函数
    2.闭包
    3.函数嵌套


    1.函数闭包
    内部函数包含对外部作用域而非全局作用域的引用
    
    提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路,包起来喽,包起呦,包起来哇


    2.函数嵌套
    
    
    
    
    def father(auth_type):
    print('from father %s' %auth_type )
    def son():
    name='linhaifeng_1'
    print('我的爸爸是%s' %name)
    def grandson():
    print('我的爷爷是%s' %auth_type)
    grandson()
    son()

    father('filedb')

    3.高阶函数
    '''
    高阶函数定义:
    1.函数接收的参数是一个函数名
    2.函数的返回值是一个函数名
    3.满足上述条件任意一个,都可称之为高阶函数
    '''
     
    计时加法器
    import time
    def cal(l):
    start_time=time.time()
    res=0
    for i in l:
    time.sleep(0.1)
    res+=i
    stop_time = time.time()
    print('函数的运行时间是%s' %(stop_time-start_time))
    return res
    print(cal(range(100)))



    装饰器的实现1
    import time
    def timmer(func): #func=test
    def wrapper():
    # print(func)
    start_time=time.time()
    func() #就是在运行test()
    stop_time = time.time()
    print('运行时间是%s' %(stop_time-start_time))
    return wrapper

    @timmer #test=timmer(test)
    def test():
    time.sleep(3)
    print('test函数运行完毕')
    test()



    # test=timmer(test) #返回的是wrapper的地址
    # test() #执行的是wrapper()

    # @timmer 就相当于 test=timmer(test)
     
    装饰器的实现2加上返回值
    import time
    def timmer(func): #func=test
    def wrapper():
    start_time=time.time()
    res=func() #就是在运行test()
    stop_time = time.time()
    print('运行时间是%s' %(stop_time-start_time))
    return res
    return wrapper

    @timmer #test=timmer(test)
    def test():
    time.sleep(3)
    print('test函数运行完毕')
    return '这是test的返回值'

    res=test() #就是在运行wrapper
    print(res)



    装饰器的实现3传入参数
    1.
    import time
    def timmer(func): #func=test1
    def wrapper(*args,**kwargs): #test('linhaifeng',age=18) args=('linhaifeng') kwargs={'age':18}
    start_time=time.time()
    res=func(*args,**kwargs) #就是在运行test() func(*('linhaifeng'),**{'age':18})
    stop_time = time.time()
    print('运行时间是%s' %(stop_time-start_time))
    return res
    return wrapper



    @timmer
    def test1(name,age,gender):
    time.sleep(1)
    print('test1函数运行完毕,名字是【%s】 年龄是【%s】 性别【%s】' %(name,age,gender))
    return '这是test的返回值'


    test1('alex',18,'male')

    print(test1('alex',18,'male'))

    2.
    import time
    def timmer(func):
    def wrapper(*args,**kwargs):
    start_time=time.time()
    res=func(*args,**kwargs)
    stop_time = time.time()
    print('函数运行时间是%s' %(stop_time-start_time))
    return res
    return wrapper

    @timmer #相当于cal等于timmer(cal)
    def cal(l):
    res=0
    for i in l:
    time.sleep(0.1)
    res+=i
    return res

    res=cal(range(20))
    print(res)
    装饰器实现带有参数验证功能
    user_list=[
    {'name':'alex','passwd':'123'},
    {'name':'linhaifeng','passwd':'123'},
    {'name':'wupeiqi','passwd':'123'},
    {'name':'yuanhao','passwd':'123'},
    ]
    current_dic={'username':None,'login':False}

    def auth(auth_type='filedb'):
    def auth_func(func):
    def wrapper(*args,**kwargs):
    print('认证类型是',auth_type)
    if auth_type == 'filedb':
    if current_dic['username'] and current_dic['login']:
    res = func(*args, **kwargs)
    return res
    username=input('用户名:').strip()
    passwd=input('密码:').strip()
    for user_dic in user_list:
    if username == user_dic['name'] and passwd == user_dic['passwd']:
    current_dic['username']=username
    current_dic['login']=True
    res = func(*args, **kwargs)
    return res
    else:
    print('用户名或者密码错误')
    elif auth_type == 'ldap':
    print('鬼才特么会玩')
    res = func(*args, **kwargs)
    return res
    else:
    print('鬼才知道你用的什么认证方式')
    res = func(*args, **kwargs)
    return res

    return wrapper
    return auth_func

    @auth(auth_type='filedb') #auth_func=auth(auth_type='filedb')-->@auth_func 附加了一个auth_type --->index=auth_func(index)
    def index():
    print('欢迎来到京东主页')

    @auth(auth_type='ldap')
    def home(name):
    print('欢迎回家%s' %name)
    #
    @auth(auth_type='sssssss')
    def shopping_car(name):
    print('%s的购物车里有[%s,%s,%s]' %(name,'奶茶','妹妹','娃娃'))

    # print('before-->',current_dic)
    # index()
    # print('after--->',current_dic)
    # home('产品经理')
    shopping_car('产品经理')


     
     
     


     
     
    
    
     
  • 相关阅读:
    前端页面有哪三层构成,分别是什么?作用是什么?
    如何使用jQuery设置背景的透明度
    笔试基础
    我的设计模式3
    C++ 输入输出流
    我的设计模式2
    剑指offer: 38 数字在排序数组中出现的次数
    我的设计模式
    常用算法设计与分析
    iOS viewController 和 view 的创建消失生命周期总结
  • 原文地址:https://www.cnblogs.com/wangxiaoyienough/p/9265362.html
Copyright © 2020-2023  润新知