函数定义
def functionname( parameters): #没有参数可以不写()
"函数_文档字符串" #存放函数说明
function_suite
return [expression] #没有返回值可以不加[]内容,也可以省略return
- def是定义函数的关键字
- 文档字符串使用三个引号括起来
- 文档字符串下的为函数体
参数传递
函数参数的定义方式有4种,位置参数,关键参数,元组参数和字典参数。
位置参数
按照函数形式参数的顺序传递参数,一旦改变参数的顺序结果就会不同。
def func(x,y):
print("x=%d y=%d"%(x,y))
func(3,4)
#输出:
x=3 y=4
func(4,3)
#输出:
x=4 y=3
关键参数
关键参数指的是在传递参数时,不必考虑形式参数的具体先后顺序,以“形式参数=实际参数”的形式,直接告诉解释器,你想把实际参数传递给哪个实参。
def func(x,y):
print("x=%d y=%d"%(x,y))
func(y=3,x=4)
#output:
x=4 y=3
元组传递
元组参数主要用在实际业务逻辑中存在“可变参数”的情况,也就是说,你不能准确的说出实参的个数。这个时候就要使用“可变参数”的策略了。元组参数的本质其实就是将若干个实参封装成一个元组参数,这样就实现了一次传递参数个数可变的需求。例如:当函数的参数表示的是pisa的配料时,则配料的种类会因为pisa种类的不同而不同。这时就可以使用“元组参数”的策略了。
def func(*toppings):
print(toppings)
func('mushrooms','extra','cheese')
func('mushrooms','extra')
#output:
('mushrooms', 'extra', 'cheese')
('mushrooms', 'extra')
字典传递
这种策略是用来传递字典的,参数的形式是键值对的形式出现。
def func(**peoples):
print(peoples)
func(name='aaron',age=25)
#output:
{'name': 'aaron', 'age': 25}
从“func(name='aaron',age=25)”这段代码中可以看出,这种方式很容易跟“关键参数”的传参方式混淆。区分开的关键是这里的name表示的是字典里的键,而不是函数中的形参。如果出现了字典里的键和函数的形参一样的情况,那么解释器会将其理解为是“关键参数”,而不是字典传参,因此,在定义字典的键时要避免和其他形参一样。
def func(name,**people):
print(name)
print(people)
func(name='aaron',age='25',city='BeiJing')
#output:
aaron
{'age': '25', 'city': 'BeiJing'}
参数传递方式优先级问题
解释器在解析函数参数时,会以位置参数,关键参数,元组参数,最后是字典参数的顺序来解析参数。这就解释了上述说所的“关键参数”和“字典传参”易混淆的问题。
def test(x,y=1,*a,**b):
print(x,y,a,b)
test(1)
#output:
1 1 () {}
test(1,2)
#output:
1 2 () {}
test(1,2,3)
#output:
1 2 (3,) {}
test(1,2,3,4)
#output:
1 2 (3, 4) {}
test(x=1,y=2)
#output:
1 2 () {}
test(1,a=2)
#output:
1 1 () {'a': 2}
test(1,2,3,a=4)
#output:
1 2 (3,) {'a': 4}
test(1,2,3,y=4)
#output:
Traceback (most recent call last):
File "<pyshell#52>", line 1, in -toplevel-
test(1,2,3,y=4)
#output:
TypeError: test() got multiple values for keyword argument
传递列表问题
有三种方式,分别是位置参数,关键参数和元组传参。不过在元组传参中,需要利用list方法将元组转化为列表。
位置参数
def func(names):
print(names)
names[1] = 'jujinyi'
names = ['aaron','jim']
func(names)
print(names)
#output:
['aaron', 'jim']
['aaron', 'jujinyi']
以上述的方式传递列表是,传递的是列表的原件,所以会永久性改变列表的值。如果说只想传递列表的附件,那么可以使用切片的方法实现。
def func(names):
print(names)
names[1] = 'jujinyi'
names = ['aaron','jim']
func(names[:])
print(names)
#output:
['aaron', 'jim']
['aaron', 'jim']
关键参数
本质上和位置参数其实是一样的,只不过是显示的传参而已。当然,对于实参的影响也是一样的,会永久性影响实参的值。
def func(num,names):
print("num=%d"%num)
print(names)
names[1] = 'jujinyi'
names = ['aaron','jim']
func(names=names,num=25)
print(names)
#output:
num=25
['aaron', 'jim']
['aaron', 'jujinyi']
元组传参
def func(*toppings):
toppings = list(toppings)
print(toppings)
func('mushrooms','extra','cheese')
func('mushrooms','extra')
#output:
['mushrooms', 'extra', 'cheese']
['mushrooms', 'extra']
传递字典的问题
字典的传递同样也有三种方法,分别是位置参数,关键参数和字典传参。
位置参数
def func(names):
print(names)
names['name'] = 'jujinyi'
people = {'name':'aaron','age':'25'}
func(people)
print(people)
#output:
{'name': 'aaron', 'age': 25}
{'name': 'jujinyi', 'age': 25}
关键参数
def func(num,names):
print("num=%d"%num)
print(names)
names['name'] = 'jujinyi'
people = {'name':'aaron','age':'25'}
func(names=people,num=25)
print(people)
#output:
num=25
{'name': 'aaron', 'age': 25}
num=25
{'name': 'jujinyi', 'age': 25}
字典传参
def func(**people):
print(people)
func(name='aaron',age='25')
#output:
{'name': 'aaron', 'age': 25}
返回值
要想获取函数的执行结果,就可以用return语句把结果返回,注意:
- 函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束
- 如果未在函数中指定return,那这个函数的返回值为None