__name__属性
一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一个程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行
说明:每个模块都有一个__name__属性,当其值时‘__main__'时,表明该模块自身在运行,否则是被引入。
dir()函数,可以找到模块内定义的所有名称。以一个字符串的形式返回:
生成器
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面很大空间都浪费
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?在Python中,这种一边循环一边计算的机制,称为生成器。
- 可迭代
- 只能读取一次
- 实时生成数据
mygenerator = (x*x for x in range(10)
for i in mygenerator
print(i)
#之后就不能使用for i in mygenerator了
yield关键字
- yield是一个类似return的关键字,只是这个函数返回的是一个生成器
- 这个函数只返回一个生成器对象
- 当使用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())