Day15 笔记
迭代器 Itreator
迭代器是访问可迭代对象的工具(对象)
什么是迭代器
迭代器是只用iter(obj) 函数返回的对象(示例)
迭代器可以用next(it) 函数获取可迭代对象的数据
迭代器相关函数
Iter(iterable) 从可迭代对象中返回一个迭代器,
Iteralble 必须是一个能提供一个迭代器的对象
Next(iterable) 从迭代器iterable 自中获取下一个记录,如果无法获取下一条记录,则触发stopIteretion 异常通知
说明:
迭代器只能往前,不能后退
示例:
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 异常通知
示例:
用whine 语句遍历列表L中的全部元素
L = [2,3,5,7]
# L = [2,3,5,7]
# it = iter(L) #先拿到用于访问L的迭代器
# while True:
# try:
# x = next(it)
# print(x)
# except StopIteration:
# break
练习:
有一个集合:
xiyou = {'唐僧','悟空','八戒','沙僧'}
用for语句来遍历所有元素如下:
for x in xiyou:
print(x)
else:
print("遍历结束")
请将上面的for语句改写为whint语句及迭代器实现
解:
# xiyou = {'唐僧','悟空','八戒','沙僧'}
# it = iter(xiyou)
# while True:
# try:
# x = next(it)
# print(x)
# except StopIteration:
# print("遍历结束")
# break
生成器 Generator
什么是生成器:
生成器是能够动态提供数据的对象,生成器也是可迭代对象
生成器有两种:
1. 生成器函数
2. 生成器表达式
生成器函数定义:
含有yield 语句的函数是生成器函数,此函数被调用将返回一个生成器对象
注:yield 翻译为:(产生或生成)
yield 语句
语法:
yield 表达式
说明:
yield 用于def 函数中,目的是将此函数作为生成器函数使用
yield 用来生成数据,供迭代器的nenx(it)函数使用
示例:
def myyield():
'''此函数因为含有yield语句,所以是生成器函数'''
print("即将生成1")
yield 1
yield 3
yield 5
yield 7
gen = myyield()
#绑定的是生成器,生成器是可迭代对象
it = iter(gen)
x = next(it)
#next(it)开始执行生成器函数的语句,直到遇见yleid语句为止
print(x)
说明:
1、生成器函数的调用将返回一个生成器对象,生成器对象是可迭代对象
2、生成器函数调用 return 会触发一个stopIteration 异常
用生成器生成一系列0开始的整数:
示例
def myinteger(n):
i = 0
while i < n:
yield i
i += 1
for x in myinteger(4):
print(x)
练习:
1、写一个生成器函数myeven(start,Stop): #不包含stop
用来生成从start开始,到stop结束区间内的一系列偶数
解:
def myeven(start,Stop):
x = start
while x < Stop:
if x % 2 == 0:
yield x
x += 1
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
迭代工具函数:
作用:
生成一个个性化的可迭代对象
函数名
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)
结果:
(10086, '中国移动')
(10000, '中国电信')
(10010, '中国联通')
示例: numbers = [10086,10000,10010,95588]
names =['中国移动','中国电信','中国联通']
for t in zip(numbers,names):
print(t)
for a,n in zip(names,numbers):
print(a,"客服号码是:", n)
结果:
中国移动 客服号码是: 10086
中国电信 客服号码是: 10000
中国联通 客服号码是: 10010
练习:
写一个程序,读入任意行文字,当输入空行时结束输入
打印带有行号的输入结果
如:
请输入:hello
请输入:world
请输入:<回车>
输入如下:
第1行 hello
第2行 world
第3行 <回车>
解:
# L = []
# while True:
# dr = input("请输入文字:" )
# if not dr:
# break
# else:
# L.append(dr)
# for t in enumerate(L,1):
# print('第%d行:%s'%t)
第二种方法
# L = []
# def read_lines():
# while True:
# dr = input("请输入文字:" )
# if not dr:
# break
# L.append(dr)
# return L
# read_lines()
# print(L)
# for t in enumerate(L,1):
# print('第%d行:%s'%t)
字节串 bytes(也叫字节序列)
作用:
存储以字节为单位的数据
说明:
字节串是不可变的字节序列
字节是0~255的整数
创建空字节串的字面值
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('您好')
字节串的运算:
+ += * *=
< <= > >= == !=
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. encode(encoding=’utf-8’)
字节数组 bytearray
可变的字节序列
创建函数bytearray
的 bytearray() 创建字节数组
的 bytearray(可迭代对象) 同bytes(可迭代对象)
的 bytearray(整数n) …
的 bytearray(字符串,encoding=‘ntf-8’)
运算操作:
+ += * *=
比较运算:
< <= > >= == !=
索引:
Index/切片 slice
(字节数组支持索引和切片赋值,规则同列表的索引和切片赋值规则)
字节数组的方法:
详见:
Heip(bytearray)
练习:
输入一个字符串用s绑定
习:
1. 写一个生成器函数myodd(x) 来生成一系列奇数
如:
myodd(10) 可以生成1, 3, 5, 7, 9
2. 写一个生成器函数primes(n) 来成生成n以内的所有素数
1) 打印100 以内的全部素数
2) 打印100 以内的全部素数的和
3. 写一个生成器函数 myrange([start, ]stop[, step]) 来生成一系列整数
要求:
myrange功能与range功能完全相同
不允许调用range(函数)
用自己写的myrange结合生器表达式求1~10内奇数的平方