Python Cookbook中文版Page 5(1.3保存最后N个元素),学到此处遇到几个问题。现记录如下,与大家分享一下学习心得。
(p6)1.3.2解决方案
example use on a file, 此处有两个问题:
1.line 2
with open('somefile.txt') as f:
此处'somefile.txt' 必须改成自己文件夹里的.txt文件,不然无法使用。如笔者改成了'poem.txt'
2.line 1
if __name__=='__main__':
开始不知道这句话有什么作用,经查阅之后知道是:语句后面的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而import到其他脚本中是不会被执行的。
为了验证,尝试把自己这段程序(e1.3.py) import 到另一个文件(e1.3_import.py)中。代码如下:
e1.3.py (内容同 e1_3.py)
def search(lines,pattern,history=20):
previous_lines=deque(maxlen=history)
for line in lines:
if pattern in line:
yield line,previous_lines #输出含有pattern的行,注意有中文符号和英文符号之分!!!
previous_lines.append(line) ### yield后面不能直接加previous_lines.append(line),因为没有返回值(不能直接print)
#Example use on a file
if __name__=='__main__': #此行后面的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而import到其他脚本中是不会被执行的。
with open('poem.txt') as f:
print(f)
print(search(f,'。',12)) #generator(生成器)函数,必须配合迭代使用,不能单独输出
print('pattern"!"','~'*15)
for line,prevlines in search(f,'!',3): #注意:是英文版“!”
print(line)
print(prevlines)
print('pattern","','~'*15)
for line,prevlines in search(f,',',4): #注意:是英文符号“,” 为什么没有输出句子?
print(line)
print(prevlines)
print('pattern","','-'*15)
for line,prevlines in search(f,',',5): #注意:是中文符号“,” 为什么没有输出句子?
print(line)
print(prevlines)
# for pline in prevlines:
# print(pline,end='')
# print('line:')
# print(line,end='')
# print('prevlines:')
# print(prevlines) #
# print('-'*20)
#
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
poem.txt
不乱于心,不困于情.不畏将来,不念过往.如此,安好!
深谋若谷,深交若水.深明大义,深悉小节.已然,静舒!
善宽以怀,善感以恩.善博以浪,善精以业.这般,最佳!
勿感于时,勿伤于怀.勿耽美色,勿沉虚妄.从今,进取!
无愧于天,无愧于地.无怍于人,无惧于鬼.这样,人生!
——丰子恺 《不宠无惊过一生》
你若爱,生活哪里都可爱。
你若恨,生活哪里都可恨。
你若感恩,处处可感恩。
你若成长,事事可成长。
不是世界选择了你,
是你选择了这个世界。
既然无处可躲,不如傻乐。
既然无处可逃,不如喜悦。
既然没有净土,不如静心。
既然没有如愿,不如释然。
——丰子恺 《豁然开朗》
心小了,所有的小事就大了;
心大了,所有的大事都小了;
看淡世事沧桑,内心安然无恙。
凡事顺其自然;遇事处之泰然;
得意之时淡然;失意之时坦然;
艰辛曲折必然;历尽沧桑悟然。
藏书如山积,读书如水流。
山形有限度,水流无时休。
希望源于失望,奋起始于忧患,
正 如一位诗人所说:
有饥饿感受的人一定 消化好,
有紧迫感受的人一定效率高,
有危机感受的人一定进步快。
大事难事,看担当;
逆境顺境,看胸襟;
是喜是怒,看涵养;
有舍有得,看智慧;
是成是败,看坚持。
有人帮你,是你的幸运;
无人帮你,是公正的命运。
没有人该为你做什么,
因为生命是你自己的,
你得为自己负责。
大其心,容天下之物,
虚其心,爱天下之善,
平其心,论天下之事,
潜其心,观天下之理,
定其心,应天下之变。
有为有不为,知足知不足;
锐气藏于胸,和气浮于面;
才气见于事,义气施于人。
走正确的路,放无心的手;
结有道之朋,断无义之友;
饮清净之茶,戒色花之酒;
开方便之门,闭是非之口。
别在树下徘徊,别在雨中沉思,别在黑暗中落泪。向前看,不要回头,只 要你勇于面对抬起头来,就会发现,此时的阴霾不过是短暂的雨季。向前看, 还有一片明亮的天,不会使人感到彷徨。
《缘缘堂随笔》
【丰子恺论人生三境界】我以为人的生活,可以分作三层:一是物质生活,二是精神生活,三是灵魂生活。物质生活就是衣食。精神生活就是学术文艺。灵魂生活就是宗教。“人生”就是这样的一个三层楼。
人生如一次长长的旅行,旅行中有坦途也有弯路,你得以平静的心态面对每一天,挑战自我,执着向前,一如既往地朝着目的地走下去。
这个世界不是有钱人的世界,也不是无钱人的世界,它是有心人的世界。
人间的事,只要生机不灭,即使重遭天灾人祸,暂被阻抑,终有抬头的日子。个人的事如此,家庭的事如此,国家、民族的事也如此。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>
>>>python3 e1.3.py
<_io.TextIOWrapper name='poem.txt' mode='r' encoding='UTF-8'>
<generator object search at 0x7f3834e99888>
pattern"!" ~~~~~~~~~~~~~~~
不乱于心,不困于情.不畏将来,不念过往.如此,安好!
deque([], maxlen=3)
深谋若谷,深交若水.深明大义,深悉小节.已然,静舒!
deque(['不乱于心,不困于情.不畏将来,不念过往.如此,安好!\n'], maxlen=3)
善宽以怀,善感以恩.善博以浪,善精以业.这般,最佳!
deque(['不乱于心,不困于情.不畏将来,不念过往.如此,安好!\n', '深谋若谷,深交若水.深明大义,深悉小节.已然,静舒!\n'], maxlen=3)
勿感于时,勿伤于怀.勿耽美色,勿沉虚妄.从今,进取!
deque(['不乱于心,不困于情.不畏将来,不念过往.如此,安好!\n', '深谋若谷,深交若水.深明大义,深悉小节.已然,静舒!\n', '善宽以怀,善感以恩.善博以浪,善精以业.这般,最佳!\n'], maxlen=3)
无愧于天,无愧于地.无怍于人,无惧于鬼.这样,人生!
deque(['深谋若谷,深交若水.深明大义,深悉小节.已然,静舒!\n', '善宽以怀,善感以恩.善博以浪,善精以业.这般,最佳!\n', '勿感于时,勿伤于怀.勿耽美色,勿沉虚妄.从今,进取!\n'], maxlen=3)
pattern"," ~~~~~~~~~~~~~~~
pattern"," ---------------
运行后,
没有输出含英文符号“,”和中文符号“,”的句子,为什么呢?
e1.3_import.py
import e1_3
import e1.3 #SyntaxError: invalid syntax
#不能写成import e1.3.py,导入py文件不需要添加后缀名,不然报错。
#如果想要在任何目录下导入a.py,把a.py文件放到Python安装目录下的lib文件夹里面即可
。
from math import floor #这样写是对的
import math.floor #ModuleNotFoundError: No module named 'math.floor'; 'math' is not a package
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
运行 python3 e1.3_import.py 之后程序报错。验证后发现是import e1.3 里e1.3文件名格式不符合规定(将e1.3.py改为e1_3.py即可)。
为什么呢?暂时还没有查出来。
?????????????????????????????????????????????
这个问题暂时标记一下待以后解答。
接着说说 第二个问题 (if __name__=='__main__': ),
ython文件的引入有2中方式:1、作为顶层执行脚本(执行入口)而加载;2、作为模块被引入。如果你直接执行一个python文件,则它就被当作顶层执行脚本而被加载。如果你使用参数-m (python -m file.py),则该文件被当作模块被引入, 如果该文件被其它文件以import的方式引入,则它也会被当成模块。一个文件的引入方式只能是这两种中的一种,而且某时刻只能是其中一种。
介绍了import,就必须介绍python的naming:
当文件被装载之后,它就会在装载器中获得一个唯一的命名,变量叫做__name__。如果文件作为顶层执行脚本被引入,则 __name__ == "__main__"。 如果作为module被引入,则__name__就是文件的文件名加上一些前缀,这些前缀就是packages/subpackages这样的类似文件路径的东西,不过是由点号dot隔开,而不是/隔开。注意其中的“类似”两字,表明前缀和文件路径不完全一样。
'''每个python文件(也就是此处的test.py和import_test.py)都包含内置的变量__name__,当文件被直接执>行时,__name__ == 'main'结果为真。如果import到其他文件中(被import的文件此时叫做模块),则__name__等于模块名称(不包含后缀.py)。
''' 同样举例说明,我们在test.py脚本的if __name__=="__main__":之前加入print __name__,即将__name__打印出来。'''
简单写两个程序验证如下:
_0322.py
print(__name__)
if __name__ == '__main__':
print("__name__ == '__main__'")
print("111111 这一段只有在执行本程序时才会出现,被import后不会起作用!")
if __name__ == '_0322': ##此处在 import_0322.py 执行时为真,输出下面结果
print("__name__ == '_0322' ")
print("222222 verify,这一段在import时也会被执行(打印出来一段话)")
print(__name__)
#print(__main__) ###NameError: name '__main__' is not defined
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>
>>> python3 _0322.py
__main__
__name__ == '__main__'
111111 这一段只有在执行本程序时才会出现,被import后不会起作用!
222222 verify,这一段在import时也会被执行(打印出来一段话)
__main__
import_0322.py
import _0322
#import 0322_ ###SyntaxError: invalid token
#import 322_ ###SyntaxError: invalid token
#import 0322 ###SyntaxError: invalid token
#import 322 ###SyntaxError: invalid syntax
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>> python3 import_0322.py
_0322
__name__ == '_0322'
222222 verify,这一段在import时也会被执行(打印出来一段话)
_0322
可以看到,前一段程序 _0322.py 执行后输出了5段
后面一个程序 import_0322.py 执行后只输出了4段(if __name__ == '__main__': 后面的语句没有输出)
(此处发现 import 后面的文件名不能以数字开头,不能含"." ,什么原因??)
先研究到这里吧!
,,