迭代器

一,函数名的运用

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

         1,函数名的内存地址

1 def func():
2     print('hehe')
3     return
4 print(func)
5 a = func
6 print(a)

  2.函数名可以当做函数的参数

1 def func(fn):
2     fn()
3 def gn():
4     print('woshi')
5 l = func(gn)
6 print(l)

  3.函数可以当做函数的返回值

def func():
    def inner():
        print('你好')
    return inner
ret = func()
ret()

二,闭包

  闭包就是内层函数对外层函数(非全局)的变量的引用,叫闭包

def func():
    name = '你好'
    def func2():
        print(name)
    func2()
func()

  __closure__来检测函数是否是闭包,使用函数名_closure_返回cell就是闭包,返回None就不是闭包

  检测是否为闭包的实验

def func():
    name = '你好'
    def func2():
        print(name)
    func2()
    print(func2.__closure__)  #检测是否是闭包
func()

结果
你好
(<cell at 0x000001D4BB3D94F8: str object at 0x000001D4BD027348>,)

  闭包询问的外部的函数变量是常驻内存的,而且是安全的,高效的

 

三,迭代器

  可迭代对象:str list tuple f dict

  dic()是查看一个对象数据类型都包含哪些

s = '王尼玛'
print(dir(s))   #查询对象的数据类型都有哪些

  检查是否对象有没有这个数据类型的方法

s = '王尼玛'
print(dir(s))
print('_iter_'  in dir(s))   #如果有在返回Ture说明是在的否则Flase

  迭代器的获取

lst = ['nihao','nihsi','lal']
li = lst.__iter__()         #迭代器的获取
print(li.__next__())         #下一步
print(li.__next__())            #下一步
print(li.__next__())          #下一步

结果
nihao
nihsi
lal

模拟FOR循坏   

 1 lst = ['nihao','nihsi','lal']
 2 # 模拟for循坏
 3 li = lst.__iter__()   #先获取迭代器
 4 while 1 :
 5     try:       #尝试的拿元素
 6         k = li.__next__()
 7         print(k)
 8     except StopIteration:  #元素拿完了   不报错
 9         break
10 
11 
12   结果
13 nihao
14 nihsi
15 lal

可迭代对象的检测

l = [1,2,3]
# form collections import Iterable  #可迭代的
# form collections import Iterable   #迭代器
# print(isinstance(l,Iterable))

print('__iter__' in dir(l))  #确定是一个可迭代器
print('__next__' in dir(l)) #确定不是一个迭代器

   四.五个英文单词

       isinstance:   用于判断一个对象的数据类型

        Iterable  :   可迭代对象

      Iterable:    迭代器

      __iter__    __next__      都含有为迭代器

      只含有__iter__为可迭代对象

      

      

posted @ 2019-10-30 11:06  7411  阅读(106)  评论(0)    收藏  举报