1.函数的定义
def 函数名():
函数体
return 返回值1,返回值2
函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕。
如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。
空函数
如果想定义一个什么事也不做的空函数,可以用pass语句
def fun():
pass
2.函数的调用
函数名()
注意:定义函数时,函数不执行,调用函数时, 函数才执行
调用函数的时候,如果传入的参数数量不对,会报TypeError的错误
In [1]: abs(1,2)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-1-d2854b9957d6> in <module>()
----> 1 abs(1,2)
TypeError: abs() takes exactly one argument (2 given)
如果传入的参数数量是对的,但参数类型不能被函数所接受,也会报TypeError的错误
In [2]: abs("a")
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-05efdfd16af5> in <module>()
----> 1 abs("a")
TypeError: bad operand type for abs(): 'str'
实现打印返回值: print 函数名()
In [4]: def add(x,y):
...: return x+y
...:
In [5]: print add(1,2)
3
3.函数的参数
- 必选参数
#形式参数x, y
def add(x, y):
print x + y
#实参 x=1, y=2
add(1 2)
3
- 默认参数
把一个参数默认为一个固定的值
#把y作为默认参数,默认值为2
def mypow(x,y=2):
print x**y
#调用时,只用一个必选参数,可以省略默认参数
mypow(2)
从上面的例子可以看出,默认参数可以简化函数的调用。设置默认参数时,有几点要注意:
必选参数在前,默认参数在后,否则Python的解释器会报错
当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数
定义默认参数要牢记默认参数必须指向不变对象
- 可变参数
可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个,这些可变参数在函数调用时自动组装为一个tuple
#args 实质上是一个元组 ;
def add(*args):
sum = 0
for i in args:
sum += i
print sum
# 实参 , x=1, y=2
add(1 2 3 4 5 6 2 3 4 5 76)
- 关键字参数
而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
# kwargs 实质上是一个字典
def inuser(name, age, **kwargs):
print name, name, kwargs
#在调用该函数时,可以只传入必选参数,也可以传入任意个数的关键字参数
inuser("user1",12,city="xi'an",birth="20180101")
- 参数组合
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数,这4种参数都可以组合使用。参数定义的顺序必须是:必选参数、默认参数、可变参数、关键字参数。
4.函数返回值
- 函数中如果没有return时, 默认返回None
- 返回值为1个
- 返回多个值
# 实质上 python 只能返回一个值,间接通过元组返回多个值 ;
def fun(*args):
return max(args), min(args)
print fun(1,2,3,4,5,6)
5.函数的作用域
num = 1
def fun():
num = 5
fun()
print num
运行效果:
1
由于函数体外的num为全局变量,函数体内的num为局部变量,只作用于函数体内,当在函数体外输出num的值,自然时全局变量num生效
# 全局变量
num = 1
def fun():
# global 声明 num 为全局变量
global num
num = 5
fun()
print num
运行效果:
5
注意:global关键字必须要先声明, 再赋值