Python 的函数参数主要包含以下几种:
必须参数是调用一个Python函数时必须指定的参数值,不指定会报错的那种。
def greet(name):
print('Hello ' + name + "!")
# 调用时,必须指定name参数值
greet('Zou Jingyao')
默认参数指的是有默认值的参数,调用函数时可以给默认参数传值也可以不传值,不传值时用默认值(默认值是函数定义出写的)
例如:
def greet(name='Zou Jingyao'):
print('Hello ' + name + "!")
# 可以给默认参数传值
greet('Zou Jingwen')
# 不指定name参数值时就用默认值
greet()
可变参数就是传入的参数数量是可变的,当我们不确定会给函数传多少值时,很有用。这些参数在函数调用时自动组装为一个元组。
可变参数的标识是在前面加一个*,这不代表C++类似的指针,而是表示接受一个元组,可以接受任意数量的参数,0个也行。
def greet(*names):
for name in names:
print('Hello ' + name + "!")
greet('Zou Jingyao', 'Zou Jingwen', 'Wang Fumei', 'Ting Ting')
关键字参数允许传入任意个含参数名的参数,这些关键字参数在函数调用时自动组装为一个字典。也就是说,关键字参数将长度任意的键-值对,作为参数传递给函数。
关键字参数的标识是**,它扩展了函数功能,使传递参数过程更为简便。
def greet(**dictionary):
for key, value in dictionary.items():
print(key + ':' + str(value))
greet(name='Zou Jingyao', age=21, work='student')
这四种参数如果想要一起使用是由顺序的,顺序依次应该是必选参数、默认参数、可变参数和关键字参数。
# 定义一个包含多种参数的函数
def greet(x, y, z=0, *names, **dictionary):
print('x =', x)
print('y =', y)
print('z =', z)
print('names =', names)
print('dictionary =', dictionary)
greet(1, 2, 3, 'yao', 'wen', 'ting')
print('*'*50)
greet(1, 2, 3, 'yao', 'wen', 'ting', age=21, work='student')
在Python函数中用return语句将值返回到调用函数的出口,有return返回值才是完整的函数。
如果没有定义函数返回值,那么程序会自动让函数返回一个None对象,表示没有任何值。
Python中可以返回多个值,将其封装成一个元组打包返回。
def greet():
return 'Zou Jingyao', 'Zou Jingwen', 'Ting Ting'
names = greet()
print(names)
运行结果:
('Zou Jingyao', 'Zou Jingwen', 'Ting Ting')
def greet():
return 'beautiful', 'Zou Jingyao'
description, name = greet()
print(description + " " + name)
运行结果:
beautiful Zou Jingyao
参考
我们除了可以将各种类型的值作为返回值外,也可以将函数作为返回值。例如,我们要定义一个函数来求列表中数值元素的和,一般情况下我们是这样定义的:
def plus(*args):
s = 0
for n in args:
s = s + n
return s
但是,如果我们不需要立刻求和,而是在后面的程序中,根据需求再计算,这种情况怎么办呢?这时我们定义的函数可以不返回求和的结果,而是返回计算求和的函数。所以我们还可以用如下方法定义函数:
def lazy_plus(*args):
def plus():
s = 0
for n in args:
s = s + n
return s
return plus
当我们调用lazy_plus()时,返回的并不是求和结果,而是计算求和的函数:
用lazy_plus()时,返回的并不是求和结果,而是求和函数
f = lazy_plus(1,2,3,4,5)
print(f)
运行结果:
.plus at 0x000001DAC97F9950>
调用函数f时,才真正计算求和的结果:
# 调用函数f时,得到真正求和的结果
f = lazy_plus(1,2,3,4,5)
print(f())
运行结果:
15
在上述例子中,我们在函数lazy_plus中又定义了函数plus,而且内部函数plus是可以引用外部函数lazy_plus的参数和局部变量的。当函数lazy_plus返回函数plus时,相关参数和变量也将会保存在返回的函数中,这种方式也称为“闭包”(Closure)。
类型 | 特征 | 举例 |
---|---|---|
private | 以两个下划线开头代表非公开,不应该直接引用 | __xxx()、__x |
protected | 以一个下划线开头的,直接从外部访问不会产生异常 | _xxx()、_x |
public | 一般使用的都是公开的,可以直接访问 | abs()、max() |
特殊变量 | 名字前后都有两个下划线的量,允许被直接引用,但是会被用作特殊 | __author__、__name__ |