Python - 函数进阶

目录

前言

一、不定长参数

1.1 *对应的不定长参数

1.2 **对应的不定长参数 

二、函数的返回值

2.1 什么是返回值

2.2 return的作用

三. 匿名函数

四. 参数高阶函数

4.1 什么是参数高阶函数

4.2 常见的参数高阶函数

4.2.1 max、min、sorted、列表.sort

4.2.2 map 

4.3.3 reduce

总结


前言

学习了基础函数之后,我们还需要掌握函数的高级用法(进阶函数)


一、不定长参数

1.1 *对应的不定长参数

1)定义函数的时候,可以在某一个形参前加*,让这个参数变成一个不定长参数,可以接受若干个实参
2)原理:让带*的形参变成一个元组,接收到的每个实参会变成元组中的元素

# 注意:如果一个函数中既有带*的不定长参数,又有定长参数,不定长参数后面的参数只能用关键字传参
#不定长前面的参数必须用位置传参

代码如下(示例):

def func1(*x):
    print(x)


func1(1, 2)
func1(1, 2, 3)
func1(1, 2, 3, 4)
func1(1, 2, 3, 4, 5)

#案例:定义一个函数,求多个数的和

def more_sum(*x):
    sum1 = 0
    for i in x:
        sum1 += i
    print(sum1)


more_sum(1, 2)
more_sum(1, 2, 3)
more_sum(1, 2, 3, 4)

1.2 **对应的不定长参数 

1)定义函数的时候在某一个形参前面加**,可以让这个形参变成一个不定长参数同时接收多个实参
2)原理:让带**的形参变成一个字典,接收到的每个实参变成字典中的元素
3)注意:调用函数的时候,**对应的不定长参数只能使用关键字传参,而且参数名可以是任何合法的变量名

代码如下(示例):

def func3(**x):
    print(x)


func3(a=10, b=20)
func3(name='xiaoming', age=18, sex='men')


def func4(x, *, y, z):       # x必须使用位置传参;y,z必须使用关键字传参
    pass


def func5(*args, **kwargs):   # 让func5在调用的时候可以以任何形式调用
    pass

二、函数的返回值

2.1 什么是返回值

函数返回值就是从函数内部传递到函数外部的数据

1)为什么需要返回值
在函数内部产生的数据,如果不作为函数的返回值,在函数调用结束的时候这个数据会被自动释放

2)什么时候需要返回值
如果实现函数的功能产生了新的数据,就需要将产生的新的数据作为返回值返回

3)怎么将数据作为返回值返回
将需要返回的数据放在关键字return的后面  ->   return:返回值
注意:如果执行函数体的时候没有遇到return,函数的返回值就是 None

4)怎么在函数外部使用函数的返回值
函数调用表达式的值就是函数的返回值

函数调用表达式:调用函数的那条语句

代码如下(示例):

def sum2(num1, num2):
    return num2 + num1


sum2(1, 2)   # 3
print(sum2(1, 2) + 3)
print(sum2(1, 2) + sum2(1, 6))

2.2 return的作用

1)将数据作为函数的返回值返回

2)提前结束函数 - 如果执行函数体的时候遇到return,函数直接结束

代码如下(示例):

def func1():
    print('hello world')
    print(100)
    return
    print('nihao')


func1()

三. 匿名函数

1)匿名函数的本质是函数,普通函数中除了定义函数的语法以外其他内容都适用于匿名函数。

2)语法: 函数名 = lambda 形参列表:返回值

代码如下(示例):

sum2 = lambda num1, num2: num1 + num2
print(sum2(1, 2))
print(sum2(num2=10, num1=20))

#练习:写一个匿名函数,判断指定的数是否是回文数

is_num = lambda num: str(num) == str(num)[::-1]
print(is_num(12321))

四. 参数高阶函数

4.1 什么是参数高阶函数

1.参数是函数的函数就是实参高阶函数;给参数的函数传参的时候可以使用普通函数的函数名,也可以使用匿名函数

2.参数x的要求:是个函数;函数有两个形参;有一个是数字的返回值

代码如下(示例):

def func1(x):
    print(x(10, 20) + 30)


def t(a, b):
    return a + b


func1(t)
func1(lambda x1, x2: x1 + x2)

4.2 常见的参数高阶函数

4.2.1 max、min、sorted、列表.sort

        a.max(序列) - 直接比较序列种元素的大小求最大值

        b.max(序列,key=函数) - 按照函数指定的比较规则比较序列中元素的大小求最大值

        c.函数的要求: a.有且只有一个参数,代表序列中的每个元素 b.需要一个返回值,返回值就是比较的对象

代码如下(示例):

nums = [98, 56, 45, 98, 78, 99, 100]
print(max(nums))

#案例1:求nums中个位数最大的元素

result = max(nums, key=lambda item: item % 10)  # 运用匿名函数找到每个元素的个位数
print(result)

4.2.2 map 

        a.map(函数,序列) - 按照函数制定规则基于指定序列中的元素创建一个新的序列 函数的要求:有且只有一个参数,代表序列中的每个元素 需要一个返回值,返回值就是新序列中的元素

        b.map(函数,序列1,系列2) 函数的要求:有且只有两个参数,分别代表后面两个序列中的每个元素 需要一个返回值,返回值就是新序列中的元素

        c.map(函数,序列1,序列2,序列3)

代码如下(示例):

# 案例1 :提取nums中所有元素的个位数

nums = [98, 56, 45, 98, 78, 99, 100]
result = list(map(lambda item: item % 10, nums))
print(result)

# 案例2:提取students中所有学生的名字

students = [
    {'name': '张三', 'score': 98, 'age': 18, 'gender': '男'},
    {'name': '李四', 'score': 82, 'age': 20, 'gender': '女'},
    {'name': '王五', 'score': 77, 'age': 33, 'gender': '女'},
    {'name': '张六', 'score': 99, 'age': 19, 'gender': '男'},
    {'name': '何琪', 'score': 56, 'age': 22, 'gender': '女'}
]
result = list(map(lambda item: item['name'], students))
print(result)

4.3.3 reduce

        a.reduce(函数,序列,默认值) - 按照函数制定的规则将序列中的元素合并成一个数据

        b.函数的要求:有且只有两个参数,第一个参数代表默认值,第二个参数代表序列中的元素 需要一个返回值,返回值就是合并方式

代码如下(示例):

from functools import reduce
# 相加
nums = [11, 20, 30, 40, 50]
result = reduce(lambda i, item: i + item, nums, 0)
print(result)

# 相乘
result = reduce(lambda i, item: i * item, nums, 1)
print(result)

# 个位数相加
result = reduce(lambda i, item: i + item % 10, nums, 0)
print(result)

# 拼接
result = reduce(lambda i, item: i + str(item), nums, '')
print(int(result))

总结

        函数的高阶用法让我们能够迅速并且更加简单的代码实现现实生活中面临的问题,通过本篇的学习,可以加强对函数高阶用法的掌握

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>