函数是python程序的重要组成部分。所谓函数就是实现某一特定功能的代码段,可重复使用,提高了代码的利用率。
python除了可以直接使用内置函数,还支持自定义函数。
使用 def
关键字,格式如下:
def函数名(参数列表):
函数体
函数的返回值
函数的返回值用return
语句返回,函数体内部的语句在执行时,一旦执行到return
时,函数就执行完毕,并将结果返回。
如果没有返回值,函数执行完毕后也会返回结果,只是结果为None。
调用的时候必须传值,有几个就按顺序传几个值
示例
def area(length, width):
return 2 * (length + width)
# 调用函数时,必须传递2个参数,否则会引发错误
print(area(10,3))
定义时给出默认值,调用的时候可以不传参,使用默认值
默认参数好处是:如果一个函数有20多个参数,如果使用默认参数,在调用的时候只需要传递某些参数(注意传参数名)就可以了。
示例
def student(name,age=10,city="Beijing"):
print("姓名:{},年龄:{},城市:{}".format(name,age,city))
#调用方式一:
student("赵四")
#调用方式二:
student("张三",15,"Shanghai")
#调用方式三:
student("李明",12)
#调用方式四:
student("李明",city="Tianjin")
1.既有位置参数又有默认参数,位置参数在前,默认参数在后。
2.多个默认参数时,调用的时候,既可以按顺序提供默认参数,也可以不按顺序提供部分默认参数。 当不按顺序提供部分默认参数时,需要传入参数名(见调用方式四)。
可以传入任意个参数,传入的参数被组装为一个tuple。
示例
def sum(*num):
sum=0
for i in num:
sum=sum+i
return sum
#调用方式一:
sum(1,2,3)
# 调用方式二:
num = [1,2,3]
sum(*num)
传入任意个含参数名的参数,这些关键字参数被组装为一个dict。
示例
def person(**kw):
for key in kw:
print("{}:{}".format(key,kw[key]))
# 调用方式一:
person(name="John",age=15)
# 调用方式二:
p={"name":"Alice","city":"Beijing"}
person(**p)
对于关键字参数,函数调用的时候可以传入任意个不受参数名限制的关键字参数。但如果想必须传入某个名字的关键字参数,就可以用命名关键字参数。如上例中的person()函数,如果必须传入名为age的关键字参数,可以写成如下形式:
def person(name, *, age):
print("name={},age={}".format(name,age))
# 调用方式:
person("John", age=15)
命名关键字参数又和位置参数不同,命名关键字参数必须传入参数名。如果没有传入参数名,调用将报错。如果上面例子的调用方式写成 person("John", 15) 将报错
如果既有可变参数,又有命名关键字参数,参数顺序为:可变参数,命名关键字参数,并且命名关键字参数前不需*
def person(name, *args, age):
print(name,args,age)
局部变量:在函数中定义的变量,只在函数内部起作用。
如果想让局部变量在函数外起作用,要声明为全局变量,需要使用global关键字来声明。
全局变量:在模块层次中定义的变量,作用范围在整个模块。
1.全局变量的作用范围仅限于单个模块文件内。
2.如果函数内定义的局部变量和全局变量同名,函数在使用该变量的时候会优先使用局部变量。
示例
先定义一个全局变量,由于函数内部没有定义同名变量,所以调用的时候使用的是全局变量的值
var=123 #全局变量
def func():
print(var)
# 调用函数
func() #123
现在在函数内部定义一个同名变量,可以看到函数在调用的时候优先使用的是自己内部的变量,而在函数外部使用的是全局变量的值
var=123#全局变量
def func():
var=45#局部变量
print(var)
# 调用函数
func() #45
print(var) #123
现在我们把函数内的变量声明为全局变量,可以看到变量var在函数外部也起作用了
def func():
global var
var=45#局部变量
print(var)
# 调用函数
func() #45
print(var) #45