python使用lambda表达式来创建匿名函数
语法
// lambda 参数们:对参数的处理 lambda x : 2 * x // x 是参数, 2*x 是返回值 //使用lambda实现求和 sum = lambda arg1, arg2 : agr1 + arg2 print(sum(10,20)) // 将匿名函数封装在一个函数里面,可以用同样的代码来创建多个匿名函数 def myfunc(n): return lambda a : a * n mydoubler myfunc(2) mytripler myfunc(3) print(mydoubler(11)) // 2 * 11 print(mytripler(11)) // 3 * 11
lambda函数不能访问自己的参数列表以外或者全局命名空间里面的参数
lambda的主体是一个表达式而不是代码块,仅仅能封装有限的逻辑进去
列表推导式
[表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件] [out_exp_res for out_exp in input_list if condition] // 例子 l = [1,2,3] [print(item) for item in l if item > 1]
字典推导式
{key_expr:value_expr for value in colletion if conditon} key_expr:新key生成表达式,可以是有返回值的函数 value_expr:新value生成表达式,可以是有返回值的函数 for value in colletion if conditon:迭代colletion中满足条件的value传入到key_expr:value_expr中
集合推导式
{expression for item in Sequence if condition} expression:新元素生成表达式,可以是有返回值的函数体 for item in Sequence if condition:将满足条件的Sequence迭代传入expression表达式
元组表达式【生成器表达式】
元组推导式可以利用range区间,元组,列表,字典和集合等数据类型,快速生成一个满足指定要求的元组
(expression for item in Sequence if condition) expression:新元素生成表达式,可以是有返回值的函数体 for item in Sequence if condition:将满足条件的Sequence迭代传入expression表达式
enumerate()函数用于将一个可遍历的数据对象组合为一个索引序列,同时列出数据和数据下标
enumerate(sequence,[start=0])
sequence为一个序列,迭代器,或者其它支持迭代对象,返回的是一个enumerate对象
通过enumerate对象的遍历,可以获得索引于数据的组合对
list = ['1','2','3','4'] for index, value in enumerate(list): print(f'第{index},{value}') # 结果如下 第0,1 第1,2 第2,3 第3,4
迭代器是访问集合元素的一种方式,迭代器特征为:
是一个可以记住遍历位置的对象
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能往前而不会后退
迭代器有两个基本方法:iter()和next(),字符串,列表,元组都可以用于创建迭代器
迭代器对象可以用for进行遍历,也可以使用next()函数来获取下一个值
list = ['1','2','3','4'] my_iterator = iter(list) while True: try: element = next(my_iterator) print(element) except StopIteration: # 迭代结束,退出循环 break
生成器:使用了yield的函数被称为生成器(generator)
生成器是一个返回迭代器的函数,只能用于迭代操作,简单说生成器就是一个迭代器
在调用生成器的运行过程中,每次遇到yield式函数都会暂停并保存当前所有信息,返回yield的值。并在下一次执行next()方法时从当前位置继续运行
调用一个生成器函数,返回的是一个迭代器对象
# 定义一个生成器函数 def my_generatpr(n): for i in range(n): # 使用yield语句返回元素 yield i * i # 创建一个生成器对象并遍历元素 for element in my_generatpr(5): print(element)
迭代器和生成器的作用:
节约内存:循环过程中,数据不用一次读入,迭代器不会保存所有值。而是在运行中动态的计算出数列的各个值,并将之前的数值扔掉
不依赖索引取值
实现惰性计算:需要时再取值计算
精简代码:使用yield关键字或者生成器表达式可以很方便的生成一个迭代器对象
函数装饰器:本质上是一个python函数,可以让其它函数在不需要做任何代码改动的前提下增加额外功能
提供了@符号作为装饰器的语法糖
使用语法糖要求装饰件函数必须retrurn一个对象
# 定义一个函数装饰器 def my_decorator(func): def wrapper(): print("Before function call") func() print("After function call") return wrapper() # 使用函数装饰器 # 原有功能:打印”hello world“ @my_decorator def say_hello(): print("hello world") #调用函数 say_hello() # 结果 TypeError: 'NoneType' object is not callable Before function call hello world After function call
类装饰器
可以用来改变类的行为,由python类和@符号组成,在python中通常用于实现代码复用,日志记录,性能测试等功能
# 定义一个类装饰器 class MyClassDecorator: def __init__(self, cls): self.cls = cls def __call__(self, *args, **kwargs): new_args = "Dear " + args[0] instance = self.cls(new_args, **kwargs) return instance # 使用类装饰器 # 原有功能:打印 hello+名字 @MyClassDecorator class MyClass: def __init__(self, name): self.name = name def say_hello(self): print(f"hello, {self.name}") # 创建实例 my_object = MyClass("Alice") # 调用实例的方法 my_object.say_hello() # 打印的结果hello,DearAlice
需要注意的是,装饰器本身并不会改变原始代码的功能,而是通过创建一个新的函数来实现对原始函数或者类的修改,因此,在使用装饰器时,需要确保新创建的函数或者类与原始代码有相同的接口或者行为,以免对其它依赖于改代码的程序产生影响。