1.函数介绍:
编程语言中的函数与数学中的函数是有区别的:数学中的函数有参数(输入),就会有相应的结果(输出)。编程语言中的函数有输入,不一定会返回结果。
编程语言中的函数其实就是一个用于完成某个特定功能的相关代码的代码段 。
编程语言中的函数的作用就是实现代码的可重用性,提高代码可维护性、扩展性和可读性。
2.Python中定义函数的语法:
def 函数名称( 参数 ):
"""
函数使用说明、参数介绍等文档信息
"""
代码块
return [表达式]
实例:
def func1():
'''testing'''
print('in the func1'),
return 0
要想获取函数的执行结果,就可以用return语句把结果返回
注意:1.函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束
2.如果未在函数中指定return,那这个函数的返回值为None
3.函数的调用
def func2(x,y,z):
print(x)
print(y)
print(z)
test(1,2,3) #调用函数
4.函数参数说明
①形参:即形式参数,函数定义时指定的可以接受的参数即为形参,比如上面定义的add(a, b)函数中的a和b就是形参;
②实参:即实际参数,调用函数时传递给函数参数的实际值即为实参,比如上面都用add(1, 9)函数中的1和9就是实参;
③位置参数:顾名思义是和参数的顺序位置和数量有关的。函数调用时,实参的位置和个数要与形参对应,不然会报错。
例:两个位置参数
def func3(name, age):
print('NAME: %s' % name)
print('AGE: %d' % age)
func3('peng',25) #正确调用
func3(25,'peng') #错误调用
func3('peng',26,27) #参数数量错误
④默认参数
def func4(name, age=20):
print('NAME: %s' % name)
print('AGE: %d' % age)
func4('peng') #正确调用:有默认参数,调用函数的时候,默认函数非必须传递
func4('peng',25) #正确调用,age取新值
func4(30) #注意:此时值传给了name,并非传给age
⑤可变长参数(非固定参数)
可变(长)参数:顾名思义,是指长度可以改变的参数。通俗点来讲就是,可以传任意个参数(包括0个)。
可变(长)参数的应用场景:通常在写一个需要对外提供服务的方法时,为了避免将来添加或减少什么新的参数使得所有调用该方法的代码点都要进行修改的情况发生,此时就可以用一个可变长的形式参数。
#*args:接收n个位置参数,转换成元组方式
def func5(*args):
print(args) func5(1,2,3,4,5,5) func5(*[1,2,4,5,6]) #args=tuple([1,2,4,5,6]) def func6(x,*args): print(x) print(args) func6(1,2,3,4,5,6,7,8,9)
⑥关键字参数
顾名思义,是指调用函数时通过关键字来指定是为哪个形参指定的实参,如name="Tom", age=10,x=6等等
def func7(x,y,z):
print(x)
print(y)
print(z)
func7(1,2,3) #正确调用:与形参一一对应
func7(y=2,x=3,z=5) #正确调用:与关键字参数顺序无关
func7(1,3,y=3) #报错:positional argument follows keyword argument
func7(1,y=3,6) #报错:positional argument follows keyword argument
func7(1,x=3,y=6) #报错:func7() got multiple values for argument 'x'
func7(1,z=3,y=6) #正确调用
func7(z=3,y=6,7) #报错:positional argument follows keyword argument
⑦n个关键字参数(非固定参数)
#**kwargs:把多个关键参数转化为字典的方式
def func8(**kwargs):
print(kwargs) #返回:{'age': 18, 'name': 'peng', 'sex': 'F'}
print(kwargs['name'])
print(kwargs['age'])
print(kwargs['sex'])
func8(name ='peng',age =18,sex ='F')
def func9(name,**kwargs):
print(name)
print(kwargs) #返回:{'age': 18, 'sex': 'F'}
func9('peng',age=18,sex='F')
5.局部变量和全局变量
在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
当全局变量与局部变量同名时:
在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
Ⅰ.局部变量
def change_name(name):
print('before chaange',name)
name ='Peng' #局部变量:这个函数就是这个变量的作用域
print('after chaange',name)
name='peng'
change_name(name)
print(name)
Ⅱ.全局变量
company ='F' #全局变量:代码顶层位置
def change_name(name):
company ='M'
print('before chaange',name,company)
name ='Peng'
print('after chaange',name)
name='peng'
change_name(name)
print(name)
print(company)
Ⅲ.修改全局变量
company ='F'
def change_name(name):
global company #声明局部变量修改为全局变量
company ='M'
print('before chaange',name,company)
name ='Peng'
print('after chaange',name)
name='peng'
change_name(name)
print(name)
print(company)
另:
def change_name():
global name
name ='Peng'
#没有全局变量而在函数里声明局部变量修改为全局变量不推荐用此种方法
change_name()
print(name)