专栏首页MyPanda的学习笔记python中函数位置参数与关键字参数

python中函数位置参数与关键字参数

Python中函数的参数依照不同的方式,可以有不同的分类,这里以“位置参数”与“关键字参数”两类进行讨论.

A. 区分位置参数和关键字参数:

在定义函数的时候,一般有两种方式来指定参数,比如python的内置工厂函数int(x, base=10) 就包含了两种不同的参数,第一个参数 x, 第二个参数 base, 这个参数还有个默认值10. 参数x就是位置参数,而参数base就是关键字参数;所以关键字参数通常是以“key=value”的方式出现在函数的定义当中的,而位置参数则只有参数的名字出现;据此就可以识别位置参数和关键字参数

B. 在定义函数时候两种参数的不同点:

关键字参数因为是以"key=value"的方式出现在函数定义时候的参数列表中,并且在函数体中对该参数引用的是key, 所以这个参数在函数的参数列表中的位置无关紧要. 但是位置参数则不同,如果函数定义时候,其参数列表里面全部是位置参数,那么在函数定义的时候,这些参数在参数列表中的位置也无关紧要. 但如果函数定义时候既有位置参数,也有关键字参数,那么 所有的位置参数都必须在关键字参数之前,否则会报: ”SyntaxError: non-default argument follows default argument“ 错误;

C. 在调用函数时候的不同:

调用函数的时候,通常需要传递函数的参数,这个时候,位置参数必须按照匹配的位置进行传递,否则会发生错误,而多个关键字参数之间则没有位置的要求,下面的参数传递是没有问题的:

#!/usr/bin/env python
def calc(str,n1='10',n2='100'):    #函数定义时候的 位置参数必须在关键字参数之前;      
    pass
calc("+",n1=4,n2=199)       #传递给位置参数str的值:"+" 不能写到其他的位置,而 关键字参数n1,n2可以互换位置;

D. 可变长的位置参数以及关键字参数:

在有的情况下,我们函数的参数列表长度是不固定的,典型的是我们使用装饰函数的时候,我们需要传递所有的参数,而这时候参数的个数是不确定的,我们可以用 *args 来表示所有的 匿名位置参数,**kwargs 来表示所有的匿名关键字参数(其中使用名称args, kwargs 是使用习惯使然,当然可以改用其他的名称), args参数的类型是tuple , 其值是所有的匿名位置参数组成的元组, kwargs的类型是 dict, 其值是匿名的每一个关键字参数 以key:value的形式组成的字典. 下面展示一个复杂的参数传递的例子:

#!/usr/bin/env python
def myfunction(n1,n2,s="default value.",m=9,*args,**kwargs):
    print "n1="+str(n1),"n2="+str(n2),"s="+str(s),"m="+str(m),args,kwargs
myfunction(1,2,3,4,5,6,7,8,ps=1)
输出的结果为: 
n1=1 n2=2 s=3 m=4 (5, 6, 7, 8) {'ps': 1}

简单分析下上述的代码:

  1. 函数定义时候的参数列表: 匿名参数总是 在参数列表的最后,并且仍然遵循位置参数在关键字参数的前面,所以 最后两个参数分别是: *args, **kwargs
  2. 在函数调用的时候,传递的参数同样需要遵循 位置参数在前,关键字参数在后的规范,而 向关键字 参数传递值的时候,可以用 key=value的方式,也可以直接用value的方式,所以在这个例子中,变量s 以及m的默认值都被修改了;比如 int("123",8) 与 int("123",base=8) 两种方式都表示传递 给关键字参数 base的值8.,至此,也就不难理解上述的结果了.

本文原创,转载请著名出处

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • shell脚本中while 和shift 配和解决变长参数问题

    在shell脚本中,我们经常需要根据传递的参数个数来进行相应的处理,那么参数个数不定的情况下如何实现优雅的处理呢?

    qsjs
  • 基于centos的rootfs 创建自己的base image

    前面介绍了dockerfile的常用命令,以及如何构建自己的centos rootfs, 这里用前面学习的内容,来创建 自己的base image .

    qsjs
  • 分享一种定位linux 下程序闪退的思路

    这两天把自己的linux 系统升级了,但是遇到了一个比较大的坑,在此分享下解决方法(主要是定位程序闪退的其中一种思路),希望对阅读此文的你有所帮助,也欢迎留言更...

    qsjs
  • @陈同学的专属Python教程之函数

    酒馆丁老师
  • Python 函数

    一份执着✘
  • 宝宝都能学会的python编程教程12:函数的参数

    Python的函数定义非常简单,也非常灵活。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还...

    JKXQJ
  • 人人都能学会的python编程教程12:函数的参数

    Python的函数定义非常简单,也非常灵活。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还...

    JKXQJ
  • Python 函数的参数

    power(x,n),x和n就是位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参数x和n。

    py3study
  • 从0开始的Python学习009参数

    对于参数有时候我们希望他是可选的,前面介绍了函数柯里化,当然还有其他的解决方案。如果不想给某些参数提供值的话,就让这写参数使用默认值。在函数定义的时候给参数赋值...

    Happy、Liu
  • python基础—函数参数

    注意:  最后一个参数的顺序是错误的,因为可变的位置参数,是不能放在关键字参数后面的,否则会出错。

    dogfei

扫码关注云+社区

领取腾讯云代金券