day17生成器

迭代器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内奇数的平方和  

猜你喜欢

转载自blog.csdn.net/robin13438235412/article/details/80786242