zoukankan      html  css  js  c++  java
  • 函数高级小结

    函数高级小结

    一、闭包函数

    def f1():
        x = 10
        def f2():
            print(x)  # 10
            
    x = 1000
    f1()  # 10
    print(x)  # 1000
    
    

    把函数和变量一起打包拿出去了,内部函数包含对外部作用于而非全局作用域的引用

    def f1(x):
        def f2():
            print(x)  # 10
        return f2
    
    f3 = f1(10)  # f2
    f3()  # f2()  # 10
    f3()  # 10
    f3()  # 10
    
    f4 = f1(5)
    f4()  # 5
    f4()  # 5
    

    二、装饰器

    • 不改变函数体代码,并且不改变函数调用方式,为函数添加功能,它本质就是一个函数
    def f1(x):
        def f2():
            print(x)  # 10
        return f2
    
    f2 = f1()
    f2()  # f2()
    
    • 完善装饰器
    def login_deco(func):
        def wrapper(*args,**kwargs):
            login_judge = login()
            if login_judge:
                res = func(*args,**kwargs)
                return res
        return wrapper
    
    @login_deco
    def shopping():
        pass
    
    # shopping = deco(shopping)
    # shopping()
    

    三、三层装饰器

    def sanceng(x,y):
        def login_deco(func):
            print(x,y)
            def wrapper(*args,**kwargs):
                login_judge = login()
                if login_judge:
                    res = func(*args,**kwargs)
                    return res
            return wrapper
       return login_deco
    
    @sanceng(10,20)
    def shopping():
        pass
    
    day20
    # shopping = login_deco(shopping)
    # shopping()
    

    四、迭代器

    1. 可迭代对象:具有__iter__方法的对象(Python中一切皆对象)
    2. 迭代器对对象:具有__iter__和__next__方法
    • 迭代器对象一定是可迭代对象,可迭代对象不一定是迭代器对象(f)

    五、三元表达式

    成立响应 if 条件 else 不成立响应
    print(True) if a >10 else print(False)
    

    六、列表推导式

    [ i for i in range(10)]
    

    七、字典生成式

    {k:v for k, v in dict.items()}
    {k:v for k, v in zip(["a", "b", "c"], [1, 2, 3])}
    

    八、生成器表达式

    (i for i in range(10))
    

    <generator object at 0x05196240>

    九、生成器

    自定义的迭代器,函数内部使用yield关键,有yield关键字的函数只要调用,这个调用后的函数就是生成器

    • yield:接收函数返回值,但是会继续执行函数体代码,n+1 next 会报错
    • return:接收函数返回值,但是会终止函数
    def f1():
        yield 1
        
    g = f1()  # 变成生成器
    
    for i in g:
        print(i)  # 1
    

    十、递归

    递归本质上就是函数调用函数本身,必须得有结束条件,并且在递归的过程中,问题的规模必须都不断缩小

    10.1 二分搜索

    def find_num(num,lis):
    
        if len(lis) == 1 and lis[0] != num:
            print('没找到')
            return
    
        mid_ind = int(len(lis) / 2)  # 中间索引
        mid_num = lis[mid_ind]  # 中间值
    
        if num < mid_num:
            lis = lis[:mid_ind]
            find_num(num,lis)
        elif num > mid_num:
            lis = lis[mid_ind + 1:]
            find_num(num, lis)
        else:
            print('find')
    
    lis = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
    find_num(20,lis)
    

    十一、匿名函数

    lamdbda 参数 : 逻辑代码
    
    • 匿名函数使用一次就失效了,一般不单独使用,与max最大值/min最小值/sorted排序/map映射/filter过滤 连用
    max(dic,key=lambda name: dic[name])
    max(dic)
    
    max(lis/se/tup)
    
    • 内置函数

    十二、面向过程编程

    类似于工厂的流水线,机械式的一步一步完成一个项目,把完成步骤具体细分,这样步骤与步骤之间互不干涉

    缺点:扩展性差,只要有一个步骤断了,项目就崩溃了
    优点:清晰优雅

    在当下的阶段,必将由程序员来主导,甚至比以往更甚。
  • 相关阅读:
    spinner下拉列表数据的添加
    inflater的简单使用
    json对象和json数组的简单转化
    线程之间的通讯
    根据网页地址获取页面内容
    ExtJS4 嵌套的border layout
    sql server Truncate清空表内数据,并对自增长列重置归零重新计算
    C# 将多个DLL和exe合成一个exe程序
    ExtJS4 border layout 左侧treePanel 中间 panel
    BugFree 3.0.4 一些操作
  • 原文地址:https://www.cnblogs.com/randysun/p/12242827.html
Copyright © 2011-2022 走看看