一、概念
什么是函数,函数是一个个单一可多次使用的功能模块,这样可以避免重复写相同的代码。函数是我们写代码用得最多的东西,可以很好的组织我们的程序。
二、定义
python函数定义如下:
def functionname(arg1, arg2, *args, **kwargs):
do_something()
return result
定义函数的关键字def, 后面是函数名, ()号里面是参数。
三、参数
python的参数不需要定义数据类型,大大简化了我们的操作。参数的写法有以下几种方式:
- 参数个数固定, 不带默认值
def foo(a, b):
return a + b
- 参数个数固定,带默认值
# 如果调用时不传递参数b的值,则b值为1,否则为传递的值
def foo(a, b=1):
return a + b
- 参数个数不固定 *args
# *args是一个tuple,当传递的参数个数不固定时使用,在函数
# 里面通过args[0], args[1]这样的方式来访问
def foo(a, b, *args):
pass
- 参数个数不固定 **kwargs
# **kwargs 是一个列表,这种很适合我们传递键值对参数
def foo(a, b, **kwargs):
# 可以通过如下方式访问这种参数
for key in kwargs:
print(kwargs[key])
四、函数调用
针对每种不同写法的参数,调用该怎么用呢
- 参数个数固定,不带默认值
def foo(a, b):
return a + b
# 直接调用, 参数位置一一对应,即是a=1, b=2
foo(1, 2)
- 参数个数固定,带默认值
def foo(a=1, b=2):
return a+b
# 这种情况我们有两种方式给参数赋值
# 1.直接传值,位置一一对应,与上面方法一样
foo(3, 4)
# 2.指定参数名赋值,这种方式,位置可以不定
foo(b=3, a=4)
# 但是不能这么写,指定参数赋值必须在直接传值的后面 ***
foo(a=6, 4)
- 参数个数不固定 *args
def foo(a, b, *args):
result = a + b
for item in args:
result += item
# 调用方式
foo(1, 2, *[2, 3, 4, 5, 6])
# 如果不加*号的话,传入的列表将会作为一个元素,即args的值是([2, 3, 4, 5, 6], ), 而不是(2, 3, 4, 5, 6)
# 调用带*args参数的时候,前面不能有指定参数赋值
foo(1, b=2, *[2, 3, 4, 5, 6]) # 这是错误的写法
- 参数不固定 **kwargs
def foo(a, b, **kwargs):
for key in kwargs:
print(key, kwargs[key])
return a + b
# 调用方式
foo(a, b, **{"name": "python", "author": "guido"})
五、局部变量与全局变量
函数内的变量称作为局部变量,函数外是没法访问的,全局变量是函数内外都可以访问的。
isBigger = False
def foo(num):
print(isBigger)
if num > 10:
isBigger = True
print(isBigger)
foo(11)
print(isBigger)
# 输出结果
# False
# True
# False
可以看到函数内的变量如果与函数外部变量名相同,当只是使用这个变量的时候,值是全局的值,当重新给这个变量赋值的时候,这个变量就是该函数的局部变量,它不会更改全局变量的值,那么如果要在函数内修改全局变量的值,就需要使用global申明变量是全局变量。
isBigger = False
def foo(num):
global isBigger
print(isBigger)
if num > 10:
isBigger = True
print(isBigger)
foo(11)
print(isBigger)
# 输出结果
# False
# True
# True
六、返回值
函数通过return来返回一个最终值,当不写这个return语句的时候,默认函数是返回None的。