python 吐血总结 【函数高级小结】

函数高级

闭包

def fun1():
    x = 520
    def fun2():
        print(x)

x = 1200
fun1()
print(x)# 内部函数包含对外部作用于而非全局作用域的引用

装饰器

不改变函数体的代码,并且不改变函数的调用方式,为函数添加功能,他本质就是一个函数,附加被装饰器的函数里面。
def login():
    return True


def login_deco(func):
    def wrapper(*args,**kwargs):
        pre_login = login()
        if pre_login:       # 调用shopping
            res = func(*args,**kwargs)
            return res
    return wrapper

@login_deco
def shopping():
    pass

装饰器进阶

def jackson(x,y):
    def login_deco(func):
        print(x,y)
        def wrapper(*args,**kwargs):
            pre_login = login()
            if pre_login:
                res = func(*args,**kwargs)
                return res
        return wrapper
    return login_deco

# shopping = login_deco(shopping)
@jackson(1,2)
def shopping():
    pass

迭代器

1、可迭代对象:具有__iter__方法的对象(Python中一切皆是对象)

2、迭代器对象:具有__iter__和__next__方法

注意:迭代器一定是可迭代对象、可迭代对象不一定是迭代器对象

生成器

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

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

return:接收函数返回值,但是会终止函数
def f1():
    # yield是接收函数返回值,但是会继续执行函数体代码
    yield 1
    yield 2
    yield 3

g = f1()
# g就是一个迭代器

for i in g:
    print(i)

递归

递归本质上就是函数调用函数本身,必须有结束条件,并且在递归的过程中,问题的规模必须都不断缩小
#  斐波那契数列
# 从第三项开始,每一项都等于前两项之和。 前两项可以写成 n-1 n-2
# 0, 1, 1, 2, 3, 5, 8, 13

def f(n):
    if n <=1:
        return n
    else:
        return (f(n-1) + f(n-2))for i in range(term):  print(f(n))
# 二分法
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)

匿名函数

匿名函数使用一次就失效了,一般不单独使用,于内置的各种函数连用
lambda  参数 : 逻辑代码
def sum(x,y):
      return x+y

p = lambda x,y:x+y
print(p(4,6))
这里p就是一个函数,一个比较帅的函数,优雅的函数。其实lambda返回值是一个函数的地址,也就是函数对象。

相关推荐