函数--第一类对象、闭包、

一.第一类函数。

二.闭包

三.迭代器。

一.第一类对象

函数名是一个变量,但它是个特殊的变量,与括号配合可以执行函数的变量.

函数名可以赋值给其他变量,调用函数体时,后面()就可和原函数名一样使用

函数名可以当作容器类的元素

函数名可以当作函数的参数

函数名可以作为函数的返回值

二.闭包

闭包就是内层函数,对外层函数(非全局)的变量的引用,python规定:如果你的内部函数中访问了外层函数中的变量,那么这个变量将不会消亡,常驻内存
闭包的简单写法:
def func1():
    name = "alex"
    def func2():
        return name    # 闭包
    return func2

ret=func1() #访问外部函数,获取到内部函数的地址
print(ret())#访问并打印内部函数
结果:
alex

未来闭包的应用场景简述

简易版爬虫
from urllib.request import urlopen  #导入urllib包的request模块的urlopen(打开一个网址)函数
def but():
content = urlopen("https://www.dytt8.net").read()
def get_content():
return content
return get_content
print("开始获取")
fn = but()
content = fn().decode("gbk")
print("获取完毕")
print(content[60])
print(content[5])
检测函数是否有闭包:__closure__

使用函数名.__closure__返回cell就是闭包,返回None就不是闭包
闭包的优点:
    1)保护变量不被全局修改
    2)可以让这个变量常驻内存,方便调用.
闭包的不足:
    当闭包太多,常驻内存的值就会很多,内存空间会告急.

 

三、迭代器

 判断迭代器和可迭代对象的方案(官方):

Iterable(是否是可迭代的);

Iterator(是否是迭代器)

from collections import Iterable, Iterator
isinstance(对象, Iterable) 是否是可迭代的
isinstance(对象, Iterator) 是否是迭代器

 

str, list, tuple, dict, set都是可迭代对象,因为他们遵循了可迭代协议.
dir()函数是第一种:可以查看类中定义好的所有方法,包括是否可迭代
print(dir(str))
属性中存在__iter__,声明该类是个可迭代对象,

isinstence()函数是第二种查看一个对象定义好的所有方法,包括是否可迭代
l = [1,2,3]
l_it = l.__iter__() #获取对象的迭代器,有了迭代器权限,才能一个一个(__next__)迭代拿取
__inter__获取到对象的迭代器  #可以使用迭代器中的__next__()来一个一个的获取迭代器内的元素,

总结:
  以后代码写的过长,但需求只是一部分时,使用改方法可节省内存.
该方法存在惰性机制,就是你不下__next__的指令它就永远停在那里,而且不能反复,只能向下执行,如果想再次获取前一个内容,必须重新获取该类的迭代器(l_it = l.__iter__)

 for 循环的机制:

for i in [1,2,3]:
    print(i)

 

 下面我们使用while循环+迭代器来模拟for循环

lst = [1,2,3]
lst_iter = lst.__iter__()#获取lst列表的迭代器权限
while True:
    try: #尝试
        i = lst__iter__().__next__()
        print(i)
    except StopIteration:#如果报错
        break  #终止(兜底)
此方法的try,except StopIteration, break,为固定格式
posted @ 2018-12-11 16:55  Tank-Li  阅读(279)  评论(0编辑  收藏  举报