zoukankan      html  css  js  c++  java
  • 迭代器

     迭代器

    一.函数名的应用

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

      1.函数名的内存地址

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

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

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def func1():      
         print("呵呵")
    def func2():   
        print("呵呵")
    def func3():   
        print("呵呵")
    def func4():   
        print("呵呵")
    lst = [func1, func2, func3]    
    for in lst:  
        i()                    #调用函数

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

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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.可以让变量常驻内存

    1
    2
    3
    4
    5
    6
    7
    def func1():   
        name = "alex"   
        def func2():       
            print(name)     # 闭包   
        func2()
    func1()
    结果: alex   

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

    1
    2
    3
    4
    5
    6
    7
    def func1():   
        name = "alex"   
        def func2():       
            print(name)     # 闭包   
        func2()   
        print(func2.__closure__)    # (<cell at 0x10c2e20a8: str object at 0x10c3fc650>,)
    func1()

      在函数外部调用内部函数

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

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

    1
    2
    3
    4
    5
    6
    7
    def func1():
        def func2():
            def func3():
                print("嘿嘿")
            return func3
        return func2
    func1()()()

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

      三.迭代器

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

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

        迭代器的特点:

          1.只能向前

          2.惰性机制

          3.省内存(生成器)

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

    1
    2
    3
    4
    = "我的哈哈哈"
    print(dir(s))       # 可以打印对象中的方法和函数
     
    print(dir(str))     # 也可以打印类中声明的方法和函数

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

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

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

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

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

      for循环的内部机制

        1.首先获取到迭代器.

        2.使用while循环获取数据

        3.it.__next__()获取数据

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

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

      

  • 相关阅读:
    页面 笔记
    快速统计一个数二进制中1的个数
    [JAVA] String 拼接效率
    [JAVA] String常用方法
    [letcode] 832 Flipping an Image
    [java]冒泡排序
    SharedPreferences
    归并排序
    安全退出调用多个Activity的Application
    Activity生命周期
  • 原文地址:https://www.cnblogs.com/RootEvils/p/9457711.html
Copyright © 2011-2022 走看看