器皿

作者: 为什么要简称 | 来源:发表于2018-09-14 15:20 被阅读3次

    生成器(Generator)

    1.列表生成式看起来是这个样子

    q = [x*2 for x in range(10)]
    print(type(q))
    ---------------------------------------------------------------------------
    <class 'list'>
    

    把 [] 改做 () 就变成生成器啦

    q = (x*2 for x in range(10))
    print(type(q))
    ---------------------------------------------------------------------------
    <class 'generator'> 
    

    想要输出内容的话:

    print(next(q))
    ---------------------------------------------------------------------------
    0
    

    (next(q)和q.next()是一个效果)

    如上所示,生成器实际上保存的是计算规则,调用next()会计算出下一个元素,如果没有更多元素,抛出StopInteration

    q = (x*2 for x in range(1))
    next(q)
    next(q)
    next(q)
    ---------------------------------------------------------------------------
    StopIteration                             Traceback (most recent call last)
    <ipython-input-41-b18c2d70dc58> in <module>()
      1 q = (x*2 for x in range(1))
      2 next(q)
    ----> 3 next(q)
      4 next(q)
    
    StopIteration: 
    

    生成器是一个可迭代对象,可以用for来实现获取元素,next还是比较累的。
    2.第二种是含有yield关键字的函数,不要被欺骗。

    def test():
      i = 0
      yield i
    test()
    ---------------------------------------------------------------------------
    <generator object test at 0x00000162B74391A8>
    

    获取元素:

    next(test())
    

    迭代器

    迭代是访问集合元素的一种方式。
    迭代器是一个可以记住遍历位置的对象。迭代器对象从集合的第一个位置开始访问,直到所有的元素被访问完结束。迭代器只能往前不能往后。

    可以直接for的对象一般有两类
    1.集合数据类型:list、tuple、set、dict、str
    2.生成器
    判断一个对象是否可以迭代,使用isInstance

    from collections import Iterable
    
    str = 'hiahiahia'
    
    print(isinstance(str, Iterable))
    print(isinstance([], Iterable))
    ---------------------------------------------------------------------------
    True
    True
    

    闭包

    概念上说的话,闭包就是能读取其他函数内部变量的函数。不过一般只有函数内部的函数才能读取局部变量,所以闭包也就是指一个函数dad内部有一个子函数,并且这个子函数用了dad的变量,而且dad返回的是这个子函数。

    def test(name):
    def inner():
        print('%s 说, i\'m in' % name)
    return inner
    
    t = test('小明')
    t()
    ---------------------------------------------------------------------------
    小明 说, i'm in
    

    装饰器

    基于闭包,如果调用闭包时传入的是函数,那么就可以实现一些函数外添加的功能了。

    def cheat():
    print('------骗钱-------')
    

    这样骗钱并不太好骗,所以先得装一下,但是改原有函数工程浩大,装饰一下就能解决问题

    def test(func):
    def inner():
        print('------装好人------')
        func()
    return inner
    
    
    def cheat():
        print('------骗钱-------')
    cheat = test(cheat)
    
    #其他模块调用的时候还是调用cheat(),完全不用动
    cheat()
    ---------------------------------------------------------------------------
    ------装好人------
    ------骗钱-------
    

    python的语法糖让这个行为还可以更简单一些:

    def test(func):
    def inner():
        print('------装好人------')
        func()
    return inner
    
    @test
    def cheat():
        print('------骗钱-------')
    
    #其他模块调用的时候还是调用cheat(),完全不用动
    cheat()

    相关文章

      网友评论

          本文标题:器皿

          本文链接:https://www.haomeiwen.com/subject/bacwgftx.html