zoukankan      html  css  js  c++  java
  • day18_文件处理_迭代器_生成器

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # ********************day18_文件处理_迭代器_生成器 *******************
    # ********************day18_文件处理_迭代器_生成器 *******************
    # ********************day18_文件处理_迭代器_生成器 *******************
    # =====>>>>>>内容概览
    # =====>>>>>>内容概览
    # =====>>>>>>内容概览
    
    '''
    # # 1、b模式下打开文件
    # # # 注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
    # # # f = open('test11.py','rb',encoding='utf-8')   # 报错,rb模式打开文件是不能指定编码的
    # # # ??????????  那个以什么方式的编码打开,就是而二进制??
    # # # 读出来的结果说明:
    是windows下的“回车键”,而linux中的回车键是“
    ”
    #
    # # 2、decode
    # # # 解码
    # # 以字节的方式写
    # # # 注意格式
    
    # # 3、为什么使用b的方式读写文件
    # # # 1、文件不仅仅有文本类型,还有图片、视频等,而图片、视频等都是使用二进制的方式进行处理的,因此需要使用b的方式去处理,可用于处理任何类型的文件
    # # # 2、linux默认的对文件的处理方式就是二进制,而Windows则不是,因此使用b的方式是能够在跨平台上使用
    # # # 3、linux默认的对文件的处理方式就是二进制,因此b模式对于linux没有什么用
    
    # # 4、f.encoding代号
    
    # # 5、关于源文件编码的一些说明
    # # # 1、	不知道源文件的编码,那么打开的就一定是乱码
    # # # 2、	你写的编码,就会知道什么方式解码
    # # # 上面总的来说,就文件的编码一定要是已知的,才可以对应的解码,否则解码出来的会是乱码
    
    # # 6、'r+'
    # # 直接在后面附加
    
    # # 7、f.flush()
    # # # 对暂存在内容中的内容进行刷入硬盘内存保存
    # # # 这个常见于pycharm、word等文档软件,每隔一定时间对文档的内容进行保存处理
    
    # # 8、f.tell()
    # # # 告诉光标的所在位置,通过字节的方式读取
    # # # 在windows中,回车是'
    ',因此读取出来的是一行的字节的后面会加上
    的位置,因此会多了
    # # # 2个字节的光标
    
    # # 9、f.seek()
    # # # seek() 方法用于移动文件读取指针到指定位置。
    # # # 文件 b.txt的内容
    # # # f.seek(3) #从开头开始算,将光标移动到第三个字节
    
    # # 10、f.truncate(10)
    # # # truncate() 方法用于从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;
    # # # 截断之后 V 后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。 。
    # # # ==》注意,文件必须以写方式打开; 使用w与w+的模式,文件会被清空,因此会截取不到文件的内容
    # # # 语法
    # # # truncate() 方法语法如下:
    # # # fileObject.truncate( [ size ])
    # # # 参数
    # # # size -- 可选,如果存在则文件截断为 size 字节。
    # # # 返回值
    # # # 该方法没有返回值。
    
    # # 11、encode
    # # # encode() 方法以指定的编码格式编码字符串。errors参数可以指定不同的错误处理方案。
    
    # # 12、seek
    # # # 默认是从文件的开始位置进行,模式:0
    # # # seek总共有3中模式,分别是
    # # # 0:每一次seek都从文件的开始位置进行
    # # # 1:每次seek都是从文件的相对位置进行
    # # # 2:每次seek从文件的末尾相对位置进行seek,此时,指定的初始位置为“负值”
    # # # ===>注意,在模式1,2中,文件的打开方式应该是字节模式  即,b模式:f = open('seek.txt','rb')
    
    # # 13、seek 默式0
    # # # 0:每一次seek都从文件的开始位置进行
    
    # # 14、seek 默式1
    # # # 1:每次seek都是从文件的相对位置进行
    # # # ===>注意文件的打开方式应该是字节模式  即,b模式:f = open('seek.txt','rb')
    
    # # 15、seek的模式2,文件末尾某处----->文件末尾
    # # # 2:每次seek从文件的末尾相对位置进行seek,此时,指定的初始位置为“负值”
    # # # f.seek(offs, 2)
    # # # 功能:读取文件的最后一行的信息
    
    # # 16、for对列表的访问
    
    # # 17、关于字符串与迭代器
    # # # 字符串也是可以被for循环,按理说应该是可迭代对象,但是,字符串中并没有遵循迭代器
    # # # 的协议,没有next方法,
    # # # 不过,字符串、列表等,是提供了内部的_iter_()方法,把字符串转化为迭代对象
    # # # 遵循迭代器协议,生成可迭代对象
    
    # # 18、字符串-->迭代器,next方法测试
    # # # 其他的称之为可迭代对象也相同的  列表、字典等
    
    # # 18.1、使用索引访问“可迭代”对象
    
    
    # # 19、for与迭代器的实现(集合测试)
    # # # 实质是集合-->__iter__方法-->集合转化为迭代器,并返回地址-->__next__方法调用内容
    # # # 遵循迭代器协议,生成可迭代对象
    
    # # 20、迭代器与字典
    # # # 默认拿到的迭代的内容是集合的key
    
    # # 21、迭代器与文件
    
    # # 22、迭代器的模拟实现过程
    
    # # 23、next内置函数与迭代器
    # # # 实质上,内置函数next就是在调用__next__(),next(iter_l)等价于iter_l.__next__()
    #
    
    # # 24、yield 与迭代函数
    # # # 使用生成器函数定义生成器
    # # # 带有 yield 的函数在 Python 中被称之为 generator(生成器)
    
    # # 25、三元表达式
    # # # 如果条件为真,把if前面的值赋值给变量,否则把else后面的值赋值给变量。
    
    # # 26、列表解析
    # # # 形象地解释 Python 中的列表解析 - Python - 伯乐在线
    # # # http://python.jobbole.com/83884/
    # # # 列表解析
    # # #   根据已有列表,高效创建新列表的方式。
    # # #   列表解析是Python迭代机制的一种应用,它常用于实现创建新的列表,因此用在[]中。
    # # # 语法:
    # # #   [expression for iter_val in iterable]
    # # #   [expression for iter_val in iterable if cond_expr]
    
    
    # # 27、生成器
    # # # 首先请确信,生成器就是一种迭代器。生成器拥有next方法并且行为与迭代器完全相同,
    # # # 这意味着生成器也可以用于Python的for循环中。另外,对于生成器的特殊语法支持使得
    # # # 编写一个生成器比自定义一个常规的迭代器要简单不少,所以生成器也是最常用到的特性之一。
    
    # # 28、sum方法与迭代器
    
    '''
    
    
    
    # # 1、b模式下打开文件
    # # # 注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
    # # # f = open('test11.py','rb',encoding='utf-8')   # 报错,rb模式打开文件是不能指定编码的
    # # # ??????????  那个以什么方式的编码打开,就是而二进制??
    # # # 读出来的结果说明:
    是windows下的“回车键”,而linux中的回车键是“
    ”
    #
    # f = open('test11.py','rb')    # b的方式不能指定编码
    # print(f.read())               # 字节读
    # f.close()
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # b'hello
    111
    222
    "string"
    xe5x95xa5xe4xbax8b'
    # #
    # # Process finished with exit code 0
    
    
    # # 2、decode
    # # # 解码
    # f = open('test11.py','rb')        # b的方式不能指定编码
    # data = f.read()
    # print(data)
    # print(data.decode('utf-8'))       # 解码
    #
    # f.close()
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # b'hello
    111
    222
    "string"
    xe5x95xa5xe4xbax8b'
    # # hello
    # # 111
    # # 222
    # # "string"
    # # 啥事
    # #
    # # Process finished with exit code 0
    
    
    # # 以字节的方式写
    # # # 注意格式
    # #
    #
    # f = open('test11.py','wb')        # b的方式不能指定编码
    # f.write(bytes("1111
    ",encoding='utf-8'))
    # f.write('杨件'.encode('utf-8'))   # '杨件' --> 'utf-8'编码 --> 二进制
    #
    #
    # f.close()
    # #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # #
    # # Process finished with exit code 0
    
    
    
    # # 3、为什么使用b的方式读写文件
    # # # 1、文件不仅仅有文本类型,还有图片、视频等,而图片、视频等都是使用二进制的方式进行处理的,因此需要使用b的方式去处理,可用于处理任何类型的文件
    # # # 2、linux默认的对文件的处理方式就是二进制,而Windows则不是,因此使用b的方式是能够在跨平台上使用
    # # # 3、linux默认的对文件的处理方式就是二进制,因此b模式对于linux没有什么用
    
    
    
    
    # 03
    # 03
    # 03
    # # 4、f.encoding代号
    #
    # f = open("a.txt",'w')
    # print(f.close)
    # print(f.encoding)     # cp936 编码代号,不同平台显示的不一样,这里指的是utf-8,平台默认的编码方式的代号
    # f.close()
    #
    # f = open("a.txt",'w',encoding='utf-8')
    # print(f.encoding)
    # f.close()
    #
    # f = open("a.txt",'w',encoding='gbk')
    # print(f.encoding)
    # f.close()
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # <built-in method close of _io.TextIOWrapper object at 0x0000000002956480>
    # # cp936
    # # utf-8
    # # gbk
    # #
    # # Process finished with exit code 0
    
    
    # # 5、关于源文件编码的一些说明
    # # # 1、	不知道源文件的编码,那么打开的就一定是乱码
    # # # 2、	你写的编码,就会知道什么方式解码
    # # # 上面总的来说,就文件的编码一定要是已知的,才可以对应的解码,否则解码出来的会是乱码
    
    
    # # r+
    # f =open('a.txt','r+',encoding='gbk')
    # f.write('aaa你好帅233')
    # f.close()
    # #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # #
    # # Process finished with exit code 0
    
    
    # # 6、'r+'
    # # 直接在后面附加
    # f =open('a.txt','r+',encoding='gb2312')
    # data = f.read()
    # print(data)
    # f.write('*_*``aaa你好233===')
    #
    # # 打印出来是空的,是因为,上面对文件处理后,文件的读取的位置是文件末尾,因此再次读取的时候
    # # 就会是空的内容
    # data = f.read()
    # print("next:
    ",data)
    # f.close()
    #
    # # D:Anaconda3python.exe# D: / C_cache / py / day18_WenJianChuLi / day18_WenJianChuLi.py
    # # aaa你好233
    # # next:
    # #
    # # Process
    # # finished
    # # with exit code 0
    
    # # 7、f.flush()
    # # # 对暂存在内容中的内容进行刷入硬盘内存保存
    # # # 这个常见于pycharm、word等文档软件,每隔一定时间对文档的内容进行保存处理
    # #
    #
    # f = open('b.txt','r+',encoding='utf-8')
    # data = f.read()
    # print(data)
    # f.write(".....")
    # f.flush()               # 对上面的内容进行刷入硬盘内存保存
    # f.close()
    #
    
    
    
    
    # # 8、f.tell()
    # # # 告诉光标的所在位置,通过字节的方式读取
    # # # 在windows中,回车是'
    ',因此读取出来的是一行的字节的后面会加上
    的位置,因此会多了
    # # # 2个字节的光标
    # #
    #
    # f = open('b.txt','r+',encoding='utf-8')
    # print("f.tell(): ",f.tell())
    # data = f.readline()
    #
    # print("f.readline(): ",data)
    # print("f.tell(): ",f.tell())
    #
    # data = f.readline()
    # print("f.readline(): ",data)
    # print("f.tell(): ",f.tell())
    #
    # data = f.readline()
    # print("f.readline(): ",data)
    # print("f.tell(): ",f.tell())
    #
    # f.write("abc")
    # print("f.tell(): ",f.tell())
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # f.tell():  0
    # # f.readline():  123        # 三个字节,后面有
    ( 可通过rb方式读取看到),因此tell读取出来是光标在5的位置
    # #
    # # f.tell():  5
    # # f.readline():  22
    # #
    # # f.tell():  9
    # # f.readline():  3234
    # # f.tell():  13
    # # f.tell():  16
    # #
    # # Process finished with exit code 0
    
    
    
    
    
    # # 9、f.seek()
    # # # seek() 方法用于移动文件读取指针到指定位置。
    # # # 文件 b.txt的内容
    # # # f.seek(3) #从开头开始算,将光标移动到第三个字节
    # #
    #
    # #
    # # # 文件b.txt的内容
    '''
    123
    22
    3234abc
    '''
    #
    # f = open('b.txt','r+',encoding='utf-8',newline = '')
    # print("f.tell(): ",f.tell())
    #
    # print("f.readline():   ",f.readline())      # 读一行
    # print("f.tell():       ",f.tell())              # 查看光标位置
    # print( "f.seek(1):     ",f.seek(1) )                        # 光标移动到1的位置
    # print("f.readline():   ", f.readline())
    # print("f.tell():       ",f.tell())
    # f.close()
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # f.tell():  0
    # # f.readline():    123
    # #
    # # f.tell():        5
    # # f.seek(1):      1
    # # f.readline():    23
    # #
    # # f.tell():        5
    # #
    # # Process finished with exit code 0
    
    
    
    
    
    
    
    # # 10、f.truncate(10)
    # # # truncate() 方法用于从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;
    # # # 截断之后 V 后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。 。
    # # # ==》注意,文件必须以写方式打开; 使用w与w+的模式,文件会被清空,因此会截取不到文件的内容
    # # # 语法
    # # # truncate() 方法语法如下:
    # # # fileObject.truncate( [ size ])
    # # # 参数
    # # # size -- 可选,如果存在则文件截断为 size 字节。
    # # # 返回值
    # # # 该方法没有返回值。
    # #
    #
    # #
    # # # 文件b.txt的内容
    '''
    123
    22
    3234abc
    '''
    #
    # f = open('b.txt','w+',encoding='utf-8',newline = '')
    #
    # print("f.tell(): ",f.tell())                      # 查看光标位置
    # print("f.readlines():   ",f.readlines())          # 读取所有的内容到列表
    # print("f.tell():       ",f.tell())                # 查看光标位置
    # print( "f.truncate(10):     ", f.truncate(6)  )   # 截取0-5位置的内容,包含0,5
    # print( "f.seek(0):     ",f.seek(0) )              # 光标返回文件最开始的位置
    # print("f.readlines():   ",f.readlines())          # 读一行
    # print("f.tell():       ",f.tell())                # 查看光标位置
    # f.close()
    
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # f.tell():  0
    # # f.readlines():    ['123
    ', '22
    ', '3234abc']
    # # f.tell():        16
    # # f.truncate(10):      6
    # # f.seek(0):      0
    # # f.readlines():    ['123
    ', '2']
    # # f.tell():        6
    # #
    # # Process finished with exit code 0
    
    
    
    # # 11、encode
    # # # encode() 方法以指定的编码格式编码字符串。errors参数可以指定不同的错误处理方案。
    # #
    #
    # f = open('d.txt','r',newline='')
    # print("f.readlines():   ",f.readlines())         # 读取所有的内容到列表
    # print( "f.seek(0):     ",f.seek(0) )             # 光标返回文件最开始的位置
    # data=f.readline().encode('utf-8')                # 使用utf-8进行编码
    # print(data)
    # print("f.tell(): ",f.tell())                     # 查看光标位置
    # print("f.readline():   ",f.readline())           # 读取所有的内容到列表
    # print("f.tell(): ",f.tell())                     # 查看光标位置
    #
    # f.close()
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # f.readlines():    ['hello
    ', '123hello
    ', '123hello
    ', '123hello']
    # # f.seek(0):      0
    # # b'hello
    '
    # # f.tell():  7
    # # f.readline():    123hello
    # #
    # # f.tell():  17
    # #
    # # Process finished with exit code 0
    
    
    
    
    # # 12、seek
    # # # 默认是从文件的开始位置进行,模式:0
    # # # seek总共有3中模式,分别是
    # # # 0:每一次seek都从文件的开始位置进行
    # # # 1:每次seek都是从文件的相对位置进行
    # # # 2:每次seek从文件的末尾相对位置进行seek,此时,指定的初始位置为“负值”
    # # # ===>注意,在模式1,2中,文件的打开方式应该是字节模式  即,b模式:f = open('seek.txt','rb')
    # #
    #
    # #
    # # # seek.txt 的内容
    '''
    hello
    你好
    123
    123
    '''
    # f = open('seek.txt','r',encoding='utf-8')
    # print(f.tell())
    # f.seek(10)
    # print(f.tell())
    # f.seek(3)
    # print(f.tell())
    #
    # f.close()
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # 0
    # # 10
    # # 3
    # #
    # # Process finished with exit code 0
    
    
    
    # # 13、seek 默式0
    # # # 0:每一次seek都从文件的开始位置进行
    # #
    #
    # #
    # # # seek.txt 的内容
    '''
    hello
    你好
    123
    123
    '''
    # f = open('seek.txt','r',encoding='utf-8')
    # print(f.readlines())
    # f.seek(0)                       # 回到开始的位置
    #
    # print(f.tell())
    # f.seek(10,0)
    # print(f.tell())
    # f.seek(3,0)
    # print(f.tell())
    #
    # f.close()
    #
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # ['hello
    ', '你好
    ', '123
    ', '123']
    # # 0
    # # 10
    # # 3
    # #
    # # Process finished with exit code 0
    
    
    
    # # 14、seek 默式1
    # # # 1:每次seek都是从文件的相对位置进行
    # # # ===>注意文件的打开方式应该是字节模式  即,b模式:f = open('seek.txt','rb')
    # # # seek.txt 的内容
    '''
    hello
    你好
    123
    123
    '''
    
    # f = open('seek.txt','rb')#,encoding='utf-8')
    # # # 文件的,每一行末尾是
      ,在encoding='utf-8'方式中,被编译器处理掉了,
    # # # 没有显示出来只有显示
    ,只有通过rb模式,才回显示出来
    
    # print("所有内容:",f.readlines())
    # f.seek(0)                                   # 回到开始的位置
    # print("第1行",f.readline())
    # print(f.tell())
    # print("第2行",f.readline())
    # print(f.tell())
    # print("第3行",f.readline())
    # print(f.tell())
    #
    # f.seek(0)                       # 回到开始的位置
    # print(f.tell())
    # f.seek(7,0)                    # 文件位置10
    # print(f.tell())
    # f.seek(8,1)                    # 相对位移结果15
    # print(f.tell())
    # print("f.readlines():",f.readlines())
    #
    #
    # f.close()
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # 所有内容: [b'hello
    ', b'xe4xbdxa0xe5xa5xbd
    ', b'123
    ', b'123']
    # # 第1行 b'hello
    '
    # # 7
    # # 第2行 b'xe4xbdxa0xe5xa5xbd
    '
    # # 15
    # # 第3行 b'123
    '
    # # 20
    # # 0
    # # 7
    # # 15
    # # f.readlines(): [b'123
    ', b'123']
    # #
    # # Process finished with exit code 0
    
    
    
    # # # 不用seek,日志文件查看方式:
    # # # 全部加载到内存中,然后读取最近的日志情况
    # # # '日志文件' 的内容
    '''
    2016/12/25 alex  干了件事情
    2016/12/26 alex  干了件事情
    2016/12/27 alex  干了件事情
    2016/12/28 alex  干了件事情
    2016/12/29 alex  干了件事情
    2016/12/30 sb  干了件sb事情
    
    '''
    
    # f = open('日志文件' ,'rb')
    # data = f.readlines()
    # print(data[-1].decode('utf-8'))
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # 2016/12/30 sb  干了件sb事情
    # #
    # #
    # # Process finished with exit code 0
    
    
    # # # 通过for读取  日志文件   中的信息
    # 就把文件的中的所有内容加载到内存当中读取
    # 缺点是,文件的内容大的话,那么就是读取的很慢,很占资源
    #
    # f = open('日志文件' ,'rb')
    # for i in f.readlines():
    #     print(i)
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # b'2016/12/25 alex  xe5xb9xb2xe4xbax86xe4xbbxb6xe4xbax8bxe6x83x85
    '
    # # b'2016/12/26 alex  xe5xb9xb2xe4xbax86xe4xbbxb6xe4xbax8bxe6x83x85
    '
    # # b'2016/12/27 alex  xe5xb9xb2xe4xbax86xe4xbbxb6xe4xbax8bxe6x83x85
    '
    # # b'2016/12/28 alex  xe5xb9xb2xe4xbax86xe4xbbxb6xe4xbax8bxe6x83x85
    '
    # # b'2016/12/29 alex  xe5xb9xb2xe4xbax86xe4xbbxb6xe4xbax8bxe6x83x85
    '
    # # b'2016/12/30 sb  xe5xb9xb2xe4xbax86xe4xbbxb6sbxe4xbax8bxe6x83x85
    '
    # #
    # # Process finished with exit code 0
    
    
    
    # # 通过for读取  日志文件   中的信息
    # # # 相当于上面更好的方式=============>
    # # # 这种方式,就是需要一行,就把文件的中的一行加载到内存当中,节约资源
    # f = open('日志文件' ,'rb')
    # for i in f:
    #     print(i)
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # b'2016/12/25 alex  xe5xb9xb2xe4xbax86xe4xbbxb6xe4xbax8bxe6x83x85
    '
    # # b'2016/12/26 alex  xe5xb9xb2xe4xbax86xe4xbbxb6xe4xbax8bxe6x83x85
    '
    # # b'2016/12/27 alex  xe5xb9xb2xe4xbax86xe4xbbxb6xe4xbax8bxe6x83x85
    '
    # # b'2016/12/28 alex  xe5xb9xb2xe4xbax86xe4xbbxb6xe4xbax8bxe6x83x85
    '
    # # b'2016/12/29 alex  xe5xb9xb2xe4xbax86xe4xbbxb6xe4xbax8bxe6x83x85
    '
    # # b'2016/12/30 sb  xe5xb9xb2xe4xbax86xe4xbbxb6sbxe4xbax8bxe6x83x85
    '
    # #
    # # Process finished with exit code 0
    
    
    
    # # 15、seek的模式2,文件末尾某处----->文件末尾
    # # # 2:每次seek从文件的末尾相对位置进行seek,此时,指定的初始位置为“负值”
    # # # f.seek(offs, 2)
    # # # 功能:读取文件的最后一行的信息
    # #
    #
    # f = open('日志文件' ,'rb')
    # for i in f:
    #     offs = -10                  # 注意到,这里是负值
    #     while True:
    #         f.seek(offs,2)
    #         data = f.readlines()
    #         if len(data)>1:
    #             #如果文件读取的是多行,那么data[-1]就是最后一行,我们所需要的信息
    #             print("文件的最后一行是:%s" %(data[-1].decode('utf-8')))
    #             break               # 读取到信息,退出循坏
    #         offs*=2
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # 文件的最后一行是2016/12/30 sb  干了件sb事情
    # #
    # #
    # # Process finished with exit code 0
    
    
    
    
    
    #
    # ************************************************迭代器************************************************
    # ************************************************迭代器************************************************
    # ************************************************迭代器************************************************
    #
    # 05
    # 05
    # 05
    
    # # 16、for对列表的访问
    #
    #  l = [1,2,3]
    # for i in l:
    #     print(i)
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # 1
    # # 2
    # # 3
    # #
    # # Process finished with exit code 0
    
    
    
    # # 17、关于字符串与迭代器
    # # # 字符串也是可以被for循环,按理说应该是可迭代对象,但是,字符串中并没有遵循迭代器
    # # # 的协议,没有next方法,
    # # # 不过,字符串、列表等,是提供了内部的_iter_()方法,把字符串转化为迭代对象
    # # # 遵循迭代器协议,生成可迭代对象
    # #
    #
    # x = 'hello'
    # # 没有next方法
    # print(dir(x))
    #
    # x_iter = x.__iter__()
    # print(x_iter)
    # #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
    # # <str_iterator object at 0x00000000021C98D0>
    # #
    # # Process finished with exit code 0
    
    
    
    
    
    
    # # 18、字符串-->迭代器,next方法测试
    # # # 其他的称之为可迭代对象也相同的  列表、字典等
    # #
    #
    # x = 'hello'
    # #    01234
    # # x_iter = x.__iter__()
    # print("__next__1",x_iter.__next__())
    # print("__next__2",x_iter.__next__())
    # print("__next__3",x_iter.__next__())
    # print("__next__4",x_iter.__next__())
    # print("__next__5",x_iter.__next__())
    # # # 下面报错,只有5个元素,元素已经迭代完,这里报错,StopIteration
    # # print("__next__6",x_iter.__next__())
    #
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # __next__1 h
    # # __next__2 e
    # # __next__3 l
    # # __next__4 l
    # # __next__5 o
    # #
    # # Process finished with exit code 0
    
    
    
    
    # # 18.1、使用索引访问“可迭代”对象
    #
    # l = [1,2,3]
    # print(l[0])
    # i = 0
    # while True:
    #     print(l[i])
    #     i = i+1
    #     if i>=len(l):
    #         break
    # # 等价代码
    # l = [1,2,3]
    # print(l[0])
    # i = 0
    # while i<len(l):
    #     print(l[i])
    #     i = i+1
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # 1
    # # 1
    # # 2
    # # 3
    # #
    # # Process finished with exit code 0
    
    
    
    
    
    
    # # 19、for与迭代器的实现(集合测试)
    # # # 实质是集合-->__iter__方法-->集合转化为迭代器,并返回地址-->__next__方法调用内容
    # # # 遵循迭代器协议,生成可迭代对象
    # #
    #
    # s = {1,2,3}
    # # for逐个访问
    # for i in s:
    #     print(i)
    #
    # s_iter = s.__iter__()                 # 遵循迭代器协议,生成可迭代对象
    # print("转化后的迭代器地址",s_iter)
    # print("__next__1",s_iter.__next__())
    # print("__next__2",s_iter.__next__())
    # print("__next__3",s_iter.__next__())
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # 1
    # # 2
    # # 3
    # # 转化后的迭代器地址 <set_iterator object at 0x0000000001F30240>
    # # __next__1 1
    # # __next__2 2
    # # __next__3 3
    # #
    # # Process finished with exit code 0
    
    
    
    # # 20、迭代器与字典
    # # # 默认拿到的迭代的内容是集合的key
    # #
    #
    # dic = {'a':1,
    #        'b':2
    #        }
    # iter_d = dic.__iter__()
    # print('迭代器地址:',iter_d)
    # print("__next__1:",iter_d.__next__())
    # print("__next__2:",iter_d.__next__())
    # # print("__next__3:",iter_d.__next__())           # 报错已经迭代完,StopIteration报错
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # 迭代器地址: <dict_keyiterator object at 0x00000000020E8688>
    # # __next__1: a
    # # __next__2: b
    # #
    # # Process finished with exit code 0
    
    
    
    
    # # 21、迭代器与文件
    # # # test.txt    文件内容
    '''
    1
    2
    3
    
    '''
    # f = open('test.txt','r+')
    # iter_f = f.__iter__()
    # print('迭代器地址:',iter_f)
    # print("__next__1:",iter_f.__next__(),end='')
    # print("__next__2:",iter_f.__next__(),end='')
    # print("__next__3:",iter_f.__next__(),end='')
    # # print("__next__4:",iter_f.__next__(),end='')      # 报错已经迭代完,StopIteration报错
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # 迭代器地址: <_io.TextIOWrapper name='test.txt' mode='r+' encoding='cp936'>
    # # __next__1: 1
    # # __next__2: 2
    # # __next__3: 3
    # #
    # # Process finished with exit code 0
    
    
    # # 22、迭代器的模拟实现过程
    #
    # l = [1,2,3]
    # diedai_l = l.__iter__()
    # while True:
    #     try:
    #         print(diedai_l.__next__())
    #     except StopIteration:
    #         # print("迭代完毕,循坏终止!")
    #         break
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # 1
    # # 2
    # # 3
    # #
    # # Process finished with exit code 0
    
    
    
    # 06
    # 06
    # 06
    # # 23、next内置函数与迭代器
    # # # 实质上,内置函数next就是在调用__next__(),next(iter_l)等价于iter_l.__next__()
    #
    # l = ['die','erzi','sunzi']
    #
    # iter_l = l.__iter__()
    # print('迭代器地址:',iter_l)
    # print("next(iter_l):    ",next(iter_l) )           # next()---->iter_l.__next__()
    # print("next(iter_l):    ",next(iter_l) )
    # print("next(iter_l):    ",next(iter_l) )
    # # print("next(iter_l):    ", next(iter_l))  # 报错已经迭代完,StopIteration报错
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # 迭代器地址: <list_iterator object at 0x0000000002275B70>
    # # next(iter_l):     die
    # # next(iter_l):     erzi
    # # next(iter_l):     sunzi
    # #
    # # Process finished with exit code 0
    
    
    
    
    
    # 07
    # 07
    # 07
    # # 24、yield 与迭代函数
    # # # 使用生成器函数定义生成器
    # # # 带有 yield 的函数在 Python 中被称之为 generator(生成器)
    # #
    #
    # def test():
    #     yield 1
    #     yield 2
    #     yield 3
    #     yield "就这么多了"
    #
    # g =test()
    # print("来自函数",g)
    # print("__next__1:",g.__next__())
    # print("__next__2:",g.__next__())
    # print("__next__3:",g.__next__())
    # print("__next__4:",g.__next__())
    # # print("__next__3:",g.__next__())           # 报错已经迭代完,StopIteration报错
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # 来自函数 <generator object test at 0x00000000039BC9E8>
    # # __next__1: 1
    # # __next__2: 2
    # # __next__3: 3
    # # __next__4: 就这么多了
    # #
    # # Process finished with exit code 0
    
    
    
    # # 25、三元表达式
    # # # 如果条件为真,把if前面的值赋值给变量,否则把else后面的值赋值给变量。
    #
    # name = 'alex'
    # # name = 'linhaifeng'
    # res = 'SB' if name == 'alex' else '帅哥'
    # print('第一次三目运算:',res)
    #
    # name = 'linhaifeng'
    # res = 'SB' if name == 'alex' else '帅哥'
    # print('第2次三目运算:',res)
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # 第一次三目运算: SB
    # # 第2次三目运算: 帅哥
    # #
    # # Process finished with exit code 0
    
    #
    # # 26、列表解析
    # # # 形象地解释 Python 中的列表解析 - Python - 伯乐在线
    # # # http://python.jobbole.com/83884/
    # # # 列表解析
    # # #   根据已有列表,高效创建新列表的方式。
    # # #   列表解析是Python迭代机制的一种应用,它常用于实现创建新的列表,因此用在[]中。
    # # # 语法:
    # # #   [expression for iter_val in iterable]
    # # #   [expression for iter_val in iterable if cond_expr]
    # # # 不使用列表解析形成的列表
    # #
    #
    # egg_list =[]
    # for i in range(10):
    #     egg_list.append('鸡蛋%s'%i)
    #
    # l = ['鸡蛋%s'%i for i in range(10)]
    # l1 = ['鸡蛋%s'%i for i in range(10) if i>5]
    # # l2 = ['鸡蛋%s'%i for i in range(10) else i>5]          # 没有这种用法,只有if这种用法
    # # l3 = ['鸡蛋%s'%i for i in range(10) if i>5 else i ]    # 报错,没有四元表达式
    # print('egg_list没有列表解析',egg_list)
    # print('列表解析:',l)
    # print('列表解析与if:',l1)
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # egg_list没有列表解析 ['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']
    # # 列表解析: ['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']
    # # 列表解析与if: ['鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']
    # #
    # # Process finished with exit code 0
    
    
    
    
    # # 27、生成器
    # # # 首先请确信,生成器就是一种迭代器。生成器拥有next方法并且行为与迭代器完全相同,
    # # # 这意味着生成器也可以用于Python的for循环中。另外,对于生成器的特殊语法支持使得
    # # # 编写一个生成器比自定义一个常规的迭代器要简单不少,所以生成器也是最常用到的特性之一。
    # #
    #
    # laomuji = ('鸡蛋%s'%i for i in range(3) )
    # print(laomuji)                             # 这个是一个迭代器
    # # print(next(laomuji))                     # 使用内置函数来输出生成器的内容
    # print(laomuji.__next__())
    # print(laomuji.__next__())
    # print(laomuji.__next__())
    # # print(laomuji.__next__())                 # 报错已经迭代完,StopIteration报错
    
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # <generator object <genexpr> at 0x00000000039BC9E8>
    # # 鸡蛋0
    # # 鸡蛋1
    # # 鸡蛋2
    # #
    # # Process finished with exit code 0
    
    
    # # 28、sum方法与迭代器
    # l=[1,2,3,4]
    #
    # # 基于迭代器的协议去取l的内容,每一次取一个,知道结束
    # # l --> sum将它转化为迭代器 ->next方法调用内容
    # print(sum(l))
    #
    # # 内存当中生成[1,2,3,4]列表(这里列表会占用很多的内存)  --> sum将它转化为迭代器
    # # ->next方法调用内容
    # # print(sum([1,2,3,4]))
    # # 等价于
    # # print(sum( i for i in range(5) ) )  # 这种方式取值会占用占用很大的内存
    #
    #
    #
    # # D:Anaconda3python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
    # # 10
    # #
    # # Process finished with exit code 0
    
    
  • 相关阅读:
    POJ 2234 Matches Game 尼姆博弈
    复杂问题的简单抽象:魔兽世界中的兔子们
    POJ 2368 巴什博奕
    POJ 1067 取石子游戏 威佐夫博弈
    Codeforces 704A Thor 队列模拟
    Codeforces 703B Mishka and trip
    P1447 [NOI2010]能量采集
    P2652 同花顺
    P2034 选择数字 / P2627 [USACO11OPEN]Mowing the Lawn G
    P2515 [HAOI2010]软件安装
  • 原文地址:https://www.cnblogs.com/jyfootprint/p/9409916.html
Copyright © 2011-2022 走看看