迭代器Iterator (list tuple dict set frozenset str range() reversed() map() filter() sorted())
迭代器是访问可迭代对象的工具(对象)
迭代器是指iter(obj)函数返回对象(实例)
迭代器可以用next(it) 函数获取可迭代对象的数据
迭代器相关函数:
iter(iterable) 从可迭代对象中返回一个迭代器 iterable必须是一个能提供一个迭代器的对象
next(iterable) 从迭代器iterable中获取下一个记录,如果无法获取下一条记录,则触发StopIteration异常通知
说明:迭代器只能往前取值,不能后退
示例:
L = [2,3,5,7]
it = iter(L) 让可迭代对象L,提供一个迭代器
next(it) >>> 2
next(it) >>> 3
next(it) >>> 5
next(it) >>> 7
next(it) >>> StopTeration 异常通知
it = iter(range(1,10,3))
next(it) >>> 1
next(it) >>> 4
next(it) >>> 7
next(it) >>> StopTeration 异常通知
用while语句遍历列表L中的全部元素:
l = [2,3,5,7]
it = iter(l) #先拿到迭代器
while True:
try:
x = next(it)
print(x)
except StopIteration:
break
----------------------------------------------------------------------------------------------------
练习:
有一个集合:xiyou = {'唐僧','悟空','八戒','沙僧'}
用for 语句来遍历所有元素如下:
for x in xiyou:
print(x)
else:
print("遍历结束")
请将上面的for 语句改写为while语句及迭代器实现
------------------------------------------------------------------------------------------------
生成器:Generator(Python2.5之后)
什么是生成器:
生成器是能够动态提供数据的对象,生成器对象也是可迭代对象
生成器有两种:
1.生成器函数:
2.生成器表达式:
生成器函数定义:
含有yield语句的函数是生成器函数,此函数被调用将返回一个生成器对象
注:yield 翻译为(产生或生成)
yield 语句:
语法:
yield 表达式:
说明:
yield 用于def函数中,目的是将此函数作为生成器函数使用;
yield 用来生成数据,供迭代器的next(it)使用
生成器函数说明:
1.生成器函数的调用将返回一个生成器对象,生成器对象是可迭代对象
2.生成器函数调用return 会触发一个StopIteration异常
用生成器函数生成一系列从0开始的整数,示例:
-------------------------------------------------------------------------------------------------
练习:
写一个生成器函数myeven(start stop),用来生成从start开始,到stop结束区间内的一些列函数偶数
def myeven(start stop):
it= iter(myeven(5,10))
next(it)
next(it)
evens = list(myeven(10,20))
print(evens)
for x in myeven(21,30):
print(x) >> 22 24 26 28
------------------------------------------------------------------------------------------------
生成器表达式:
语法:
(表达式 for 变量 in 可迭代对象 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
示例:
L= [2,3,5,7]
Lst = [x + 1 for x in L]
it = iter[Lst]
print(next(lst))
L[1] = 30
print(next(it))
L= [2,3,5,7]
Lst = (x + 1 for x in L)
it = iter[Lst]
print(next(lst))
L[1] = 30
print(next(it))
迭代工具函数:
作用:生成一个个性化的可迭代对象:
函数名: 函数说明
zip(iter1,iter2,iter3......)返回一个zip对象,此对象用于生成一个元组,此元组中的元素分别由iter1,iter2可迭代对象中的元组构成(元组个数由最小的可迭代对象决定)
enumetate(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(1000),numbers,names):
print(t)
d = dict(zip(numbers,names))
print(d)
for t in enumerate(names):
print(t)
for t in enumerate(names,10000):
print(t)
------------------------------------------------------------------------------------------------
练习:
写一个程序,读入任意行文字,当输入空行时结束输入,打印带有行号的输入结果
如:请输入:hello
请输入world
请输入Python
请输入<回车>
输入如下:
第一行
第二行
第三行
------------------------------------------------------------------------------------------------
字节串:bytes(也叫字节串)
作用:存储以字节为单位的数据
说明:
1.字节串是不可变的字节序列
2.字节是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转换
编码Unicode
str----->> bytes
b = s.encode(encoding='htf-8')
解码
bytes------>>> str22
s = b.decode(encoding = 'utf-8')
字节数组:bytearray
可变的字节序列
创建函数bytearray:
bytearray() 创建字节数组
bytearray(可迭代对象) 同bytes(可迭代对象)
bytearray(整数n)
bytearray(字符串,encoding='utf-8')
运算操作:
+ += * *=
比较运算:< <= > >= == !=
in / not in
索引 index / 切片 slice
(字节数组支持索引和切片赋值,规则同列表索引和切片赋值规则)
字节数组的方法:
详见:help(bytearray)
------------------------------------------------------------------------------
练习:
输入一个字符串用s绑定,将此字符串转换为字节串,用b绑定,再将此字节串b转换回为字符串,
用s2绑定试判断s与s2是否相同
--------------------------------------------------------------------------------
s = input("请输入一个字符串")
print(s)
b = s.encode(encoding = 'utf-8')
print(b)
s2 = b.decode(encoding='utf-8')
print(s2)
if s == s2:
print("相等")
else:
print("不等")
--------------------------------------------------------------------------------
练习:
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内奇数的平方和
迭代器是访问可迭代对象的工具(对象)
迭代器是指iter(obj)函数返回对象(实例)
迭代器可以用next(it) 函数获取可迭代对象的数据
迭代器相关函数:
iter(iterable) 从可迭代对象中返回一个迭代器 iterable必须是一个能提供一个迭代器的对象
next(iterable) 从迭代器iterable中获取下一个记录,如果无法获取下一条记录,则触发StopIteration异常通知
说明:迭代器只能往前取值,不能后退
示例:
L = [2,3,5,7]
it = iter(L) 让可迭代对象L,提供一个迭代器
next(it) >>> 2
next(it) >>> 3
next(it) >>> 5
next(it) >>> 7
next(it) >>> StopTeration 异常通知
it = iter(range(1,10,3))
next(it) >>> 1
next(it) >>> 4
next(it) >>> 7
next(it) >>> StopTeration 异常通知
用while语句遍历列表L中的全部元素:
l = [2,3,5,7]
it = iter(l) #先拿到迭代器
while True:
try:
x = next(it)
print(x)
except StopIteration:
break
----------------------------------------------------------------------------------------------------
练习:
有一个集合:xiyou = {'唐僧','悟空','八戒','沙僧'}
用for 语句来遍历所有元素如下:
for x in xiyou:
print(x)
else:
print("遍历结束")
请将上面的for 语句改写为while语句及迭代器实现
------------------------------------------------------------------------------------------------
生成器:Generator(Python2.5之后)
什么是生成器:
生成器是能够动态提供数据的对象,生成器对象也是可迭代对象
生成器有两种:
1.生成器函数:
2.生成器表达式:
生成器函数定义:
含有yield语句的函数是生成器函数,此函数被调用将返回一个生成器对象
注:yield 翻译为(产生或生成)
yield 语句:
语法:
yield 表达式:
说明:
yield 用于def函数中,目的是将此函数作为生成器函数使用;
yield 用来生成数据,供迭代器的next(it)使用
生成器函数说明:
1.生成器函数的调用将返回一个生成器对象,生成器对象是可迭代对象
2.生成器函数调用return 会触发一个StopIteration异常
用生成器函数生成一系列从0开始的整数,示例:
-------------------------------------------------------------------------------------------------
练习:
写一个生成器函数myeven(start stop),用来生成从start开始,到stop结束区间内的一些列函数偶数
def myeven(start stop):
it= iter(myeven(5,10))
next(it)
next(it)
evens = list(myeven(10,20))
print(evens)
for x in myeven(21,30):
print(x) >> 22 24 26 28
------------------------------------------------------------------------------------------------
生成器表达式:
语法:
(表达式 for 变量 in 可迭代对象 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
示例:
L= [2,3,5,7]
Lst = [x + 1 for x in L]
it = iter[Lst]
print(next(lst))
L[1] = 30
print(next(it))
L= [2,3,5,7]
Lst = (x + 1 for x in L)
it = iter[Lst]
print(next(lst))
L[1] = 30
print(next(it))
迭代工具函数:
作用:生成一个个性化的可迭代对象:
函数名: 函数说明
zip(iter1,iter2,iter3......)返回一个zip对象,此对象用于生成一个元组,此元组中的元素分别由iter1,iter2可迭代对象中的元组构成(元组个数由最小的可迭代对象决定)
enumetate(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(1000),numbers,names):
print(t)
d = dict(zip(numbers,names))
print(d)
for t in enumerate(names):
print(t)
for t in enumerate(names,10000):
print(t)
------------------------------------------------------------------------------------------------
练习:
写一个程序,读入任意行文字,当输入空行时结束输入,打印带有行号的输入结果
如:请输入:hello
请输入world
请输入Python
请输入<回车>
输入如下:
第一行
第二行
第三行
------------------------------------------------------------------------------------------------
字节串:bytes(也叫字节串)
作用:存储以字节为单位的数据
说明:
1.字节串是不可变的字节序列
2.字节是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转换
编码Unicode
str----->> bytes
b = s.encode(encoding='htf-8')
解码
bytes------>>> str22
s = b.decode(encoding = 'utf-8')
字节数组:bytearray
可变的字节序列
创建函数bytearray:
bytearray() 创建字节数组
bytearray(可迭代对象) 同bytes(可迭代对象)
bytearray(整数n)
bytearray(字符串,encoding='utf-8')
运算操作:
+ += * *=
比较运算:< <= > >= == !=
in / not in
索引 index / 切片 slice
(字节数组支持索引和切片赋值,规则同列表索引和切片赋值规则)
字节数组的方法:
详见:help(bytearray)
------------------------------------------------------------------------------
练习:
输入一个字符串用s绑定,将此字符串转换为字节串,用b绑定,再将此字节串b转换回为字符串,
用s2绑定试判断s与s2是否相同
--------------------------------------------------------------------------------
s = input("请输入一个字符串")
print(s)
b = s.encode(encoding = 'utf-8')
print(b)
s2 = b.decode(encoding='utf-8')
print(s2)
if s == s2:
print("相等")
else:
print("不等")
--------------------------------------------------------------------------------
练习:
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内奇数的平方和