Python函数进阶

函数
定义:函数是将一组语句的集合通过一个名字(函数名)封装起来,想要执行这个函数,只需要调用其函数名即可
特性:减少重复代码;使程序变的可拓展;使程序变得易维护

函数参数
形式参数:只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元;形参只在函数内部有效。函数调用结束返回主调用函数后不能在使用该变量

实参:可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参,应预先赋值,输入等方法使参数获得确定值。

关键参数:指定了参数名的参数就叫关键参数(关键参数必须放在位置参数之后)

非固定关键字参数
def stu_register(name,age,*args): #*args会把多传入的的参数变成一个元组形式,如果*args没有传值,会返回一个空元组
print(name,age,args)
stu_rigister("xfxing",22)

def stu_register(name,age,*args,*kwargs):#*kwargs会把多传入的的参数变成一个字典(dict)形式,如果*kwargs没有传值,会返回一个空字典
print(name,age,args)
stu_rigister("xfxing",22)


函数返回值
函数外部的代码想要获取函数的执行结果,就可以在函数里用return语句把结果返回
注意:函数在执行过程中只要遇到return语句,就会停止执行并返回结果
如果未在函数中指定return,这个函数返回值为None


局部变量 不用传值到函数里,也可以在函数里调用外面的变量
1.在函数中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量
2.全局变量作用域是整个程序,局部变量作用域是定义该变量的函数
3.当全局变量与局部变量同名是,在定义局部变量的函数内,局部变量起作用,在其他地方全局变量起作用

在函数内修改全局变量,可先声明要修改的全局变量 然后再去修改它(应从实际开发角度去考虑)
name="alex"
def change_name():
global name
name="xfxing"
print(name,id(name))

change_name()
print(name,id(name))


在函数里修改列表数据
names=['Alex','Rain','Girl']
def change_name():
del names[2]
names[1]="黑姑娘"
print(names)

change_names()
print(names)

重新赋值不可以,修改列表里的值可以,整体的内存地址不能改,里面的某个元素可以修改

作用域(scope)
通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。

在Python中函数就是一个作用域(JavaScript类似),局部变量放置在其作用域中
代码定义完成后,作用域已经生成,作用域链向上查找

作用域的查找顺序:LEGB(locals->enclosing function->globals->__builtins__)
locals是函数内的名字空间,包括局部变量和形参
enclosing外部嵌套的名字空间
globals全局变量,函数定义所在模块的名字空间
builtins内置模块的名字空间


嵌套函数(在函数中嵌套函数)
不能直接调用内层嵌套的函数

1.函数内部可以再次定义函数
2.执行需要被调用

匿名函数
就是不需要显示的指定函数名
func=lambda x,y:x*y if x<y else x/y #申明一个匿名函数
print(func(8,16))

f=lambda x:x**x

高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数称之为高阶函数

只需满足以下任意一个条件,即是高阶函数
1.接受一个或多个函数作为输入
2.return返回另外一个函数

递归
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数

递归特性:
1.必须要有一个明确的结束条件
2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以递归调用的次数过多,会导致栈溢出)

猜你喜欢

转载自www.cnblogs.com/xfxing/p/9098164.html