python学习笔记8
什么是闭包?
内部函数可以引用外部函数的参数和局部变量,当外部函数返回内部函数时,相关参数和变量都保存在返回的函数中,这种特性被称为“闭包(Closure)。闭包是两个函数的嵌套,外部函数返回内部函数的引用,外部函数一定由参数。
#闭包的类似格式
def 外部函数(参数):
def 内部函数():
pass
return 内部函数
闭包有以下几个特点
- 必须有一个内嵌函数
- 内嵌函数必须引用外部函数的变量(该函数包含对作用域而不是全局作用域名字的引用)。
- 外部函数的返回值必须是内嵌函数
闭包与正常函数的区别
- 闭包格式连个函数的嵌套
- 闭包外部函数的参数可以在内存中保持
- 闭包函数就如同一个类,只有在改函数里的方法才可以使用其局部变量,闭包函数之外的方法是不能读取其局部变量的。这就实现了面向对象的封装性,更安全更可靠,即闭包里面的数据是独有的数据,与外界无影响
- 函数:在函数中,需要使用的全局变量在一定程度上是受到限制的,因为全局变量不仅可以给函数使用,其他的函数也可能会使用到,一旦被修改会影响到其他函数使用 全局变量,所以全局变量不能随便被修改,因此在函数的使用中受到一定的限制
def func_out(*args):#定义外部函数
def func_in():
sumV = sum(args)
return sumV
S = func_out(1,2,3,4)
print(S())#真正调用的是func_in函数
请编写一个函数,接收整数参数n,返回一个函数,函数的功能把函数的参数和n想成并把结果返回
def mulby(num):
def gn(val):
return num*val
return gn
zw = mulby(7)
print(zw(8))
函数中*args和**kwargs的作用是什么
*args和**kwarags主要用于函数的定义。当函数的参数不确定时,可以使用*args和**kwargs来将不定数量的参数传递给一个函数。这里补丁的意思是预先不知道函数的使用者会传递多少个参数,所以在这种场景下可以使用这两个关键字
*args是用来发送一个非键值对的可变你数量的参数列表归一个函数*args会接受任意多个参数并把这些参数作为元组传递给函数。*argss没有key值,以元组形式传递
**kwargs存储可变的关键字参数,允许使用没有事先定义的参数名,将接收到多任意个关键字参数作为字典传递个函数。**kwargs有key置,以字典形式传递函数
需要注意的是,函数的参数的顺内需:*args和**kwargs前面,调用函数传递参数也必须依照此序列
args实例
def demo(args_f,*args_v):
print(*args_f)
for x in args_v:
print(x,end='')
demo(1,'a','b','c','d')
def func(x,y,*args):
print(x,y,args)
func(1,2,3,4,5,6)
说明传递给函数的是一个元组
**kwargs示例
def demo(**kwargs):
print(kwargs,type(kwargs))
demo(name='mtcx')
如何在一个function里面设置一个全局的变量?
可以在function中使用global来声明一个变量
def f():
global x
如果要给全局变量在一个函数里赋值,那么必须使用global语句。global VarName的表达式会告诉python,VarName是一个全局变量,这样python就不会在局部命名空间里寻找这个变量了
用python语言写一个自定义函数,输入一个字符串,返回倒序排列的结果
def string_reverse(input_str):
return input_str[::-1]
print(string_reverse('abcdefg'))
给定一个红包的数额属组gifts=[2,3,6,2,24,5,26]以及它的大小n,返回是否有某某个金额出现的次数超过红包数的一半.若存在则返回改红包金额,若不存在则返回0
#使用函数来完成
def select_most_often_gift(gifts):
gift_item = set(gifts)
n = len(gifts)
for gift in gift_item:
num = gifts.count(gift)
if num > n/2:
return gift
return 0
print(select_most_often_gift([2,3,6,2,24,5,26]))