社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

9.9元限时抢|学Python绕不开的入门经典

异步社区 • 5 年前 • 673 次点击  


来源 | 异步 | 文末赠书


本期9.9元限时抢购e读版电子书活动,异步君要隆重推荐一本书。


你也许没读过它,但一定听说过。


这本书被多所大学选为入门教材,是经典蓝皮书系列之一,《Python程序设计(第3版)》 。

点击图片

直达9.9元购买e读版电子书




         

01

   

计算机和程序

学习目标

  • 了解计算系统中硬件和软件各自的作用。

  • 学习计算机科学家研究的领域和他们使用的技术。

  • 了解现代计算机的基本设计。

  • 了解计算机编程语言的形式和功能。

  • 开始使用Python编程语言。

  • 学习混沌模型及其对计算的影响。



   

02

   

通用机器

几乎每个人都用过计算机。也许你玩过计算机游戏,或曾用计算机写文章、在线购物、听音乐,或通过社交媒体与朋友联系。计算机被用于预测天气、设计飞机、制作电影、经营企业、完成金融交易和控制工厂等。
你是否停下来想过,计算机到底是什么?一个设备如何能执行这么多不同的任务?学习计算机和计算机编程就从这些基本问题开始。
现代计算机可以被定义为“在可改变的程序的控制下,存储和操纵信息的机器”。该定义有两个关键要素。第一,计算机是用于操纵信息的设备。这意味着我们可以将信息放入计算机,它可以将信息转换为新的、有用的形式,然后输出或显示信息,让我们解释。
第二,计算机不是唯一能操纵信息的机器。当你用简单的计算器来加一组数字时,就在输入信息(数字),计算器就在处理信息,计算连续的总和,然后显示。另一个简单的例子是油泵。给油箱加油时,油泵利用某些输入:当前每升汽油的价格和来自传感器的信号,读取汽油流入汽车油箱的速率。油泵将这个输入转换为加了多少汽油和应付多少钱的信息。
我们不会将计算器或油泵看作完整的计算机,尽管这些设备的现代版本实际上可能包含嵌入式计算机。它们与计算机不同,它们被构建为执行单个特定任务。这就是定义的第二部分出现的地方:计算机在可改变的程序的控制下运行。这到底是什么意思?
“计算机程序”是一组详细的分步指令,告诉计算机确切地做什么。如果我们改变程序,计算机就会执行不同的动作序列,因而执行不同的任务。正是这种灵活性,让计算机在一个时刻是文字处理器,在下一个时刻是金融顾问,后来又变成一个街机游戏。机器保持不变,但控制机器的程序改变了。
每台计算机只是“执行”(运行)程序的机器。有许多不同种类的计算机。你可能熟悉Macintosh、PC、笔记本计算机、平板计算机和智能手机,但不论实际上还是理论上,都有数千种其他类型的计算机。计算机科学有一个了不起的发现,即认识到所有这些不同的计算机具有相同的力量,通过适当的编程,每台计算机基本上可以做任何其他计算机可以做的事情。在这个意义上说,放在你的办公桌上的PC实际上是一台通用机器。它可以做任何你想要它做的事,只要你能足够详细地描述要完成的任务。现在它是一台强大的机器!

   

03

   
程序的力量
你已经知道了计算的一个要点:“软件”(程序)主宰“硬件”(物理机器)。软件决定计算机可以做什么。没有软件,计算机只是昂贵的镇纸。创建软件的过程称为“编程”,这是本书的主要关注点。
计算机编程是一项具有挑战性的活动。良好的编程既要有全局观,又要注意细节。不是每个人都有天赋成为一流的程序员,正如不是每个人都具备成为专业运动员的技能。然而,几乎任何人都可以学习如何为计算机编程。只要有一点耐心和努力,本书将帮助你成为一名程序员。
学习编程有很多好理由。编程是计算机科学的一个基本组成部分,因此对所有立志成为计算机专业人员的人都很重要。但其他人也可以从编程经验中受益。计算机已经成为我们社会中的常见工具。要理解这个工具的优点和局限性,就需要理解编程。非程序员经常觉得他们是计算机的奴隶。然而,程序员是真正的控制者。如果你希望成为一个更聪明的计算机用户,本书就是为你准备的。
编程也有很多乐趣。这是一项智力活动,让人们通过有用的、有时非常漂亮的创作来表达自己。不管你信不信,许多人确实爱好编写计算机程序。编程也会培养有价值的问题解决技能,特别是将复杂系统分解为一些可理解的子系统及其交互,从而分析复杂系统的能力。
你可能知道,程序员有很大的市场需求。不少文科生已经将一些计算机编程课程作为一种有利可图的职业选择。计算机在当今的商业世界中如此常见,以至于理解计算机和编程的能力可能就会让你在竞争中占据优势,不论你是何种职业。灵感迸发时,你就准备好写出下一个杀手级应用程序了。

   

04

   
什么是计算机科学
你可能会惊讶地得知,计算机科学不是研究计算机的。著名计算机科学家Edsger Dijkstra曾经说过,计算机之于计算机科学,正如望远镜之于天文学。计算机是计算机科学中的重要工具,但它本身不是研究的对象。由于计算机可以执行我们描述的任何过程,所以真正的问题是:“我们可以描述什么过程?”换句话说,计算机科学的根本问题就是“可以计算什么”。计算机科学家利用许多研究技术来回答这个问题。其中三种主要技术是设计、分析和实验。
证明某个问题可以解决的一种方式就是实际设计解决方案。也就是说,我们开发了一个逐步的过程,以实现期望的结果。计算机科学家称之为“算法”。这是一个奇特的词,基本上意味着“菜谱”。算法设计是计算机科学中最重要的方面之一。在本书中,你会看到设计和实现算法的技术。
设计有一个弱点,它只能回答“什么是可计算的”。如果可以设计一个算法,那么问题是可解的。然而,未能找到算法并不意味着问题是不可解的。这可能意味着我只是不够聪明,或者碰巧还没有找到正确的想法。这就是引入分析的原因。
分析是以数学方式检查算法和问题的过程。计算机科学家已经指出,一些看似简单的问题不能通过任何算法解决。另一些问题是“难解的”(intractable)。解决这些问题的算法需要太长时间,或者需要太多存储器,因而没有实际价值。算法分析是计算机科学的重要组成部分,在整本书中,我们将探讨一些基本原则。第13章有不可解决和难解问题的例子。
一些问题太复杂或定义不明确,无法分析。在这种情况下,计算机科学家就依靠实验。他们实际实现一些系统,然后研究结果的行为。即使在进行理论分析时,也经常需要实验来验证和完善分析。对于大多数问题,底线是能否构建一个可靠的工作系统。通常我们需要对系统进行经验性测试,以确定这个底线已经满足。当你开始编写自己的程序时,会有很多机会观察你的解决方案的表现。
我已经从设计、分析和评估算法的角度定义了计算机科学,这当然是该学科的核心。然而,当今计算机科学家参与广泛的活动,所有这些活动都在计算这把大伞之下。一些例子包括移动计算、网络、人机交互、人工智能、计算科学(使用强大的计算机来模拟科学过程)、数据库和数据挖掘、软件工程、网络和多媒体设计、音乐制作、管理信息系统和计算机安全。无论在何处进行计算,计算机科学的技能和知识都有应用。

   

05

   

硬件基础

你不必知道计算机工作的所有细节,也能成为一名成功的程序员,但了解基本原理将有助于掌握让程序运行所需的步骤。这有点像驾驶汽车。了解一点内燃机知识,有助于解释为什么必须做一些事情,如加油、点火、踩油门等。你可以通过记住要做什么来学习驾驶,但拥有更多知识会让整个过程更容易理解。让我们花一点时间来看看计算机的内部构造。

虽然不同计算机在具体细节上会显著不同,但在更高的层面上,所有现代数字计算机是非常相似的。图1.1展示了计算机的功能视图。中央处理单元(CPU)是机器的“大脑”。这是计算机执行所有基本操作的地方。CPU可以执行简单的算术运算,如两个数相加,也可以执行逻辑操作,如测试两个数是否相等。

图1.1 计算机的功能视图

存储器存储程序和数据。CPU只能直接访问存储在“主存储器”(称为RAM,即随机存取存储器)中的信息。主存储器速度快,但它也是易失性存储。也就是说,当电源关闭时,存储器中的信息会丢失。因此,还必须有一些辅助存储器,提供永久的存储。

在现代个人计算机中,主要的辅助存储器通常是内部的硬盘驱动器(HDD)或固态驱动器(SSD)。HDD将信息以磁模式存储在旋转磁盘上,而SSD使用称为闪存的电子电路。大多数计算机还支持可移动介质作为辅助存储器,如USB存储“棒”(也是一种形式的闪存)和DVD数字多功能光盘,后者以光学模式存储信息,由激光读取和写入。

人类通过输入和输出设备与计算机交互。你可能熟悉常见的设备,如键盘、鼠标和显示器(视频屏幕)。来自输入设备的信息由CPU处理,并可以被移动到主存储器或辅助存储器。类似地,需要显示信息时,CPU将它发送到一个或多个输出设备。

那么,你启动最喜欢的游戏或文字处理程序时,会发生什么?构成程序的指令从(更)持久的辅助存储器复制到计算机的主存储器中。一旦指令被加载,CPU就开始执行程序。

技术上,CPU遵循的过程称为“读取—执行循环”。从存储器取得第一条指令,解码以弄清楚它代表什么,并且执行适当的动作。然后,取得并解码和执行下一条指令。循环继续,指令接着指令。这确实是所有的计算机从你打开它直到再次关闭时做的事情:读取指令、解码、执行。这看起来不太令人兴奋,是吗?但计算机能以惊人的速度执行这个简单的指令流,每秒完成数十亿条指令。将足够多的简单指令以正确的方式放在一起,计算机完成了惊人的工作。


   

06

   

编程语言

请记住,程序只是一系列指令,告诉计算机做什么。显然,我们需要用计算机可以理解的语言来提供这些指令。如果可以用我们的母语告诉计算机做什么,就像科幻电影中那样,当然很好。(“计算机,曲速引擎全速到达行星Alphalpha需要多长时间?”)计算机科学家在这个方向上取得了长足的进步。你可能熟悉Siri(Apple)、Google Now(Android)和Cortana(Microsoft)等技术。但是,所有认真使用过这种系统的人都可以证明,设计一个完全理解人类语言的计算机程序仍然是一个未解决的问题。
即使计算机可以理解我们,人类语言也不太适合描述复杂的算法。自然语言充满了模糊和不精确。例如,如果我说“I saw the man in the park with the telescope”,是我拥有望远镜,还是那个人拥有望远镜?谁在公园里?我们大多数时间都相互理解,因为所有人都拥有广泛的共同知识和经验。但即便如此,误解也是很常见的。
计算机科学家已经设计了一些符号,以准确无二义的方式来表示计算,从而绕过了这个问题。这些特殊符号称为编程语言。编程语言中的每个结构都有精确的形式(它的“语法”)和精确的含义(它的“语义”)。编程语言就像一种规则,用于编写计算机将遵循的指令。实际上,程序员通常将他们的程序称为“计算机代码”(computer code),用编程语言来编写算法的过程被称为“编码”(coding)
Python是一种编程语言,它是我们在本书中使用的语言[1]。你可能已经听说过其他一些常用的语言,如C ++、Java、Javascript、Ruby、Perl、Scheme和BASIC。计算机科学家已经开发了成千上万种编程语言,而且语言本身随着时间演变,产生多个、有时非常不同的版本。虽然这些语言在许多细节上不同,但它们都有明确定义的、无二义的语法和语义。
上面提到的所有语言都是高级计算机语言的例子。虽然它们是精确的,但它们的设计目的是让人使用和理解。严格地说,计算机硬件只能理解一种非常低级的语言,称为“机器语言”。
假设我们希望让计算机对两个数求和。CPU实际执行的指令可能是这样的:
将内存位置2001的数加载到CPU中将内存位置2002的数加载到CPU中在CPU中对这两个数求和将结果存储到位置2003
两个数求和似乎有很多工作,不是吗?实际上,它甚至比这更复杂,因为指令和数字以二进制符号表示(即0和1的序列)
在Python这样的高级语言中,两个数求和可以更自然地表达为c = a + b。这让我们更容易理解,但我们需要一些方法,将高级语言翻译成计算机可以执行的机器语言。有两种方法可以做到这一点:高级语言可以被“编译”或“解释”。
“编译器”是一个复杂的计算机程序,它接受另一个以高级语言编写的程序,并将其翻译成以某个计算机的机器语言表达的等效程序。图1.2展示了编译过程的框图。高级程序被称为“源代码”,得到的“机器代码”是计算机可以直接执行的程序。图中的虚线表示机器代码的执行(也称为“运行程序”)

图1.2 编译高级语言

“解释器”是一个程序,它模拟能理解高级语言的计算机。解释器不是将源程序翻译成机器语言的等效程序,而是根据需要一条一条地分析和执行源代码指令。图1.3展示了这个过程。

图1.3 解释高级语言

解释和编译之间的区别在于,编译是一次性翻译。一旦程序被编译,它可以重复运行而不需要编译器或源代码。在解释的情况下,每次程序运行时都需要解释器和源代码。编译的程序往往更快,因为翻译是一次完成的,但是解释语言让它们拥有更灵活的编程环境,因为程序可以交互式开发和运行。

翻译过程突出了高级语言对机器语言的另一个优点:可移植性。计算机的机器语言由特定CPU的设计者创建。每种类型的计算机都有自己的机器语言。笔记本计算机中的Intel i7处理器程序不能直接在智能手机的ARMv8 CPU上运行。不同的是,以高级语言编写的程序可以在许多不同种类的计算机上运行,只要存在合适的编译器或解释器(这只是另一个程序)。因此,我可以在我的笔记本计算机和平板计算机上运行完全相同的Python程序。尽管它们有不同的CPU,但都运行着Python解释器。


   

07

   

Python的“魔法”

在你已了解了所有技术细节后,就可以开始享受Python的乐趣了。最终的目标是让计算机按我们的要求办事。为此,我们将编写控制机器内部计算过程的程序。你已经看到,这个过程中没有魔法,但编程的某些方面让人感觉像魔法。

计算机内部的计算过程就像一些魔法精灵,我们可以利用它们为我们工作。不幸的是,这些精灵只能理解一种非常神秘的语言,而我们不懂。我们需要一个友好的小仙子,能指导这些精灵实现我们的愿望。我们的小仙子是一个Python解释器。我们可以向Python解释器发出指令,并指导下面的精灵来执行我们的需求。我们通过一种特殊的法术和咒语(即Python)与小仙子沟通。开始学习Python的最好方法是将我们的小仙子放出瓶子,尝试一些法术。

对于大多数Python安装,你可以用交互模式启动Python解释器,这称为shell。shell允许你键入Python命令,然后显示执行它们的结果。启动shell的具体细节因不同安装而异。如果你使用来自www.python.org的PC或Mac的标准Python发行版,应该有一个名为IDLE的应用程序,它提供了Python shell,正如我们稍后会看到,它还可以帮助你创建和编辑自己的Python程序。本书的支持网站提供了在各种平台上安装和使用Python的信息。

当你第一次启动IDLE(或另一个Python shell),应该看到如下信息:

1Python 3.4.3 (v3.4.3:9b73f1c3e601Feb 24 2015, 22:43:06)[MSC v.1600 32 bit (Intel)] on win32
2Type "copyright", "creditsor "license()" for  more information.>>>

确切的启动消息取决于你正在运行的Python版本和你正在使用的系统。重要的部分是最后一行。>>>是一个Python提示符,表示我们的小仙子(Python解释器)正在等待我们给它一个命令。在编程语言中,一个完整的命令称为语句。

下面是与Python shell交互的例子:
1>>> print("Hello, World!")Hello, World!>>> print(2 + 3)5>>> print("2 + 3 =", 2 + 3)2 + 3 = 5

这里,我尝试了三个使用Python的print语句的例子。第一个print语句要求Python显示文本短语Hello, World!。Python在下一行做出响应,打印出该短语。第二个print语句要求Python打印2与3之和。第三个print结合了这两个想法。Python打印出引号中的部分“2 + 3 =”,然后是2 + 3的结果,即5。

这种shell交互是在Python中尝试新东西的好方法。交互式会话的片段散布在本书中。如果你在示例中看到Python提示符>>>,这就告诉你正在展示交互式会话。启动自己的Python shell并尝试这些例子,是一个好主意。

通常,我们希望超越单行的代码片段,并执行整个语句序列。Python允许我们将一系列语句放在一起,创建一个全新的命令或函数。下面的例子创建了一个名为hello的新函数:

1>>def hello():
2        print("Hello")
3        print("Computers are fun!")>>>
4

第一行告诉Python,我们正在定义一个新函数,命名为hello。接下来两行缩进,表明它们是hello函数的一部分。(注意:有些shell会在缩进行的开头打印省略号[“...”])。最后的空白行(通过按两次键获得)让Python知道定义已完成,并且shell用另一个提示符进行响应。注意,键入定义并不会导致Python打印任何东西。我们告诉Python,当hello函数用作命令时应该发生什么,但实际上并没有要求Python执行它。

键入函数名称并跟上括号,函数就被调用了。下面是使用hello命令时发生的事情:

1>>> hello()HelloComputers are fun!>>>
你看到这完成了什么?hello函数定义中的两个print语句按顺序执行了。

你可能对定义中的括号和hello的使用感到好奇。命令可以有可变部分,称为参数(也称为变元),放在括号中。让我们看一个使用参数、自定义问候语的例子。先是定义:




    
1>>def greet(person):
2        print("Hello", person)
3        print("How are
4

现在我们可以使用定制的问候。

1>>> greet("John")Hello JohnHow are you?>>> greet("Emily")Hello EmilyHow are you?>>>
你能看到这里发生了什么吗?使用greet时,我们可以发送不同的名称,从而自定义结果。你可能也注意到,这看起来类似于之前的print语句。在Python中,print是一个内置函数的例子。当我们调用print函数时,括号中的参数告诉函数要打印什么。

我们将在后面详细讨论参数。目前重要的是要记住,执行一个函数时,括号必须包含在函数名之后。即使没有给出参数也是如此。例如,你可以使用print而不使用任何参数,创建一个空白的输出行。

1>>> print()>>>

但是如果你只键入函数的名称,省略括号,函数将不会真正执行。相反,交互式Python会话将显示一些输出,表明名称所引用的函数,如下面的交互所示:

1>>> greet
2<function greet at 0x8393aec>>>> printfunction print>
有趣的文本0x8393aec是在计算机存储器中的位置(地址),其中恰好存储了greet函数的定义。如果你在自己的计算机上尝试,几乎肯定会看到不同的地址。

将函数交互式地输入到Python shell中,像我们的hello和greet示例那样,这存在一个问题:当我们退出shell时,定义会丢失。如果我们下次希望再次使用它们,必须重新键入。程序的创建通常是将定义写入独立的文件,称为“模块”或“脚本”。此文件保存在辅助存储器中,所以可以反复使用。

模块文件只是一个文本文件,你可以用任何应用程序来编辑文本,例如记事本或文字处理程序,只要将程序保存为“纯文本”文件即可。有一种特殊类型的应用称为集成开发环境(IDE),它们简化了这个过程。IDE专门设计用于帮助程序员编写程序,包括自动缩进、颜色高亮显示和交互式开发等功能。IDLE是一个很好的例子。到目前为止,我们只将IDLE作为一个Python shell,但它实际上是一个简单却完整的开发环境[2]

让我们编写并运行一个完整的程序,从而说明模块文件的使用。我们的程序将探索一个被称为混沌(chaos)的数学概念。要将此程序键入IDLE,应选择File/New File菜单选项。这将打开一个空白(非shell)窗口,你可以在其中键入程序。下面是程序的Python代码:

1# File: chaos.py# A simple program illustrating chaotic behavior.def main():
2    print("This program illustrates a chaotic function")
3    x = eval(input("Enter a number between 0 and 1: "))
4    for i in range(10):
5        x = 3.9 * x * (1 - x)
6        print(x)
7main()
键入它之后,从菜单中选择File/Save,并保存为chaos.py。扩展名.py表示这是一个Python模块。在保存程序时要小心。有时IDLE默认会在系统范围的Python文件夹中启动。要确保导航到你保存自己文件的文件夹。我建议将所有Python程序放在一个专用的文件夹中,放在你自己的个人文档目录中。

此时,你可能正试图理解刚刚输入的内容。你可以看到,这个特定的例子包含了几行代码,定义了一个新函数main。(程序通常放在一个名为main的函数中。)文件的最后一行是调用此函数的命令。如果你不明白main实际上做了什么,也不要担心,我们将在下一节中讨论它。这里的要点在于,一旦我们将一个程序保存在这样的模块文件中,就可以随时运行它。

我们的程序能以许多不同的方式运行,这取决于你使用的实际操作系统和编程环境。如果你使用的是窗口系统,则可以通过单击(或双击)模块文件的图标来运行Python程序。在命令行情况下,可以键入像python chaos.py这样的命令。使用IDLE时,只需从模块窗口菜单中选择Run/Run Module即可运行程序。按下键是该操作的方便快捷方式。

IDLE运行程序时,控制将切换到shell窗口。下面是看起来的样子:

1>>> ======================= RESTART =======================>>>This program 
2illustrates a chaotic functionEnter a number between 0 and 1
3.250.731250.766441406250.69813501043853750.82189581879023040.57089401919693170.95539874836420990.1661867219544130.54041791206179260.96862893029980420.11850901017563877>>>
4

第一行是来自IDLE的通知,表明shell已重新启动。IDLE在每次运行程序时都会这样做,这样程序就运行在一个干净的环境中。Python然后从上至下逐行运行该模块。这就像我们在交互式Python提示符下逐行键入它们一样。模块中的def会导致Python创建main函数。这个模块的最后一行导致Python调用main函数,从而运行我们的程序。正在运行的程序要求用户输入一个介于0和1之间的数字(在这个例子中,我键入“.25”),然后打印出10个数字的序列。
如果浏览计算机上的文件,你可能会注意到,Python有时会在存储模块文件的文件夹中创建另一个名为pycache的文件夹。这里是Python存储伴随文件的地方,伴随文件的扩展名为.pyc。在本例中,Python可能会创建另一个名为chaos.pyc的文件。这是Python解释器使用的中间文件。从技术上讲,Python采用混合编译/解释的过程。模块文件中的Python源代码被编译为较原始的指令,称为字节代码。然后解释这个字节代码(.pyc)。如果有.pyc文件可用,则第二次运行模块就会更快。但是,如果要节省磁盘空间,你可以删除字节代码文件。Python会根据需要自动重新创建它们。
在IDLE下运行模块,会将程序加载到shell窗口中。你可以要求Python执行main命令,从而再次运行该程序。只需在shell提示符下键入命令。继续我们的例子,下面是我们重新运行程序时它的样子,以“.26”作为输入:
1>>> main()This program illustrates a chaotic functionEnter a number between 0 and 1: .260.750360.730547494560.7677066257330.69549933390.8259420407340.5606709657210.9606442322820.1474468759350.4902545493760.974629602149>>>



   

08

   

Python程序内部

chaos程序的输出可能看起来不太令人兴奋,但它说明了物理学家和数学家已知的一个非常有趣的现象。让我们逐行来看这个程序,看看它做了什么。不要担心不能马上理解每个细节,我们将在下一章重新探讨所有这些想法。

程序的前两行以#字符开头:

1# File: chaos.py# A simple program illustrating chaotic behavior.
这些行称为“注释”。它们是为程序的人类读者编写的,会被Python忽略。Python解释器总是跳过从井号(#)到行末之间的所有文本。
程序的下一行开始定义一个名为main的函数:
1def main():

严格地说,不需要创建main函数。因为模块的代码行在加载时会被执行,所以我们可以在没有这个定义的情况下编写我们的程序。也就是说,模块可能看起来像下面这样:

1# File: chaos.py# A simple program illustrating chaotic behavior.print("This program illustrates a chaotic function")
2x = eval(input("Enter a number between 0 and 1: "))for i in range(10):
3    x = 3.9 * x * (1 - x)
4    print(x)

这个版本更短一些,但惯例是将包含程序的指令放在main函数内部。上面展示了这种方法的一个直接好处:它允许我们通过调用main()来运行程序。我们不必重新启动Python shell就能再次运行它,这在没有main的情况下是不行的。

main内部的第一行是程序真正的开始。
1print("This program illustrates a chaotic function")

这行导致Python打印一个消息,在程序运行时介绍它自己。

看看程序的下一行:




    
1x = eval(input("Enter a number between 0 and 1: "))
里的x是变量的示例。变量为值提供了一个名称,以便我们在程序的其他位置引用它。
整行是一个语句,从用户那里获得一些输入。这一行内容有点多,我们将在下一章讨论它的细节。现在,你只需要知道它完成了什么。当Python遇到该语句时,它显示引号内的消息“Enter a number between 0 and 1:”并暂停,等待用户在键盘上键入内容,然后按键。随后用户键入的值保存为变量x。在上面显示的第一个例子中,用户输入了“.25”,它成为x的值。
下一个语句是循环的示例。
1for i in range(10):

循环是一种策略,它告诉Python重复做同样的事情。这个特定的循环说要做某事10次。在循环头下缩进的几行,是要执行10次的语句。它们构成了循环体。

1x = 3.9 * x * (1 - x)print(x)
循环的效果完全一样,就像我们将循环体写了10次:
 1x = 3.9 * x * (1 - x)print(x)
2x = 3.9 * x * (1 - x)print(x)
3x = 3.9 * x * (1 - x)print(x)
4x = 3.9 * x * (1 - x)print(x)
5x = 3.9 * x * (1 - x)print(x)
6x  = 3.9 * x * (1 - x)print(x)
7x = 3.9 * x * (1 - x)print(x)
8x = 3.9 * x * (1 - x)print(x)
9x = 3.9 * x * (1 - x)print(x)
10x = 3.9 * x * (1 - x)print(x)
显然,使用循环为程序员省却了很多麻烦。
但是这些语句究竟做了什么?第一句执行了计算:
1x = 3.9 * x * (1 - x)
这被称为“赋值”语句。“=”右侧的部分是一个数学表达式。Python使用“*”字符表示乘法。回想一下,x的值是0.25(来自上面的input)。计算的值为3.9(0.25)(1 – 0.25),即0.73125。一旦计算出右侧的值,它就被保存为(或赋值给)出现在“=”左侧的变量,在这个例子中是x。x的新值(0.73125)替换了旧值(0.25)

循环体中的第二行是我们之前遇到的一种语句类型,即print语句。

1print(x)
Python执行此语句时,屏幕上将显示x的当前值。所以第一个输出的数是0.73125。

记住,循环要执行10次。打印x的值后,循环的两个语句再次执行。

1x = 3.9 * x * (1 - x)print(x)
当然,现在x的值为0.73125,所以公式计算新的x值为3.9(0.73125)(1 – 0.73125),它是0.76644140625。

你能看到每次循环时如何用x的当前值来计算一个新值吗?这是示例运行中数字的来源。你可以针对一个不同的输入值(例如0.5)尝试执行程序的步骤,然后用Python运行该程序,看看你模拟计算机的情况。


   

09

   

混沌与计算机

我在前面说过,chaos程序展示了一个有趣的现象。满屏幕的数字哪里有趣?如果你自己尝试这个程序会发现,无论从什么数字开始,结果总是相似的:程序吐出10个似乎随机的数字,在0和1之间。随着程序运行,x的值似乎跳来跳去,好吧,像混沌一样。

由该程序计算的函数具有一般形式k(x)(1–x),k在这个例子中是3.9。这被称为逻辑函数。它模拟某些类型的不稳定电子电路,并且有时也在限制条件下模拟群体变化。重复应用逻辑函数可以产生混沌。虽然我们的程序有一个明确的底层行为,但输出似乎不可预测。

混沌函数有一个有趣的属性,即随着公式被重复应用,初始值的非常小的差异可以导致结果的巨大差异。你可以在chaos程序中看到这一点,只需输入稍微不同的数字。以下是修改后的程序的输出,显示了初始值为0.25和0.26的结果:

 1input    0.25      0.26---------------------------
2       0.731250  0.750360
3       0.766441  0.730547
4       0.698135  0.767707
5       0.821896  0.695499
6       0.570894  0.825942
7       0.955399  0.560671
8       0.166187  0.960644
9       0.540418  0.147447
10       0.968629  0.490255
11       0.118509  0.974630
使用非常相似的起始值,输出在几个迭代中保持相似,然后就显著不同了。大约到第五次迭代,两个模型之间就似乎没有任何关系了。
我们的chaos程序的这两个特征,即显然不可预测性和对初始值的极端敏感性,是混沌行为的标志。混沌对计算机科学有重要的影响。事实证明,在现实世界中,我们可能希望用计算机建模和预测的许多现象就是这种混沌行为。你可能听说过所谓的蝴蝶效应。用于模拟和预测天气模式的计算机模型是如此敏感,以至于一只蝴蝶在新泽西拍打翅膀,可能会影响伊利诺州皮奥里亚(Peoria)是否下雨的预测。
很可能即使有完美的计算机建模,我们也永远不能准确地测量已有的天气条件,从而提前几天预测天气。测量就是不够精确,不能让预测在较长时间内准确。
如你所见,这个小程序给计算机用户上了有价值的一课。尽管计算机如此神奇,但它们给出的结果只是与程序所基于的数学模型一样有用。计算机可能由于程序错误而给出不正确的结果,但如果模型错误或初始输入不够精确,即使正确的程序也可能产生错误的结果。


   

10

   

小     结

本章介绍了计算机、计算机科学和编程。下面是一些关键概念的小结。

  • 计算机是一种通用的信息处理机器。它能执行可以充分详细描述的任何过程。用于解决特定问题的步骤序列的描述称为算法。算法可以变成软件(程序),确定硬件(物理机)能做什么和做了什么。创建软件的过程称为编程。
  • 计算机科学研究什么可以计算。计算机科学家使用设计、分析和实验技术。计算机科学是更广泛的计算领域的基础,其中包括的领域如网络、数据库和信息管理系统等。
  • 计算机系统的基本功能视图包括中央处理单元(CPU)、主存储器、辅助存储器以及输入和输出设备。CPU是计算机的大脑,执行简单算术和逻辑运算。CPU操作的信息(数据和程序)存储在主存储器(RAM)中。更多的永久信息存储在辅助存储设备上,如磁盘、闪存和光学设备。信息通过输入设备进入计算机,而输出设备显示结果。
  • 程序使用形式表示法来编写,这称为编程语言。有许多不同的语言,但都具有精确的语法(形式)和语义(意义)的属性。计算机硬件只能理解一种非常低级的语言,称为机器语言。程序通常使用面向人类的高级语言(如Python)编写。高级语言必须被编译或解释,以便计算机能够理解它。高级语言比机器语言更容易移植。
  • Python是一种解释型语言。了解Python的一个好方法是使用交互式shell进行实验。标准Python发布版包括一个名为IDLE的程序,它提供了一个shell以及编辑Python程序的工具。
  • Python程序是一个命令序列(称为语句),供Python解释器执行。Python包括了一些语句来完成工作,如打印输出到屏幕、从用户获取输入、计算数学表达式的值以及多次执行一系列语句(循环)。
  • 如果输入中的非常小的变化导致结果的大变化,让它们看起来是随机的或不可预测的,则该数学模型被称为混沌。许多现实世界现象的模型表现出混沌行为,这让计算的力量受到一些限制。


  Python程序设计(第3版) 

作者:【美】John Zelle(策勒)
译者: 王海鹏


推荐理由:

  • 广泛使用计算机图形学——本书提供一个简单的图形软件包graphics.py作为示例; 
  • 生动有趣的例子——本书包含了完整的编程示例来解决实际问题; 
  • 亲切自然的行文——以自然的叙事风格介绍了重要的计算机科学概念 。
本书是面向大学计算机科学专业第一门程的教材。本书以Python语言为工具,采用相当传统的方法,强调解决问题、设计和编程是计算机科学的核心技能。全书共13章,包含两个附录。第1章到第5章介绍计算机与程序、编写简单程序、数字计算、对象和图形、字符串处理等基础知识。第6章到第8章介绍函数、判断结构、循环结构和布尔值等话题。第9章到第13章着重介绍一些较为高级的程序设计方法,包括模拟与设计、类、数据集合、面向对象设计、算法设计与递归等。附录部分给出了Python快速参考和术语表。每一章的末尾配有丰富的练习,包括复习问题、讨论和编程联系等多种形式,帮助读者巩固该章的知识和技能。




END -



 


🎤


分享时刻


你对哪本书感兴趣?为什么?

截止9月25日,留言+转发朋友圈

抽取2名读者




点击阅读原文,直接购书


点个好看增加中奖概率👇

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43145
 
673 次点击