首页 > 编程语言 >Python 中的函数参数

Python 中的函数参数

时间:2023-01-15 10:33:23浏览次数:53  
标签:full name Python args 函数参数 add 参数 函数


在通常情况下,定义函数时,函数的参数个数是预先确定的。例如,编写计算两个数相加的函数 add(a, b),代码如下:

def add(a, b):
return a + b

sum = add(1, 2)
  • 在第 1 行,定义了函数 add,函数有两个参数,第 1 个参数是 a,第 2 个参数是 b
  • 在第 2 行,计算参数 a 和 参数 b 的累加和,通过 return 语句将计算结果返回给调用者
  • 在第 4 行,通过 add(1, 2) 调用函数 add
  • 将整数 1 传递给第 1 个参数 a
  • 将整数 2 传递给第 2 个参数 b
  • 将整数 1 传递给第 1 个参数 a
  • 将整数 2 传递给第 2 个参数 b

传入的两个整数按照位置顺序依次赋给函数的参数 a 和 b,参数 a 和参数 b 被称为位置参数

在 Python 中,调用函数时,根据函数定义的参数位置来传递参数,要求传递的参数与函数定义的参数两者一一对应,如果 “传递的参数个数” 不等于 “函数定义的参数个数”,运行时会报错,例如:

def add(a, b):
return a + b

sum = add(1, 2, 3)
  • 在第 1 行,定义了函数 add,函数有 2 个参数
  • 在第 4 行,通过 add(1, 2, 3) 调用函数 add,传递了 3 个参数

因为 “传递的参数个数” 不等于 “函数定义的参数个数”,运行时报错如下:

C:\> python add.py
Traceback (most recent call last):
File "error.py", line 4, in <module>
sum = add(1, 2, 3)
TypeError: add() takes 2 positional arguments but 3 were given

在第 5 行,运行时提示:函数 add 有 2 个位置参数,但是调用时传递了 3 个位置参数。

1. 位置参数实例

1.1 函数没有任何位置参数

def hello_world():
print('hello')
print('world')

hello_world()

程序运行输出如下:

hello
world

1.2 函数有 1 个位置参数

def hello_world(n):
for i in range(n):
print('hello world')

hello_world(3)

程序运行输出如下:

hello world
hello world
hello world

1.3 函数有 2 个位置参数

def hello_world(n, string):
for i in range(n):
print(string)

hello_world(n, 'HELLO WORLD')

程序运行输出如下:

HELLO WORLD
HELLO WORLD
HELLO WORLD

2. 默认参数

2.1 概述

调用函数时,“传递的参数” 需要与 “函数定义的参数” 一一对应,例如:

def add_student(name, age, city):
print(name)
print(age)
print(city)

add_student('tom', 10, 'nanjing')
  • 在第 1 行,定义函数 add_student,函数定义了 3 个参数
  • 在第 5 行,调用函数 add_student,传递了 3 个参数

程序正常运行,输出结果如下:

tom
10
nanjing

如果 “传递的参数个数” 少于 “函数定义的参数个数”,程序会报错,例如:

def add_student(name, age, city):
print(name)
print(age)
print(city)

add_student('jerry', 12)
  • 在第 1 行,定义函数 add_student,函数定义了 3 个参数
  • 在第 5 行,调用函数 add_student,传递了 2 个参数

程序运行时,报错如下:

Traceback (most recent call last):
File "add_student.py", line 5, in <module>
add_student('jerry', 12)
TypeError: enroll() missing 1 required positional argument: 'city'

在定义函数时,可以为参数提供一个缺省值,如果传递参数时,可以忽略部分参数,举例如下:

def add_student(name, age, city = 'nanjing'):
print(name)
print(age)
print(city)

add_student('jerry', 12)
  • 在第 1 行,定义函数 add_student,函数定义了 3 个参数
  • 参数 name 和参数 age 是位置参数
  • 参数 city 是缺省参数,该参数的缺省值是 'nanjing’
  • 在第 5 行,调用函数 add_student,传递了 2 个参数
  • 参数 name 被设定为 ‘jerry’
  • 参数 age 被设定为 12
  • 调用函数时没有传递参数给 city,因此参数 city 被设定为缺省值 ‘nanjing’
  • 参数 name 和参数 age 是位置参数
  • 参数 city 是缺省参数,该参数的缺省值是 'nanjing’
  • 参数 name 被设定为 ‘jerry’
  • 参数 age 被设定为 12
  • 调用函数时没有传递参数给 city,因此参数 city 被设定为缺省值 ‘nanjing’

程序正常运行,输出结果如下:

tom
10
nanjing

2.2 简化函数调用

现在需要多次调用 add_student 对一批学生进行处理,可以使用如下代码:

def add_student(name, age, city):
print(name)
print(age)
print(city)

add_student('tom', 10, 'nanjing')
add_student('jerry', 12, 'nanjing')
add_student('mike', 12, 'nanjing')
add_student('john', 11, 'nanjing')
add_student('jobs', 13, 'beijing')
  • 在第 6 行到第 10 行,新增 5 个学生 tom、jerry、mike、john、jobs
  • 大部分学生来自于相同的城市,极个别学生来自于外地城市

使用默认参数,可以简化函数的调用,尤其是在函数需要被频繁调用的情况下。因为大部分学生来自于 nanjing,可以为参数 city 设定一个默认值 nanjing,如下所示:

def add_student(name, age, city):
print(name)
print(age)
print(city)

add_student('tom', 10)
add_student('jerry', 12)
add_student('mike', 12)
add_student('john', 11)
add_student('jobs', 13, 'beijing')
  • 在第 6 行到第 10 行,新增 4 个学生 tom、jerry、mike、john,这 4 个学生来自于相同的城市 ‘nanjing’,调用函数 add_student 时不需要的传递参数 ‘nanjing’
  • 在第 10 行,新增 1 个学生 jobs,该学生来自于 beijing,调用函数 add_student 时需要的传递参数 ‘beijing’

3. 可变参数

3.1 概述

假设需要编写一个函数 add,函数 add 计算 2 个数的累加和,代码如下:

def add(a, b):
return a + b

add(1, 2)

编写计算 3 个数的累加和函数,代码如下:

def add3(a, b, c):
return a + b + c

add3(1, 2, 3)

如果需要编写计算 4 个数的累加和函数,可以用上述方式再增加一个函数,显然,这样的方法是繁琐的。我们的需求是:编写一个计算累加和的函数 add,但是函数 add 的参数个数是预先不确定的。

Python 提供了一种可变参数机制用于解决这样的问题,在函数定义中,可以将函数设定为可以接受任意数量的参数,函数调用时就可以传递任意数量的参数。

在函数定义中,在参数前加上符号 * 表示函数可以接受可变数量的参数,如下所示:

def 函数(*args):
函数体
  • 该函数被设定为能够接受可变数量的参数
  • args 的类型是元组
  • 调用该函数时,所有的参数被合并成一个元组
  • 合并后的元组被赋值给 args,通过遍历 args 可以访问传递的参数

3.2 例子

使用可变参数重新实现计算累加和的函数 add,函数 add 能够接受任意个数的参数,代码如下:

def add(*args):
sum = 0
for arg in args:
sum = sum + arg
print('len = %d, sum = %d' % (len(args), sum))

add(1)
add(1, 2)
add(1, 2, 3)
  • 在第 1 行,定义函数 add,args 是可变参数,args 的类型是一个元组
  • 在第 2 行,设定累加和 sum 的初值为 0
  • 在第 3 行,调用函数 add 时,所有的参数被合并成一个元组赋值给 args,因此使用 for 循环遍历元组 args,相当于遍历所有的输入参数
  • 在第 4 行,变量 arg 表示当前遍历的参数,将其加入到变量 sum 中
  • 在第 5 行,打印 args 的长度和计算结果 sum
  • 在第 7 行,传递 1 个参数给 add
  • 在第 8 行,传递 2 个参数给 add
  • 在第 9 行,传递 3 个参数给 add

程序运行时,输出如下:

len = 1, sum = 1
len = 2, sum = 3
len = 3, sum = 6

4. 关键字参数

4.1 概述

通常情况下,调用函数时,以直接给出参数值的形式传递参数,如下所示:

def add(a, b):
return a + b

add(1, 2)
  • 在第 3 行,整数 1 和整数 2 作为参数值传递给参数 a 和 参数 b

Python 允许调用函数时,以 “参数名 = 参数值” 的形式传递参数,如下所示:

def add(a, b):
return a + b

add(a = 1, b = 2)

"参数名 = 参数值" 形式的参数,例如 a = 1 和 b = 2,被称为关键字参数。在函数定义中,在参数前加上符号 ** 参数表示函数可以接收关键字参数,如下所示:

def 函数(**kw_args):
函数体
  • 该函数被设定为能够接收关键字参数
  • kw_args 的类型是字典
  • 调用该函数时,所有的关键字参数被合并成一个字典
  • 合并后的字典被赋值给 kw_args,通过访问 kw_args 可以访问参数名和参数值

4.2 例子

假设需要通过两种方式来创建一个人的姓名:

  1. 直接给出人的姓名,需要一个参数:full_name
  • 例子,如果 full_name 等于 ‘ZhangSan’,则用这种方式创建的姓名是 ‘ZhangSan’
  1. 分别给出人的姓和名,需要两个参数: first_name 和 last_name
  • 参数 first_name 表示姓
  • 参数 last_name 表示名
  • 例子,如果 first_name 等于 ‘Zhang’、last_name 等于 ‘San’,则用这种方式创建的姓名是 ‘ZhangSan’

直接给出人的姓名,需要一个参数:full_name

  • 例子,如果 full_name 等于 ‘ZhangSan’,则用这种方式创建的姓名是 ‘ZhangSan’

分别给出人的姓和名,需要两个参数: first_name 和 last_name

  • 参数 first_name 表示姓
  • 参数 last_name 表示名
  • 例子,如果 first_name 等于 ‘Zhang’、last_name 等于 ‘San’,则用这种方式创建的姓名是 ‘ZhangSan’

现在使用 Python 的关键字参数机制完成函数 create_full_name,代码如下:

def create_full_name(**kw_args):
if 'full_name' in kw_args:
full_name = kw_args['full_name']
return full_name

if 'first_name' in kw and 'last_name' in kw:
first_name = kw_args['first_name']
last_name = kw_args['last_name']
full_name = first_name + last_name
return full_name

print(create_full_name(full_name = 'ZhangSan'))
print(create_full_name(first_name = 'Li', last_name = 'Si'))

运行程序,输出结果如下:

ZhangSan
LiSi
  • 在第 1 行,创建函数 create_full_name,该函数能够接受关键字参数
  • 该函数被调用时,所有关键字参数被合并成一个字典,被赋值给参数 kw_args
  • kw_args 的类型是字典,它包含了所有的关键字参数
  • 在第 2 行,检查 kw_args 中是否包含参数 full_name
  • 在第 3 行,从 kw_args 中获取参数 full_name 的值
  • 在第 4 行,返回 full_name
  • 在第 6 行,检查 kw_args 中是否包含参数 first_name 和 last_name
  • 在第 7 行,从 kw_args 中获取参数 first_name 的值
  • 在第 8 行,从 kw_args 中获取参数 last_name 的值
  • 在第 9 行,根据 first_name 和 last_name 计算 full_name
  • 在第 10 行,返回 full_name
  • 在第 12 行,通过 “直接给出人的姓名” 的方式调用 create_full_name
  • 传递关键字参数 full_name = ‘ZhangSan’
  • 关键字参数被合并入一个字典 kw_args
  • 字典 kw_args 中包含一条键值对
  • 在第 12 行,通过 “分别给出人的姓和名” 的方式调用 create_full_name
  • 传递关键字参数 first_name = ‘Li’、last_name = ‘Si’
  • 关键字参数被合并入一个字典 kw_args
  • 字典 kw_args 中包含两条键值对
  • 该函数被调用时,所有关键字参数被合并成一个字典,被赋值给参数 kw_args
  • kw_args 的类型是字典,它包含了所有的关键字参数
  • 在第 3 行,从 kw_args 中获取参数 full_name 的值
  • 在第 4 行,返回 full_name
  • 在第 7 行,从 kw_args 中获取参数 first_name 的值
  • 在第 8 行,从 kw_args 中获取参数 last_name 的值
  • 在第 9 行,根据 first_name 和 last_name 计算 full_name
  • 在第 10 行,返回 full_name
  • 传递关键字参数 full_name = ‘ZhangSan’
  • 关键字参数被合并入一个字典 kw_args
  • 字典 kw_args 中包含一条键值对
  • 传递关键字参数 first_name = ‘Li’、last_name = ‘Si’
  • 关键字参数被合并入一个字典 kw_args
  • 字典 kw_args 中包含两条键值对

5. 小结

这节课我们学习了函数的参数,参数这个概念是函数使用中不可缺少的一环。在函数定义时的参数叫做"形参",而在函数调用时的参数叫做"实参"。一定要分清这两个概念。

标签:full,name,Python,args,函数参数,add,参数,函数
From: https://blog.51cto.com/10zhancom/6008308

相关文章

  • Python 基础实战
    1.概述本节实现一个文件管理程序,该程序会使用到如下知识点:函数面向对象采用面向对象的程序设计方法对数据建模异常处理使用异常处理和文件相关的错误,例如文件不存......
  • Python 中的生成器实现原理
    1.如何生成一个巨大的序列1.1需求描述要求生成一个包含很多元素的序列,假设:存储1个整数需要4个字节现在要创建一个包含1G个整数的序列,从0到1*1024*1024*10......
  • Python 中的迭代器趣味实践
    1.遍历文本文件中的单词假设存在文本文件test.txt,内容如下:TheZenofPythonBeautifulisbetterthanuglySimpleisbetterthancomplex注意文件包含有空行,要求完成如......
  • 可以让程序员更有效率的 Python 技巧?
    在本文中,我们将了解一些可以使我们的编码人员的生活更高效、更轻松、更快乐的Python技巧. 使用Try和except语句我们在主要条件下看到的另一个缺乏效用的是使用try......
  • 为什么 Python 是初学者更好的语言?
    在本文中,我们将了解为什么Python如此常见的初学者语言。以下是各种原因。为什么Python是初学者更好的第一语言?还有其他优秀的编程语言可用,但Python是初学者最好的语言......
  • python:一文带你搞懂AB测试
    学习目标目标知道什么是AB测试知道AB测试的步骤知道AB测试原理  让我们想象一下,在公司的某产品研发讨论会上……“这个功能要不要上?”“我觉得没问题,XX指标肯定能涨一大截......
  • 为什么你应该使用NumPy数组而不是嵌套的Python列表?
    在本文中,我们将向您展示为什么使用NumPy数组而不是嵌套的Python列表,以及它们之间的异同。PythonNumPyLibraryNumPy是一个Python库,旨在有效地处理Python中的数组。......
  • Python实现排序
    冒泡排序交换排序相邻元素两两比较大小,有必要则交换元素越小或越大,就会在数列中慢慢的交换并“浮”向顶端,如同水泡咕嘟咕嘟往上冒核心算法排序算法,一般都实现为就......
  • Python闭包和装饰器的学习
    之前看了不少的帖子,总是看了这篇帖子说的理解了,换篇帖子说的又不理解了,把人弄晕了,究其原因还是因为没有把底层原理理解。这两个概念总是放在一起说,两者之间肯定是有关系的......
  • python def函数总结
    简单无参函数编写脚本test1.pydefregister_user():"""docstring"""#描述函数的功能print("Welcome!")register_user()#调用函数执行脚本test1.py输出结果We......