Python基础-----函数

一、函数的定义方式
def 函数名([参数]):
'''函数文档'''
代码块
return 返回值(可以返回多个值,各种类型均可,最终以元组形式存放并返回)
上述格式就是python中函数的基本定义方式,其中def为关键字,参数可有可无,但是括号必须有
中间的注释内容为函数文档,用于说明该函数的作用以及参数。
1、返回值数=0,则返回None;
2、返回值数=1,返回指定的对象;
3、返回值数>1,将多个返回值存放至元组进行返回。
函数执行过程中遇到return语句则函数即刻执行结束
二、函数的特性
1、可重复性
2、可拓展性
3、代码的简洁性
三、过程
即没有返回值的函数即为过程(即没有return),默认返回None
四、函数的参数
1、形参
形参变量只有在调用时才分配内存单元,调用结束后即刻释放内存单元,即形参只在函数内部有效
函数调用结束返回主调函数后则不可再使用该形参变量;
2、实参
实参可以是常量、变量、表达式、函数等,无论实参是何种类型的值,在进行函数调用时,他们都
必须有确定的值,以便将这些值传给形参。因此应预先用赋值、输入等方式使参数获得确定值。
例如:
def calc(x,y):
res = x ** y
return res
c = calc(a,b)
print(c)
该例中,x y为形参,a b为实参
3、位置参数和关键字参数
1)位置参数
位置参数传值时,需按照位置以及参数数量进行传值
def test(x,y,z):
num = x + y + z
return num
c = test(1,2,3)
print(c)
>>> 6
2)关键字参数
关键字参数传值时,可以不按照位置进行传值,但是也必须传入同样数量的参数
def test(x, y, z):
num = x + y + z
return num
c = test(y = 1,x = 2,z = 3)
print(c)
>>> 6
4、默认参数
即为在定义函数的时候就讲参数指定好了
def test(x, y, z = 10):
num = x + y + z
return num
c = test(y=1, x=2)
print(c)
>>> 13
5、参数组
参数组即为加上*args或者**kwargs
1)其中*args表示传入列表
def test(x,*args):
print(x)
print(args)
test(1,2,3,4,5)
>>> 1
(2,3,4,5)
又如:
def test(x,*args):
print(x)
print(args)
test(1,[2,3,4,5])
>>> 1
([2,3,4,5])
若想将上述传入的列表中的每个元素均取出来而不是作为一体的话,可以在调用的时候在列表前加*
def test(x, *args):
print(x)
print(args)
test(1, *[2, 3, 4, 5])
>>> 1
(2,3,4,5)
上述一个*可传入列表等,但是依旧以位置参数进行处理,只是将args表示的值整体处理
2)**kwargs表示传入字典
但是传入的参数必须以关键字参数进行传值
def test(x,**kwargs):
print(x)
print(kwargs)
test(1,y =2,z = 3)
>>> 1
{'x':2,'y':3}
或者等同于:
def test(x, **kwargs):
print(x)
print(kwargs)
test(1, **{'x':2,'y':3})
>>> 1
{'x': 2, 'y': 3}
3)上述两种情况结合一起,则定义的函数可以传入任何值(是以位置参数进行传递)
def test(x,*args,**kwargs):
print(x)
print(args)
print(kwargs)
test(1,*[2,3,4],**{'a':5,'b':6})
>>> 1
(2,3,4)
{'a':5,'b':6}
五、局部变量与全局变量
在子程序中定义的变量成为局部变量,在程序的一开始定义的变量成为全局变量
当局部变量与全局变量同名时,在定义局部变量的子程序内,局部变量起作用;在其他
地方全局变量起作用。(命名上:一般全局变量名用大写表示,局部变量用小写表示)
一般用global来定义全局变量。如果函数内无global关键字,优先读取局部变量
若无局部变量则只能读取全局变量,且无法对全局变量重新赋值,对于可变类型如列表等
可以利用其内置方法对内部元素进行操作;如果函数中有global关键字,变量本质就是
全局的那个变量,可读取可赋值。
name = 'alex'
def chage_name():
name = 'jerry'
print('我是:',name)
chang_name()
print(name)
>>> '我是: jerry'
'alex'
上例中的name并没有被修改,只是直接调用函数内部的局部变量

name = ['alex']
def chage_name():
name.append('jerry')
print('我是:',name)
chang_name()
print(name)
>>> '我是: ['alex','jerry']
['alex','jerry']
上例中随便函数内无局部变量,但是全局变量为列表等可变类型,则可以进行修改

name = 'alex'
def chage_name():
global name
name = 'jerry'
print('我是:', name)
chang_name()
print(name)
>>> '我是:jerry'
'jerry'
上例中在函数中指定了全局变量,并对其进行了重新赋值
可以用nonlocal来指定局部变量,这样就可以对该变量的上一级变量进行修改
name = 'alex'
def chang_name1():
name = 'tony'
def change_name1_1():
nonlocal name
name = 'pony'
change_name1_1()
print(name)
chang_name1()
print(name)
>>> 'alex'
'pony'
'alex'
posted @ 2018-10-03 23:07  Meanwey  阅读(399)  评论(0编辑  收藏  举报