迭代器 生成器 字节 yield

迭代器 Iterator

  迭代器是访问可迭代对象的工具(对象)

 

什么是迭代器

  迭代器是指用iter(obj) 函数返回的对象(实例)

  迭代器可以用next(it) 函数获取可迭代对象的数据

 

迭代器相关函数

  iter(iterable)  从可迭代对象中返回一个迭代器, iterable 必须是一个能提供一个迭代器的对象

  next(iterator)  从迭代器iterator中获取下一个记录,如果无法获取下一条记录,则触发StopIteration异常通知

说明:

  迭代器只能往前取值,不能后退

  用iter 函数可以返回一个可迭代对象的迭代器

作用:

 

可迭代对象可用于

   for 语句

   列表推导式

 

示例:

   L = [2, 3, 5, 7]

   it = iter(L)  # 让可迭代对象L 提供一个迭代器

next(it)  # 2

next(it)  # 3

next(it)  # 5

next(it)  # 7

   next(it)  # StopIteration 异常通知

 

it = iter(range(1, 10, 3))

next(it)  # 1

next(it)  # 4

next(it)  # 7

next(it)  # StopIteration

 

 

示列:

    用while 语句遍历列表L中的全部元素

       L = [2, 3, 5, 7]

    见iterator.py

 

练习:

  有一个集合:

    xiyou = {'唐僧', '悟空', '八戒','沙僧'}

    用for 语句来遍历所有元素如下:

for x in xiyou:

print(x)

else:

          print("遍历结束")

    请将上面的for语句改写为while语句及迭代器实现

 

 

 

 

 

 

生成器 Generator (python 2.5 及之后)

  什么是生成器

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

 

生成器有两种:

  1. 生成器函数

  2. 生成器表达式

 

生成器函数定义:

  含有语句的函数是生成器函数,此函数被调用将返回一个生成器对象

  注:  yield 翻译为(产生或生成)

 

yield 语句

  语法:

    yield 表达式

  说明:

    yield 用于def 函数中,目的是将此函数作为生成器函数使用

    yield 用来生成数据,供迭代器的next(it) 函数使用

 

示例见:

  yield.py

 

生成器函数说明:

  1. 生成器函数的调用将返回一个生成器对象,生成器对象是可迭代对象

  2. 生成器函数调用 return 会触发一个StopIteration异常

 

 

# 用生成函数生成一系列从0开始的整数, 示例见:

   myinteger.py

 

 

 

练习:

  写一个生成器函数myeven(start, stop),用来生成从start开始,到stop结束区间内的一系列偶数

 

  def myeven(start, stop):  # 不包含stop

      .... 此处自己实现

 

it = iter(myeven(5, 10))

print(next(it))  # 6

print(next(it))  # 8

 

evens = list(myeven(10, 20))

print(evens)  # [10, 12, 14, 16, 18]

for x in myeven(21, 30):

print(x)  # 22 24 26 28

 

生成器表达式:

  语法:

    (表达式 for 变量 in 可迭代对象 if 真值表达式)

  说明:

    if 子句可以省略

  作用:

    用推导式的形式生成一个新的生成器

  示例:

gen = (x ** 2 for x in range(1, 5))

it = iter(gen)

next(it)  # 1

next(it)  # 4

next(it)  # 9

next(it)  # 16

 

看程序执行结果有什么不同:

  1) 程序1

  L = [2, 3, 5, 7]

lst = [x + 1 for x in L]

it = iter(lst)

print(next(it))  # 3

L[1] = 30

print(next(it))  # 4

 

  2) 程序2

  L = [2, 3, 5, 7]

lst = (x + 1 for x in L)

it = iter(lst)

print(next(it))  # 3

L[1] = 30

print(next(it))  # 31

 

 

迭代工具函数:

  作用:

    生成一个个性化的可迭代对象

 

函数名                            函数说明

zip(iter1, iter2, iter3, ....) 返回一个zip对象,此对象用于生成一个元组,此元组的中的元素分别由iter1,iter2可迭代对象中的元素构成(元组个数由最小的可迭代对象决定)

 

  enumerate(iterable, start=0) 生成带索引的枚举对象,返回的迭代类型为索引-值对 (index-value) 对, 默认索引从零开始,也可用start指定

 

示例:

numbers = [10086, 10000, 10010, 95588]

  names = ['中国移动', '中国电信', '中国联通']

for t in zip(numbers, names):

print(t)

 

  for n, a in zip(numbers, names):  # 等同于序列赋值

      print(a, '的客服号码是:', n)

 

for t in zip(range(2), numbers, names):

print(t)

 

  d = dict(zip(numbers, names))  # ???

 

for t in enumerate(names):

      print(t)  # (0, '中国移动') ....

 

for t in enumerate(names, 20000):

      print(t)  # (20000, '中国移动') ....

 

练习:

  写一个程序,读入任意行文字,当输入空行时结束输入

    打印带有行号的输入结果

      如:

        请输入:hello

        请输入:world

        请输入:python

        请输入:<回车>

      输入如下:

        第1行: hello

        第2行: world

        第3行: python

 

 

问题:

  序列:

list, str, tuple, bytes, bytearray

 

1k=1024bytes 1m=1024k

 

字节串 bytes (也叫字节序列)

  作用:

    存储以字节为单位的数据

  说明:

字节串是不可变的字节序列

字节是0~255的整数

字节:

   字节是由8个位组成的数据单位,是计算机进行数据管理的单位

   字节使用0-255范围内的整数表示

 

创建空字节串的字面值

    b = b''     b 绑定空字节串

    b = b""     b 绑定空字节串

    b = b'''''' b 绑定空字节串

    b = b"""""" b 绑定空字节串

创建非空字节串的字面值

    b = b'ABCD'

    b = b'\x41\x42'

字节串的构造函数bytes

    bytes()    生成一个字的字节串,等同于b''

    bytes(整型可迭代对象)  用可迭代对象初始化一个字节串

    bytes(整数n)   生成n个值为0的字节串

bytes(字符串, encoding='utf-8')  用字符串的转换编码生成一个字节串

例:

    b = bytes()

    b = bytes(range(0, 255))

    b = bytes(10)

    b = bytes('你好', 'utf-8')

 

字符串的运算:

  +  +=  *  *=

<<=  >>=  ==  !=

in / not in

  索引和切片

函数:

len(x)

max(x)

min(x)

sum(x)

any(x)

all(x)

 

 

bytes 与 str 的区别:

  bytes 存储字节(0~255)

  str 存储 unicode 字符(0~65535或更大)

 

str 与 bytes转换

        编码(encode)

str ----------> bytes

       b = s.encode(encoding='utf-8')

 

        解码(decode)

bytes -------------> str

       s = b.decode(encoding='utf-8')

 

 

str  tuple  dict  frozenset  set  bytes   bytearray

字节数组 bytearray

可变的字节序列

 

创建函数bytearray

 bytearray()           创建字节数组

   bytearray(可迭代对象)   同bytes(可迭代对象)

   bytearray(整数n)     ...

   bytearray(字符串, encoding='utf-8')

 

运算操作:

  +  +=  *  *=

  比较运算: <<= >>= == !=

in / not in

  索引 index / 切片 slice

  (字节数组支持索引和切片赋值,规则同列表的索引和切片赋值规则)

 

字节数组的方法:

  详见:

help(bytearray)

ba.clear()

ba.append(n)  追加一个字节(n为0-255的整数)

ba.remove()

ba.reverse() 字节顺序反转

ba.decode(encoding=’utf-8’) #解码为字符串

ba.find(sub[,start]) 查找sub

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值