python学习日记之函数(2)

  • 装饰器

本质上也是一个函数

是给现有的模块增添新的小功能 不修改原代码的前提下可以对原函数进行功能扩展

让我们可以在代码运行期间 动态地对指定函数增加一些功能(比如计算函数的运行时间、给函数添加调用日志、进行类型检查等等)

  1. 装饰器的语法糖

@+装饰器的名字

调用函数时相当于把函数当作一个参数传递到装饰器里面去

多个装饰器可以用在同一个函数上

  1. 给装饰器传递参数

带参数和不带参数的编译器 那么它们的调用顺序应该是自下而上依次执行

python学习日记之函数(2)_第1张图片

 

  1. 功能

将目标函数进行打包,并返回一个加工后的新函数对象

def add(yyqx):
    def inner():
        x = yyqx()
        return x + 1
    return inner

def reduce(yyqx):
    def inner():
        x = yyqx()
        return x + 1
    return inner

def cube(yyqx):
    def inner():
        x = yyqx()
        return x * x * x
    return inner

def square(yyqx)
    def inner():
        x = yyqx()
        return x * x
    return inner

@add
@reduce
@cube
@squsre
def result():
    return 2

print(test())

2.Lambda表达式

  1. 函数介绍

在使用函数时不需要给函数分配一个名称 该函数就是“匿名函数       在python中使用lambda表达式表示匿名函数

是对一个函数的引用

addYYQX = lamdba x:x + 1
addYYQX(1)
yyqx = [lambda x : x + 1,2,3]
yyqx[0](yyqx[1])

mapped = map(lambda x : ord(x) + 1,"yyqx")
list(mapped)
  1. 函数语法

lambda 参数列表:lambda体

参数列表    类似函数中的形参 不同参数之间逗号隔开

                  可参考函数的参数那里对形参的讲解

lambda 表达式的主要代码在此处编写 类似于函数体

                  不能是一个代码块,不能包含多条语句,只能包含一条语句

                  返回的lambda体运算式运算结果

                  与函数不同的是 不需要使用return语句返回

注意:参数列表可有可无,可以接收任意数量的参数,但只能返回一个值

lambda函数与def函数的异同点

a.lambda可以立即传递(无需变量),自行返回结果b.lambda在内部只能包含一行代码

c.lambda是一个为编写简单函数而设计的,而def用来处理更大的任务

d.lambda可以定义一个匿名函数,而def定义的函数必须有一个名字

e. 参数都是可选,也都会返回对象,用法基本一致

f. lambda是一个表达式而非语句,两者应用范围有不同

lambda函数优势:

a.对于单行函数且只有一个返回值,使用lambda表达式可以省去定义函数的过程,让代码更加简洁

b.对于不需要多次复用的函数,用lambda表达式可以在用完后立即释放,提高程序执行的性能。

c. lambda函数可以作为参数传递给其他函数也可 作为函数返回

d. lambda 是一个表达式 因此它可以用在常规函数不可能存在的地方

  • 生成器

让函数退出之后还能保留状态 —— 闭包/使用全局变量/生成器

是一个迭代器 每次调用的时候提供一个数据 这样就不必创建完整的list,从节省量的空间 不走回头路

无法使用下标索引这种随机访问方式

  1. 格式
  1. 生成器表达式

和列表推导式的定义类似,生成器表达式使用 () 而不是 []

yyqx = (x for x in range(10))

for qxh in yyqx:
    print(qzh)
  1. 生成器函数

Yield表达式代替return语句,调用该函数时会返回一个生成器           

def yyqx()
    qzh = 0
    while qzh <= 5:
        yeild qzh
            qzh = qzh + 1

for qzh in yyqx()
    print(qzh)

 当我们使用 yield 时 在没有数据时 也会抛出 StopIteration 异常

a.调用该函数的时候不会立即执行代码,而是返回了一个生成器对象

b.当使用 next() (在 for 循环中会自动调用 next() ) 作用于返回的生成器对象时 函数 开始执行 在遇到 yield 的时候会停止  并返回当前的迭代值 当再次使用 next() 的时候 函数会从原来打断的地方继续执行 直到遇到 yield语 句 如果没有 yield 语句 则返回完所有元素后抛出异常

1、支持next函数

通过 next() 函数获得成器的下个返回值 每次调 next(g) ,就计算出 g 的下个元素的值,直到计算到最后个元素,没有更多的 元素时,抛出 StopIteration 的异常。

def yyqx()
    qzh = 0
    while qzh <= 5:
        yeild qzh
            qzh = qzh + 1

qzh = yyqx()

next(qzh)
next(qzh)
next(qzh)
next(qzh)
next(qzh)

2、使用for循环/使用for-in循环

Next函数点一次出一次 需要不断调用 生成器是可迭代对象 可以使用for循环

def yyqx()
    qzh = 0
    while qzh <= 5:
        yeild qzh
            qzh = qzh + 1

for qzh in yyqx()
    print(qzh)
  1. object内置的__next__()方法
  2. 特点

(1)上次调的所有局部变量都保持不

(2)节约内存

(4)迭代到下次的调时 所使的参数都是第次所保留下的 在整个所有函数调的参数都是第次所调时保留的 不是新创建的

你可能感兴趣的:(1024程序员节,python,学习,开发语言)