1、函数:指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用函数名即可
2、函数的作用:
减少重复代码
方便修改,更易扩展
保持代码的一致性
3、函数的命名规则
函数名必须以下划线或字母开头,可以包含任意字母、数字或下划线的组合,不能使用任何的特殊字符或标点符号
函数名区分大小写
函数名不能使用保留字
4、函数的创建
def 函数名(参数列表):
函数体
5、函数的参数
形式参数:不是实际存在,是虚拟变量,在定义函数和函数体的时候使用形参,目的是在函数调用时接收实参(实参个数,类型与实参一一对应)
实际参数:调用函数时传给函数的参数,可以使用常量,变量,表达式,函数,传给形参
区别:形参是虚拟的,不占用内存空间,形参变量只有在被调用时才分配内存单元
实参是一个变量,占用内存空间,数据传送单向,实参传给形参,不能形参传给实参
def fansik_add(x, y): # x和y是形式参数
print(x + y)
fansik_add(1, 2) # 1和2是实际参数
执行结果:
3
6、函数中参数的种类
位置参数
关键字参数
默认参数
不定长参数
def info(name, age, sex):
print('Name: %s' % name)
print('Age: %d' % age)
print('Sex: %s' % sex)
info('fansik', 45, 'male') # 位置参数,按照形参位置对应
info(age=27, name='fansik', sex='male') # 关键字参数,加载实参中
def info(name, age, sex='male'): # sex='male'为默认参数,默认参数需要放在其他参数的后边
print('Name: %s' % name)
print('Age: %d' % age)
print('Sex: %s' % sex)
info('fansik', 45, 'male')
def add(*args):
print(args)
sum = 0
for i in args:
sum += i
print(sum)
add(1, 2, 2, 3, 3, 4) # 还可以继续添加
def info(*args, **kwargs):
print(args)
for i in kwargs:
print("%s : %s" % (i, kwargs[i]))
info(1, 2, 3, 3, Name='fansik', Age=24)
将一个列表作为参数传递
def fansik(*args):
print(args)
fanjinbao = [1, 2, 3, 4, 5]
fansik(*fanjinbao)
将一个字典作为参数传
def fansik(**kwargs):
print(kwargs)
fanjinbao = {'name': 'zhangsan', 'age': 17}
fansik(**fanjinbao)
7、函数的返回值
def fansik():
print('ok')
return 'fanjinbao'
fansik()
print(fansik())
执行结果:
ok
ok
fanjinbao
说明:
函数里如果没有return,那么函数的默认返回值为None
return多个对象,python会将着多个对象封装成一个元组返回
8、作用域
L:local,局部作用域,即函数中定义的变量
E:enclosing,嵌套的父级函数的局部作用域,即包含次函数的上级函数的局部作用域,但不是全局的
G:global,全局变量,就是模块级别定义的变量
B:built-in,系统固定模块里面的变量,比如int,bytearray等
搜索变量的优先级顺序依次是:局部变量>父级变量>全局变量>python内置模块变量,也就是LEGB
x = int(2.9) # int built-in
g_count = 0 # global
def outer():
o_count = 1 # enclosing
def inner():
i_count = 2 #local
print(i_count)
print(o_count)
inner()
outer()
使用global修改全局变量
count = 0
def fansik():
global count
print(count)
count = 10
print(count)
fansik()
以上的例子这个count修改的就是全局的count
如果注释掉global count,那print(count)中的count查找顺序就是先从本函数中查找是否存在count变量如果不存在就会直接打印全局的count,
如果存在就会打印本函数中的count,但是这个count必须要在print(count)之前,函数中的count并不是全局count
使用nonlocal修改嵌套函数的变量
def fansik():
count = 10
def nimei():
nonlocal count
count = 100
print(count)
nimei()
print(count)
fansik()
执行结果:
100
100
如果注释掉nonlocal count,那么执行结果就是:
100
10