Python函数的参数和返回值

函数参数

参数种类

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)

运行结果:

<function lazy_plus.<locals>.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__
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章