跟光磊学Python开发-匿名函数函数和高阶函数
跟光磊学Python开发
匿名函数
匿名函数就是函数定义时没有名字的函数,也称为匿名表达式。
普通函数的定义方式如下
def 函数名(参数列表):
函数体
匿名函数的定义方式如下
lambda [形参1][形参2]:[单行表达式]或[函数调用]
lambda定义和普通函数的区别
lambda没有函数名
lambda参数列表没有括号
lambda函数体中只能实现简单的表达式或则函数调用
lambda函数不能使用return,if,while,for-in
lambda函数体可以使用if实现的三目运算符
一般情况下因为lambda的局限性,使得它不能实现复杂的功能,只能实现一些简单功能。在使用时一般会实现一些简单的一次性使用的场景。
在Python的世界里一切皆对象,函数、文件等等都是对象,每个对象都有对应的内存地址(即引用),通过引用找到该对象并使用它。
函数作为参数赋值给变量,通过赋值的变量调用函数
"""
函数名作为参数
函数名也是可以参与赋值
@author tony 18601767221@163.com
@version 2021-02-06 09:43:44
@since python3.9.1
"""
# 普通函数的定义和调用
def display():
print("Hello Python")
def show_info():
print("跟光磊学Python开发")
display()
# 将一个函数的引用display赋值给一个变量func
func = display
# 打印函数的引用地址
# func =
print("func = ", func)
# 通过func变量 调用func()函数
func()
def call_func(func):
"""
函数地址作为参数实现在一个函数调用另外一个函数的函数
:param func:
:return:
"""
func()
call_func(func)
call_func(show_info)
程序运行结果
匿名函数的定义、使用和注意事项
"""
匿名函数的定义、使用和注意事项
@author tony 18601767221@163.com
@version 2021-02-06 09:43:44
@since python3.9.1
"""
# 定义一个匿名函数 返回1+1的结果给函数变量func
func = lambda: 1 + 1
print(func)
print("1加1的结果是", func())
# 定义一个带参数的匿名函数,返回参数的10次方
func = lambda x: x ** 10
print("2的10次方是", func(2))
# 匿名函数的注意事项
# lambda默认返回计算结果,不需要return返回,如果加了return反而会报错 无效的语法
# func = lambda x, y: return x + y
func = lambda x, y: x + y
print("两个整数的和是", func(10, 20))
# 匿名函数不能使用循环 无效的语法
# func =lambda x,y:for i in range(x,y):print(i)
# func=lambda x:while x<100:print(x)
# 匿名函数不能使用if的三种格式
# func= lambda x:if x<10:print("参数小于10")
# 匿名函数使用if实现的三目运算符
func = lambda left, right: left if left > right else right
print("两个整数的最大值是", func(10, 20))
高阶函数-map
map会根据将提供的函数对指定的序列做映射,第一个参数function以参数序列中的每个元素调用function函数,返回包含每次function函数返回值的新列表
def square(x):
"""
求平方,该函数作为map()函数的第一个参数
因为map函数需要这个函数计算每个元素的值
所以该函数有且必须只能有一个参数
:param x:
:return:
"""
return x ** 2
# 普通函数作为map函数的参数参数
# square作为引用赋值给map()函数的形参
# result = map(square, int_list)
# lambda匿名函数作为map函数的参数
result = map(lambda x: x ** 2, int_list)
print("map函数的返回值类型", type(result))
for i in result:
print(i)
程序运行结果
自定义实现map函数
def custom_map(func, origin_list):
"""
自定义实现map函数
:param func: 函数
:param origin_list: 列表
:return: 列表
"""
# 定义一个列表作为返回参数
new_list = []
# 遍历参数列表
for i in origin_list:
# 将列表的元素传递给函数执行后将返回结果添加到新列表中
new_list.append(func(i))
# 返回新列表
return new_list
使用自定义实现map函数
result = custom_map(lambda x: x ** 2, int_list)
print("custom_map函数的返回值类型", type(result))
for i in result:
print(i)
程序运行结果
高阶函数-reduce
reduce()函数会对参数序列中的元素进行累计操作,例如累加求和,求阶乘,统计数量,字符串连接等。
reduce()函数在functools模块中,在使用前需要使用import functools导入该模块。
使用reduce()分别结合普通函数和匿名函数实现累加求和
"""
reduce()函数的使用
@author tony 18601767221@163.com
@version 2021-02-06 10:55:17
@since python3.9.1
"""
import functools
int_list = [1, 2, 3, 4, 5]
def custom_sum(left, right):
"""
返回两个参数的和
:param left:
:param right:
:return:
"""
return left + right
result = functools.reduce(custom_sum, int_list)
print("使用普通函数 result的类型是", type(result))
print("使用普通函数 累加求和的结果是 ", result)
result = functools.reduce((lambda value, element: value + element), int_list)
print("使用lambda匿名函数 result的类型是", type(result))
print("使用lambda匿名函数 累加求和的结果是 ", result)
程序运行结果
使用reduce()函数结合匿名函数实现字符串拼接
"""
使用reduce()实现字符串拼接,并转换为大写
@author tony 18601767221@163.com
@version 2021-02-06 11:22:40
@since python3.9.1
"""
import functools
str_list = ["h", "e", "l", "l", "o"]
result = functools.reduce(lambda s1, s2: str(s1 + s2).upper(), str_list)
print("result的类型是",type(result))
print("字符串拼接的结果是",result)
程序运行结果
使用reduce()函数结合匿名函数实现阶乘运算
"""
使用reduce求阶乘
@author tony 18601767221@163.com
@version 2021-02-06 11:27:39
@since python3.9.1
"""
import functools
int_list = [1, 2, 3, 4, 5]
result = functools.reduce(lambda n1, n2: n1 * n2, int_list)
print("阶乘的结果是", result)
程序运行结果
高阶函数-filter
filter函数用于过滤序列,过滤掉不符合条件的元素,返回一个filter对象,如果要转换成列表,可以使用list()方法转换。
该函数需要两个参数,一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回True或者False,最后将返回True的元素放到新列表中。
"""
filter()函数的使用
@author tony 18601767221@163.com
@version 2021-02-06 11:35:47
@since python3.9.1
"""
int_list = [i for i in range(1, 10)]
# 使用filer函数结合匿名函数实现奇数过滤
result = list(filter(lambda x: x % 2 == 0, int_list))
print("int_list过滤奇数后的结果是",result)
程序运行结果
使用filer()过滤列表中的数字字符串
"""
使用filer()过滤列表中的数字字符串
@author tony 18601767221@163.com
@version 2021-02-06 11:44:38
@since python3.9.1
"""
str_list = ["123", "456", "python", "go", "java"]
result = filter(lambda s: s.isdigit(), str_list)
print("str_list过滤列表汇总的数字字符串的结果是",list(result))
程序运行结果
列表排序
列表的sort()方法只支持基本类型的排序,例如整数的排序,默认顺序升序
"""
sort()函数与lambda
@author tony 18601767221@163.com
@version 2021-02-06 11:48:41
@since python3.9.1
"""
int_list = [1, 2, 4, 5, 7, 8, 9, 6, 3]
# 简单排序
print("排序之前int_list = ", int_list)
int_list.sort()
print("排序之后int_list = ", int_list)
程序运行结果
如果想要完成复杂类型的数据排序,例如字典类型的数据排序,可以通过参数key结合lamda函数来指定排序规则进行排序
product_list = [{"id": 1, "name": "iphone12 pro max", "price": 12999.99},
{"id": 3, "name": "华为mate40pro max", "price": 8999.99},
{"id": 2, "name": "小米11 pro", "price": 6999.99}]
print("排序之前product_list= ", product_list)
# sort()方法不能对字典进行排序
# TypeError: '
# product_list.sort()
print("初始化产品列表 product_list= ", product_list)
# 需求 按照ID的升序排序
product_list.sort(key=lambda d: d["id"])
print("按照ID的升序排序之后product_list= ", product_list)
product_list.sort(key=lambda d: d["price"], reverse=True)
print("按照价格降序排序之后product_list= ", product_list)
程序运行结果