定义函数
def 函数名(形式参数):
函数体 return 返回值a = 1def f(b): print(b) return None
如上所示,就是简单的定义了一个函数
函数的返回值
return后面为函数的返回值,跟其他编程语言不一样的是,在python中,不需要在def前面指定函数返回值的类型
如果函数没有返回值,默认返回一个None
在函数里面,只要执行了return,函数就执行完了,函数中return后面的代码就不执行了
函数的参数
- 形参和实参
- 指定参数
- 默认参数
- 动态参数
- 函数作为参数
形参和实参
在定义函数的时候,函数名后面括号里的参数是形式参数,简称形参
在执行函数的时候,函数名后面括号里的参数是实际参数
a = 1def f(b): print(b)f(a)
如上所示,b为形参,a为实参
指定参数
形参与实参默认是按照顺序一一对应的,如def f(x,y)......f(1,2),x与1对应,y与2对应,但是也可以指定参数,这样,形参与实参就不用一一对应了
def f(x,y)......f(y=1,x=2),这样就是指定参数
默认参数
def drive(p,name = 'alex'): temp = name + str(p) + '开车去东北' return temps = drive(11)print(s)
输出结果为:
alex11开车去东北
在上面的例子中,p是一个普通参数,name具有默认参数,一定要把含有默认值的参数放在后面
也可以给含有默认值的参数传递参数,这时默认值就不起作用了
动态参数
第一种动态参数:在形参列表中,在形参前面加上一个*,这样参数就可以不受数量限制了,如:
def f(*a): print(a) print(type(a))f(1,2,3,4,5)
输出结果为:
(1, 2, 3, 4, 5)
<type 'tuple'>由此可见,虽然只有一个形参a,但是却接受了5个参数,还有一点需要注意,第一种动态参数的类型是元组类型
第二种动态参数:在形参列表中,在形参的前面加上两个*, 在传递参数的时候,必须是键值对传(key=value),第二种动态参数会将闯进来的参数转换成字典,如:
def f(**a): print(a)f(k1=1,k2=2)
输出结果为:
{'k2': 2, 'k1': 1}
一般,第一种动态参数用args表示,第二种动态参数用kwargs表示,因此因该是这样:f(*args)与f(**kwargs)
两种动态参数可以放在一起使用
def fun(*args,**kwargs)...注意:*args在前面,**kwargs在后面,这个是规定死了的,不能变
fun(11,22,33,44,key1=value1,key2=value2) 这样自动就把11,22,33,44方到args中,key1=value1,key2=value2放放到kwargs中, def fun(p,*args,**kwargs)... fun(11,22,33,44,key1=value1,key2=value2) 这样,把11自动给p,22,33,44给args,key1=value1,key2=value2放放到kwargs中函数作为参数
def f1(): return 123 print(f1)
输出结果为:<function f1 at 0x000001ABF30ED268>,由此,我们可以看出:
f1:代指函数
f1():调用函数
def f1(): return 123def f2(f1): f1() return 456
在f2函数中,参数为f1,这个时候,f1做了f2的参数
全局变量与局部变量
约定:全局变量都大写,局部变量都小写
在函数内部,如果想要修改全局变量需要加一条global A语句
A = 1def fun(): b = 2 global A A = 3fun()print(A)
A为全局变量,b为局部变量,如果想要修改A,需要加一条global A语句,如果不加该语句,b=1 A=3直接这样,表示又申请了一个局部变量A