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

 

posted @ 2018-07-30 10:14  JY小脚丫  阅读(168)  评论(0编辑  收藏  举报