快速学习Python基础知识详细图文教程9--函数进阶

来源引用网络知识与某站曹老师视频相互结合学习记录,仅供参考!

Python 基础知识

函数进阶

函数的多返回值

在复杂业务情况下,函数是可以有多个返回值的,类型也不限制;

语法是 return 返回值 1,返回值 2,...返回值 n

return 表达式 语句用于退出函数,选择性地向调用方返回一个表达式;不带参数值的 return 语句返回 None;

复制代码
def apple():
    return 1, 'python', True

调用函数返回类型是元组 tuple 类型,元组类型数据再进行取值时通过遍历即可;

复制代码
# 定义一个多返回值的函数
def apple():
    return 1, 'python', True


# 返回元组类型
result = apple()
print(f'result={result},type={type(result)}')


运行输出结果:
result=(1, 'python', True),type=<class 'tuple'>

调用函数返回时通过多个变量进行接收;

复制代码
# 定义一个多返回值的函数
def apple():
    return 1, 'python', True


# 返回元组类型
result = apple()
print(f'result={result},type={type(result)}')


# 通过多个变量接收
a, b, c = apple()
print(f'a={a}, b={b}, c={c}')


运行输出结果:
result=(1, 'python', True),type=<class 'tuple'>
a=1, b=python, c=True

函数的不定长参数

在之前学习 Python 基础知识 3--函数时有介绍过位置参数,关键字参数,默认值参数;所以现在开始学习一个不定长参数,它主要是用于不确定调用的时候会传递多少个参数的测试场景(可能需要一个函数能处理比当初声明时更多的参数,这种参数叫做不定长参数,声明时不会命名);不定长参数的类型分为位置传递和关键字传递两种。

不定长参数(位置传递)

加了星号 *(一个 * 星号)的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数;

如果在函数调用时没有指定参数,它就是一个空元组。我们也可以不向函数传递未命名的变量;

一般通过元组 tuple 类型的 *args 来实现;

复制代码
def apple(*args):
    print(args, type(args))


apple(1, '2', "3")
apple(True, 1, '456', 3.1415926)
# 可不传任何参数,返回一个空的元组
apple()


运行输出结果:
(1, '2', '3') <class 'tuple'>
(True, 1, '456', 3.1415926) <class 'tuple'>
() <class 'tuple'>
不定长参数(关键字传递)

加了两个星号 ** 的参数会以字典的形式导入,可以通过字典 dict 类型 **kwargs 来实现;

复制代码
def apple(**kwargs):
    print(kwargs, type(kwargs))


apple(name="张三", age=11)
apple()


运行输出结果:
{'name': '张三', 'age': 11} <class 'dict'>
{} <class 'dict'>

使用函数变量

Python 语言中的函数也是一种值;所有函数都是 function 对象,这意味着可以把函数本身赋值给变量;

复制代码
# 定义计算两个参数相加的函数
def add(x, y):
    return x + y

# 将add自定义函数赋值给my_add,则my_add可以被当做是"add"使用
my_add = add

# 调用my_add函数
print(my_add(2, 3))

print(add(1, 1))


运行输出结果:
5
2

使用函数作为函数形参

有些时候可能需要定义一个函数,该函数的大部分计算逻辑都能确定,但某些处理逻辑暂时无法确定,这意味着某些程序代码需要动态改变时,如果希望调用函数时能动态传入这些代码,那么就需要在函数中定义函数形参,这样即可在调用该函数时传入不同的函数作为参数,从而动态改变这段代码。

1、def func(): --自定义一个函数;

2、def func(x, y): --比如说有两个参数,分别是 x 和 y;

3、def func(x, y, fn): --但是此时具体还不知道 x 和 y 是怎么处理?可以是做加法处理,也可以是做减法处理,只有在调用时才能够确定,这时的话只要直接传入一个函数参数 fn(自定义) 就行了;把函数传进去操作即可;

4、return fn() --然后 return,fn()做为函数;

5、return fn(x, y) -- fn 就是一个函数,然后操作,返回结果;

6、再自定义两个,一个定义加法、一个定义减法;

7、执行调用(在调用时才确认需要调用哪个方法);

复制代码
# 自定义函数
def func(x, y, fn):
    return fn(x, y)

# 定义加法
def add(x, y):
    return x + y

# 定义减法
def sub(x, y):
    return x - y

# 调用加法
print(func(2, 1, add))
# 调用加法
print(func(2, 1, sub))


运行输出结果:
3
1

使用函数作为返回值

在 Python 语言中还支持使用函数作为其他函数的返回值(一般用的不多,学习了解);

1、def func(bol): --自定义一个函数,返回类型是布尔类型;

2、根据实际业务选择(传来参数或者里面做一大堆业务逻辑),例如做一个判断;

3、根据 bol 类型返回一个方法;如果 bol 类型是 True 就返回 add 方法,若是 False 就返回减法;(这里举例是一个简单逻辑,可根据实际选择,在一大堆业务逻辑操作中根据不同的情况返回多种方法)

复制代码
# 自定义函数
def func(bol):
    if bol:
        return add
    else:
        return sub

def add(x, y):
    return x + y

def sub(x, y):
    return x - y

b1 = func(True)
print(b1, b1(1, 2))
b2 = func(False)
print(b2, b2(1, 2))


运行输出结果:
<function add at 0x0000023C5B589080> 3
<function sub at 0x0000023C5B505A80> -1

lambda 匿名函数

上面所介绍的函数定义都是有函数名的,现在开始学习的 lambda 函数是没有名称的,也就是匿名函数。

在只需要一次性使用的函数的时候,就可以用 lambda 匿名函数,简单方便快捷;

lambda 匿名函数语法:lambda 传入参数:函数体

注意:函数体只能写一行,不支持多行;

复制代码
# 自定义函数
def func(x, y, fn):
    return fn(x, y)


# 使用lambda匿名函数
print(func(2, 1, lambda x, y: x + y))


运行输出结果:
3

其他,把 sub 函数变量传参改成 lambda 匿名函数传参;

复制代码
# 自定义函数
def func(x, y, fn):
    return fn(x, y)


# 使用lambda匿名函数
print(func(2, 1, lambda x, y: x - y))


运行输出结果:
1

Python lambda(匿名函数)

Python 使用 lambda 来创建匿名函数,lambda 函数是一种小型、匿名的、内联函数,它可以具有任意数量的参数,但只能有一个表达式;匿名函数不需要使用 def 关键字定义完整函数,lambda 函数通常用于编写简单的、单行的函数,通常在需要函数作为参数传递的情况下使用;例如在 map()、filter()、reduce() 等函数中。

lambda 函数特点:
  • lambda 函数是匿名的,它们没有函数名称,只能通过赋值给变量或作为参数传递给其他函数来使用。

  • lambda 函数通常只包含一行代码,这使得它们适用于编写简单的函数。

    lambda arguments: expression

    lambda是 Python 的关键字,用于定义 lambda 函数。

    arguments 是参数列表,可以包含零个或多个参数,但必须在冒号(:)前指定。

    expression 是一个表达式,用于计算并返回函数的结果。

没有参数的 lambda 函数
复制代码
# 没有参数的 lambda 函数
myla = lambda: "Hello, World!!"

# 打印输出
print(myla())


运行输出结果:
Hello, World!!

使用 lambda 创建匿名函数;

复制代码
# 设置一个函数参数 a,函数计算参数 a 加 50,并返回结果:
myla = lambda a : a + 50
# a=5
print(myla(5))


运行输出结果:
55
设置多个参数的 lambda 函数
复制代码
# 设置函数参数 a和b 相乘,并返回结果:
myla = lambda a, b : a * b
# a=10,b=20
print(myla(10, 20))


运行输出结果:
200

lambda 函数也可以设置多个参数,参数使用逗号 , 隔开;

复制代码
# 设置函数参数 a、b 和 c 相加,并返回结果:
myla = lambda a, b, c : a + b + c
# a=1,b=2,c=3
print(myla(1, 2, 3))


运行输出结果:
6

lambda 函数通常与内置函数如 map()、filter() 和 reduce() 一起使用,以便在集合上执行操作。

复制代码
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared)


运行输出结果:
[1, 4, 9, 16, 25]

使用 lambda 函数与 filter() 一起,筛选偶数;

复制代码
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)


运行输出结果:
[2, 4, 6, 8]

使用 reduce() 和 lambda 表达式演示如何计算一个序列的累积乘积;

复制代码
# 导包
from functools import reduce

numbers = [1, 2, 3, 4, 5]

# 使用 reduce() 和 lambda 函数计算乘积
product = reduce(lambda x, y: x * y, numbers)

print(product)


运行输出结果:
120

reduce() 函数通过遍历 numbers 列表,并使用 lambda 函数将累积的结果不断更新,最终得到了 1 * 2 * 3 * 4 * 5 = 120 的结果。

未完待续......

相关推荐
weixin_408099675 小时前
2026 图片去水印 API 接口完全指南:一键去除图片水印(附 Python/Java/PHP/C# 示例)
java·python·php·图片处理·api调用·图片去水印·石榴智能
爱喝水的鱼丶5 小时前
SAP-ABAP:ALV通用封装实践——搭建可复用的ALV开发工具类,减少80%重复代码
开发语言·性能优化·sap·abap·erp·alv
去码头整点薯条ing5 小时前
某当网登录滑块【协议+OCR】
爬虫·python·ocr
脱胎换骨-军哥5 小时前
C++/Rust无缝互操作:混合系统新常态
开发语言·c++·rust
川石课堂软件测试6 小时前
安全测试|常见SQL注入攻击方式、实例及预防
服务器·数据库·sql·功能测试·测试工具·安全·单元测试
songroom6 小时前
Kimi K3:Rust封装XTP接口详细教程实践
开发语言·后端·rust
世人万千丶6 小时前
鸿蒙Flutter Flexible与Expanded的区别
学习·flutter·harmonyos·鸿蒙
kebeiovo6 小时前
游戏服务端开发:Actor模型详解(Go语言)
开发语言·后端·golang
赶紧写完去睡觉6 小时前
Anaconda 创建虚拟环境与使用
python·pycharm·conda