函数名的使用以及第一类对象,闭包,迭代器

函数名的使用以及第一类对象:

# 查看函数的内存地址 print(函数名)
# 函数可以当值,赋值给变量
# 函数可以参数,传递个参数的形参,函数当参数的时候不能加括号
# 函数可以当返回值,当返回值的之后不加括号
# 函数名可以元素存在容器里

 闭包 closure 
 嵌套函数,在嵌套函数内部使用外部变量(非全局变量),(并且一般外部函数的返回值为内部函数)
 好处:保护变量不会被外界修改,函数内使用到的变量延长寿命周期,节省开辟空间和销毁空间(函数每次运行都会开辟空间跟销毁空间)的时间差
#示例解析:

 def startAt():
 x = 1
def incrementby(y):
return x + y
 return incrementby
 a = startAt() # 调用startAt(),返回值是incrementby的函数名,也就是incrementby地址
 print('function',a)
 print('result',a(1))
print('a.func_name',a.func_name)

 


 迭代器iterate
迭代器一定是可迭代的,可迭代的不一定是迭代器.
可迭代对象:遵守可迭代对象的协议 具有__iter__()方法
除去整型和布尔值,剩下的都是
迭代器:遵守迭代器的协议,具有__iter__()和__next__()方法
创建一个迭代器 == 可迭代对象.__iter__()
使用迭代器== 迭代器.__next__()

 lst = [1,2,3,4,5]
 l1 = lst.__iter__().__next__()
 l2 = lst.__iter__().__next__()
 l3 = lst.__iter__().__next__()
 l4 = lst.__iter__().__next__()
 l5 = lst.__iter__().__next__()

 #结果全部都是1,因为每次都是生成一个新的迭代器,迭代第一个1.


 迭代器特性:不能回退,惰性机制,一次性的
 怎么查看迭代器还是可迭代对象

 from collections import Iterable,Iterator
 lst = [1,2,3,4,5]
 ll = lst.__iter__()
 print(isinstance(lst,Iterator)) #判断是否是一个可迭代对象
 print(isinstance(ll,Iterable))    #判断是否是一个迭代器
 False
 True

 


for 循环的机制 ************

lst = [1,2,3,4,5]
count = 0
l = lst.__iter__()()
while count < len(lst)
    print(l.__next__())
    count += 1

lst = [1,2,3,4,5]
l = lst.__iter__()()
while True:
    try: #异常捕获
        print(l.__next__())
    except StopIteration:
        break

from  collections import Iterable,Iterator

lst = [1,2,3,4,5]
ll = lst.__iter__()()
print(isinstance(lst),Iterator)  #判断是否是一个可迭代对象
print(isinstance(ll),Iterable)     #判断是否是一个迭代器

 

posted on 2019-01-10 15:31  antigeneral  阅读(67)  评论(0编辑  收藏  举报

导航