一:迭代器 iter
特点:每次迭代得到的结果都是下一次迭代的初始值。
迭代对象:字符串,列表,元组,集合,字典。
可迭代对象的表现形式为内置了iter方法的数据,都属于可迭代对象。
声明迭代器:
方法一:
变量名 = 可迭代对象.__iter__()
方法二:
变量名 = iter(可迭代对象)
变为迭代器,就可以用next方法把里面的数据一个个取出来使用。
迭代器取值:
方法一:
迭代器名称.__next__()
方法二:
next(迭代器名称)
注意:迭代器next一次只能取一个值,并且是向下取值不能回头。
StopIteration :当进行迭代取值时,超过数据长度会进行报错。
num=[1,2,3,4]
a=num.__iter__()
print(type(a)) #<class 'list_iterator'>
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__())
如果再写一个 print(a.__next__()) 语句会报错,因为超出了取值范围。
有了迭代器后,我们可以不依赖索引迭代取值了,使用while循环的方式也可以进行迭代取值。
while True:
try:
print(a.__next__())
except StopIteration: #捕捉异常终止循环
break
for循环的原理,也就是把数据转为一个迭代器,然后把里面的数据一个个的取出来使用,直到捕捉到StopIteration异常,结束迭代。
二:生成器 yield
1.生成器可以理解为自定义迭代器,当一个函数内有yield这个关键字的话,那么这个函数就是生成器。
2.生成器返回的是迭代数据,需要使用迭代取值的方式获取,数据生成是边生成变迭代。
3.yield --这个可以返回迭代数据,但是返回之后不会停止函数的执行而是进入暂停状态,等待下一次调用取值就会往后继续执行。
表达式:
名称 = (迭代值 for 变量 in 可迭代对象/range)
下面是一个生成器函数:
def fun():
for i in range(1, 11):
yield f'这是第{i}碗'
print('好好吃')
f=fun() #把生成器对象赋值给一个变量
print(type(f)) #<class 'generator'>生成器
while True:
try:
print(f.__next__())
except StopIteration:
break
noodle=(f'这是第{i}碗' for i in range(1,6))
print(type(noodle)) #<class 'generator'>
print(next(noodle))
print(next(noodle))
print(next(noodle))
print(next(noodle))
print(next(noodle))
三:绝对路径和相对路径
文件路径:文件存储的位置
绝对路径:完整的路径,从盘符开始找文件(c盘符)
相对路径:简短的路径,有参考对象,默认从当前文件开始
相关操作:
./ 表示当前文件夹
../ 表示返回上一层文件夹
../../ 返回这个文件的上上层文件夹
四:文件操作
用Python代码来操作电脑里的文件(txt,exe,mp3..)--文本/图片/音频。
文件的数据类型:
t:text 文本数据(文件操作默认就是文本数据)
b:byte 以字节码的方式操作数据--目前还不需要使用,后续讲到网络编程/爬虫的时候会使用
wb:以字节码的方式写入数据
wt:以文本的方式写入数据
rb:以字节码的方式读取数据
文件操作三要素:打开文件,操作文件,关闭文件
文件操作模式:
w:write 写入数据,如果文件里有数据,会被覆盖,如果没有这个文件则会新建。
a:append 追加数据,如果文件里有数据,不会覆盖而是会追加到后面
r:read 读取数据
语法一:
文件名 = open(文件路径/文件名.后缀,操作模式,encoding = 'utf-8')
f.操作模式()
f.close()
注意:如果不写文件路径,默认在当前文件夹。
f是作为文件对象.名字是不固定的,但是一般都是叫f
f.read():读取所有数据,也可以在括号里面放参数,指定读取的数据。(得到的数据是字符串)
f.readline():读取一行数据,也可以在括号里面放参数,指定读取的数据,但是超出一行的内容,也是会读取一行。(得到的数据是字符串)
f.readlines():读取所有行,并返回一个包含所有行的列表的方法。每个元素都是文件中的一行 ,包括换行符\n。(得到的数据是列表)
f.closed --> 判断文件是否已经关闭 True关闭 False没关闭
f.writable() --> 判断文件是否可写 True可写 False不可写
f.readable() --> 判断文件是否可读 True可读 False不可读
f=open('小白.txt','w',encoding='utf-8')
f.write('好好学习,天天向上')
print(f.writable())
f.close()
print(f.closed)
f=open('小白.txt','a',encoding='utf-8')
f.write('认真学习')
f.close()
f=open('小白.txt','r',encoding='utf-8')
print(f.read()) #可以读取全部数据
f.close()
f=open('小白.txt','r',encoding='utf-8')
print(f.read(3)) #也可以指定参数读取
print(f.readable())
f.close()
文件操作语法格式2:
为了避免文件操作没有关闭文件,导致内存泄漏,有种更推荐的写法,叫with open上下文管理器。
语法:
with open (文件路径\文件名.后缀,操作模式,encoding = 'utf-8') as 名字:名字.操作模式()
该模式会对文件自动关闭
with open('study.txt', 'w', encoding='utf-8') as f:
f.write('学海无涯苦作舟\n')
f.write('每天都要学习\n')
print(f.closed)
with open('study.txt', 'a', encoding='utf-8') as f:
f.write('学习让我快乐\n')
f.write('学习使我开心')
with open('study.txt', 'r', encoding='utf-8') as f:
res = f.readline()
print(res)
with open('study.txt', 'r', encoding='utf-8') as f:
res1 = f.readline(20)
print(res1)
print(type(res1))
with open('study.txt', 'r', encoding='utf-8') as f:
res2 = f.readlines()
print(res2) # <class 'list'>
print(type(res2))
print(res2[2])
这段代码可以自行理解。
标签:文件,迭代,day9,Python,encoding,next,print,open From: https://blog.csdn.net/2401_88454635/article/details/144492531