函数式编程
作用域
变量起作用的范围
块级作用域
python中没有块级作用域,逻辑必须完整
num = int(input('请输入:'))
if num % 2 == 0:
info = "这是一个偶数"
print(info)
局部作用域
定义在函数里面的变量
在函数的外边,不能直接访问函数里面的变量
def func():
name = 'chancey'
print(name)
func(name)
# 一直报错而不能直接访问变量
全局作用域
直接顶格定义在脚本中的变量
函数内部可以访问到函数外边的变量
name = "chancey"
def func():
print(name)
func()
python代码从上往下执行,在遇到函数的时候,将开辟一条内存空间,用来存放函数,到func()
的时候,就会再次开辟内存空间,用来执行函数。而函数在寻找变量的时候,先从函数体内部找,如若没有,则去外边寻找。
name = "waller"
def func():
name = "mary"
def inner():
name = "peter"
print(name)
inner()
func()
name = 'chancey'
def f1():
print(name)
def f2():
name = 'waller'
f1()
f2()
# 这打印出来的是chancey,是因为代码在从上往下执行的,name变量开辟一条空间,f1开辟一条空间,而在执行f2的时候,开辟的新空间里在调用f1又开辟新的空间,所以找f1就找到上边开辟的空间,而上边开辟的空间并没有name变量,则向外找。
global
name = 'waller'
def func():
name = 'chancey'
func()
print(name)
# 打印waller
name = 'waller'
def func():
global name
name = 'chancey'
func()
print(name)
# 打印chancey
用来声明全局变量,即函数外的变量无效,直接修改
nonlocal
name = 'waller'
def func():
name = 'chancey1'
def inner():
nonlocal name
name = "chancey2"
inner()
print(name)
func()
print(name)
# 打印chancey2和waller
有以上的例子可以看出,nonlocal
用来修改嵌套函数之外的函数变量
小结:
- 函数的外部无法访问函数内部的变量;
- 函数内部可以访问函数外部的变量;
- 一般情况下,函数里面不能修改外边的变量,如需修改,则用
global
,nolocal
闭包
百度百科提供:闭包就是能够读取其他函数内部变量的函数。
嵌套函数
def func1():
print("func 1 被调用 ")
def func2():
print("func 2 被调用 ")
func2()
func1()
像这种在一个函数里面有一个完整函数的函数就是嵌套函数。
函数名及变量
def func1():
print("func 1 被调用 ")
b = func1
a = b
当定义一个函数的时候,就以函数名为变量名存储,实则函数也就是一个变量。
闭包
def f1():
name = "chancey"
def inner():
print(name)
return inner
a = f1()
a()
通过内层函数去引用外层函数的变量,然后外层函数的参数就被封到内层函数里面,又通过retrun
返回出来,类似于打成了一个包。
个人理解,还望大神不令赐教
因为一直有函数引用,所以一直不会被回收,则变量一直存在。
def f1():
temp = []
for i in range(10):
def inner():
print(i)
temp.append(i)
return temp
msg = f1()
msg[0]()
for f in msg:
f()
装饰器
其本质就是一个函数
现有如下业务代码,功能为打印函数名 hello world
def f1():
print(f1.__name__,"hello world")
f1()
以上代码可以完美的满足业务需求,但是,现在有新的需求,希望在不更改原代码的基础上增加新的功能,然后在该函数打印hello world
之前,打印出提示信息。
首先定义一个新的函数
def logger(fun):
def inner():
print("打印之前的提示")
res = fun()
print("打印之后的提示")
return res
return inner
这里的传的参数就是上述的f1,完整代码为
def f1():
print("hello world")
def logger(fun):
def inner():
print("打印之前的提示")
res = fun()
print("打印之后的提示")
return res
return inner
f1 = logger(f1)
f1()
然后这里完美的解决问题,但是python里面有一种特殊的语法,叫语法糖,@
def logger(fun):
def inner():
print("打印之前的提示")
res = fun()
print("打印之后的提示")
return res
return inner
@logger
def f1():
print("hello world")
f1()