• 迭代器


    迭代器

    1. 默认参数的一个考点
      • 当你的默认参数是可变数据类型的时候,那么你要当心了

        def func(a,lst = []):    可变数据类型使用的是同一个内存空间
            lst.append(a)
            return lst
        print(func(1))  -----[1]
        print(func(2))   -----[1, 2]
        print(func(3,[]))  -----[3]
        
    2. 函数名的应用

      函数名是一个特殊变量,它具有变量的特点

      • 函数名指向的是函数的内存地址,这个内存地址加上()就可以运行函数.

      • 函数名是一个变量,可以赋值运算

        def func():
            print(666)
        print(func)
        a = func
        a()   # 也可以运行函数funcdef func():
            print(666)
        print(func)
        a = func
        a()   # 也可以运行函数func
        
      • 函数名可以作为容器类类型的元素

        def func():
            print(666)
        lst = [func,func,func]
        lst[1]()
        for el in lst:
            el()
        
      • 函数名可以作为函数的实参传进去

        def func1():
            print('in func1')
        def func2(argv):
            argv()
            print('in func2')
        func2(func1)
        
      • 函数名可以作为函数的返回值

        def func1():
            print('in func1')
        def func2(argv):
            print('in func2')
            return argv
        ret = func2(func1)
        ret()
        
    3. f-strings格式化输出
      • python3.6后加入标准库的格式化输出新的写法

      • 不区分大小写,f,F都可以

      • 可以加入表达式

        s1 = 'haha'
        s = f'python{s1.upper()}'
        
        l1 = ['小明',18,175]
        s2 = f'我的名字{l1[0]},我的年龄{l1[1]},我的身高{l1[2]}'
        
      • 可以结合函数

        def func(a,b):
            return a+b
        s1 = f'最终的结果{func(1,3)}'
        
        • 注意:不能放一些特殊字符:冒号: 分号; 感叹号!逗号,
    4. 可迭代对象
    • 字面意思分析:可以重复的迭代的实实在在的一个东西

    • 专业角度: 内部含有'iter'方法的对象,就是可迭代对象
      # 用内置函数dir()查看对象内部含有的所有方法,用in判断
      print('__iter__' in dir(str))
      
    • 优点
      • 可以直观的查看里面的数据
      • 操作方法多
    • 缺点
      • 占用内存
      • 可以迭代对象不能迭代取值(除去索引,字典的key以外)
    1. 迭代器
      • 字面意思:可以重复迭代的工具

      • 专业角度:内部含有'iter'方法并且含有'next'方法的对象,就是迭代器
        判断一个对象是否为迭代器
        print('__iter__'and '__next__' in dir(map))
        
        
      • 由于迭代器也含有'iter'方法,所以迭代器也是可迭代对象
      • 可迭代对象可以转化为迭代器

        l1 = [1,2,3,4,5]
        obj = iter(l1)  #l1.__iter__()
        print(obj) #<list_iterator object at 0x00000114277BD390>
        
        
      • 迭代器可以迭代取值,利用next()进行取值

        l1 = [1,2,3,4,5]
        obj = iter(l1)  #l1.__iter__()
        print(obj) #<list_iterator object at 0x00000114277BD390>
        print(next(obj))  # 一个next()对应一个值,多了就报错
        print(next(obj))    # 接着上次的位置,会记录位置
        print(next(obj))
        print(next(obj))
        print(next(obj))
        print(next(obj))    # 超出值的个数,会报错:StopIteration
        
        
      • 利用while循环,模拟for循环内部循环可迭代对象的机制
        l1 = [1,2,3,4,5]
        obj = iter(l1)
        while True:
            try:
                print(next(obj))
            except  StopIteration:   ----->异常处理
                break
        
        
      • 迭代器是一条路走到底,不走回头路,会记录位置

        l1 = [22, 33, 44, 55, 66, 77]
        obj = iter(l1)
        for el in range(3):
            print(next(obj))
        for el in range(2):
            print(next(obj))
        
        
      • 迭代器的优点
        • 非常节省内存
        • 惰性机制,next()一次取值一次
      • 迭代器的缺点:
        • 不直观
        • 操作不灵活
        • 效率相对低
    2. 可迭代对象与迭代器的对比
      • 可迭代对象:可迭代对象是一个私有的方法比较多,操作灵活,比较直观,但是占用内存,而且不能直接通过循环迭代取值的一个数据集
      • 迭代器:是一个非常节省内存,可以记录取值位置,可以直接通过循环+next方法取值,但是不直观,操作方法比较单一的数据即
      • 当你侧重于对数据可以灵活处理,并且内存足够,将数据集设置为可迭代对象是明智的选择
      • 当你的数据量过大,将数据集设置为迭代器是一个不错的选择
  • 相关阅读:
    Codeforces Round #249 (Div. 2) D. Special Grid 枚举
    图论二
    C语言中的atan和atan2(转)
    BestCoder Round #79 (div.2)
    数学
    LCA
    二分图
    动态规划
    线段树
    树状数组
  • 原文地址:https://www.cnblogs.com/maqian/p/11905212.html
Copyright © 2020-2023  润新知