1. 为什么要使用函数
函数就是执行特定任务和完成特定功能的一段代码
随着代码量增大,需要对代码的结构重新进行整理打包,以降低代码结构的复杂性和冗杂度。
为了使得程序代码变得简单,需要把程序分解成较小的组成部分,可以通过:
函数、类、模块三种方法来实现
1)复用代码
2)隐藏实现细节
3)提高可维护性
4)提高可读性便于调试
2. 函数的定义
2.1 函数的创建使用关键字:def,函数名后面跟对小括号():
def Func1():
print('我在学习python')
注意:
1) 创建的函数名后面必须加一对小括号()
2)创建函数后,未调用函数,则该函数里的代码不会被执行
3)函数在刚被发明出来时,是没有参数的,这样只能对同样内容的代码进行打包,与使用循环没有本质不同。
因此,函数的参数出现,使得函数可以事先个性化
2.2 函数的参数
def Func2(name):
print(name+'在学习python')
def Func3(name,course):
print(name+'在学习'+course)
2.2.1 形参和实参
函数因参数而灵活,若没有参数,一个函数就只能死板地完成一个功能、一项任务。
参数分为形式参数(parameters),简称形参和实际参数(arguments),简称实参。
在函数定义时用来占位的参数称为形参;
在函数调用过程中实际传递进来的参数称为实参
2.2.2 默认参数
函数在创建的时候指定默认值,这样在函数调用的时候,若没有传递实参,则采用默认参数值
def Func4(name='蜜蜂',course='采蜜'):
print(name+'在学习'+course)
2.2.3 可变参数
1) 个数可变的位置参数
(1) 定义函数时,可能会无法事先确定传递的位置实参的个数
(2)使用*定义个数可变的位置参数
(3)结果为一个元组
(4)在函数的定义过程中个数可变的位置参数最多只能有1个
def func(*args):
print(args)
print(args[0])
func(11)
func(11,22,33,44)
func([66,88],999,333)
2) 个数可变的关键字参数
(1) 定义函数时,可能会无法事先确定传递的位置实参的个数
(2)使用**定义个数可变的关键字参数
(3)结果为一个字典
(4)在函数的定义过程中个数可变的关键字参数最多只能有1个
(5)在函数的定义过程中,如果既有个数可变的位置参数又有个数可变的关键字参数,个数可变的位置参数一定放在个数可变的关键字参数之前。
def fun(**args):
print(args)
fun(a=111)
fun(a=222,b=333,c=444,d=555)
2.3 函数的调用
2.3.1 调用函数只需要直接写出函数名加上小括号即可
Func1()
Func2('包菜')
Func3('小狗','啃骨头')
Func4()
Func4('蝴蝶','跳舞')
2.3.2 实际参数
函数在调用的过程中,实际传入的参数,如商数函数调用中传入的:包菜、小狗、啃骨头、蜜蜂、采蜜、蝴蝶、跳舞
2.3.3 位置参数
在函数定义的时候,已经确定参数的名称与位置,调用时,按照顺序传递正确的参数即可,这类位置固定的参数称为位置参数。
Func2('包菜')
Func4('蝴蝶','跳舞')
但是实际中可能会搞乱位置参数的顺序,无法实现函数的逾期效果,这时可以在调用时使用关键字参数
2.3.4 关键字参数
在传入实参时明确指定形参的变量名,这时参数之间不存在先后顺序
Func4(course='跳舞',name='蝴蝶')
注意:
1)调用函数时,位置参数必须在关键字参数前面
Func4('小鸡',course='画竹叶')
2.4 函数的返回值
使用:return关键字,后面跟着的就是指定要返回的值
3.函数文档
函数文档是为了自己以后或者别人更好地理解你的函数设计逻辑,主要描述该函数的功能和一些注意事项
def Func6(a,b):
'''
计算a的b次方
:param a: 底数
:param b: 指数
:return: a**b
'''
c = a**b
return c
print(Func6(2,3))
函数的文档可以通过特殊属性__doc__获取
print(Func6.__doc__)
4. 作用域
作用域是变量可被访问的范围
4.1 局部变量
定义在函数内部,只能在函数的内部生效,不能在函数外被引用。
def mya():
x=520
print(x)
mya()
print(x)
4.2 全局变量
函数体外定义的变量,函数内外均起作用
# 全局变量
x = 521
def myb():
print(x)
myb() # x可以被访问
4.2.1 函数中存在与全局变量相同的变量名时
x = 888
def myc():
x = 111
print(x)
myc() # 输出局部变量111,同名的局部变量覆盖全局变量x
print(x) # 输出全局变量888
4.2.2 函数内部创建全局变量:global语句
不提倡使用global语句在函数内部定义或修改全局变量,以免出现难以排查的bug
x = 888
def myc():
global x
x = 111
print(x)
myc() # 输出局部变量111
print(x) # 输出修改后的全局变量111
4.3 嵌套函数
def myd():
x = 999
print('in myd,x=',x)
def mye():
x = 666
print('in mye,x=',x)
mye() # 内部嵌套的函数是无法直接调用的,报错
要想调用内部嵌套的函数mye,需要在定义时调用
def myd():
x = 999
print('in myd,x=',x)
def mye():
x = 666
print('in mye,x=',x)
mye()
myd()
4.3.1 修改嵌套函数的值: nonlocal语句
def myd():
x = 999
def mye():
nonlocal x
x = 666
print('in mye,x=',x)
mye()
print('in myd,x=', x)
myd()
def myd():
x = 999
def mye():
# nonlocal x
x = 666
print('in mye,x=',x)
mye()
print('in myd,x=', x)
myd()
注意:
在python命名时避免使用与内部函数相同的变量名,否则会发生覆盖,使内部函数改变
num = 520
print(type(num))
num1 = str(num)
print(type(num1))
str='变量名'
print(str)
intt = 666
print(type(intt))
intt1 = str(intt)
''' 内部函数str已被改变,不再是内部函数str,变成字符串:变量名,无法再执行转变字符串的功能'''
print(type(intt1))