专栏首页python3Python的函数参数

Python的函数参数

前言

python中 函数的参数可以分为两大类形参和实参~

def func(x, y):     # x, y 就是形参
    print(x, y)

func(2, 3)           # 2, 3 就是实参

- 形参

形参(如上面的x, y)仅在定义的函数中有效,函数调用结束后,不能再使用该形参变量。在调用函数时,该函数中的形参才会被分配内存,并赋值;函数调用结束,分配的内存空间也随即释放~

- 实参

即在调用函数时,向该函数的形参传递确定的值(必须是确定的值)。传递的值可以是常量、变量、表达式、函数等形式~

在形参和实参中又可以细化为多种参数,例如形参中有 位置形参,默认形参,可变长参数...;实参中有位置实参,关键字实参等,下面一一介绍~

位置参数

位置参数顾名思义,按照从左到右的顺序依次定义的参数。位置参数有两种:位置形参和位置实参。上面示例中,func函数中的x,y就是位置形参,每一个位置形参都必须被传值。调用func时传递的2,3就是位置实参,位置实参与位置形参一一对应,不能多也不能少~

关键字参数

关键字参数针对实参,即实参在定义时,按照 key=value 形式定义

def func(x, y, z):
    print(x, y, z)

func(1, z = 2, y = 3)

关键字参数可以不用像位置参数一样与形参一一对应,例如这里可以是 z 在前面,y 在后面。

使用注意点: 1)在调用函数时,位置实参 必须在 关键字实参的前面~

def func(x, y, z):
    print(x, y, z)

# 位置参数和关键字参数混合使用的时候
func(1, z = 2, y = 3)      # 正确

func(x = 1, z = 2, 3)      # 错误

2)一个形参不能重复传值

def func(x, y, z):
    print(x, y, z)

func(1, x = 2, y = 3, z = 4)     # 错误,形参 x 重复传值

默认参数

默认参数即在函数定义阶段,就已经为形参赋值

def function(x, y=10):   # y 即为默认参数
    pass

# 函数调用阶段,必须为 x 传值(位置形参),可以为 y 传值,也可以不传,不传值就使用默认值 10

function(1)    # x = 1,y = 10
function(1,2)    # x = 1,y = 2

默认参数使用的注意点: 1)定义函数时,默认形参必须放在位置形参后面

def func(y = 10, x):     # 错误
    pass

def func(x, y = 10):    # 正确
    pass

2)默认参数通常要定义成不可变类型,例如:数字,字符串,元组等;虽然语法上支持定义成可变类型,但一般不建议这么做

3)默认参数只在定义阶段被赋值一次,如下示例:

x=10
def func(name, age = x):
    pass

x=20
func('hello')

Tip:func函数在定义时,age 只被赋值一次,即 age=10,下面重新指定了 x=20,不会再作用于函数中的 age 参数

可变长参数

在定义函数时,若不确定调用时需要传入多少个参数,这时就可以使用可变长参数,即实参的个数不固定

可变长参数 可以分为两类: 1)按位置定义的可变长度的实参(*) 2)按关键字定义的可变长度的实参(**)

- 按位置定义的可变长度的实参

def func(x, y, *args):   # *args 会把传入的 多余的 参数以一个元组的形式存放,元组的变量名就是args
    print(x, y)
    print(args)

func(1, 2, 3, 4, 5, 6)   # x=1, y=2, args=(3,4,5)

# 输出结果:
1 2
(3, 4, 5, 6)

Tip:'args = (3, 4, 5, 6)',所以 '*args = *(3, 4, 5, 6) ',在调用函数时,也可以使用如下方式传值( * 是用来处理位置参数的,表示把后面的元组拆开)

func(1, 2, *(3, 4, 5, 6))          # 等同于 func(1, 2, 3, 4, 5, 6) 
# 输出结果:                       # 结果一致
1 2
(3, 4, 5, 6)

- 按关键字定义的可变长度的实参

def func(x, y, **kwargs):         # **kwargs 会把多传入的参数以 dict 形式存放
    print(x, y)
    print(kwargs)

func(1, 2, a = 3, b = 4, c = 5)  # x=1, y=2, kwargs={'a': 3, 'b': 4, 'c': 5}

# 输出结果:
1 2
{'a': 3, 'b': 4, 'c': 5}

Tip:'kwargs = {'a': 3, 'b': 4, 'c': 5}',所以 ' **kwargs = **{'a': 3, 'b': 4, 'c': 5}',在调用函数时,也可以使用如下方式传值(** 表示关键字形式的实参,** 会将字典拆开,以关键字的形式传入)

func(1, 2, **{'a': 3, 'b': 4, 'c': 5} )  # 等同于 func(1, 2, a = 3, b = 4, c = 5)
# 输出结果:                                # 输出结果一致
1 2
{'a': 3, 'b': 4, 'c': 5}

接收任意长度、任意形式参数的函数

def func(*args,**kwargs):
    pass

调用方式:

func(1, 2, 3)            # 参数被 * 接受,转成元组,保存在 args 中
func(1, x=1, y=2)    # 1 与上述一致,x=1, y=2 被 ** 接受,转成字典的形式,保存在kwargs中

# 前面已经提过,位置实参和关键字实参混合使用时,要注意关键字实参必须放在位置实参的后面~

命名关键字参数

定义函数时,* 号后面的形参就是 命名关键字参数,在调用时,命名关键字参数 必须要传值,而且必须要以关键字的形式传值,还有命名关键字并不常用~

def func(*, name, age):         # name 和 age 就是 命名关键字参数
    print(name)
    print(age)

func(name = 'abc', age = 2)  # name 和 age 必须以关键字的形式传值

命名关键字参数的使用示例。前面提过 默认形参必须放在位置形参后面,如下示例的函数定义中,name 和 age 都是命名关键字参数(不是默认形参,也不是位置形参),name 是命名关键字参数的默认值,所以如下示例中的函数定义方式并没有问题~

def func(*, name='kitty', age):
    print(name)
    print(age)

func(age=2)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python_函数

    一、 定义函数的格式: def function_name(参数1,参数2,参数3......): 代码块 二、函数的形参和实参:函数定义时的参数为形参...

    用户2398817
  • Python3之命名关键字参数

    在*后面的参数都是命名关键字参数,传值的时候必须按照关键字参数进行传值,*args后面的参数也是命名关键字参数,例如此种形式:

    用户2398817
  • day3 python 学习随笔

    用户2398817
  • 服务器端Go程序对长短链接的处理及运行参数的保存

    对长、短连接的处理策略(模拟心跳) 作为一个可能会和很多Client进行通讯交互的Server,首先要保证的就是整个Server运行状态的稳定性,因此在和Cli...

    李海彬
  • HDOJ 1014

    Uniform Generator Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536...

    用户1154259
  • 使用Tidyr重塑数据

    虽然R中存在许多基本的数据处理函数,但它们至今仍有一点混乱,并且缺乏一致的编码和容易地将流一起的能力。这导致很难记忆和操作。因此我们需要更有效的代码、更容易记住...

    用户1359560
  • Java的wait()、notify()学习三部曲之二:修改JVM源码看参数

    在上一章《 Java的wait()、notify()学习三部曲之一:JVM源码分析》中,我们通过JVM源码分析了线程同步的相关操作,但还是留下了一些疑惑未解:在...

    程序员欣宸
  • 注册表删除windows服务的方法

    2 在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 中删除相应的键值

    飞奔去旅行
  • 基因型填充前的质控条件简介

    影响基因型填充准确率的因素有很多,比如分型结果的质量,填充软件的选择,reference panel的选择,样本量的大小, SNP的密度等等。

    生信修炼手册
  • c++计算中缀表达式:一个识别括号的简易计算器

    point:用两个栈分别存数字和运算符,对于在栈内和在栈外的运算符,需要有两套优先级。 #include <iostream> #include <string...

    kalifa_lau

扫码关注云+社区

领取腾讯云代金券