登陆注册
24662100000095

第95章 Python交互式编程入门

www.codesculptor.org

1以游戏的思路来理解编程,就是一系列的规则,能够形成封装的函数,实现一定的输入和输出构建对应关系。实际上,游戏就是这个复杂的函数,能够针对玩家的输入有一定的输出(如得分,游戏结束等等)。幸运的是,我们不必从头做起,我们可以利用前人写的各种工具库来快速实现。

2项目思维,将复杂的目标分解为一个个小的模块,乃至函数(以文件的形式)。于是可以最后能够开发各种游戏乃至软件。以python面向对象的编程的特点,我们需要定义一个个的类和函数,理论上各种变量就对应于现实的一个属性,只要描述的属性足够多,可以以更高的精度来逼近现实事物。面向对象,基于类和对象,就是属性+方法,属性就是定义的不同变量(描述不同性质),方法就是各种定义的函数。本质上对象是对现实的一种抽象,而对象是实例的一种抽象,实例是对象的具体表达。如我们都住在房子(对象),但具体的位置,大小等等(实例)是不同的。简单的小项目不需要模板,但实现复杂的功能,有模板能够更好地完成工作

3程序需要在一定的运行环境实现其功能。程序本质上都是基于文本符号的交互,更底层的是各种逻辑门的运算,我们通过各种定义如ASCII码来构建符号与二进制数字的关系,于是能够通过文本的输入与计算机进行交互。如今的图形界面的交互也是这样的思路。于是我们能够通过这些措施来实现高于语言的功能,如我们的各种APP。

4表达式的形成就是简单的符号组合(基本的算术运算符有加、减、乘、除、乘方),而运算符号有一定的优先级。然后在这个基础可以形成函数,而变量这些功能就对应于数学的定义域,函数的输出就对应于值域。这些基本的数据类型如整数型int,浮点数型float,字符串型string等等就是这些变量的类型。所谓的强制类型转换就是改变其存储数据的应用范围,如整数转化为浮点数是精度的改变(任何超出15位小数精度的部分都会被丢弃)

5变量命名是重要的(在Python中有效的变量名由字母、数字和下划线组成,变量名必须以字母或下划线开头,变量名是要区分大小写的),一方面这是储存数据的单元(用于存储“值”的占位符),另一方面作为函数的参数需要比较明确的意义以便于人们理解。实际上,把值存入变量可以避免一次又一次的计算同一个表达式,在我们的数学计算是有意义的。变量名要能够帮助理解变量所代表的值的含义。然后变量需要赋值,一般来说初始化是好习惯,然后再更新即放入一定的表达式中运算,最后实现一定的输出。当然,我们需要养成测试的好习惯,即在运行程序前就思考正确的答案应该是什么,从而为代码的修改提供依据(使用print语句)。还有,及时保存程序很重要,时刻记住ctrl+s。

6简单的程序是一行一行输入语句,运行程序后语句立刻执行,这是基本的措施,但很繁琐,我们需要进一步抽象。这就是函数,能够如同变量的值减少重复运算,这种架构其实也是代码,但只有当你调用这个函数,才会执行函数内部的代码。一次性定义一段代码之后可以多次调用它,这无疑大大简化各种计算。将函数的用处清楚地写入注释里,这有助于把一整套函数集成起来。函数头:def函数名(参数):;函数体:具体的语句如计算公式,然后有一定的输出或者return。函数只有被调用时才执行。实际上函数可以被视为黑箱,我们知道其可以针对一定的输入实现一定的输出,这最后能够升维到算法的层次甚至各种功能。

7代码如何运行,结合冯诺依曼计算机体系,我们知道这是存储器的不同区块的数据的选择性提取到CPU计算(以变量为基础,其存储于硬盘的一定地址),然后各种返回值也同样存储于特定的存储器地址中。

8模运算mod,就是被除数剩下的余数,a=b*c+d,amodc=d.可以用于计算12小时制或24小时制的小时,如20:00时再过8个小时是几点的问题,可以用20加8得28,可以取24的余数得4。使用模运算和余数可以来做24小时时钟的小时计算。这是计算周期的一个很重要的方法,如2D游戏对象可以到处移动,当一个物体移动到界面边缘的情况,有时希望它可以环绕屏幕运动,在一侧消失然后在另一侧冒出来。其位置的数值在这个情况的变化可以使用模运算,新位置值等于原来的位置值加上移动值然后取得屏幕宽度的余数。

如何处理字符串和数字,即数据类型的强制转换,如数值转换为字符串输出,可以使用str函数将数字转换为字符串,从而能够使用不同的运算(数字的+是计算,字符串的+是连接字符串)

调用Python的一些内置函数是设置好的,Python以外的函数集即模块,是其他人建立好并添加到Python中的,要想调用这些函数需要将其导入如importsimplegui。

9计算机的本质是逻辑运算。任何复杂的程序可以分解为基本的布尔逻辑包括非(NOT)、与(AND)和或(OR)。这些基本的逻辑门的不断组合嵌套能够形成复杂的函数。

10程序的控制流程,从基础的顺序执行到顺序分支循环语句的结合(可以根据程序中的值来改变控制流程),再到各种复杂的叠套结构。在Python中根据数据来改变控制流程的方式是使用if语句,可以有多个条件通过与或非连接起来。使用任意的布尔逻辑和断言的能力允许行事强大而灵活。在查验一个函数的断言时函数名要以is开头。

11测试和调试debug。得到一个错误信息,要去理解它并解决问题,这需要学习一些检测的技巧。如当我们写错函数名或变量名就会得到一条名称错误信息,因为它们没有被定义。拼错了在句号之后的部分都会得到一个属性错误。每一个函数头,“if“和“else“都以冒号结尾。注意全局变量和局部变量的区别。

编码风格和可读性:良好的命名(变量有意义)并确保命名一致,将相关信息放进文档字符串,清晰的注释。用多种途径简化条件和其他内容,产生更容易理解的代码。在定义之间加空行,在表达式之间加入空格,更具可读性。

12程序的控制流程取决于程序结构以及具体输入,这是面向过程的方法。而由事件驱动的编程模型,可用来构建交互式应用。不同的程序块等待不同的输入作为响应条件,然后运行处理程序的函数,处理程序运行完成后函数块继续等待。于是这些函数的处理的组合数是指数级爆炸增长的,从而可以灵活地处理各种情况。这和顺序分支循环语句的组合思想是一致的。最后用某种事件来触发程序的退出,即停机。

13事件有很多种,它们取决于你运行系统的类型和你的兴趣所在:输入事件(按钮或文本框输入),键盘事件(按键按下事件或按键抬起事件),鼠标事件(点击事件或拖动事件)和计时器事件(周期性触发)。对于一个事件,要写个处理程序,但不会给所有同一事件都写同一个处理程序。系统的大部分时间都在等待事件发生。有一个计时器事件的周期性触发,避免等待用户的动作。我们使用计时器来触发,然后我们再设计触发的操作。

事件队列:事件一发生系统就会把它们放到队列里。程序在等待时,系统会查看事件队列,然后运行直到事件队列是空为止。写出的程序应该能响应事件做出相应的操作,不管它们发生的顺序如何。处理程序正在运行时是独占的,如果有新事件,它们仅仅被排进内部的事件队列(而不触发相应的处理程序),因而如果有个死循环在里面,就阻断了所有其他事件的处理。

14编程模型:先编写处理函数--注册这些函数--响应事件并被执行--程序结束。当系统在运行时,程序大多数时间都在等待,当事件发生时,它首先被放进事件队列中,然后系统从事件队列中依次抽取一个,并运行相应的处理程序。程序员不能决定函数什么时候被调用和发送,而是事件发生时系统调用处理函数。我们只知道如果事件发生,特定的处理函数就会运行。这是图形用户界面编写的底层思维,即事件驱动编程,事件处理程序对事件作出回应。

15在事件驱动的程序里,不同的处理程序需要共用一组信息来令交互式程序得以运行:让所有处理函数一起工作,即让它们共享一组全局变量。

全局变量(在函数外部定义变量,在函数内部修改全局变量是不可能的,除非声明该变量是全局变量global;使用全局变量实现各种处理函数之间的数据通讯是最简便的方法,也可以隐藏信息,控制信息可见度)和局部变量(在函数内部创建的变量,只能在该函数内部修改和使用,函数调用结束之后局部变量也就不复存在了。应该优先使用局部变量)

16SimpleGUI程序结构:1定义全局变量,这基本上是程序的状态;2定义程序所需的任意辅助函数,用来帮助事件处理函数完成特定的任务;3定义程序需要用到的类;4定义事件处理函数,可以使用你在程序中定义的全局变量,辅助函数和定义好的类;5创建Frame;6注册所有我们需要的事件处理函数7启动Frame和程序中的定时器。

17交互式应用程序(如同类的定义,需要有基本的属性(存储数据的变量)和操作):首先需要搭建一定的框架,然后确定相应的控制区(创建按钮,输入框等等),迭代式开发,不断添加需要的功能,最后形成有一定功能的整体。

18计算机是如何工作的以及它们是如何组织绘图过程的:显示器根据电脑所作的显示某种视觉输出,分辨率对应到二维的像素网格,按逻辑存储在帧缓存的地方(跟踪你在屏幕上看到的像素的值的数据结构);电脑是如何实际地让这些东西移动:它快速地把帧缓存扫一遍并且重新绘制其内容。刷新率表示了计算机把帧缓存的内容显示在实际屏幕上的频率。每个应用或屏幕要给自己注册一个绘画处理程序的特殊函数。

字符串处理,大多数情况下都是将字符串打印输出到控制台。计算机科学从零开始计数。可以写复杂的条件语句以构造适合的程序的字符串

同类推荐
  • 游戏神厨

    游戏神厨

    我去,这游戏还能不能玩了,为什么是个厨子?
  • 斗战圣皇

    斗战圣皇

    “别人都称尊道祖的,为什么你独爱自诩帝皇!”“天上地下,举世万灵,一言而出莫敢不从!眉目一怒,万灵颤抖,伏尸千里,诸天万界,唯帝皇也,独此一人!如此风姿,与我匹配!”“可传闻你是觉得帝王标配三宫六院,所以你才自诩帝皇。”“污蔑,这是污蔑,谁说的,本皇分分钟砍死他!”“你别这样激动,好奇问下,为什么当初你唯独对我另眼相看?”“从看到你未婚妻第一眼起,我就决定和你做朋友!”
  • 修真聊天

    修真聊天

    独家首发!敬请期待!一个混混穿越的奇妙生活!玉女,萝莉,御姐!等等绝世没妞!
  • 吞天魔神

    吞天魔神

    一个被家族抛弃的小孩在无尽之森醒来,神识被封印,忘记了自己是谁。一个意外神识的封印被打破,回忆起了自己的来历,他决定重回家族,要查清为什么自己会被抛弃。在重返家族的途中,他结识了很多朋友,当然还包括自己的爱人。时间流逝,他的境界越来越高,他的朋友却一个个离开人世,自己的爱人都变成了一具冰冷的,没有意识的躯体,自己的家族也被灭。他开始意识到了什么,好像自己被一双手控制着,和自己亲近的人没有一个好下场,而且自己也不断的被追杀。最后他发现这一切原来是天界众神在操控,他满腔怒火舍身成魔,打破了天界,重掌了轮回。可是这并不是结束,真正的幕后黑手才刚刚露出诡异的笑脸。
  • 神帝之位

    神帝之位

    一个诞生在四大家族被误认为废物的人,却在机缘巧合下被证实天才之资,面对妖魔的进攻、外族的入侵、爱人的背叛、盟友的反戈,看他如何度过这一切,最后登上神帝之位......
热门推荐
  • 逆世傲妃好生妖艳

    逆世傲妃好生妖艳

    什么?她只不过是穿越了一回,一夜误闯,美男出浴。为什么却要她的命运,与一个腹黑无耻的男人此生紧紧拴在一起了?!碧落泉水里,他一把紧紧抓住她的肩膀,邪魅笑道:“放开你也可以,我有个条件。”她淡然问道:“我听听你的条件是什么?”谁知这腹黑男轻笑道:“但说无妨,条件是你亲我一下。”“……”她一瞬被这绝美男人给劈得外焦里嫩了。你若想拥江山,我便辅佐你为一人之上万人之下的帝皇。你若想拥无拘无束的生活,我便放弃皇位,与你畅饮甘酒,万世婵娟。透支千年泪,祭奠你的美,谁的笑藏尽泪光,谁的妖娆舞遍江山,谁的伤痕在歌唱?
  • 诸天剑皇

    诸天剑皇

    陆阳带着遗憾,重生回到少年时代的第五纪年九十五载。‘才能’早已经被夺走,宗族岌岌可危,“最璀璨的一代”妖孽们即将出世,长生神藏的钥匙还在某个地方沉睡,界域战争的阴影正悄然浮出水面……三千小世界、八百上域、九天大世界,震动诸天的号角已经响起。长生不朽、立于诸天之巅——“拔剑吧!”
  • 男人一生要做的50件事

    男人一生要做的50件事

    如果你现在还没有生活的目标,还不确定自己的责任所在,那就拿出纸写下你的梦想和计划,为自己的人生列出一份清单,然后照着这份清单去努力地实现自己的梦想、完成自己设定的计划。
  • 大道天衍

    大道天衍

    大道五十,天衍四九!先天九重天高手林阳,为了抢夺一件至宝而陨落,重生之后却获得了来自神秘地球的传承。降龙十八掌、龙爪手,来自地球的神秘功法,让我从新踏入大道!
  • 红包乱三界

    红包乱三界

    微信红包风靡人间,又盛行阴间,阎王、鬼差玩忽职守,地府内忧外患,阳间亡灵作恶,阴间群鬼造反……天庭也来凑热闹,玉帝打造天庭、地府朋友圈,与神鬼一同抢红包,各种阴间鬼物,天庭神器被外泄人间,引发三界大乱……
  • 玉楼传奇

    玉楼传奇

    玉楼、陆天兰一代英豪,纠集众豪杰抗击外辱,保卫山河!
  • 九龙帝皇

    九龙帝皇

    龙生九子,各不相同。体宿天龙真魄,习九龙吞天决,成就无上至尊。
  • 海外寻奇(文心藏趣丛书)

    海外寻奇(文心藏趣丛书)

    本书记述了作者收藏的经历,包括“贵人童先生和天球瓶”、“在纽约找个古董店”、“一个祭蓝碗引出一段收藏故事”、“走进佳士得”等文章。
  • 微青春

    微青春

    一些小事,有些伤感,有些疼痛,有些叛逆,有些幸福。
  • 冷妃邪王:零落墨怀

    冷妃邪王:零落墨怀

    含蓄版:偌大的天地,却造就了一颗冰冷的心,当这颗心划破前尘种种,迎来新的生命,她,只为自己而活,定要逆改天命,可代号下的冰寒被谁融成绕指柔,她的一丝温暖由谁给予。强者的路上,他孤寂冷傲,无一人敢近身,笑里藏刀,绵中埋针,前一秒笑意盈盈,下一刻杀人无形,他的心何时落下,他的眼又为谁驻留。世界巅峰,仗剑执手,同闯天涯,此生不负!影子脑抽版:俗话说萝莉有三好,音娇体软易推倒!喂喂,谁来告诉偶们芝兰玉树绝世无双的楠竹,次奥!这丫头什么时候能被推倒哇!咳咳,其实这就是一个调教与反调教,推倒与反推倒的纯洁的故事~~不信!来看看影子这纯洁的双眼!