Python Cookbook e1.3 yield生成器函数及import

    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 后面的文件名不能以数字开头,不能含"." ,什么原因??)


先研究到这里吧!


,,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值