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

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

一,函数对象

    函数对象:函数是第一类对象,即函数可以当做数据传递

     1,可以被引用

技术分享

     2,可以做参数的传递

 技术分享

     3,返回值可以是函数

技术分享

     4,可以当作容器类型的元素

技术分享

 二,函数嵌套

 1,函数的嵌套调用

技术分享

 2,函数的嵌套定义

技术分享

三,名称空间与作用域 

名称空间:存放名字的地方叫名称空间,存放这些值与名字的绑定关系

查看内置名称的两种方法:
技术分享

技术分享

三种名称空间

1,内置名称空间:随着python解释器的启动而产生
2,全局名称空间:文件的执行会产生全局名称空间,指的是文件级别定义的名字都会放入该空间
3,局部名称空间:调用函数时会产生局部名称空间,只在函数调用时临时绑定,调用结束解除绑定,
作用域:
   1,全局作用域:
         包含内置名称空间和全局名称空间(全局有效,在任何位置都能被访问到,除非del删掉,否则会一直存活到文件)
   2,局部作用域:
         局部名称空间,局部有效,只能在局部范围调用,只在函数调用时才有效,函数结束
名字的查找顺序:局部名称空间-----全局名称空间-----内置名称空间
技术分享

查看全局作用域内名字的方法:gloabls()

查看全局作用域内名字的方法 :locals()

四,闭包

1,内部函数包含对外部作用域而非全局作用域的引用,该内部函数就称为闭包函数.
闭包:
 技术分享
闭包函数:惰性计算

技术分享

五,装饰器

为什么要用装饰器?

      1,开放封闭原则,对修改是封闭的,对扩展是开放的

      2,装饰器就是为了在不修改被装饰对象的源代码以及调用方式的前提下,为其添加新功能

装饰器:在遵循下面两个原则的前提下为被修饰者添加新功能

必须遵循两个原则:

      1,尽量不要修改源代码

      2,不能修改调用方式

装饰器:修饰别人的工具,修饰:添加功能,工具指的是函数

装饰器本身可以是任何可调用对象,被装饰的对象也可以是任意可调用对象 

无参函数的简单语法

技术分享

sleep休眠函数
@    装饰器的语法,正下方的函数当做参数传进来,固定只有一个参数
 
传入有参函数的语法
技术分享

多个装饰器

技术分享

技术分享

技术分享

六,迭代器

为什么要有迭代器?

对于没有索引的数据类型,必须提供一种不依赖索引的迭代方式

迭代的概念:重复+上一次迭代的结果为下一次迭代的初始值,重复的过程称为迭代,每次重复即一次迭代,并且每次迭代的结果是下一次迭代的初始值

执行__iter__方法,得到的结果就是迭代器

迭代器的有点和缺点:

优点:1,提供了一种不依赖下标的迭代方式

         2,就迭代器本身来说,更节省内存

缺点: 1,无法获取迭代器对象的长度

          2,不如序列类型取值灵活,是一次性的,只能往后取,不能往前退

迭代协议:

           对象有__next__

          对象有__iter__,对于迭代器来说,,执行__iter__方法,得到的结果仍然是它本身

可迭代对象

技术分享

技术分享

只有文件是迭代器对象__next__是迭代器

__next__一次只能取一个值

抛出异常:StopIteration说明值已取完

取字典value的值和处理异常

技术分享

生成器函数:只要函数体包括yield关键字,该函数就是yield就是生成器函数

yield的功能:

          1,相当于为函数装好__iter__和__next__

          2,return只能返回一次值,函数就终止了,而yield能返回多次值,每次返回都会将函数暂停,下一次next会从上一次暂停的位置继续执行。

技术分享

技术分享 

七,内置函数

技术分享

 

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