python 入门之迭代生成器、字符串字节(万字整理)2

224 阅读5分钟

python 入门之计算机基础、linux命令、数据、运算(万字整理)1

1. 迭代器 Iterator

  • 迭代器是访问可迭代对象的工具
  • 迭代器是指iter(obj)函数返回的对象(实例)
  • 迭代器可以用next(it) 函数获取可迭代对象的数据

1.2 迭代器函数iter和next

- iter(iterable) 从可迭代对象中返回一个迭代器,iterable必须是能提供一个迭代器的对象
- next(iterator) 从迭代器iteraror中获取下一个记录, 如果无法获取下一条数据,则触发StopIteration异常
- 说明: 
    - 迭代器只能向前取值,不会后退
    - 用iter函数可以返回一个可迭代对象的迭代器
- 作用:
    - 迭代器对象能用next 函数获取下一个元素
- 示例:
    ```
        L = [2, 3, 5, 7]
        it = iter(L) # 用L 对象访问迭代器
        next(it) # 2
        next(it) # 3
        next(it) # 5
        next(it) # 7
        next(it) # StopIteration 通知(没有数据)
    ```

2. 生成器 Generator (python 2.5及之后)

生成器是能够动态提供数据的对象,生成器对象也可迭代对象

  • 生成器有两种

    • 生成器函数
    • 生成器表达式
  • 生成器函数的定义

    • 含有yield 语句的函数是生成函数,此函数被调用将会返回一个生成器对象
    • yield 翻译为 产生 生成
    • yield语句
      • 语法
            yield 表达式
        
      • 说明:
        • yield 用于 def 函数中,目的是将此函数作用生成器函数使用
        • yield 用来生成数据,供迭代器的next(it) 函数使用
  • 生成器函数说明:

    • 生成器函数的调用经返回一个生成器对象,生成器对象是一个可迭代对象
    • 在生成器函数调用return 会触发一个StopIteration 异常
  • 生成器表达式

    • 语法:
          (表达式 for 变量 in 可迭代对象 [if 真值表达式])
      
    • 说明: if 子句可省略
    • 作用:
      • 用推导式创建一个新的生成器 思考:
        # iter() 函数用来生成迭代器。
        # next() 返回迭代器的下一个项目。
    
        L = [2, 3, 5, 7]
        L2 = [x ** 2 for x in L] # 列表推导式
        it = iter(L2)
        print(next(it)) # 4
        L[1] = 10
        print(next(it)) # 9
        
        
        
        L = [2, 3, 5, 7]
        L2 = (x ** 2 for x in L) # 生成器表达式
        it = iter(L2)
        print(next(it)) # 4
        L[1] = 10
        print(next(it)) # 100
    
  • 迭代工具函数

    • 迭代工具函数的作用是生成一个个性化的可迭代对象
    • 函数zip:
      • 返回一个zip对象,此对象用于生成元素,此元组的个数由最小的可迭代对象决定
          zip(iter1 [, iter2[, ...]]) 
      
    • 示例:
          number = [10086, 10000, 10010, 9558]
          names = ['中国移动', '中国电信', '中国联通']
          
          for t in zip(number, names):
              print(t)
              
          # 输出
          (10086, '中国移动')
          (10000, '中国电信')
          (10010, '中国联通')
          
          d = dict(zip(number, names))
          
          # 输出
          {10086: '中国移动', 10000: '中国电信', 10010: '中国联通'}
      
          # zip函数实现示例
          number = [10086, 10000, 10010, 9558]
          names = ['中国移动', '中国电信', '中国联通']
          
          def myzip(iter1, iter2):
              it1 = iter(iter1)
              it2 = iter(iter2)
              while True:
                  a = next(it1)
                  b = next(it2)
                  yield (a, b)
          
          for t in myzip(number, names):
              print(t)
      
    • 函数enumerate
      • 生成带索引的枚举对象,返回迭代类型为索引-值(index-value对), 默认索引从零开始,也可以用start指定
            enumerate(iterable[, start])
        
      • 示例
            names = ['中国移动', '中国电信', '中国联通']
            for t in enumerate(names):
                print(t)
            
            # 输出
            (0, '中国移动')
            (1, '中国电信')
            (2, '中国联通')
        

3. 字节串和字节数组

  • 字节串bytes (也叫字节数列)

    • 作用:
      • 存储以字节为单位的数据
      • 字节串是不可变的字节序列
  • 字节

    • 字节是由8个位(bit)组成的数据单位,是计算机进行数据管理的单位
    • 字节是用0 ~ 255范围内的整数表示
  • 创建非空字节串的字母字面值

        B = b''
        B = b""
        B = b''''''
        B = b""""""
    
  • 创建非空字节串的字面值

        B = b'ABCD'
        B = b"ABCD"
        B = b'\x41\x42' # ascii码 16进制
        B = b""""""
    
  • 字节字符串的构造函数 bytes

    • bytes() 生成一个字的字节串 等同于b''
    • bytes(整数可迭代对象) # 用可迭代对象初始化一个字符串
    • bytes(整数n) 生成n个值为0 的字符串
    • bytes(字符串, encoding='utf-8')
    • 用字符串转为编码生成一个字符串
    • 示例
          b = bytes() # b = b''
          b = bytes(range(65, 69)) # b = b'ABCD'
          b = bytes(5) # b = b'\x00\x00\x00\x00\x00'
          b = bytes('abc中文') # b = b'ABC\xe4\xb8\xad\x96\x87'
      
  • bytes 运算

        + += * *=
        < <= > >= == !=
        in 
        not in
        索引和切片
    
    • len(x)
    • max(x)
    • min(x)
    • sum(x)
    • any(x)
    • all(x)
  • bytes 和 str的区别

    • bytes 存储字节(通常值在range(0, 256))
    • str存储unicode字符(通常值在0~65535)
  • bytes 与 str 转换

    sequenceDiagram
    str->>bytes: 编码(encode) b = s.encode(encoding='utf-8')
    bytes->>str: 解码(decode) b = s.decode(encoding='utf-8')
    
  • 字节数组 bytearray

    • 可变的字节序列
    • 字节数组的构造函数:bytearry
      构造函数 说明
      bytearray() 创建空的字节数组
      bytearray(整数) 用可迭代对象初始化一个字节数组
      bytearray(整数可迭代对象) 用可迭代对象初始化一个字节数组
      bytearray(字符串, encoding='utf-8') 用字符串的转换码生成一个字节数组
    • bytearray 运算
          + += * *=
          < <= > >= == !=
          in 
          not in
          索引和切片
      
      • len(x)
      • max(x)
      • min(x)
      • sum(x)
      • any(x)
      • all(x)
      • 字节数组支持索引和切片的赋值操作,规则同列表的索引和切片赋值规则
            ba = bytearray(b'aBCDEfG)
            ba[0] = 65
            ba[-2] = 70
        
    • bytearray 方法
      方法名 说明
      BA.clear() 清空
      BA.append(n) 追加一个字节(n为0~255的整数)
      BA.remove(value) 删除第一个出现的字节,如果没有出现,则触发VelueError错误
      BA.reverse() 字节顺序反转
      BA.decode(encoding='utf8') 解码为字符串
      BA.find(sub[, start[, end]]) 查找sub