函数式编程

作用域

变量起作用的范围

块级作用域

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用来修改嵌套函数之外的函数变量

小结:

  1. 函数的外部无法访问函数内部的变量;
  2. 函数内部可以访问函数外部的变量;
  3. 一般情况下,函数里面不能修改外边的变量,如需修改,则用globalnolocal

闭包

百度百科提供:闭包就是能够读取其他函数内部变量的函数。

嵌套函数

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返回出来,类似于打成了一个包。

个人理解,还望大神不令赐教

因为一直有函数引用,所以一直不会被回收,则变量一直存在。

demo

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()
posted @ 2019-07-12 10:41  ChanceySolo  阅读(203)  评论(0编辑  收藏  举报