zoukankan      html  css  js  c++  java
  • 闭包函数 装饰器 迭代器 列表、字典、生成器表达式 递归

    闭包函数

    def f1(url):#f1就叫闭包函数
        def spider():
            print(url)
        rerurn spider# 函数对象
    taoao=f1('www.taobao.com')
    taobao()
    baidu=f1('www.baidu.com')
    baidu()
    

    闭包函数:闭包函数 把闭包函数内部的变量+闭包函数内部的函数 这两者包裹在一起 然后通过返回值的形式返回出来

    闭包函数至少要符合函数嵌套

    装饰器

    装饰器的本质就是一个 给函数增加功能的函数

    装饰器给 函数 增加功能时需要注意一下两点:

    1.不改变原函数的源代码

    2.不改变原函数的调用方式

    import time
    def index():
        '''被装饰的函数'''
        print('index')
        time.sleep(1)
        
    # time_count装饰器:对被装饰函数计时
    def time_count(func):
        def wrapper():
            s=time.time
            func()
            e=time.time
            print(e-s)
         return wrapper
    
    index=time_count(index)
    index()
    

    带返回值

    import time
    def index():
        '''被装饰的函数'''
        print('index')
        time.sleep(1)
        return 'index'
        
    # time_count装饰器:对被装饰函数计时
    def time_count(func):
        def wrapper():
            s=time.time
            res=func()
            e=time.time
            print(e-s)
            return res
         return wrapper
    
    index=time_count(index)
    res=index()
    print(res)
    

    加参数

    import time
    def index(x,y,z=10):
        '''被装饰的函数'''
        print('index')
        time.sleep(1)
        return 'index'
        
    # time_count装饰器:对被装饰函数计时
    def time_count(func):
        def wrapper(*args,**kwargs):
            s=time.time
            res=func(*args,**kwargs)
            e=time.time
            print(e-s)
            return res
         return wrapper
    
    index=time_count(index)
    res=index(10,20)
    print(res)
    

    装饰器模板

    def deco(func):
        def wrapper(*args,**kwargs):
            '''加功能'''
            res=func(*args,**kwargs)
            return res
        return wrapper
    

    语法糖

    让代码变得更简单

    import time
    
    # time_count装饰器:对被装饰函数计时
    def time_count(func):
        def wrapper(*args,**kwargs):
            s=time.time
            res=func(*args,**kwargs)
            e=time.time
            print(e-s)
            return res
         return wrapper
        
    @time_count()
    def index(x,y,z=10):
        '''被装饰的函数'''
        print('index')
        time.sleep(1)
        return 'index'
    

    三层装饰器

    由于两层的装饰器,参数必须得固定位func,但是三层的装饰器解除了这个限制。我们不仅仅可以使用上述单个参数的三层装饰器,多个参数的只需要在三层装饰器中多加入几个参数即可。也就是说装饰器三层即可,多加一层反倒无用

    迭代器

    可迭代对象:含有__item__方法的就叫做可迭代对象

    迭代器:含有__item____next__方法的叫做迭代器

    生成器:含有yield关键字的函数叫做生成器

    迭代器

    可迭代对象

    __iter--()方法的对象就是可迭代对象,除了数字类型之外都是可迭代对象。

    迭代器对象

    具有__iter__()__next__()方法的叫迭代器对象,只有文件是迭代器对象

    迭代器对象提供了不依赖索引取值的手段

    for循环原理

    for循环本质就是一个while循环,只不过是一个可控的while循环

    lt = [1,2,3]
    for i in lt:   # 可迭代对象;迭代器对象  # 不依赖索引取值,而是迭代取值
        print(i)
    
    lt=[1,2,3]
    lt_iter=lt.__iter__()
    while Ture:
    	try:
            print(lt_iter.__next__())
        except StopIteration:
            break
    

    1.首先使用iter把lt变成迭代器对象,对于文件也要使用iter方法把文件iter下

    2.然后使用next方法进行迭代取值

    3.判断stopiteration异常,遇到异常终止

    迭代器对象一定是可迭代对象,可迭代对象不一定是迭代器对象

    三元表达式

    print(x) if x>y else print(y)
    

    条件成立走这里 if 条件 else 条件不成立走这里

    列表推导式

    lt=[i for i in range(10)]
    print(lt)
    lt=[i**2(可以做运算) for i in range(10)]
    

    字典生成式

    lt1=['a','b','c']
    lt2=[1,2,3]
    dic={k:v**2 for k,v in zip(lt1,lt2)}
    print(dic)#{'a': 1, 'b': 4, 'c': 9}
    

    生成器表达式

    g=(i for i in range(10))
    print(g)
    for i in g:
        print(i)
    #<generator object <genexpr> at 0x000002D0F10E6BA0>
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    

    生成器

    生成器:含有yield关键字的函数叫做生成器

    def ge():
        yield 3#一个yield相当于一个next:暂停函数
        yield 4
    print(ge())#<generator object ge at 0x00000246292A6BA0>
    g=ge()
    print(g.__next__())#3
    print(g.__next__())#4
    

    yield的函数

    1.暂停函数

    2.通过next取值

    return的特性

    1.终止函数

    2.通过调用函数拿到值

    def range(start):
        count=0
        while count<start:
            yield count
            count+=1
    for i in range(10):
        print(1)
    #0
    #1
    #2
    #3
    #4
    #5
    #6
    #7
    #8
    #9
    

    递归

    递归:函数a内部直接调用函数a本身

    每次递归都不会结束函数,每一次递归都会开辟内存空间,如果一直开辟内存就炸掉了,所以最多递归1000次

    真正的递归必须要有 退出条件的

    count=0
    def a():
        global count
        count+=1
        print(count)
        if count==5:
            return 
        a()
    a()
    
    def age(x):
        if x==0:
            return 18
        x-=1
        return age(x)+2
    res=age(6)
    print(res)#32
    
  • 相关阅读:
    QT 信号槽 异步事件驱动 单线程 多并发
    Qt 静态库与共享库(动态库)共享配置的一个小办法
    关于:有符号与无符号整数的大小比较
    QT信号槽 中的对象野指针
    Qt程序打包发布
    Qt程序打包发布
    SQL Server 2012 sa 用户登录 18456 错误 (转)
    QtCreator常用之快捷键
    opengl中相关的计算机图形变换矩阵之:模型视图几何变换
    opengl中相关的计算机图形变换矩阵之:齐次坐标 (摘编)
  • 原文地址:https://www.cnblogs.com/zqfzqf/p/12577993.html
Copyright © 2011-2022 走看看