python笔记(四)

本文探讨Python中的生成器概念,包括__name__属性、dir()函数、生成器、可迭代特性及yield关键字的使用。同时,深入解析Python文件I/O操作,如open()函数的使用、文件读写、StringIO和BytesIO内存读写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

__name__属性

一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一个程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行

说明:每个模块都有一个__name__属性,当其值时‘__main__'时,表明该模块自身在运行,否则是被引入。

dir()函数,可以找到模块内定义的所有名称。以一个字符串的形式返回:

生成器

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面很大空间都浪费

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?在Python中,这种一边循环一边计算的机制,称为生成器。

  1. 可迭代
  2. 只能读取一次
  3. 实时生成数据
mygenerator = (x*x for x in range(10)
for i in mygenerator
    print(i)
#之后就不能使用for i in mygenerator了

yield关键字

  1. yield是一个类似return的关键字,只是这个函数返回的是一个生成器
  2. 这个函数只返回一个生成器对象
  3. 当使用for进行迭代的时候,函数中的代码才会执行(且只能执行一次)
 def createGenerator() :
    mylist = range(3)
    for i in mylist :
        yield i*i

>>> mygenerator = createGenerator() # create a generator
>>> print(mygenerator) # mygenerator is an object!
<generator object createGenerator at 0xb7555c34>
>>> for i in mygenerator:
...     print(i)
0
1
4

io编程

程序和运行时数据是在内存中驻留,有CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘,网阔等,这就需要io接口

文件读写

在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)

#open()内置函数,传入文件名和标识符
f=open('D:/test.txt','r') #r表示读
str = f.read() #read()一次读取文件的全部内容,python把内容读到内存
print(str)
f.close() #调用close()方法关闭文件,文件必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间内能打开的文件数量也是有限的

由于文件读写可能会产生IOError,一旦出错,后面的f.close()就不会调用。所以,需要添加try...finally

但是每次这么写会很繁琐,所以Python引入了with语句

with open('D:/test.txt','r') as f:
    print(f.read())

这个方法和try...fianlly的作用一样,并且不必调用f.close()

调用read()会一次性读取文件的全部内容,所以为了保险起见,可反复调用read(size)方法

readline()可以每次读取一行内容,并按行返回list

f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')

encoding确定编码参数,errors参数,遇到错误如何处理

写文件,同理

with open('D:test.txt','w') as f:
    f.write('hello,world')

StringIO

很多时候,数据读写不一定是文件,也可以在内存中读写。

StringIO顾名思义就是在内存中读写str,要把str写入StringIO,我们需要先创建一个StringIO,然后,像文件一样写入即可:

from io import StringIO

f=StringIO()
f.write('hello')
print(f.getvalue())

getvalue()方法用于获得写入的str

from io import StringIO

f=StringIO('Hello!\nHi!\nGoodbye!')
while True:
    s=f.readline()
    if s == '':
        break
    print(s.strip())

BytesIO

StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO

BytesIO实现了在内存中读写bytes

from io import BytesIO

f=BytesIO()
f.write('中文'.encode('utf-8'))
print(f.getvalue())

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值