欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python全栈Day 18部分知识点

程序员文章站 2022-03-30 11:51:32
执行应用程序和函数都是在执行功能 rb f=open('aaa','rb',encoding='utf-8') #b的方式不能指定编码 输出 b'hello\r\n\xe4\xbd\xa0\xe5\xa5\xbd\r\n123\r\n12\r\n1' #Windows中回车是\r\n这个整体;Lin ......

执行应用程序和函数都是在执行功能

  rb

f=open('aaa','rb',encoding='utf-8')  #b的方式不能指定编码

Python全栈Day 18部分知识点

 

1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 f=open('ttt','rb')
4 data=f.read()
5 print(data)

输出

b'hello\r\n\xe4\xbd\xa0\xe5\xa5\xbd\r\n123\r\n12\r\n1'   #windows中回车是\r\n这个整体;linux或unix平台是\n

 

字符串---encode--->bytes

bytes---decode--->字符串

  wb

1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 f=open('ttt_new','wb')
4 f.write(bytes('111\n',encoding='utf-8'))  #字符串要转化为二进制,中间必须经过字符编码

Python全栈Day 18部分知识点

 

  另一种编码方式,

  >>>'杨建'.encode('utf-8')

  >>>b'\xe6\x9d\xa8\xe5\xbb\xba'

 

  ab

  不代表在最后一行追加,而是从最后的位置追加。

 

二进制这种方式代表处理数据的方式,不代表最后的内容,用二进制的好处:文件中不仅是文本,还包括视频、图片

 

  文件操作的其他方法

  closed判断是否关闭

  encoding判断文件打开的编码  

  flush内存中的数据刷到硬盘中

  tell光标当前所在位置  read(3)代表读取3个字符,其余的文件内光标移动都是以字节位单位,如seek/tell/read/truncate

      f=open('aaa','r',encoding='utf-8',newline='')  #读取文件中真正的换行符号windows系统中是\r\n

       f=open('aaa','r',encoding='utf-8')  #读取文件中python变换后换行符号\n

  seek用来控制光标的移动  f.seek(3,0) 0即从文件开头数三个字节,不写0也行,是默认  f.seek(3,1) 1即相对于上一次光标停留位值,使用相对位置的时候文件操作方式必须带b  f.seek(-10,2) 2即从文件末尾倒10个字节 

  truncate文件截取,在写文件,截取之外剩下的都删掉。文件操作方式可以是w或者是什么+都行,除了w+,w+一打开文件就把文件清空了。

 

循环文件的推荐方式

for i in f:  #一条一条读,不符合的从内存中清除,不用一下都读出来,对文件句柄遍历循环

  print(i)

高效率获取文件最后一行的方式

Python全栈Day 18部分知识点

 

迭代器和生成器

递归:自己调用自己  ;  迭代:每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。

  迭代器

    迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么引起一个stopiteration异常,以终止迭代(只能往后走不能往前退)

    可迭代对象:实现了迭代器协议的对象

    协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数)使用迭代器协议访问对象

    python中强大的for循环机制(跟索引无关,就是基于迭代器协议工作的)字符串、列表、元组、字典、集合、文件对象,这些都不是可迭代对象,只不过在for循环时,调用了它们内部的__iter__方法,把它们变成了可迭代对象。然后for循环调用可迭代对象的__next__方法去取值,而且for循环会捕捉stopiteration异常,以终止迭代。所以对象都可以通过for循环来遍历,while可以通过下标访问对象,但无序对象就无法访问了。

      l=[1,2,3]

      for i in l:  #1. 调用__iter__方法生成可迭代对象i_l=l.__iter__();2. i_1.__next()__  next()就是在iter_l.__next__()

        print(i)

 

1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 l=[1,2,3]
4 iter_l=l.__iter__()
5 print(iter_l.__next__())
6 print(iter_l.__next__())
7 print(iter_l.__next__())

输出

1

2

3

  生成器

    可以理解为一种数据类型,它自动实现了迭代器协议,本身就是可迭代对象。

    函数中有yield(相当于return,但可以执行多次),执行就得到了个生成器

    三元运算,列表解析

写法比较简单,但占内存太多,列表解析需要生成列表,列表元素过多会卡死。

1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 l=['鸡蛋%s'%i for i in range(10)] #列表是内存对象,鸡蛋都放到内存里了。
4 l1=['鸡蛋%s'%i for i in range(10) if i>5]
5 #l1=['鸡蛋%s'%i for i in range(10) if i>5 else i] #没有四元表达式
6 l2=['鸡蛋%s'%i for i in range(10) if i<5]
7 print(l)
8 print(l1)
9 print(l2)

输出

['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']

['鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']
['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4']

 

    生成器表达式

  把列表解析[]换成()得到的就是生成器表达式,它们都是便利的编程方式,只不过,生成器表达式更节省内存,因为生成器表达式是基于迭代器协议的next方法一个个取值的

1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 laomuji=('鸡蛋%s'%i for i in range(10))   #生成器
4 print(laomuji)
5 print(laomuji.__next__())
6 print(next(laomuji))
7 print(next(laomuji))
8 print(next(laomuji))

输出

鸡蛋0
鸡蛋1
鸡蛋2
鸡蛋3