Python day08
今天学习了函数的返回值,装饰器,闭包,内部函数,break与return区别,LEGB变量
函数返回值
参数可以是str,int,bool,float,list,tuple,set,dict
返回值:
1. 如果函数没有返回值则默认的返回值是None
2. 如果在函数中添加返回值,要通过return关键字
return关键字的作用:
A. 返回return后面值
B. 结束方法(函数)
break —> 结束循环
return —> 出现在函数,表示结束函数
C. return 可以单独使用,返回值是None
D. python独有的
return a,b,c ----> (a,b,c)
print只是打印,不会返回值,return 参数 接受参数后打印会将参数输出
def hanshu(x):
print(x)
return x
hanshu(10)#10 打印
********************************
def hanshu(x):
return x
r=hanshu(10)
print(r) 输出返回值
**********************************
def hanshu(x,y):
return x,y
r=hanshu(10,20)
print(r) #(10, 20) return两个值会将两个值组成元组
***********************************
def hanshu():
for i in range(5):
print(i)
if i ==2:
return
print('hello')
hanshu() #0 1 2 return后面无参数时,表示退出整个函数,不只是退出这一层,后面的语句也不会执行 return返回的值是None
*************************************
def hanshu(*args,**kwargs):
print(args,kwargs)
hanshu(1,2,3,4) #(1, 2, 3, 4) {}
**************************
list1=[1,2,3,4]
def hanshu(*args,**kwargs):
print(args,kwargs)
hanshu(list1,1,2,a=1,b=2) #([1, 2, 3, 4], 1, 2) {'a': 1, 'b': 2}
*************************
拆包
list1=[1,2,3,4]
dict1={'a':1,'b':2}
def hanshu(*args,**kwargs):
print(args,kwargs)
hanshu(*list1,**dict1)
内部函数
def A():
print('我是函数')
def a():
print('我是内部函数')
A()#我是函数,没有调用内部函数
**********************************
def A():
print('我是函数')
def a():
print('我是内部函数')
a()
A()#我是函数
#我是内部函数
作用域
LEGB
global —> 函数外层
local —> 函数的本地变量
enclosing --> 两层函数
def func():
a =10 ---->内层函数的enclosing
def inner_func():
print(a)
inner_func()
builtins: 所有py文件执行的时候都会加载内置模块
global —》 函数中想修改全局变量(不可变)
nonlocal —》内层函数中想修改外部函数中变量 (外层函数是可变list—》内层函数还用加nonlocal吗?)
globals() —> 内置函数 获取全局变量= 系统+ 自定义 --》{。。。。}
locals() —> 用在函数中,获取函数中局部变量 —》{。。。。。}
局部变量
locals(),在函数内部调用
number=0
def hanshu():
number=1
print(locals()) #{'number': 1} locals()会将局部变量以字典的形式储存
hanshu()
print(number) #0 因为函数内部的number是局部变量,不会对全局变量number造陈成影响
全局变量
globals()
number=0 对于不可变类型
def hanshu():
global number
number=1
hanshu()
print(number)# 1 声明变量的前面加上global,就成了全局变量,内部的number改变,外面的随之改变
print(globals()) # 'number': 1,globals()在函数外调用,会将全局变量以字典的形式存储
*********************************************
list1=[0] 对于可变类型,list1引用相同的地址
def hanshu():
list1[0]=1 #此处list1可以不用加global,加上也不影响
hanshu()
print(list1)
enclosing
外部嵌套函数的名字空间
def hanshu():
number=1
def neibu():
nonlocal number #此处number会优先考虑自身变量,若没有会像外层寻找,
#nonlocal表示不引用自身number,引用外部函数的number,修改number后外层也改变
number=0
neibu()
print(number)
hanshu()
Builtins
builtins 则是内置模块,轻易不要修改
搜索变量的规则是:
- 如果有内部函数,先找内部函数自身的变量
- 如果内部函数自身没有变量,则找外部函数的变量
- 如果外部函数也不存在此变量则找全局
- 如果全局也没有此变量则找builtins
- 如果内部builtins也没有则报错
闭包
闭包就是能够读取其他函数内部变量的函数
装饰器
1.一个函数定义了一个内部函数
2.内部函数要使用外部函数的变量
3.返回值为内部函数名
用于拓展原来函数功能的一种函数,
这个函数的特殊之处在于它的返回值也是一个函数,
使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能
简单的装饰器
def decoration(f):
def wrapper():
print('装饰前')
f()
print('装饰后')
return wrapper
@decoration 此处表示把func()的地址传给上面的f,若有参数也一起传递
def func():
print('hello world')
func() 执行语句,此处相当于执行wrapper()函数
****************************************************************
例题
定义一个装饰器,实现计数器的效果。
def decoration(f):
count = [0]
# global n
n=[0]
def wrapper():
count[0]=count[0]+1
print('第{}位访客'.format(count[0]))
n[0]=n[0]+1
f(n[0])
return wrapper
@decoration
def show(n):
print('正在查看{}页面的内容'.format(n))
show()
show()