Python 所有文章传送门 |
---|
【Python】所有文章传送门 |
目录
简述 / 前言
这篇开始分享在做项目中用的最多的一个东西:函数,你可以会用别人写好的函数(比如第三方库的某个函数),又或者你会自己写一个函数来完成你要实现的功能,所以这节比较重要,但是内容并不难。鉴于此部分内容较多,所以应该会分成2篇文章分享~
1. 函数
1.1 函数的定义与调用
关键语法:
def 函数名(形参):
print(f'你输入的是:{形参}')
# return 形参 # 函数可以通过 return 返回值
实参 = '实参'
函数名(实参)
输出:
你输入的是:实参
插一嘴,虽然我们可以用中文来写函数,但是不建议这么做,毕竟不同的电脑有不同环境,有时候不同的解释器解析代码时很容易出错,其次我们的代码要国际化~
1.2 函数的形参要怎么排序
值得注意的是:函数可以没有形参,即没有传入值!
Python参数传递方法是传递对象引用,而不是传递对象的值。
1.2.1 位置参数
实参默认按位置顺序传递给对应的形参,实参和形参的顺序必须严格一致,并且实参和形参的数量必须相同。即:
def CSDN(a, b):
print(f'a = {a}')
print(f'b = {b}')
print()
CSDN(1, 2)
CSDN(b=2, a=1) # 通过关键字参数乱序传入实参
输出:
a = 1
b = 2
a = 1
b = 2
值得注意的是,虽然说是位置参数,但是默认情况下可以通过 关键字参数 来不按顺序传入实参。但是并不是什么情况下都可以这么用的,特殊情况见【1.2.4 指定使用形参格式】~
1.2.2 默认值参数(可选参数)
如果一个函数希望用到一个参数,但是这个参数基本上不会变化,那么可以通过设置默认值参数,这样在调用函数时就不用再传入这个实参了。即:
def CSDN(a, b=2024):
print(f'a = {a}')
print(f'b = {b}')
print()
CSDN(1)
CSDN(1, 2)
输出:
a = 1
b = 2024
a = 1
b = 2
1.2.3 可变长度参数
在形式参数名前加 1个*
或 2个**
。
*args
用来接受多个位置参数并将其放在一个元组中。**kwds
接受多个关键参数并存放到字典中。- 这类参数必须位于形参列表的最后位置。
示例:
def CSDN(a, b=2024, *args, **kwds):
print(f'a = {a}')
print(f'b = {b}')
print(f'args = {args}')
print(f'kwargs = {kwds}')
print()
CSDN(1, 2, 3, 4, 5, name='小邓在森林', age=18)
输出:
a = 1
b = 2
args = (3, 4, 5)
kwds= {'name': '小邓在森林', 'age': 18}
1.2.4 指定使用形参格式
在形参中,文末可以加入这两个符号:/
, *
。
位置 | 含义 |
---|---|
形参1, …, 形参m, /, … | 形参1~m都是位置参数,即只能通过顺序位置传入参数,不能使用关键字参数传值 |
…, /, 形参1, …, 形参m, *, … | 形参1~m即是位置参数,也是关键字参数,即可以通过顺序位置传入参数,也可以使用关键字参数传值,但是要注意的是:这个形参必须使默认值参数 |
…, *, 形参1, …, 形参m | 形参1~m都是关键字参数,即只能使用关键字参数传值 |
示例:
def CSDN(a, b=2024, /, c=0, d=-1, *, e, f=2025):
print(f'a = {a}')
print(f'b = {b}')
print(f'c = {c}')
print(f'd = {d}')
print(f'e = {e}')
print(f'f = {f}')
CSDN(0, 0, 0, d=0, e=0, f=0)
输出:
a = 0
b = 0
c = 0
d = 0
e = 0
f = 0
1.2.5 形参一般顺序
不考虑这两个符号:/
, *
的情况下,形参一般顺序为:位置参数、关键字参数、可变长度参数。
1.2.6 特别注意
-
如果传递给函数的实参是可变序列,那么在函数中修改的操作会覆盖到原可变序列。比如传入的是一个数组,哪怕你的形参与实参数组的名字不一样,它们映射的还是同一个数组地址,那么在函数体中修改数组的值,函数外的数组也会改变。可看下面示例:
def list_change(l1): l1[0] = 5 print(f'函数体中改变后的数组为:{l1}') l = [1, 2, 3] print(f'原数组为:{l}') list_change(l) print(f'原数组为:{l}')
输出:
原数组为:[1, 2, 3] 函数体中改变后的数组为:[5, 2, 3] 原数组为:[5, 2, 3]
-
如果形参命名和可变长度中的
**kwds
的键重名了,那么就要加上符号/
。
示例:def CSDN(name, **kwds): print('name' in kwds) CSDN('小邓在森林', **{'name': '小邓在森林'})
输出:
Traceback (most recent call last): File "D:\MyCode\Python_Code\PyCharm\CSDN.py", line 32, in <module> CSDN('小邓在森林', **{'name': '小邓在森林'}) TypeError: CSDN() got multiple values for argument 'name'
示例(加上符号
/
):def CSDN(name, /, **kwds): print('name' in kwds) CSDN('小邓在森林', **{'name': 2024})
输出:
True