day18_文件处理_迭代器_生成器
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# ********************day18_文件处理_迭代器_生成器 *******************
# ********************day18_文件处理_迭代器_生成器 *******************
# ********************day18_文件处理_迭代器_生成器 *******************
# =====>>>>>>内容概览
# =====>>>>>>内容概览
# =====>>>>>>内容概览
'''
# # 1、b模式下打开文件
# # # 注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
# # # f = open('test11.py','rb',encoding='utf-8') # 报错,rb模式打开文件是不能指定编码的
# # # ?????????? 那个以什么方式的编码打开,就是而二进制??
# # # 读出来的结果说明:\r\n是windows下的“回车键”,而linux中的回车键是“\n”
#
# # 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中,回车是'\r\n',因此读取出来的是一行的字节的后面会加上\r\n的位置,因此会多了
# # # 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模式打开文件是不能指定编码的
# # # ?????????? 那个以什么方式的编码打开,就是而二进制??
# # # 读出来的结果说明:\r\n是windows下的“回车键”,而linux中的回车键是“\n”
#
# f = open('test11.py','rb') # b的方式不能指定编码
# print(f.read()) # 字节读
# f.close()
#
# # D:\Anaconda3\python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
# # b'hello\r\n111\r\n222\r\n"string"\r\n\xe5\x95\xa5\xe4\xba\x8b'
# #
# # 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:\Anaconda3\python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
# # b'hello\r\n111\r\n222\r\n"string"\r\n\xe5\x95\xa5\xe4\xba\x8b'
# # hello
# # 111
# # 222
# # "string"
# # 啥事
# #
# # Process finished with exit code 0
# # 以字节的方式写
# # # 注意格式
# #
#
# f = open('test11.py','wb') # b的方式不能指定编码
# f.write(bytes("1111\n",encoding='utf-8'))
# f.write('杨件'.encode('utf-8')) # '杨件' --> 'utf-8'编码 --> 二进制
#
#
# f.close()
# #
# # D:\Anaconda3\python.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:\Anaconda3\python.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:\Anaconda3\python.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:\n",data)
# f.close()
#
# # D:\Anaconda3\python.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中,回车是'\r\n',因此读取出来的是一行的字节的后面会加上\r\n的位置,因此会多了
# # # 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:\Anaconda3\python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
# # f.tell(): 0
# # f.readline(): 123 # 三个字节,后面有\r\n( 可通过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:\Anaconda3\python.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:\Anaconda3\python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
# # f.tell(): 0
# # f.readlines(): ['123\r\n', '22\r\n', '3234abc']
# # f.tell(): 16
# # f.truncate(10): 6
# # f.seek(0): 0
# # f.readlines(): ['123\r\n', '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:\Anaconda3\python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
# # f.readlines(): ['hello\r\n', '123hello\r\n', '123hello\r\n', '123hello']
# # f.seek(0): 0
# # b'hello\r\n'
# # 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:\Anaconda3\python.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:\Anaconda3\python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
# # ['hello\n', '你好\n', '123\n', '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')
# # # 文件的,每一行末尾是\r\n ,在encoding='utf-8'方式中,被编译器处理掉了,
# # # 没有显示出来只有显示\n,只有通过rb模式,才回显示出来\r\n
# 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:\Anaconda3\python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
# # 所有内容: [b'hello\r\n', b'\xe4\xbd\xa0\xe5\xa5\xbd\r\n', b'123\r\n', b'123']
# # 第1行 b'hello\r\n'
# # 7
# # 第2行 b'\xe4\xbd\xa0\xe5\xa5\xbd\r\n'
# # 15
# # 第3行 b'123\r\n'
# # 20
# # 0
# # 7
# # 15
# # f.readlines(): [b'123\r\n', 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:\Anaconda3\python.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:\Anaconda3\python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
# # b'2016/12/25 alex \xe5\xb9\xb2\xe4\xba\x86\xe4\xbb\xb6\xe4\xba\x8b\xe6\x83\x85\r\n'
# # b'2016/12/26 alex \xe5\xb9\xb2\xe4\xba\x86\xe4\xbb\xb6\xe4\xba\x8b\xe6\x83\x85\r\n'
# # b'2016/12/27 alex \xe5\xb9\xb2\xe4\xba\x86\xe4\xbb\xb6\xe4\xba\x8b\xe6\x83\x85\r\n'
# # b'2016/12/28 alex \xe5\xb9\xb2\xe4\xba\x86\xe4\xbb\xb6\xe4\xba\x8b\xe6\x83\x85\r\n'
# # b'2016/12/29 alex \xe5\xb9\xb2\xe4\xba\x86\xe4\xbb\xb6\xe4\xba\x8b\xe6\x83\x85\r\n'
# # b'2016/12/30 sb \xe5\xb9\xb2\xe4\xba\x86\xe4\xbb\xb6sb\xe4\xba\x8b\xe6\x83\x85\r\n'
# #
# # Process finished with exit code 0
# # 通过for读取 日志文件 中的信息
# # # 相当于上面更好的方式=============>
# # # 这种方式,就是需要一行,就把文件的中的一行加载到内存当中,节约资源
# f = open('日志文件' ,'rb')
# for i in f:
# print(i)
#
# # D:\Anaconda3\python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
# # b'2016/12/25 alex \xe5\xb9\xb2\xe4\xba\x86\xe4\xbb\xb6\xe4\xba\x8b\xe6\x83\x85\r\n'
# # b'2016/12/26 alex \xe5\xb9\xb2\xe4\xba\x86\xe4\xbb\xb6\xe4\xba\x8b\xe6\x83\x85\r\n'
# # b'2016/12/27 alex \xe5\xb9\xb2\xe4\xba\x86\xe4\xbb\xb6\xe4\xba\x8b\xe6\x83\x85\r\n'
# # b'2016/12/28 alex \xe5\xb9\xb2\xe4\xba\x86\xe4\xbb\xb6\xe4\xba\x8b\xe6\x83\x85\r\n'
# # b'2016/12/29 alex \xe5\xb9\xb2\xe4\xba\x86\xe4\xbb\xb6\xe4\xba\x8b\xe6\x83\x85\r\n'
# # b'2016/12/30 sb \xe5\xb9\xb2\xe4\xba\x86\xe4\xbb\xb6sb\xe4\xba\x8b\xe6\x83\x85\r\n'
# #
# # 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:\Anaconda3\python.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:\Anaconda3\python.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:\Anaconda3\python.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:\Anaconda3\python.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:\Anaconda3\python.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:\Anaconda3\python.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:\Anaconda3\python.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:\Anaconda3\python.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:\Anaconda3\python.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:\Anaconda3\python.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:\Anaconda3\python.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:\Anaconda3\python.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:\Anaconda3\python.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:\Anaconda3\python.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:\Anaconda3\python.exe D:/C_cache/py/day18_WenJianChuLi/day18_WenJianChuLi.py
# # 10
# #
# # Process finished with exit code 0
day18_文件处理_迭代器_生成器的更多相关文章
- python基础15上_迭代器_生成器
# 迭代器和生成器 # 迭代器: # 双下方法 : 很少直接调用的方法.一般情况下,是通过其他语法触发的 # 可迭代的 —— 可迭代协议 含有__iter__的方法('__iter__' in dir ...
- Python笔记(十)_迭代器与生成器
迭代 用for...in来遍历一个可迭代对象的过程就叫迭代 可迭代对象:列表.元组.字典.集合.字符串.生成器 可以使用内置函数isinstance()判断一个对象是否是可迭代对象 >>& ...
- python基础15下_迭代器_生成器
print(dir([])) #告诉我列表拥有的所有方法 # 双下方法 # print([1].__add__([2])) print([1]+[2]) ret = set(dir([]))& ...
- python语法_列表生成器_生成器_迭代器_异常捕获
列表生成式 a = [x for x in range(10)] print(a) x 可进行操作 a = [x*2 for x in range(10)] print(a) x甚至可以为函数, de ...
- Python基础(8)_迭代器、生成器、列表解析
一.迭代器 1.什么是迭代 1 重复 2 下次重复一定是基于上一次的结果而来 l=[,,,] count= while count < len(l): print(l[count]) count ...
- js分析 天_眼_查 字体文件
0. 参考 js分析 猫_眼_电_影 字体文件 @font-face 1. 分析 1.1 定位目标元素 1.2 查看网页源代码 1.3 requests 请求提取得到大量错误信息 对比猫_眼_电_影抓 ...
- cb07a_c++_迭代器和迭代器的范围
cb07a_c++_迭代器和迭代器的范围c++primer第4版https://www.cnblogs.com/txwtech/p/12309989.html--每一种容器都有自己的迭代器--所有的迭 ...
- linux文件内容列传行_行转列
================ 文件内容列传行_行转列 ================ 一.列转行 1.编辑测试文件 vi log.txt 16:23:00 8.2% 1773620k 16:2 ...
- Python3基础笔记_迭代器
# Python3 迭代器与生成器 import sys ''' 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开 ...
随机推荐
- IIS查找报错信息
1.打开IIS,选择日志 2.选择 日志文件和ETW事件 ---->应用 3.在发布网站的根目录下找一个logs文件(如果没有则创建) 4.浏览网站,如果报错,logs文件夹下面就会生成一个 ...
- delphi 文件存取方法与文件管理组件
9.2 文件存取方法与文件管理组件 9.2.1 存取文件的类方法 Delphi在许多需要与文件打交道的类中定义了文件存取方法,使用这些方法可以非常方便地将类中的数据保存到文件中,或从文件中读取所需 ...
- eclipse背景设置什么颜色缓解眼睛疲劳
eclipse背景设置什么颜色缓解眼睛疲劳 1.打开window->Preference,弹出Preference面板 2.展开General标签,选中Editors选项,展开. 3.选中 Te ...
- 牛客多校第三次B——线段树维护线性基交
写线性基交函数时调试了半天.. #include<bits/stdc++.h> using namespace std; #define ll long long #define maxn ...
- ETL详解
ETL是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程,目的是将企业中的分散.零乱.标准不统一的数据整合到一起,为企业的决策提供分析依据. ETL是BI项目重要的一个环节. 通常情况下,在 ...
- IOI 2005 River (洛谷 3354)
题目描述 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一个村庄--名叫 ...
- ES6 箭头函数this指向
箭头函数有几个使用注意点. (1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象. (2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误. (3)不可以使 ...
- random,time,sys,os,序列化模块
random模块(随机数模块) 取随机小数: random.random() 取0-1之间的小数 random.uniform(x, y) 取x-y之间的小数 取随机整数: random.randin ...
- bash数组总结
bash数组操作 bash支持两种数组,一种是索引数组,一种是关联数组 索引数组 数组的值类型是任意的,索引也未必一定要连续,当做列表理解更好 下面总结下索引数组,即列表: 1. 声明 declare ...
- jsp-提交表单乱码解决
jsp提交表单有两种方式,一种是get,一种是post,对于两种方式都可能出现乱码,以下给出两种乱码方式的解决方案. 1.post提交解决乱码 //设置解码方式,post提交解决乱码 比较简单 req ...