迭代器

一.函数名的应用

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

  1.函数名的内存地址

def func():    
    print("呵呵") 
print(func) 
结果: <function func at 0x1101e4ea0>

  2.函数名可以赋值给其他变量

def func():    
    print("呵呵") 
print(func) a = func    # 把函数当成一个变量赋值给另一个变量
a()     # 函数调用 func()

  3.函数名可以当做容器类的元素

def func1():       
     print("呵呵") 
def func2():    
    print("呵呵") 
def func3():    
    print("呵呵") 
def func4():    
    print("呵呵")
lst = [func1, func2, func3]     
for i in lst:   
    i()                    #调用函数

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

def func():    
    print("吃了么")
def func2(fn):    
    print("我是func2")    
    fn()    # 执行传递过来的fn    
    print("我是func2") 
func2(func)     # 把函数func当成参数传递给func2的参数fn.

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

def func_1():    
    print("这里是函数1")    
    def func_2():        
        print("这里是函数2")    
    print("这里是函数1")    
    return func_2 
fn = func_1()   # 执行函数1.  函数1返回的是函数2, 这时fn指向的就是上面函数2 
fn()    # 执行上面返回的函数
     

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

   好处:  

     1.保护变量不受外界影响

     2.可以让变量常驻内存

def func1():    
    name = "alex"    
    def func2():        
        print(name)     # 闭包    
    func2() 
func1() 
结果: alex    

  可以使用__closure__来检测函数是否是闭包.返回cell就是闭包,返回None就不是闭包.

def func1():    
    name = "alex"    
    def func2():        
        print(name)     # 闭包    
    func2()    
    print(func2.__closure__)    # (<cell at 0x10c2e20a8: str object at 0x10c3fc650>,) 
func1() 

  在函数外部调用内部函数

def outer():    
    name = "alex"    # 内部函数    
    def inner():        
        print(name)    
    return inner 
fn = outer()   # 访问外部函数, 获取到内部函数的函数地址 
fn()    # 访问内部函数

  多层嵌套时,一层一层返回即可

def func1():
    def func2():
        def func3():
            print("嘿嘿")
        return func3
    return func2
func1()()() 

  Python中规定,如果你在内部函数中访问了外层函数中的变量,那么这个变量将不会消亡,将会常驻内存中.

  三.迭代器

    可迭代对象:Iterable,里面有__iter__()可以获取迭代器,没有__next__()

    迭代器:       Iterator,里面有__iter__()可以获取迭代器,还有__next__()

    迭代器的特点:

      1.只能向前

      2.惰性机制

      3.省内存(生成器)

    可以通过dir函数查看类中定义好的方法

s = "我的哈哈哈" 
print(dir(s))       # 可以打印对象中的方法和函数 

print(dir(str))     # 也可以打印类中声明的方法和函数

  可迭代对象可以使用for循环

  打印的结果中能找到__iter__函数,则是可迭代对象

  也可以通过isinstance()函数查看对象是不是可迭代对象

from collections import Iterable  # 可迭代对象
from collections import Iterator    # 迭代器
lst = ["alex为什么这么帅","我不信","你们信吗?"]
print(isinstance(lst, Iterable)) 
print(isinstance(lst, Iterator))

  可迭代对象可以通过.__iter__()获取迭代器

  for循环的内部机制

    1.首先获取到迭代器.

    2.使用while循环获取数据

    3.it.__next__()获取数据

    4.处理异常 try: xxx  except StopIteration:

lst = ["alex", "wusir", "taibai", "ritian"]
it = lst.__iter__() # 获取迭代器
while 1:
    try:    # 尝试执行
        el = it.__next__()  # 获取下一个元素
        print(el)
    except StopIteration:   # 处理错误
        break

  

posted @ 2018-08-10 16:24  Virous1887  阅读(94)  评论(0编辑  收藏  举报