【人生苦短,我学 Python】(11)函数(上)

发布时间:2024年01月22日

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 特别注意

  1. 如果传递给函数的实参是可变序列,那么在函数中修改的操作会覆盖到原可变序列。比如传入的是一个数组,哪怕你的形参与实参数组的名字不一样,它们映射的还是同一个数组地址,那么在函数体中修改数组的值,函数外的数组也会改变。可看下面示例:

    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]
    
  2. 如果形参命名和可变长度中的 **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
    
文章来源:https://blog.csdn.net/senlin_6688/article/details/135699399
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。