python进阶,在第一期的基础上做了极大的优化,整体更加美观易懂
十三、函数进阶 (下)
内容较多(该篇幅超过4000字),分为上下两个篇幅,此篇是下
13.6、参数形式
参数形式: 语法:lambda 参数列表:表达式(返回值)
13.6.1、无参数
d = lambda: 99 # 定义一个函数b,返回值为99
print(d()) # 结果:99
13.6.2、一个参数
d1 = lambda a: a # 定义一个函数d1,并有一个传参
print(d1(999)) # 结果:999
13.6.3、默认参数
func = lambda a, b, c = 250: a + b + c # c给了一个值,为250
print(func(10, 1)) # 不给c传值,c用默认值,默认为250
print(func(10, 1, 3)) # 给c传值,传的值会覆盖c原有的值
# 结果:
>>> 216
>>> 14
13.6.4、可变参数
可变参数:*args (包裹位置参数,返回的数据类型为元组),**kwargs (包裹关键字参数,关键字参数(以键等于值的形式去传))
func1 = lambda *args: args # 传入的值没有上限返回值args表示返回所有
print(func1(10, 20, 21))
print(func1(10, 11, 412, 13))
# 结果:
>>> (10, 20, 21)
>>> (10, 11, 412, 13)
func2 = lambda **kwargs: kwargs # 包裹关键字参数(以键等于值的形式去传)
print(func2(name="zs")) # 键等于值的形式去传参
print(func2(name="ls", age=60))
# 结果:
>>> {'name': 'zs'}
>>> {'name': 'ls', 'age': 60}
13.7、lambda表达式的应用
13.7.1、带判断的lambda
func3 = lambda a, b:a if a > b else b # lambda 接if判断
print(func3(5, 6))
# 结果:6
13.7.2、列表数据按字典key的值升序排序
13.7.2.1、name对应的值进行升序排序
stu = [
{"name": "wjk", "age": 21},
{"name": "wy", "age": 22},
{"name": "yyqx", "age": 19}
]
stu.sort(key=lambda a: a["name"]) # a指代字典,默认升序(后面的没写,具体看13.7.2.2)。name的值升序排序
print(stu)
# 结果:
>>> [{'name': 'wjk', 'age': 21}, {'name': 'wy', 'age': 22}, {'name': 'yyqx', 'age': 19}]
13.7.2.2、age对应的值进行降序
# .sort(key = None, reverse= False(升序)、True(降序))
# key = None:可以指定序列中的一个元素来进行排序
stu = [
{"name": "wjk", "age": 21},
{"name": "wy", "age": 22},
{"name": "yyqx", "age": 19}
]
stu.sort(key=lambda v: v["name"], reverse=True) # v默认为字典(用任意字母都可以),reverse=Tru指降序
print(stu)
# 结果:
>>> [{'name': 'yyqx', 'age': 19}, {'name': 'wy', 'age': 22}, {'name': 'wjk', 'age': 21}]
13.8、高阶函数
abs()函数:可以完成对数字求绝对值计算
print(abs(-10))
print(abs(-20))
print(abs(10))
# 结果:
>>> 10
>>> 20
>>> 10
print(round(1.4))
print(round(1.6))
# 结果:
>>> 1
>>> 2
小需求:输入两个数字,先进行数字处理(四舍五入+绝对值)再进行求和计算
方法一
def add_num(a, b): # 定义形参a, b
return abs(a) + abs(b) # abs()求绝对值,对传的参数做绝对值运算并相加,返回结果
print(add_num(-9.994, -89.235))
# 结果:99.229
def add_num01(a, b):
return round(a)+round(b)
print(add_num01(-90.996, 996.404))
# 结果:905
问题很大,于是出现了方法二
方法二->高阶函数-把函数作为参数传入
def add1(a, b, e):
return e(a) + e(b) #
print(add1(3.6, -4.4, abs)) # 结果:8.0
print(add1(3.9, 5.4, round)) # 结果:9
def add2(a, b, e, f):
return f(e(a)) + f(e(b))
print(add2(-3.9, 4.2, abs, round))
# 结果:8
13.9、内置高阶函数
list1 = [0, 1, 4, 8, 9]
def func1(x):
return x ** 2 # 计算变量x的二次方
result = map(func1, list1) # 对list中的元素做二次方操作
print(list(result)) # 要类型转换,否则出现乱码
# 结果:[0, 1, 16, 64, 81]
import functools
list2 = [1, 9, 6, 4, 0]
def func2(a, b): # fun2的作用,求两数和
return a + b
result = functools.reduce(func2, list2) # linst2中的元素相加
print(result)
# 结果:20
list3 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 需求,过滤偶数
def fun3(x): # fun3 取奇数
return x % 2 != 0
result = filter(fun3, list3) # 结果为0的过滤
print(list(result))
# 结果:[1, 3, 5, 7, 9]