一.函数的定义
函数是组织好的,可重复使用的,功能集中单一的代码段。
函数的定义规则:
- 定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号。
- 参数必须放在圆括号内。
- 函数的第一行语句可以选择性地使用文档字符串,用于表达函数的用途和参数说明。
- 函数内容以冒号起始,函数体要缩进4格。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
def 函数名( 参数):
"函数文档字符串"
函数内容
return [表达式]
二. 函数体与返回值
- 函数体
函数体开始要空4格,如果想定义一个什么事也不做的空函数,可以用pass语句占位。如果不使用pass占位会报错。
def func():
pass
- 返回值
- return可以省略。如果没有return语句,函数执行完毕后会返回None。
- return None可以简写为return。
- Python函数可以返回多个值:
def func():
a=1
b=2
return a,b
m,n=func()
其实,本质上讲Python函数并没有返回多个值,而是返回一个tuple!但是,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便。
三.参数
1.Python函数的参数种类
Python函数的参数类型一共有五种,分别是:
位置参数
默认参数
可变参数
关键字参数
- 位置参数
最常见的参数,使用位置参数时,传参的顺序和数量必须和声明完全一致。
def p(name,age):
print name
print age
return
p('yoyo',12)
- 默认参数(parameter=)
函数声明的时候,可以给参数设置默认值。调用时,如果不传递此参数,会使用默认值,默认参数一定要放在位置参数后面。
def p(name,age=12):
print name
print age
return
p('yoyo')
- 可变参数
定义函数时,在参数前面加一个※,表示这个参数是数量可变的,调用时该参数可以接受任意多个值。可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。
def calculate(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
s=calculate(1,2,3,4)
如果已经有一个list或者tuple,要调用一个可变参数怎么办?Python允许你在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去:
>>> nums = [1, 2, 3]
>>> calc(*nums)
14
- 关键字参数
关键字参数允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
关键字参数有什么用?它可以扩展函数的功能。比如,在person函数里,我们保证能接收到name和age这两个参数,但是,如果调用者愿意提供更多的参数,我们也能收到。试想你正在做一个用户注册的功能,除了用户名和年龄是必填项外,其他都是可选项,利用关键字参数来定义这个函数就能满足注册的需求。
- 命名关键字参数
和关键字参数不同,命名关键字参数需要一个特殊分隔符※,※后面的参数被视为命名关键字参数。
调用方式如下:
def person(name, age, *, city, job):
print(name, age, city, job)
>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer
命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错:
>>> person('Jack', 24, 'Beijing', 'Engineer')
Traceback (most recent call last):
File "", line 1, in
TypeError: person() takes 2 positional arguments but 4 were give
四. 函数参数中的引用
回忆上节中,我们介绍Python中所有变量都是引用,那么将实参数据传递给形参的过程,本质上就是让形参指向实参的引用对象。
函数的参数是可变类型:
(如 列表,字典)类似 c++ 的引用传递。由于可变类型可以通过引用修改数据,所以在函数内部修改后,外部也会受影响。函数的参数是不可变类型:
(如整数、字符串、元组)类似 c++ 的值传递。不可变类型不能通过引用修改数据,只能重新引用其他对象。所以在函数内部修改参数的值,只会将形参指向其他对象,不会影响到函数外部。
参考:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888