Python基础(11):Python中函数参数的进阶模式详解

练习最大的收获就是先进行模仿,在发现问题,解决问题,最后掌握!

**上一篇文章题目:**Python基础(10):Python函数基础详解

链接: https://blog.csdn.net/2501_94250394/article/details/156517202?spm=1001.2014.3001.5501


前言

前面给小伙伴们分享了Python函数基础知识,今天和大家一起学习一下进阶模式,一起来探索一下,看看都有哪些神奇的知识点。旅程开始:

偷瞄一眼今天的内容:

一、函数的参数进阶

1.1 函数的参数

在函数定义与调用时,我们可以根据自己的需求来实现参数的传递。在Python中,函数的参数一共有两种形式:

① 形参 ② 实参(昨天文章的拓展内容里面也进行了解释)

形参:在函数定义时,所编写的参数就称之为形式参数,也就是定义函数时括号内声明的参数,仅作为接收数据的占位符,无具体实际值,比如add_num(a, b)里面的a和b。

实参:在函数调用时,所传递的参数就称之为实际参数,也就是调用函数时括号内传入的具体数据或变量,用于给对应形参赋值,比如add_num(3, 5)里面的3和5。

案例:

python 复制代码
def greet(name):  # name:形参(局部变量)
    return name + ',您好'

# 调用函数
name = '张三'  # name:全局变量(存储实参值)
result = greet(name)  # 传递实参值'张三'给形参name
print(result)  # 输出:张三,您好

1.2 函数的参数类型(调用)

我们在传参的时候有一下几种方式,大家可以选择自己喜欢的方式。

1.2.1 位置参数

理论上,在函数定义时,我们可以为其定义多个参数,这是 Python 函数参数的基础形式。位置参数的核心是按照参数定义的先后位置,进行一一对应的传递 ,即在函数调用时,传递的实参数量必须与函数定义的位置参数数量完全一致(不能多也不能少),且实参的顺序必须和形参的定义顺序严格匹配。

案例:

python 复制代码
# 定义函数,其中name、age、address均为位置参数(按顺序声明,调用时需按对应位置传递实参)
def user_info(name, age, address):
    # 按位置参数接收的值,格式化输出个人信息
    print(f'我的名字{name},今年{age}岁了,家里住在{address}')

# 调用函数:使用位置参数传递方式,实参与形参按定义顺序一一对应
# 第1个实参'Tom' 对应 函数定义中第1个位置形参name
# 第2个实参23    对应 函数定义中第2个位置形参age
# 第3个实参'美国纽约' 对应 函数定义中第3个位置形参address
# 位置参数要求实参顺序与形参顺序完全一致,不可随意颠倒
user_info('Tom', 23, '美国纽约')
1.2.2 关键词参数(Python特有)

关键词参数是 Python 中灵活便捷的参数传递形式,其核心是通过 "键 = 值" 的形式明确指定实参对应的形参,其中 "键" 必须是函数定义时声明的形参名称,"值" 是要传递给该形参的具体数据。这种传递方式可以让函数调用的语义更加清晰、容易理解,使用者无需记忆形参的定义顺序,同时也彻底清除了参数传递的顺序限制

案例:

python 复制代码
# 定义函数,声明三个形参:name、age、address(用于接收后续调用时传递的参数值)
def user_info(name, age, address):
    # 格式化输出接收的参数值,展示个人信息
    print(f'我的名字{name},今年{age}岁了,家里住在{address}')

# 调用函数:采用Python关键词参数(键=值)的传递方式
# 关键词参数通过"形参名=实参值"的形式明确指定对应关系,无需依赖形参定义顺序
# name='Tom':明确将实参'Tom'传递给形参name
# age=23:明确将实参23传递给形参age
# address='美国纽约':明确将实参'美国纽约'传递给形参address
# 该传参方式语义清晰,可读性更强,即使打乱参数顺序也能正确赋值
user_info(name='Tom', age=23, address='美国纽约')

#关键词传参不需要遵照形参的顺序,比如下面的形式也成立
user_info(age=23, address='美国纽约',name='Tom')
1.2.3 函数定义时缺省参数(参数默认值)

缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值

**注意:所有位置参数必须出现在默认参数前,包括函数定义和调用,**我们在定义缺省参数时,一定要把其写在参数列表的最后侧。

案例:

python 复制代码
# 定义函数:name、age是位置参数,gender是缺省参数(默认值为'男')
def user_info(name, age, gender='男'):
    # 格式化输出个人信息
    print(f'我的名字{name},今年{age}岁了,我的性别为{gender}')

# 调用函数:未传gender,使用默认值'男'
user_info('李林', 25)
# 调用函数:未传gender,使用默认值'男'
user_info('振华', 28)
# 调用函数:传递gender='女',覆盖默认值
user_info('婉儿', 18, '女')

1.3 不定长参数

不定长参数(又称可变参数)是 Python 为解决函数调用时参数数量不确定 (可传递 0 个、1 个或多个参数,甚至不传参)的场景设计的参数类型,核心通过包裹(packing)机制 ,将多个零散参数打包成一个聚合数据类型进行处理,主要分为两种形式包裹位置参数(*args包裹关键字参数(**kwargs,二者分工明确,覆盖不同的传参场景。

光看文字可能有点枯燥和不懂,我们来看看具体的案例,加深一下印象和理解。

案例:

不定长元组(位置)参数

python 复制代码
# 定义一个接收可变数量位置参数的函数,用于输出用户基础信息
def user_info(*args):
    #打印args参数,用于查看其存储格式
    print(args)  # 元组类型数据,对传递参数有顺序要求,参数会按传入顺序打包进元组
    # 格式化输出用户信息,通过元组索引获取对应位置的参数值
    # args[0]:获取传入的第1个参数(姓名)
    # args[1]:获取传入的第2个参数(年龄)
    # args[2]:获取传入的第3个参数(居住地)
    print(f'我的名字{args[0]},今年{args[1]}岁了,住在{args[2]}')

# 调用函数,传递参数
# 按「姓名、年龄、居住地」的顺序传递3个位置参数,参数会被自动打包成元组传入args
user_info('Tom', 23, '美国纽约')

不定长字典(关键字)参数

python 复制代码
def user_info(**kwargs):
    # print(kwargs)  # 字典类型数据,对传递参数没有顺序要求,格式要求key = value值
    print(f'我的名字{kwargs["name"]},今年{kwargs["age"]}岁了,住在{kwargs["address"]}')

# 调用函数,传递参数
user_info(name='Tom', address='美国纽约', age=23)

**注意:**kw = keyword + args;无论是包裹位置传递还是包裹关键字传递,都是一个组包的过程。

Python组包:就是把多个数据组成元组或者字典的过程。

二、lambda函数

2.1 普通函数与匿名函数的区别

Python 普通函数(def定义,有名)支持复杂逻辑、灵活返回值,适用于重复调用和维护扩展;匿名函数(lambda定义,无名)仅单行表达式、自动返回结果,适用于临时简单功能或高阶函数参数

注意:如果一个函数有一个返回值,并且只有一句代码,可以使用 lambda简化。

2.2 lambda表达式基本语法

基本语法:

python 复制代码
变量 = lambda 函数参数:表达式(函数代码 + return返回值)
# 调用变量
变量()

案例:编写表达式

定义一个函数,经过一系列操作,最终返回100

python 复制代码
def fn1():
    return 100

# 调用fn1函数
print(fn1)  # 返回fn1函数在内存中的地址
print(fn1())  # 代表找到fn1函数的地址并立即执行

lambda表达式进行简化:

python 复制代码
fn2 = lambda : 100

print(fn2)  # 返回fn2在内存中的地址
print(fn2())

2.3 lambda表达式

2.3.1 带参数的lambda表达式:

比如编写一个函数求两个数的和:

python 复制代码
def fn1(num1, num2):
    return num1 + num2

print(fn1(10, 20))

lambda表达式进行简化:

python 复制代码
fn2 = lambda num1, num2:num1 + num2

print(fn2(10, 20))
2.3.2 带默认参数的lambda表达式
python 复制代码
fn = lambda a, b, c=100 : a + b + c
print(fn(10, 20))
2.3.3 带if判断(三目运算符)的lambda表达式
python 复制代码
fn = lambda a, b : a if a > b else b

print(fn(10, 20))

2.4 列表数据+字典数据排序(重点)

知识点:列表.sort(key=排序的key索引, reverse=True)

注意具体案例,稍微字典和元组稍微有点区别

案例:

python 复制代码
# 元素是元组,格式:(姓名, 年龄),索引0=姓名,索引1=年龄
student_tuples = [('Tom', 20), ('Rose', 19), ('Jack', 22)]
# key=lambda x: x[0] 就是指定"元组索引0"作为排序key,对应"排序的key索引"
student_tuples.sort(key=lambda x: x[0])  # 按索引0(姓名)排序

案例:

注意:在字典里面,key 后面并不是真正的 "列表索引",而是指定字典的键作为排序依据

python 复制代码
# 定义一个存储学生信息的字典列表,每个元素是包含name和age的字典
students = [
    {'name': 'Tom', 'age': 20},
    {'name': 'Rose', 'age': 19},
    {'name': 'Jack', 'age': 22}
]

# 按学生name对应的值进行升序排列(默认reverse=False,无需显式指定)
# key=lambda x: x['name']:lambda接收列表中的每个字典元素x,返回x的'name'值作为排序关键字
# 排序后姓名顺序:Jack → Rose → Tom
students.sort(key=lambda x: x['name'])  # Jack/Rose/Tom
# 打印按姓名升序排序后的学生列表
print(students)

# 按学生name对应的值进行降序排列
# reverse=True:开启降序排序,覆盖默认的升序规则
# 排序后姓名顺序:Tom → Rose → Jack
students.sort(key=lambda x: x['name'], reverse=True)
# 打印按姓名降序排序后的学生列表
print(students)

# 按学生年龄age对应的值进行升序排列
# key=lambda x: x['age']:lambda接收列表中的每个字典元素x,返回x的'age'值作为排序关键字
# 排序后年龄顺序:19(Rose)→ 20(Tom)→ 22(Jack)
students.sort(key=lambda x: x['age'])
# 打印按年龄升序排序后的学生列表
print(students)

三、总结

转眼Python基础知识分享就快要结束了,不知道我分享的内容对于小伙伴来说通俗易懂不?我最近也抽空看了一下,感觉文字内容写太多吧,又害怕小伙伴们抓不住重点,写太少吧,也害怕大家不好理解,最近稍微有点矛盾,希望小伙伴们也在评论区发表一下建议,我后期进行修改。

今天突然发现Coze扣子首页竟然进行了更新,变得更加简单容易操作了,之前搭建智能体和工作流都需要手动一个一个操作,现在直接可以和ai交流,ai直接就可以一步完成了,操作确实简化了好多。

所以我准备在Python基础知识分享完毕之后,给大家分享一期实用的工具集,之后开始分享如何利用Coze平台搭建属于自己的智能体和业务工作流!!!


上述内容会根据大家的评论和实际情况进行实时更新和改进。

麻烦小伙伴们动一动发财的小手,给小弟点个赞和收藏,如果能获得小伙伴的关注将是我无上的荣耀和前进的动力。

小伙伴们,我是AI大佬的小弟,希望大家喜欢!!!

晚安,兄弟们。

相关推荐
smj2302_796826527 小时前
解决leetcode第3801题合并有序列表的最小成本
数据结构·python·算法·leetcode
AI数据皮皮侠7 小时前
中国乡村旅游重点村镇数据
大数据·人工智能·python·深度学习·机器学习
小北方城市网8 小时前
第 11 课:Python 全栈项目进阶与职业发展指南|从项目到职场的无缝衔接(课程终章・进阶篇)
大数据·开发语言·人工智能·python·数据库架构·geo
danyang_Q8 小时前
d2l安装(miniforge+cuda+pytorch)
人工智能·pytorch·python
源码梦想家8 小时前
多语言高性能异步任务队列与实时监控实践:Python、Java、Go、C++实战解析
开发语言·python
百***78759 小时前
Gemini 3.0 Pro与2.5深度对比:技术升级与开发实战指南
开发语言·python·gpt
reasonsummer9 小时前
【教学类-122-01】20260105“折纸-东南西北中”(4个方向文字,9个小图案)
python·通义万相
智航GIS9 小时前
9.6 JSON 基本操作
python·json
@zulnger9 小时前
python 学习笔记(文件读写)
笔记·python·学习
weixin_4624462310 小时前
Python 使用 Tkinter + openpyxl 处理 Excel 文件并显示实时进度条
python·excel·tkinter