资讯专栏INFORMATION COLUMN

python学习笔记-函数的参数

jasperyang / 2509人阅读

摘要:默认参数的坑默认参数的默认值指向的必需时不变对象。举一个例说明当函数的默认参数默认为一个可变对象时,会出现什么状况。例如调用函数输出结果当然,如果已经又一个对象,也可以在传入时的名前输入,会自动将拆分成关键字参数。

函数就像是一个黑盒子,我们将相关的一些功能打包成一个函数,后续再调用的时候,我们不再关心内部如何实现,而是只关心这个函数需要输入(Input)什么,需要输出(Output)什么。 其中函数的输入就是参数,输出就是Return。

Python支持的参数有四种类型:

必选参数

默认参数

可变参数

关键字参数
下面我们来一一介绍一下。

必选参数

必选参数就是调用一个函数时,必须输入的参数。
例如我们定义一个函数

 def my_sum(x,y):
    return x+y

此时,my_sum函数的x,y参数就是必选参数,在调用该函数时候必须输入,不可以省略。

默认参数

默认参数是指在调用函数时可选择性的输入或者不输入。不输入时,则参数为默认值。例如我们定义一个用于打印学生信息的函数。学生的信息包括姓名、年龄、生源。这些学生大多数来自浙江省,那么这个函数可以这么定义:

def print_info(name,age=20,province="Zhejiang"):
    print name,age,province

对于大多数浙江的学生且年龄都是20,我们只需要这么调用函数即可:print_info("Lilei")。此时我们并没有输入province参数,函数默认为年龄20,生源为Zhejiang

对于少数来自外省的学生,且年龄不为20的学生,我们可以这么按顺序排列默认参数,即先年龄,后生源,顺序与函数定义的时候一致:
print_info("Lucy",21,"Jiangsu")。此时province就修改成Jiangsu了。

如果需要跳过某个默认参数或则不按顺序传入默认参数,我们则需要写上参数名。例如:print_info("Tom",province="Hebei")

使用默认参数可以大大降低函数调用的复杂性。例如对于有很多参数的函数,某些参数在实际业务中经常变化,有些参数缺较少变化。我们可以将这些参数按其在实际业务中的变化频率从高到底排列,并对变化频率低的参数设为默认参数。实际调用时,我们只需要传入必要的参数值即可。这样我们可以实现只定义一个函数却能满足多种情境。

默认参数的坑

默认参数的默认值指向的必需时不变对象。
举一个例说明当函数的默认参数默认为一个可变对象时,会出现什么状况。

def add_item(items=[]):
    items.append("apple")
    return items

我们想要实现的功能是,调用该函数,会对传入的list最后添加一个apple元素。若 `items`参数未传入,则默认是一个空list。

当我们第一次调用add_item()函数时,返回["apple"],没什么错误。

但我们再一次调用add_item()函数时,却返回了`["apple","apple"]。这与我们预期的不相符合。因为我们第二次调用也未传入任何参数。

其原因是add_item()函数的默认参数在函数定义的时候就已经在内存生成。第一次、第二次的默认参数指向的是同一个list对象。其一次调用函数对该list对象的修改会影响后一次函数的调用。

可变参数

在实际情况下,我们经常会碰到某函数的参数个数不一定的情况。例如我们想要写一个计算几个数字的平方和的函数。
当然我们可以预先将这些数字组装成一个list或者tuple再传入函数。代码如下:

# 定义函数
def quadratic_sum(numbers):
    sum = 0
    for number in numbers:
        sum = sum + number
    return sum    

# 先将数字组成一个list
ns = [1,3,2,6,2]
# 将list传入函数
quadratic_sum(ns)    

在Python中,我们可以直接定义一个有可变参数的函数,我们无需预先组装一个list或者tuple,而直接传入函数。可变参数的表示方法是在参数名前加一个*
传入的可变参数会被Python组装成一个tuple,tuple名即为函数定义的可变参数名。

# 定义一个有可变参数的函数
def quadratic_sum(*numbers):
    sum = 0
    for number in numbers:
        sum = sum + number
    return sum
# 直接调用函数,无需预先组装成一个list或者tuple。
quadratic_sum(1,3,2,6,2)

此时我们已经有了一个支持可变参数的函数,但是我们现在又有一个list比如[1,3,2,6,2]。我们还需要把这个list一个拆成一个数字传入函数吗?显然这么做不科学。
Python提供了一个简单的解决方案。我们只需要在传入的list名前加一个*,Python就会帮我们把这个list或tuple拆成可变参数传入。例如:

ns = [1,2,3,54,2]
quadratic_sum(*ns)
关键字参数

关键字参数于可变参数类似。关键字参数可以将传入的参数组装成一个字典Dict。
定义一个关键字参数的方法就是在关键字参数前写**。例如

def user_info(name,age,**kw):
    print "Name:",name,"Age:",age,"Keyword:",kw
# 调用函数
user_info("Charlie",20,gender="male",city="Hangzhou")

输出结果:
Name: Chalrie Age: 20 Keyword: {"gender": "male", "city": "Hanzhou"}

当然,如果已经又一个dict对象,也可以在传入时的dict名前输入**,Python会自动将Dict拆分成关键字参数。

keyword = {"gender": "male", "city": "Hanzhou"}
user_info("charlie",20,**keyword)
参数组合

Python函数的参数可以是上述四种参数的任意组合,但是其顺序必须是必选参数、默认参数、可变参数、关键字参数。Python会根据这个顺序进行匹配。例如我们定义一个函数:

def func(name,age=20,gender="female",*args,**kw):
    print "age:",age
    print "name:",name
    print args
    print kw

上面这个函数,name是必选参数。调用该函数时若没有传入name参数,则会报错。
age,gender是默认函数。可以传入也可以不传入。不传入则是默认值。
其余无关键字的参数会被组装成一个叫argstuple。
其余有关键字的参数会被组装成一个叫kw的dict。
例如:
func("Charlie",gender="male",2,3,4,city="hangzhou",province="Zhejiang")

关于更多参数类型的内容,可以阅读一篇文章:
http://www.qiangtaoli.com/boo...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44249.html

相关文章

  • python学习笔记-调用函数

    摘要:调用函数时常见的错误函数参数个数不正确会给我们返回,并给出确切的错误信息。例如将变量名指向这个取整函数调用函数,即调用这个取整数的函数 python有许多内置的函数(Build-in Functions)例如abs()——求绝对值的函数供我们使用。那么我们如何调用这些函数呢?直接书写函数名带括号并在括号内传入参数即可。例如abs(-10.2)即可。python内置的函数可以到https...

    AZmake 评论0 收藏0
  • python学习笔记 函数

    摘要:一等函数在中,函数是一等对象。匿名函数关键字在表达式内创建匿名函数然而,简单的句法限制了函数的定义体只能使用纯表达式,即函数的定义体中不能赋值,不能使用等语句。匿名函数适合用于作为函数的参数 一等函数 在python中,函数是一等对象。编程语言理论家把一等对象定义为满足以下条件的程序实体: 在运行时创建 能赋值给变量或数据结构中的元素 能作为参数传给函数 能作为函数的返回结果 在p...

    Scorpion 评论0 收藏0
  • python学习笔记-定义函数

    摘要:空函数如果想要定义一个什么都不做的函数,那么可以用语句。为函数添加参数检查我们对作一些改写。此时调用函数时传入错误的参数则会抛出。函数返回多个值支持返回多个值。 python中定义函数的关键词是def,例如定义一个叫my_function的函数我们可以这么定义, 其中括号内的x,y为传入的参数。 def my_function(): # function body 返回值 函数...

    CoderStudy 评论0 收藏0
  • python学习笔记-map/reduce/filter/sorted

    摘要:会依次将中的数据传递到中,根据返回的或者,留下或者抛弃这个值。而对于字符串,则是根据字符串对应的码表进行排序。同时也是一个高阶函数,可以实现自定义的排序方式。 map/reduce是一种编程思想,在各个领域都有它的实践。网上有一个简单的例子解释map/reduce。比如说你需要数一下某一个图书馆中有多少本藏书。最傻瓜的做法就是排一个人从头数到尾。这样速度慢,低效。另一种方法就是先将图书...

    用户83 评论0 收藏0
  • python-学习笔记 内部函数

    摘要:返回该函数的时候,携带了该内部函数引用的外部函数参数和局部变量。每次返回的函数都是不同的对象的结果为内部函数本身被返回时,所携带的参数或局部变量时那一刻的值例如在函数内有循环,内部函数引用的循环变量。 内部函数 Python可以在函数内部再定义一个函数。这个定义的内部函数可以引用外部函数的参数和局部变量。事实上,内部函数还可以在其中再定义内部函数,实现内部函数多重嵌套。例如: def ...

    Gilbertat 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<