函数小结

函数小结

一、闭包函数



def f1():
    x = 10

    def f2():
        print(x)  # 10


x = 1000
f1()  # 10
print(x)  # 1000


def f1():
    x = 10

    def f2():
        print(x)  # 10

    return f2


f = f1()  # f2

f()  # f2()
  • 把函数和变量一起打包拿出去了


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()

四、迭代器

可迭代对象:具有iter方法的对象(Python中一切皆对象)
2.
迭代器对对象:具有iter和next方法

  • 迭代器对象一定是可迭代对象,可迭代对象不一定是迭代器对象(f)

五、三元表达式

六、列表推导式

七、字典生成式

八、生成器表达式

九、生成器

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

yield:接收函数返回值,但是会继续执行函数体代码

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)
  • 内置函数(有空看一看,没空抄一抄)

十二、面向过程编程

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

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

posted @ 2020-05-04 17:30  Mr-Allen  阅读(173)  评论(0编辑  收藏  举报