Python读书随笔

1、创建球对象时,并没有在size、color或是direction中填入任何内容。必须在创建对象之后填充这些内容。不过有一种方法可以在创建对象时设置属性,这称为初始化对象。

2、Python中有一些魔法方法,这些只是在你创建类时Python自动包含的一些方法。Python程序员通常把它们叫做特殊方法(special method)。

每个对象都内置了一个init()方法。如果你在类定义中没有加入自己的init方法,就会有这样的一个内置方法接管,它的工作就是创建对象。

还有一个特殊的方法就是str(),它会告诉Python打印(print)一个对象时具体显示什么内容。Python会默认以下内容。
(1)实例在哪里定义
(2)类名
(3)存储实例的内存位置

3、关于什么是self?
可以使用蓝图盖很多个房子,可以用一个类创建很多个对象实例。方法必须知道是哪个实例调用了它。self会告诉方法是哪一个对象调用它。这称为实例引用。

为什么调用方法时,没有传入参数?
调用一个方法时,究竟是哪个实例调用了这个方法?这个信息(也就是实例引用)会自动传递给方法。

我们还看到了另一个特殊方法str(),利用这个方法可以更好地打印我们的对象。
在上面的实例中,我们并没有在办法中加入任何实际代码,只有一些注释来解释这些方法要做什么。这是一种未雨绸缪的方法,是对以后要增加的内容提前做出计划或提前考虑。具体的代码要取决于游戏如何工作。程序员编写比较负责的代码时通常就会采用这种做法来组织他们的想法。“空”函数或方法称为代码桩。
如果希望建立一个代码桩,可以使用Python的pass关键字作为一个占位符。

声音既可以作为输入,也可以作为输出。作为输入,需要把一个麦克风或其他的音源连接到计算机,程序会把声音记录下来,或者对它做其他处理(可能通过互联网发送)。
Pygame有一个处理声音的模块,名字为pygame.mixer。在真实世界中,取不同的声音并把它们混在一起的设备叫做“混音器”(mixer),Pygame中的模块也正是因此得名。

要播放声音,首先必须初始化(initialize)pygame.mixer。还记得初始化是什么意思吗?指的是开始时让某个东西做好准备。
让pygame.mixer做好准备很容易。只需要在初始化Pygame之后增加一行代码:
pygame.mixer.init()

我们还可以控制Pygame发送到计算机声卡的音量。
模块是某个东西的一部分。如果一个东西可以分为几部分,或者你可以很容易地把它分解成多个不同部分,我们就说这个东西是模块化的。在Python中。模块(module)是包含在一个更大程序中的类似的部分。每个模块或部分都是硬盘上的一个单独的文件。可以把一个大程序分解成多个模块或者文件。或者也可以反过来,从一个小的模块开始,逐渐增加其他部分来建立一个大模块。

模块化意味着你可以使用各部分的不同组合来完成不同的任务,就像利用同样的一组乐高积木可以搭建不同的东西一样。

···他们会把类似的积木收集在一个模块中,或者他们也有可能把一个项目需要的所有函数收集在一个模块中。

一般来说,程序员把较小的命名空间称为局部命名空间,而较大的命名空间称为全局命名空间。
Python提供了大量的标准模块,可以用来完成很多工作,比如查找文件、报时(或计时)、生成随机数,以及很多其他功能。

要让图形和声音在你的计算机上起作用,这可能有点复杂。这涉及到操作系统和你的图形卡,还需要大量的底层代码。所以会使用一个名字为pygame的Python模块来提供帮助。

什么是翻转:对于pygame窗口中显示的所有内容,Pygame中的显示对象都会有这些内容的额两个副本。这样做的原因是,开始动画时,我们希望让动画尽可能流畅,速度尽可能快。所以不必在每次对图形做一个小小的修改时都更新显示,可以做很多修改后再“翻转”(flip)到图形的新版本。这样就会一次显示出所有这些修改,而不是一个接一个出现。这样一来,我们就不会显示出只画了一半的圆(或外星人,或者其他任何东西)
可以把这两个副本当做“当前屏”和一个“下一屏”。当前屏就是我们现在看到的,下一屏就是完成”翻转”之后看到的。

my_ball对象是一个表面,不过我们看不到这个表面,它只在内存中,我们唯一能看到的是显示表面,名为screen。通过把my_ball表面复制到screen表面上,然后像前面一样,通过display.flip()调用使它可见。

利用计算机做动画时,移动一个东西要完成两个步骤:(1)在新的位置上画出图形(2)把原来的图形擦掉
要擦掉什么东西,实际上是用什么把它盖住

四处移动的单个图像或者是图像部分称为动画精灵(sprite),Pygame有一个特殊的模块来处理动画精灵。利用这个模块,我们可以更容易地移动图形对象。
动画精灵表示作为一个单位来移动和显示的一组像素,这是一种图像对象。
可以把动画精灵想象成一个小图片——一种可以在屏幕上移动的图形对象,并且可以与其他图形对象交互。
Pygame的sprite模块提供了一个动画精灵基类,名为Sprite。正常情况狭隘,我们不会直接使用基类,而是基于pygame.sprite.Sprite来创建自己的子类。

self.rect.left,self.rect.top = location
location是一个[x,y]位置,这是个包含两个元素的列表。因为=号的一边是包含两个元素的列表(x和y),所以可以在另一个边赋两个值。这里我们为动画精灵的left和top属性赋值。

简单来说,碰撞检测指的是了解两个动画精灵何时接触或者是重叠。两个移动的东西相互碰撞到一起,这就是一个碰撞(collision)。

对于要在Pygame中完成的大多数工作来说,矩形碰撞检测已经足够了。像素完美碰撞检测需要写更多的代码,而且会让游戏运行得更慢,所以应该只有在确实有必要的情况下才使用这种方法。

这说明,对于图形运行的帧速率有一个限制。这个限制取决于图形的复杂程度、窗口大小以及运行这个程序的计算机的速度。

假如已经设置了clock.tick(30),这说明你想要按照30fps的帧速率运行。如果使用clock.get_fps()并发现只得到速率为20fps,可以知道:屏幕上对象移动的速度比你希望的要慢。因为每秒的帧数更少,所以每一帧必须把对象移动得更远,这样看上去才跟得上预想的速度,你的移动对象可能有一个名为speed的变量(或者是属性),这会告诉它们每一帧移动多远。只需要增加speed对运行速度较慢的机器做出补偿。

这个事件去哪里了呢?事件循环会一直不断地搜索内存的某个部分,内存中存储事件的部分叫做事件队列(event queue)
事件队列就是发生的所有事件的列表,这些事件按它们发生的顺序排列。

程序中处理某个事件的部分称为一个事件处理器(event handler)

不过你的程序可能不关心鼠标的每一个小小的移动,它可能只关心用户什么时候点击某个部分,所以你的程序可以忽略mouseMove事件,只关注mouseClick事件。

移动球时我们没有“擦除”球,而是做了不同的处理。我们已经知道,在新位置上重画球之前要从原位置“擦除”动画精灵有两种方法:一种方法是在每个动画精灵的原位置上涂上背景颜色,另一种方法是直接重绘每一帧的整个背景——实际上每一次都会从一个空屏幕开始。在这里,我们采用了第二种做法。不过这里不是每次循环时使用screen.fill(),而是建立了一个名为background的表面,用白色填充。每次循环时,只需要把这个背景“块移”到显示表面screen。这样也能达到目的。这只是完成这项工作的不同方法而已。

不过在Pygame中还有一个设置,可以在按键一直按下时生成多个KEYDOWN事件,不过Pygame中还有一个设置,可以在按键一直按下时生成多个KEYDOWN事件。这称为按键重复(key repeat)。你要告诉它开始重复之前等待多长时间,另外还要指出多长时间重复一次。这些值的单位都是毫秒(1/1000秒)。

delay值告诉Pygame在开始重复之前等待多长时间,interval值告诉Pygame按键要以多快的速度重复,也就是说,各个KEYDOWN事件之间要间隔多长时间。
我们将使用球的rect.center属性,这样一来,球的中心就会跟着鼠标移动。

定时器事件(timer event)会按照固定的间隔生成事件,就像你的闹钟一样。如果你设置好闹钟,并把闹钟打开,每天它都会在固定的时刻响起来。

要使用什么EVENT_NUMBER呢?应当使用Pygame还没有用过的一个编号(也就是说,尚未将这个编号用于其他事件)。可以询问Pygame哪些编号已经占用。

在计算机中,渲染(render)是指绘制某个东西,或者让它可见。

PythonCard模块帮助我们创建GUI。

一定要让def快比class多缩进4个空格。为什么要这么做呢?这是因为所有组件都在窗口中,也就是说要作为窗口的一部分。所以按钮的代码应该放在这个类定义内。

前面我们说过,要看程序里发生了什么,有一种很好的方法,就是在程序运行时打印出一些变量的值。

为什么我们要在Convert的C前面加上一个&符号?这样做是为了告诉菜单编辑器这个菜单使用哪个热键。
要使用菜单项的热键,需要使用Alt键(如果是windows系统)。前面说过,按下Alt-F就会进入File菜单。一旦进入File菜单,就可以使用File菜单中菜单项的热键。在这里Exit的热键是X。

关于开发程序代码的最佳方式有很多争论:可以是过程式编程,或者采用函数式编程技术,还可以使用面向对象技术。这3种编程方法在Python中都会以某种方式得到支持。除了列表,Python还提供集合数据结构,它的变现类似于你在数学课上学到的集合。

工厂函数:用于创建某种类型的新的数据项。例如,“set()”就是一个工厂函数,因为它会创建一个新的集合。在真实世界中,工厂会生产产品,这个概念因此而得名。
Python还提供了字典,允许你有效地组织数据,可以将数据与名关联而不是与数字关联,从而实现快速查找。
当Python的内置数据结构无法胜任时,Python class语句还允许你定义自己的数据结构。

现在按钮和菜单的command属性都已经设置成cmdCtoF。另一个按钮和菜单项的command属性都设置为cmdFtoC。我们只需要改变事件处理器的名字。因为按钮和菜单会共享一个事件处理器,所以总共只需要两个事件处理器,而不是4个。

制表符(Tab,也叫做进格符)在按列对其方面非常有用。要了解制表符是如何制表符是如何工作的。可以想一想屏幕上的每一行都划分为多个大小相同的块时是什么样。下面假设每一个块是8个字符宽。插入一个制表符时,就会移到下一个块开始的位置。

这里有两处用到%符号,先是用在字符串中间,指示要把变量放在什么位置,然后在字符串后面再次用到,告诉Python接下来就是我们希望在字符串中插入的变量。
%s表示我们想插入一个字符串变量。如果想插入整数,要使用%i;想插入浮点数,要使用%f。

Python非常聪明,它会把数字四舍五入为两位小数,而不是直接去掉多余的数位。使用整数格式化时,数字会截断,使用浮点数格式化时,数字会四舍五入。
如果指定的小数位比数字中实际的小数位还要多,Python会使用0来填充(pad)
如果希望数字会显示正负号,即使它是一个正数,可以在%后面加上一个“+”号

要使用%e格式字符串打印E记法,它总是打印6位小数,除非你另作要求。

如果你希望Python自动选择浮点数记法或者是E记法,可以使用%g格式字符串。Python会自动为大数自动选择E记法,而对较小的数使用浮点数记法。
对于GUI和其他图形程序(比如游戏)来说,将格式化的数字存储为字符串非常有用,一旦有一个对应格式化字符串的变量名,就可以采用你希望的任何方式来显示:可以显示在文本框中,显示在对话框中,或者显示在游戏屏幕上。

Python中的字符串实际上都是对象,而且有自己的方法来完成搜索、分解和结合之类的操作,这些方法都称为字符串方法。

···‘Tony,’并没有出现在列表中,因为分解标记会被丢掉。
如果没有为Python指定任何分解标记,它会按空白符(whitespace)分解字符串。空白符表示所有的空格、制表符或者换行符。

我们已经了解到,可以使用+操作符把字符串联接起来,只不过这称为拼接。联接字符串还有一种方法,使用join()函数。你要指出你希望把哪些字符串联接起来,另外希望在联接的各部分之间插入什么字符(如果有的话)。换句话说,join()前面的字符串可以用做粘合剂,把其他字符串联接在一起。

startswith()方法可以指出一个字符串是否以某个字符或者某几个字符开头。

前面我们已经使用了in来检查某个元素是否在列表中,关键字in也同样适用于字符串。实际上字符串就是一个字符列表。

注意使用index之前,我们首先使用in查看Maple是不是在较大的字符串中。这是因为,如果使用了index(),而你查找的内容不在字符串中,就会得到一条错误消息。先用in检查可以杜绝这样的错误。

如果没有告诉strip()要剥除哪一部分,它就会除去所有的空白符。你不需要告诉strip()要删除多少个空格,它会删除字符串末尾所有的空白符。

程序使用的所有变量都是临时的,也就是说,程序一旦停止,这些变量就会丢失。如果想保存某些信息以便以后使用,就必须把它们存储咋可以永久保存的地方,比如说存储在硬盘中。
什么是文件呢?文件是有名字的字节集合。

文件夹和目录表示的是同一样东西,只是名字不同而已,它们是一种组织文件的方法。文件夹或者是目录组织和关联的方式称为文件夹结构或者目录结构。

大多数操作系统都有一个“工作目录”概念,有时候也称为“当前工作目录”,这是文件夹树中你目前所在的目录。

如果你要使用这个文件作为输入(只是查看文件中有什么,而不做任何改变),就是要打开文件完成读。
如果要创建一个全新的文件或者用某个全新的文件替换现有的文件,就是要打开文件完成写。
如果要为一个现有的文件增加内容,就是要打开文件完成追加。
我们在程序中要用文件对象来访问文件。
对于文件,会有一个由操作系统使用的名字,操作系统要用这个名字把文件存储在磁盘上(文件名),另外还有一个由程序使用的名字,程序处理文件时要使用这个名字(文件对象)。一旦打开文件并且创建文件对象,就不再需要文件名了。我们在程序中将使用文件对象来完成所有工作。

要从一个文件读取文本行,可以使用readlines()方法,lines=my_file.readlines()
这会读取整个文件,并创建一个列表,每个文本行作为列表中的一项。
处理完文件时,一定要关闭文件:my_file.close()
如果我们的程序没有将它关闭,那么另一个程序就无法访问这个文件。
readlines()方法会读取文件所有的行,直到文件末尾。如果你想一次只读取一行,可以使用readline()方法。只会读取文件的第一行,如果再在同一个程序中使用readline(),Python会记住目前在什么位置,所以第二次使用时,你会得到文件的第二行。
readline()方法一次只读取一行,所以它不会把结果放入一个列表。每次使用readline()时,都只是得到一个字符串。

如果已经使用了几次readline(),现在希望退回到文件的起始位置,可以使用seek()方法,my_file.seek(0)

文件能够存储任何内容,文本只是其中的一种,程序员把所有去他类型的文件都统称为二进制文件。
二进制文件由于不包含文本,所以这些文件中也没有行,因为根本不存在换行符。大多数情况下,如果要使用二进制文件,就要通过Pygame或者其他一些模块来加载文件。
打开二进制文件:my_music_file=open(‘bg_music.mp3’,’rb’)
要读文件,需要使用‘r’作为文件模式;要写文件,需要使用‘w’作为文件模式,要追加文件,需要使用‘a’作为文件模式。

使用写模式时,如果文件已经存在,文件中所有的内容都会丢失,替换为现在写入的内容。
如果文件不存在,会创建一个同名的新文件,你写的所有内容会被放入这个新文件中。
使用追加模式:
todo_list=open(‘notes.txt’,’a’)
todo_list.write(‘\nSpend allowance’)
todo_list.close()

写文件时,只有使用close()关闭文件,你所做的修改才会真正保存到文件中。
我们还可以使用print来写文件,
my_file=open(“new_file.txt”,’w’)
print>>my_file,”Hello there,neighbor!”
my_file.close()

这里的两个>符号(有时候称为山形符号)告诉print要把他的输出发送到一个文件中而不是屏幕上。这称为重定向(redirecting)输出。
要“腌”某个东西,比如列表,需要使用dump()函数。dump()函数需要一个文件对象,我们已经知道如何建立文件对象:
pickle_file=open(‘my_pickled_list.pkl’,’w’)
这里使用‘w’模式来打开文件完成写,因为我们要在这个文件中存储一些内容,可以选择你想要的任何文件名和扩展名。然后用dump()把列表“倒”在pickle文件中。
pickle.dump(my_list,pickle_file)

完成“还原”的函数是load(),这个函数提供一个文件对象(对应包含“被腌”数据的文件),它会按照原来的格式返回数据。

find_letters()函数会查找某个字母在单词中出现的所有位置,并返回一个包含这些位置的列表。
使用计算机程序生成随机事件是研究概率的一种很好的办法,可以用来完成概率实验,查看需要相当多尝试才能看到的结果。

仿真就是为真实世界中的某个东西创建计算机模型。
Python的日期和事件对象类在单独的datetime模块中定义。datetime模块包括处理日期、事件以及日期或时间之差(delta)的类。
print when.ctime()用来打印字符串版本的日期和时间
datetime对象分日期类和时间类,如果只关心日期,可以使用date类,其中只有年月日。如果只关心时间,可以使用time类,其中只包括小时、分、秒。

要创建一个timedelta,得到两个时间之差,就需要将这两个时间相减。
注意当我们将两个datetime对象相减时,我们得到的不是另一个datetime,而是一个timedelta对象。Python会自动完成这一点。
关于timedelta对象还有一点应该知道,与datetime对象不同(datetime对象包括年、月、日、小时、分和秒(以及微妙)),timedelta对象只有日、秒和微秒。如果想要得到月或者年,必须根据天数计算出来。如果希望得到分或者小时数,必须根据秒来计算。
Python有一个os模块,可以告诉我们这个文件是否存在,这里要使用的方法名为isfile()
Turtle图形是一种编程方法,你要向一个小字符(turtle发出命令[比如forward(前进),left(向左),right(向右),speed(加速)等]来控制它的动作。如果想在Python中使用真正的Logo命令,可以使用PyLogo,利用这个命令,你能够从Python程序使用LOGO命令完成turtle图形编程。还有一个模块叫做RUR-PLE,它使用Python控制一个名为Reeborg的机器人,并在屏幕上移动。这与Logo或Turtle的思想是类似的。利用Vpython(Visual Python的简写)可以很容易地建立3D对象,并且可以用鼠标在一个3D场景中移动。

PyWinAuto这个模块允许你编写的Python程序通过模拟鼠标点击、键入文本等与其他Windows程序交互。
Win32com只面向Windowws用户,win32com允许Python程序与其他Windows程序直接交互。

你可能感兴趣的:(python)