Python函数参数基础介绍及示例

作者:acktomas 时间:2021-02-03 03:11:04 

视频

观看视频

函数的参数

定义函数时,我们把参数的名字和位置确定下来,函数的接口定义就完成了。参数在函数名后的括号内指定。您可以根据需要添加任意数量的参数,只需用逗号分隔即可。对于函数的调用者,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解。

Python的函数定义可以使用必选参数、默认参数、可变参数和关键字参数。

位置参数

我们先写一个计算x2的函数:

def power(x):
   return x * x

对于power(x)函数,参数x就是一个位置参数。

当我们调用power函数时,必须传入有且仅有的一个参数x

>>> power(5)
25
>>> power(15)
225

现在,如果我们要计算 x 3 x^3 x3怎么办?可以再定义一个power3函数,但是如果要计算 x 4 x^4 x4、 x 5 x^5 x5……怎么办?我们不可能定义无限多个函数。

你也许想到了,可以把power(x)修改为power(x, n),用来计算 x n x^n xn:

def power(x, n):
   s = 1
   while n > 0:
       n = n - 1
       s = s * x
   return s

对于这个修改后的power(x, n)函数,可以计算任意n次方:

>>> power(5, 2)
25
>>> power(5, 3)
125

修改后的power(x, n)函数有两个参数:xn,这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参数xn

默认参数

power(x, n)函数定义没有问题,但是,原来的调用代码失败了,原因是我们增加了一个参数,导致旧的代码因为缺少一个参数而无法正常调用:

>>> power(5)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: power() missing 1 required positional argument: 'n'

错误信息指出:调用函数power()缺少了一个位置参数n

这个时候,默认参数就排上用场了。由于我们经常计算x2,所以,可以把第二个参数n的默认值设定为2:

def power(x, n=2):
   s = 1
   while n > 0:
       n = n - 1
       s = s * x
   return s

这样,当我们调用power(5)时,相当于调用power(5, 2)

>>> power(5)
25
>>> power(5, 2)
25

对于n > 2的情况,就必须明确地传入n,比如power(5, 3)

从上面的例子可以看出,默认参数可以简化函数的调用。设置默认参数时,有几点要注意:

  1. 必选参数在前,默认参数在后,否则Python的解释器会报错。思考一下:为什么默认参数不能放在必选参数前面?

  2. 如何设置默认参数。

使用默认参数有什么好处?最大的好处是能降低调用函数的难度。

举个例子,我们写个一年级小学生注册的函数,需要传入namegender两个参数:

def enroll(name, gender):
   print('name:', name)
   print('gender:', gender)

这样,调用enroll()函数只需要传入两个参数:

>>> enroll('Sarah', 'F')
name: Sarah
gender: F

如果要继续传入年龄、城市等信息怎么办?这样会使得调用函数的复杂度大大增加。

我们可以把年龄和城市设为默认参数:

def enroll(name, gender, age=6, city='Beijing'):
   print('name:', name)
   print('gender:', gender)
   print('age:', age)
   print('city:', city)

这样,大多数学生注册时不需要提供年龄和城市,只提供必须的两个参数:

>>> enroll('Sarah', 'F')
name: Sarah
gender: F
age: 6
city: Beijing

只有与默认参数不符的学生才需要提供额外的信息:

enroll('Bob', 'M', 7)
enroll('Adam', 'M', city='Tianjin')

可见,默认参数降低了函数调用的难度,而一旦需要更复杂的调用时,又可以传递更多的参数来实现。无论是简单调用还是复杂调用,函数只需要定义一个。

有多个默认参数时,调用的时候,既可以按顺序提供默认参数,比如调用enroll('Bob', 'M', 7),意思是,除了namegender这两个参数外,最后1个参数应用在参数age上,city参数由于没有提供,仍然使用默认值。

也可以不按顺序提供部分默认参数。当不按顺序提供部分默认参数时,需要把参数名写上。比如调用enroll('Adam', 'M', city='Tianjin'),意思是,city参数用传进去的值,其他默认参数继续使用默认值。

默认参数陷阱

默认参数很有用,但使用不当,也会掉坑里。默认参数有个最大的坑:

先定义一个函数,传入一个list,添加一个END再返回:

def add_end(L=[]):
   L.append('END')
   return L

当你正常调用时,结果似乎不错:

>>> add_end([1, 2, 3])
[1, 2, 3, 'END']
>>> add_end(['x', 'y', 'z'])
['x', 'y', 'z', 'END']

当你使用默认参数调用时,一开始结果也是对的:

>>> add_end()
['END']

但是,再次调用add_end()时,结果就不对了:

>>> add_end()
['END', 'END']
>>> add_end()
['END', 'END', 'END']

很多初学者很疑惑,默认参数是[],但是函数似乎每次都&ldquo;记住了&rdquo;上次添加了'END'后的list。

原因:

Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。

定义默认参数要牢记一点:默认参数必须指向不变对象!

要修改上面的例子,我们可以用None这个不变对象来实现:

def add_end(L=None):
   if L is None:
       L = []
   L.append('END')
   return L

现在,无论调用多少次,都不会有问题:

>>> add_end()
['END']
>>> add_end()
['END']

为什么要设计strNone这样的不变对象呢?因为不变对象一旦创建,对象内部的数据就不能修改,这样就减少了由于修改数据导致的错误。此外,由于对象不变,多任务环境下同时读取对象不需要加锁,同时读一点问题都没有。我们在编写程序时,如果可以设计一个不变对象,那就尽量设计成不变对象。

来源:https://acktomas.blog.csdn.net/article/details/125877339

标签:Python,函数参数
0
投稿

猜你喜欢

  • SQL SERVER中的流程控制语句

    2024-01-12 18:25:26
  • IE里模拟DOMContentLoaded事件

    2008-08-05 17:12:00
  • django DRF图片路径问题的解决方法

    2023-02-05 15:25:46
  • 简单的Python人脸识别系统

    2023-01-26 23:31:57
  • javascript结合ajax读取txt文件内容

    2024-04-30 10:14:58
  • 一张图告诉你计算机编程语言的发展历史

    2023-03-29 15:16:42
  • python中Lambda表达式详解

    2021-12-06 22:40:26
  • ASP.NET连接SQL数据库的简单实例代码

    2024-01-26 06:54:27
  • Pytorch自动求导函数详解流程以及与TensorFlow搭建网络的对比

    2023-07-08 18:44:37
  • PyCharm使用Docker镜像搭建Python开发环境

    2021-09-24 21:41:16
  • python查看FTP是否能连接成功的方法

    2023-11-04 13:31:50
  • 两侧背景自动延伸的CSS实现方法

    2010-02-24 09:42:00
  • Python判断字符串与大小写转换

    2021-07-17 03:23:35
  • 保姆级官方yolov7训练自己的数据集及项目部署详解

    2023-09-16 14:19:45
  • pytorch获取vgg16-feature层输出的例子

    2021-04-16 20:56:47
  • PHP中常用的数组操作方法笔记整理

    2023-06-06 15:17:12
  • Python3 pandas.concat的用法说明

    2023-11-22 23:46:51
  • 关于Python排序问题(冒泡/选择/插入)

    2023-11-17 19:43:37
  • 土豆网前端概况

    2008-01-24 12:06:00
  • ASP.NET中的几种弹出框提示基本实现方法

    2023-07-13 00:23:50
  • asp之家 网络编程 m.aspxhome.com