20181128(闭包函数,函数嵌套,名称空间,作用域,装饰器待补充)

一、函数对象

在面向对象的编程中 一切皆对象

具体的体现:

1.函数可以被引用

def bar():    print(‘from bar‘)?f=barf()输出结果为:from bar

2.函数可以作为函数的参数

def bar():    print(‘from bar‘)?def wrapper(func): #func=bar    func() #bar()?wrapper(bar)输出结果为:from bar

3.函数可以作为函数的返回值

def bar():    print(‘from bar‘)?def foo(func):     return func ?f=foo(bar) #先执行这一句,得出f=barf()  #等同于bar()输出结果为:from bar

4.可以被存储到容器类型中

def get():    print(‘from get‘)?def put():    print(‘from put‘)?l=[get,put]l[0]()输出结果为;from get

#写一个购物车,要求注册登录

二、函数嵌套

1.嵌套调用:在一个函数中调用了另一个函数

def max2(x,y):    if x > y:        return x    else:        return y?def max3(x,y,z):    res1=max2(x,y)  #因为max2函数有返回值,所以可以有等于    res2=max2(res1,z)    return res2  #等同于返回最大值?print(max3(11,199,2))输出结果为:199

2.嵌套定义:在一个函数中,又定义了另一个函数。定义在函数内的函数,只能在函数内使用,外界不能访问。

def func1():    print(‘from func1‘)    def func2():         print(‘from func2‘)    func2()  #调用func2()函数    print(func2)    #输出其内存地址,观察输出结果为(所在功能块,变量所在空间(局部变量?全局变量?),内存地址)func1()输出结果:from func1from func2<function func1.<locals>.func2 at 0x00000207784F9B70>  ??def func1():    print(‘from func1‘)    def func2():         print(‘from func2‘)    func2()      print(func2)   func1()print(func2())  #此处会报错,因为定义在函数内的函数,只能在函数内使用,外界不能访问。

3.函数的嵌套中:nonlocal a #声明使用上一层的变量a,如果上一层没有则找上上一层,但是不能寻找全局变量。嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量。

a = 1b = 2def func1():    a = 10    def func2():        b = 20        def func3():            nonlocal a,b            print(a,b)        func3()    func2()func1()print(a,b)输出结果为:10 201 2
a = 1b = 2def func1():    a = 10    def func2():        def func3():            nonlocal a,b            print(a,b)  #此处的b只能取函数内变量的值,不能取全局变量的值,因为上一句已经申明a,b只能修改获取嵌套作用域内的变量。        func3()    func2()func1()输出结果会报错?如果修改为:a = 1b = 2def func1():    a = 10    def func2():        def func3():            nonlocal a            print(a,b)  #此时b可以取全局变量        func3()    func2()func1()输出结果为:10 2
三、名称空间:又名name space,是存放变量名和值绑定关系的地方。

名称空间分为三类:

builtins:内置名称空间,存储解释器自带的一些名称与值的对应关系(解释器启动时创建,关闭解释器时销毁)

globals:全局名称空间,又名模块名称空间,在模块内定义的名称(文件级别的名字),除了内置的和函数内的,都在全局中。(执行py文件时创建全局名称空间,在文件结束或者文件执行期间被删除则失效。)

locals:局部名称空间,只要是函数内的名称就是局部的,包括局部变量和形参(函数调用时创建,函数执行完毕后销毁)

不同变量的作用域不同就是由于这个变量所在的名称空间决定的。

加载顺序:?    内置名称空间---》全局名称空间----》局部名称空间?查找顺序:?    局部名称空间 ---》全局名称空间----》内置名称空间

细分之下有四种空间:

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

域:指的是区域、范围的意思

python中有两种最基本的变量作用域:

局部变量:

1.只能在函数内使用

2.调用函数时生效,调用结束失效

全局变量:

1.在任何位置都能访问到

2.该范围内的名字会伴随程序的整个生命周期

局部变量:在函数内定义的变量名只能在函数内部引用,不能在函数外引用,这个变量的作用域是局部的,也称为局部变量。一般来说,定义的变量如果是在函数体中第一次出现,就是局部变量。

x = 50def func(x):    print(x)    x = 2    print(x)func(x)print(x)输出结果:   # 调用func()时创建了新的命名空间,作用于func的代码块50250

全局变量:在函数体外,一段代码最开始赋值的变量可以被多个函数引用,这就是全局变量。全局变量可以在整个程序范围内被引用。

num = 100def func():    num = 200    print(num)func()print(num)输出结果:  #函数中使用某个变量时,如果该变量名既有全局变量又有局部变量,就默认使用局部变量。在函数体中更改全局变量的值不会影响全局变量在其他函数或语句中的使用。200100

如何将局部变量变更为全局变量:

num = 100print(num)def func():    global num  #在函数体中的变量前加关键字 global,函数调用结束后,在函数体外使用变量时,值变得和函                       数体中的值一样    num = 200    num += 100    print(num)?func()print(num)输出结果:100300300

globals() 查看全局作用域的内容

locals() 查看局部作用域的内容

五、闭包函数

闭包函数是一种函数,其中闭 指的是定义在函数内部的函数。

函数的作用域在定义的时候就固定了,与调用的位置没有关系。

闭包的定义:如果在一个内部函数里对外部函数(不是在全局作用域)的变量进行引用,内部函数就认为是闭包。

闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得该函数无论在何处调用,都优先使用自己外层包裹的作用域。

什么是闭包函数

①定义在另一个函数中的函数

②内部的函数中访问了外部的名称(不包含全局的数据)

与普通函数的区别

①定义在另一个函数中的

②在内部的函数中使用了外部的名称

def s(*args):    def c():        a=0        for n in args:            a=a+n        return a    return cprint(s(1,2,3,4))c=s(1,2,3,4)print(c())输出结果为:<function s.<locals>.c at 0x000001F3D3469B70>10

在返回内部函数时,不是单纯的返回函数,还把函数中访问到的局部变量名称一起打包了

闭包函数的模板:

def func1():

a = 1

def innner():

print(a)

return inner

func1()

六、装饰器

对扩展开放,对修改封闭。即可以添加新功能,不能修改源代码和调用方式

什么是装饰器:

给一个已有的对象,添加新的功能

装饰器和闭包函数的关系:

装饰器是一种设计代码的套路(在不修改源代码和调用方法的情况下增加功能)

要完成装饰器,就需要使用闭包函数。

原文地址:https://www.cnblogs.com/realadmin/p/10036040.html

时间: 2024-10-07 05:38:09

20181128(闭包函数,函数嵌套,名称空间,作用域,装饰器待补充)的相关文章

函数对象,函数的嵌套,名称空间与作用域,闭包,装饰器,迭代器,内置函数

一,函数对象 函数对象:函数是第一类对象,即函数可以当做数据传递 1,可以被引用 2,可以做参数的传递 3,返回值可以是函数 4,可以当作容器类型的元素 二,函数嵌套 1,函数的嵌套调用 2,函数的嵌套定义 三,名称空间与作用域 名称空间:存放名字的地方叫名称空间,存放这些值与名字的绑定关系 查看内置名称的两种方法: 三种名称空间 1,内置名称空间:随着python解释器的启动而产生 2,全局名称空间:文件的执行会产生全局名称空间,指的是文件级别定义的名字都会放入该空间 3,局部名称空间:调用函

函数对象.函数嵌套,名称空间作用域

函数对象 函数使用方法 之前说函数类似于变量,那么有些变量的使用方法在函数上也是适用的 python中一切皆对象,我们可以对它获取内存地址或者打印类型或者其他的操作 1. 引用,赋值 def self_max(x,y): if x > y: return x return y a = self_max #此时a就是函数self_max max_num = a(20,39) print(max_num) 39 2. 当作函数的返回值 def f2(): print('from f2') def f

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

函数嵌套名称空间与作用域闭包函数装饰器迭代器生成器三元表达式,列表解析,生成器表达式递归与二分法内置函数--------------------------------------------函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数def max(x,y): if x>y: return x else: return ydef max1(a,b,c,d): res=max(a,b) res2=max(res,c) res3=ma

python_day04 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式

本节课重要知识点内容如下: 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式 1.函数嵌套 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数 def bar(): print('from nbar')def foo(): print('from foo') bar()foo()def max2(x,y): if x > y: return x else: return ydef max4(a,

11.11函数对象,名称空间,作用域,命名关键字参数

函数对象 函数是一个对象 函数名可以被引用 函数名可以当做一个参数进行传参 函数名也可以当成返回值,但是不能加括号,不然会直接调用函数 函数名可以当做容器类的元素 函数的嵌套 就是函数内部定义或调用函数 例 def x(): print('x') def y(): print('y') y() x() 名称空间 内置名称空间 python解释器自带的名称空间,开机就有了 全局名称空间 打开python解释器后就形成的名称空间, 局部名称空间 函数内部的名称空间 查找顺序 先从局部查找,在查找全局

python函数作用域+装饰器

今天记录的是一个小小的知识点 ->函数作用域+装饰器: LEGB:L>E>G>B L;local函数内部作用域 E:enclosing函数内部与内嵌函数之间 G:global全局作用域 B:build-in内置作用域 Coding && Result: 闭包(Closure):内部函数中对enclosing作用域的变量进行引用. 闭包的作用: 1)封装 2)代码复用 函数的实质和属性: 1)函数是一个对象 2)函数执行完成之后内部变量回收 3)函数是对象就有属性 4

~~函数进阶(一):装饰器~~

进击のpython 函数进阶-装饰器 知道京东吧(不知道?那你知道淘宝,蘑菇街吧) 我们身为用户,在进入界面的时候 首先会提示我们登陆是吧 当我们登陆的时候,接下来的所有操作就不用再验证身份了 否则,一到收藏啊,关注啊,就需要我们重新登陆 那我们可不可以做一个这个呢?? 没有数据库,我们模拟一个数据库,懂我意思吧! DB = { "login": False, "user_name": "poddy", "password":

Python函数的冒泡排序、递归以及装饰器

函数的冒泡排序: 本质是,让元素换位置,逐个比较最终排序. 例1:实现a1,a2值互换: a1 = 123 a2 = 456 temp = a1 a1 = a2 a2 = temp print(a1) print(a2) 结果: 456 123 冒泡排序: #!/bin/bash/env python # -*- coding:utf-8 -*- li = [22,1,5,4,3,66,22,12,34,21] for j in range(1,len(li)): for i in range(

python函数、装饰器、迭代器、生成器

5月21日,请假结婚,然后性格惰性来了,不怎么想看视频和笔记,性格中的弱点开始出现,开始做的不错,渐渐开始松懈,直至放弃--- 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象:  函数是第一类对象,即函数可以当作数据传递,它的应用形式也被称为高阶函数,函数的特性如下: a. 可以被引用 1 # def foo(): 2 # print('from foo') 3 # 4 # func = foo