教孩子学编程(Python语言版)

978-7-115-41634-6
作者: 【美】Bryson Payne
译者: 李军
编辑: 陈冀康

图书目录:

详情

本书旨在为家长和老师提供一个叫孩子学会编程和用Python语言解决问题的的指南,书中还包括一些非常典型且实用的案例,来促进学习效果。通过一步步的指导,让学生了解计算机思维,并能够掌握变量、循环、函数等基础概念,以此来提升孩子的动脑动手能力。无论是有一定编程经验的人,还是零基础的读者,你都将成为孩子在计算机编程方面最棒的第一任老师。

图书摘要

版权信息

书名:教孩子学编程(Python语言版)

ISBN:978-7-115-41634-6

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。


• 著 [美]Bryson Payne

 译   李 军

 责任编辑 陈冀康

 责任印制 张佳莹 焦志炜

• 人民邮电出版社出版发行   北京市丰台区成寿寺路11号

 邮编 100164    电子邮件 315@ptpress.com.cn

 网址 http://www.ptptress.com.cn

 北京缤索印刷有限公司印刷

• 开本:720×960 1/16

 印张:16.75

 字数:302千字   2016年3月第1版

 印数:1 – 3 500册   2016年3月北京第1次印刷

 著作权合同登记号  图字:01-2015-7472号    

 定价:59.00元

 读者服务热线:(010)81055339   印装质量热线:(010)81055316

 反盗版热线:(010)81055315


Bryson Payne博士是北乔治亚大学计算机科学系的一位终身教授。他在 大学负责教授有志成为程序员的学生长达15年的时间。他的学生在Blizzard Entertainment、Riot Games、Equifax、CareerBuilder等众多公司,都开启了成 功的职业生涯。他是北乔治亚大学的计算机科学的首任系主任,并且他从乔 治亚州立大学获得了计算机科学博士学位。此外,他持续与K-12学校合作, 以推动科技教育工作。

Payne博士从事编程工作长达30多年。他销售的第一个程序在1985 年 RUN杂志(Commodore 64)的“Magic”专栏上,售价为10 美元。

Payne 和妻子Bev,以及两个儿子Alex和Max,居住在乔治亚州的亚特兰大。

Miran Lipovac是Learn You a Haskell for Great Good !一书的作者。他喜 欢拳击、演奏低音吉他,当然,还喜欢画画。他痴迷于骷髅舞和数字71。当 经过自动门的时候,他总是假装实际上是用自己的意念打开了门。

Ari Lacenski是一位Android应用程序和Python软件开发者。她居住在旧 金山。她在http://gradlewhy.ghost.io/撰写的有关Android编程的文章,担任 Women Who Code的导师,并且用吉他演奏关于太空海盗的歌曲。

本书特色

本书属于No Starch的经典系列之一,同时“教孩子学习”这一思路非常值得推广。

美国劳工统计局预计,在未来的5年内,大约会创造800万个技术职位。在2014–2015 Occupational Outlook Handbook中,70% 增长最快、不需要硕士或博士学位的职业,都分布在计算机科学或信息技术(IT)领域。

Python这门强大的语言在大学和Google、IBM等大型技术公司广泛使用。本书是一本父母和老师教孩子使用Python进行基础程序设计和解决问题的入门书。

本书通过按部就班的说明,帮助孩子快速学习计算机的思维方式,而可视化和游戏为主的例子则持续吸引他们的注意力。对于变量、循环、函数等编程基础概念的介绍,甚至可以帮助最年轻的程序员构建所需的技能,以制作超酷的游戏和应用。


Simplified Chinese-language edition copyright © 2016 by Posts and Telecom Press.

Copyright © 2015 by Bryson Payne. Title of English-language original: Teach Your Kids to Code, ISBN-13: 978-1-59327-614-0, published by No Starch Press.

All right resened.

本书中文简体字版由美国No Starch出版社授权人民邮电出版社出版。未经出版者书面许可,对本书任何部分不得以任何方式复制或抄袭。

版权所有,侵权必究。


Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。这门强大的语言如今在大学和Google、IBM等大型技术公司广泛使用。 

本书是一本父母和老师教孩子使用Python进行基础程序设计和解决问题的入门图书。本书通过科学合理的结构、通俗易懂的文字、活泼有趣的图示,帮助孩子学习计算机的思维方式,而可视化和游戏为主的例子则持续吸引读者的注意力。针对变量、循环、函数等编程基础概念的介绍,可以帮助最年轻的程序员构建所需的技能,以制作自己的超酷的游戏和应用。每章末尾的编程挑战,则可以拓展读者地思维,巩固所学习的知识和技能。 

本书适合任何想要通过Python学习编程的读者,尤其适合父母、老师、学生,以及想要理解计算机编程基础知识的未成年人阅读学习。


本书内容清晰、配图很吸引人,并且App也很惊人。这是父母和孩子一 起学习的编程指南。

——Aaron Walker,NASA网络安全专家

在本书中,作者投入了自己的精力和兴奋,使用彩色的、吸引人的游戏 和图形,帮助读者掌握现实的技能。

——Bindy Auvermann,Next Generation Youth Debelopment公司执行总监

易于学习的5星好书,帮助读者打下坚实的基础以进一步阅读高级编程图书。

——James Floyd Kelly,GeekDad

为一种美妙的、未来会快速改变世界的技术,提供了构建基础。

——JoAnne Taylor,IBM Global Telecommunications前副总裁

本书中的概念能够帮助任何年轻人扩展自己的大学视野和职业机会。

——Dr. Raj Sunderraman,佐治亚州立大学计算机系主任

每个孩子和每一个父母都应该阅读本书。

——James E. Daniel, Jr.,App Studios 公司创始人

富有新意的、激动人心的学习指南。构建的技能令人受益终生。

——Dr. Steven Burrell,佐治亚南方大学信息技术副总裁和CIO

我在孩童时代就想要拥有的那种书。

——Scott Hand,CareerBuilder软件工程师

作者是一位计算机科学家和教授,通过本书,他把计算机的能力以年幼 的读者和较大的读者易于理解的方式进行讲解。

——Dr. Antonio Sanz Montemayor,西班牙Rey Juan Carlos大学信息学教授

引人入胜、富有想象的App和宝贵的终身技能的美妙组合。

——Ted Cunningham,The Power of Home的作者

本书及其引入的逻辑思考帮助构建了下一代的技术领导力。

——N. Dean Meyer,作者和执行教练

本书可以让你的孩子在高科技的世界里赢在起跑线上。

——Ken Coleman,The Ken Coleman Show前电台主持人和领导力作者

作者让我们上路并引领我们走向梦想的职业。本书中,他为父母和教师 提供了机会培育下一代的创新和问题解决者。

——Shah 和Susan Rahman,Riot Games

作者帮助人们提高自己的技术水平。他的书也起到了这样的作用。

——Ash Mady,RedHat 公司技术经理

对于父母和孩子来说,同样有趣和好读。

——Steve McLeod,北佐治亚大学副CIO

本书很直白,你可以很容易地把本书递给小学高年级的学生或更大的孩 子,并让他们自学。比我的树更加适合暑假培训。

——Mel Ford,BlogHer

配图令人印象深刻,游戏很有趣,并且讲解很清晰而有指导性。

——Sandra Henry-Stocker,ITworld


计算机编程是每个孩子都应该学习的一项重要技能。我们使用计算机解决问题,玩游戏,帮助我们更有效地工作,执行重复性的任务,存储和查找信息,创建新的内容,同时与我们的朋友和世界联系。理解如何编写代码,将会把这一切力量付诸于我们的指尖。

每个人都能够学习编程,这就像是求解一个谜题或一个谜语。你可以应用逻辑,尝试一种解决方案,更多地试验一下,然后解决问题。开始学习编程的时机就是现在!我们处在一个前所未有的历史时期,在此之前,人们不可能像我们今天一样,通过计算机每天都和另一个人联系。我们生活在一个充满了很多新的可能性的世界,从电动汽车和机器人保姆,到甚至能快递包裹和比萨饼的无人机。

如果你的孩子今天开始学习编程,他们能够帮助定义这个快速改变的
世界。

学习计算机编程有很多很好的理由,但是,我认为最重要的有以下两点:

技术正在成为日常生活的一部分。每一家公司、慈善组织和事业都能够从技术中获益。还有一些App可以帮助你购买、转赠、加入、玩乐、充当志愿者、联系和分享,甚至做你能够想象到的任何事情。

你的孩子是否想要构建他们自己喜欢的电子游戏的关卡?编程可以做到!创建他们自己的手机应用怎么样?他们可以通过在自己的计算机上编程,把想法带到生活中。他们曾经见过的每一个程序、游戏、系统或者App,都可以使用他们在本书中学习的、相同的编程构建模块来编码。当孩子编程的时候,他们在技术中扮演主角,不仅能享受乐趣,而且会创造乐趣。

编程是21世纪的技能。今天的工作比以往需要更多的问题解决能力,而且越来越多的职业把技术当作不可或缺的一部分。美国劳工统计局预计,在未来的5年内,大约会创造出800万个技术职位。在《2014–2015 Occupational Outlook Handbook》(2014–2015就业前景手册)中,70%的增长最快、不需要硕士或博士学位的职业都分布在计算机科学或信息技术(IT)领域。

本书只是一个开端。还有很多地方可以学习编程,如Code.org、Codecademy(如图1所示)这样的Web站点,还有数不尽的其他站点教授各种从基础到高级编程的必备编程语言知识。一旦你和孩子一起学完这本书,他们就可以自己通过EdX、Udacity和Coursera这样的Web站点进一步拓展他们的
学习。

“编程俱乐部”是一种和朋友们快乐学习的美妙方式。获得相关领域的大学学位,仍然是为职业做好准备的最好方式,但是,现在即便大学也不是唯一的选择,你的孩子今天可以就开始构建一份编程简历并且展示他们作为程序员和问题解决者的技能。

图1 Codecademy教你如何使用各种语言一步一步地编程

本书不只是针对孩子的,它也针对父母、老师、学生以及想要理解计算机编程基础知识的成年人,同时针对那些享受乐趣并想在高科技经济中获取一份新的职业的人。不管多大年龄,你都可以把握学习编程基础的好时机。做到这一点的最好的方式,就是体验并操作。

如果你想要尝试新事物的话,学习编程会令你兴奋。你和你的孩子可以参照本书中的程序,尝试修改代码中的数字和文本,看看程序会发生什么变化。即便把程序搞坏了,还可以通过修改它而学到一些新的东西。最坏的情况下,不过是重新录入书中的示例,或者打开最近保存的能够工作的版本。

学习编程的要点在于,尝试一些新东西,学习一项新技能并且以新的方式解决问题。通过修改一些内容、保存程序、运行程序,看看发生了什么,并且修改错误,从而测试你自己的代码。

例如,我编写了一些代码来进行彩色的绘制(如图2所示),然后返回,在这里或那里修改一些数字并且尝试再次运行程序。这使得我得到了一幅完全不同但令人惊讶的画。我再次返回去,修改另一些数字并且得到另一幅美丽的、独特的图画。尝试玩玩,看看你能做些什么?

图2 通过在一个程序的一行代码中尝试3个不同的值得到3幅彩色的螺旋线图画

尝试代码是学习程序如何工作的一种很好的方式,而且,如果你和其他人一起工作的话,甚至会更加有效。不管你是教一个孩子或学生学习,还是自学,没有什么比和别人一起操作代码更有趣了,这甚至会更有效率。

例如,在音乐教育的Suzuki Method中,父母和孩子一起参加课程,甚至比孩子学习得更快一点儿,以便能够在课程中帮助孩子。尽早开始,是Suzuki Method的另一个特征,孩子在3岁或4岁的时候就可以开始正式
学习。

当我的两个儿子两岁和4岁的时候,我开始教他们编程并且鼓励他们通过修改每个程序的较小的部分来获得乐趣,例如颜色、形状以及形状的
大小。

在13岁的时候,我通过录入图书中的例子,然后再修改它们做一些新的事情,从而学习编程。现在,在我所教授的计算机科学课程中,我常常给学生一个程序并鼓励它们修改代码来构建一些新的东西。

如果你使用本书自学,可以找一个朋友和你一起研究本书中的例子,或者开始参加一个业余或社区编程俱乐部(参见http://coderdojo.com/http://www.codecademy.com/afterschool/),从而可以和其他人一起学。编程也是一项团队运动。

本书中的所有的程序文件都可以通过http://www.nostarch.com/teachkids/获取,包括编程挑战的一些示例解决方案以及其他的信息。下载程序并体验,以便学习更多内容。如果你遇到困难,可以使用示例解决方案,查看它们。

不管你的孩子是两岁还在学习数数,还是22岁了在寻求新的挑战,本书以及它所介绍的概念,都是一项回报丰厚、激励人心的消遣活动,而且能带来更好的职业机会。能够编程并且由此能够快速而有效地解决问题的人,在今天的世界里是宝贝,他们会去做有趣的、有成就感的工作。并非世界上所有的问题都能够用技术来解决,但是,技术能够以以前无法想象的规模和速度来支持交流、协作、了解和行动。如果你能够编程,你就能够解决问题。问题解决者有能力使得世界变得更美好,因此,今天就开始编程吧!


如今,几乎任何东西之中都有一个计算机,例如电话、汽车、手表、电子游戏机、跑步机、贺卡或者机器人。计算机编程或编
码,就是要告诉计算机如何执行一项任务,因此,理解如何编写代码,可以将计算机的能力控制在你的指间。

计算机程序,也叫作应用程序(applications或App),它告诉计算机做什么。Web App可以告诉计算机如何记录你喜欢的音乐;游戏App告诉计算机如何用逼真的图像显示一个古代的战场;一个简单的App可以让计算机绘制出如图1-1所示的类似六边形的、漂亮的螺旋线。

图1-1 彩色的螺旋图形

一些App由数千行代码组成,而另一些App可能只有几行代码的长度,例如,图1-2所示的NiceHexSpiral.py程序。

图1-2 一个简短的Python程序NiceHexSpiral.py绘制出如图1-1所示的螺旋线

这个简短的程序绘制了图1-1所示的彩色螺旋线。我想要使用一幅漂亮的图片作为本书的示例,因此,我决定使用一个计算机程序来解决这个问题。首先,我进行大概的构思,然后开始编写代码。

在本章中,我们将下载、安装并学习使用一些程序,这些程序可以帮助我们编写代码,来构建所能想象出的任何的App。

要开始编写代码,必须讲计算机的语言。计算机需要按部就班的指令,而且它们只能够理解特定的语言。就像俄国人可能不懂英语一样,计算机只能够理解为它们而制定的语言。

计算机代码使用诸如Python、C++、Ruby或JavaScript这样的编程语言来编写。这些语言允许我们和计算机“对话”并且向它们发布命令。不妨想一下我们如何训练一只狗,当我们说“坐下”的时候,它蹲着;当我们说“叫”的时候,它叫两声。这只狗理解了这些简单的命令,但是,你所说的其他的大多数话,它就不懂了。

类似的,计算机也有局限性,但是,它们确实能够执行你用它们的语言发布的指令。本书中,我们将使用Python语言,这是一种简单而强大的编程语言。在高中和大学,Python作为计算机科学课程的入门课来教授,而且,Python用于运行世界上一些最强大的App,包括Gmail、Google Maps和YouTube。

要开始在计算机上使用Python,我们需要经过下面这3个步骤。

(1)下载Python。

(2)在计算机上安装Python。

(3)使用一两个简单的程序测试Python。

Python是免费的,我们可以很容易地从Python的Web站点获取,如图1-3所示。

我们用Web浏览器访问https://www.python.org/,将鼠标指针悬停在上方的Downloads菜单上并且点击以Python 3开头的按钮。

找到已经下载的文件(它可能在Downloads文件夹中)并双击它,我们来运行并安装Python和IDLE编辑器。IDLE是我们用来录入和运行Python程序的一个程序。要了解它的详细安装说明,我们可以参见本书的附录A。

图1-3 从Python Web站点可以很容易地下载Python

我们在Start菜单或Applications文件夹下,找到IDLE程序并运行它。你将会看到如图1-4所示的一个基于文本的命令行窗口。这个命令行窗口叫作Python shell。shell是一个窗口或界面,它允许用户输入命令或者代码行。

 

图1-4 IDLE Python shell—我们学习Python的命令中心

“>>>”叫作提示符,它表示计算机准备好接受你的第一条命令。计算机问你想要让它做什么,例如输入如下代码。

print(“Hello, world!”)

按下键盘上的回车键,你应该会看到Python shell打印出了引号中的文本,这些文本是你输入到圆括号中的,也就是“Hello, world!”。好了,你已经编写完第一个程序了!

通常,你想要编写的程序都多于一行代码,因此,Python带有一个编辑器,用来编写较长的程序。在IDLE中,打开“File”菜单并选择“File->New Window”或“File->New File”,会弹出一个空白的屏幕,其顶部带有一个Untitled标题。

让我们用Python编写一个稍微长一点儿的程序,在这个新的空白窗口中,输入如下3行代码。

# YourName.py
name = input (“What is your name?\n”)
print(“Hi, “, name)

第1行代码叫作注释。注释以一个井号开头(#),它是程序的提示,运行时计算机会忽略它。在这个示例中,注释只是提示我们程序的名称是什么。第2行要求用户输入自己的名字并且将其存储为name。第3行代码打印出“Hi,”,后面跟着用户的名字。注意,这里有一个逗号(,),它将引号中的文字“Hi, ”和name分隔开。

打开程序上方的菜单中的Run选项并且选择Run->Run Module,这将会运行(或执行)程序中的指令。首先会要求你保存程序,让我们将该文件命名为YourName.py,这就会让计算机将该程序保存为一个名为YourName.py的文件,而“.py”部分表示这是一个Python程序。

当保存了文件并运行它的时候,你将会看到Python shell窗口启动程序,显示了“What is your name?”这个问题。在下一行中输入你的名字并按下回车键,程序将会打印出“Hi,”,后面跟着你所输入的名字。因为你要求程序做的就是这些,程序将会结束,而且,你将会再次看到“>>>”提示符,如图1-5所示。

图1-5 计算机知道我的名字

对于年龄较小的初学者,例如,我3岁的儿子,向他们解释这个程序是让他们输入自己的名字,这是一件很有趣的事情。Max知道自己的名字的字母,因此,他在键盘上输入m-a-x,当我告诉他程序对他说Hi, max的时候,他很喜欢这个程序。问一下你身边的小读者,他是否想要让程序说一些不同的话。Max想让它说“Hello,”,因此,我编辑了程序的第3行,让它说Hello而不是Hi。

然后,我将第3行修改为以下格式。

print(“Hello, “, name, name, name, name, name)

当程序用“Hello, max max max max max”回答他的时候,Max很高兴。尝试修改程序的第2行和第3行,让计算机询问不同的问题,并且打印出不同的回答。

学习编写代码就像是学习走迷宫、猜谜语或者玩脑筋急转弯。你从一个问题开始,应用所知道的信息,同时一路获知新的东西。当你完成的时候,你锻炼了大脑并且解决了问题。希望你能够乐在其中。

在本章中,我们解决第一个主要的问题:在计算机上安装了Python编程语言,以便能够开始编写代码。这很容易,我们只需要下载文件,安装文件并运行它。

在后面的各章中,我们将学习如何使用代码解决问题。我们首先从一个简单的可视化的谜题开始,例如在计算机屏幕上(或者平板电脑或手机的屏幕上)绘制形状,然后,搞清楚如何创建诸如猜数字、Rock-Paper-Scissors和Pong这样的简单游戏。

通过在前几个程序中打下的这些基础,我们可以开始继续编写游戏、移动App、Web App以及更多内容。

现在,我们应该:

#1:Mad Libs

简单的YourName.py App具备了构建更为有趣的程序所需的所有内容。(例如,老式的Mad Libs单词游戏,如果你以前没有尝试过这种游戏,请访问http://www.madlibs.com。)

我们来修改YourName.py程序并将其保存为MadLib.py。我们将要求用户输入一个形容词、一个名词以及一个过去式的动词(而不是输入用户的名字)并将其存储到3个不同的变量中,就像我们在最初的程序中对名字所做的那样,然后,打印出诸如“形容词+名词+动词+ over the lazy brown dog”的一个句子。做完这些修改之后,代码如下所示。

MadLib.py

我们可以输入任何想要的形容词、名词和动词。当保存并运行MadLib.py之后,我们应该会看到如下所示的内容(我已经输入了smart、teacher和sneezed)。

#2:More Mad Libs!

让我们把Mad Lib游戏变得更有趣一些。我们打开MadLib.py的一个新的版本并将其保存为MadLib2.py,添加另外的一个输入行,要求输入一种动物。然后,我们从打印的语句中删除单词dog并且在引用的句子的末尾添加这个新的animal变量(在打印的语句之中这个新的变量之前,添加一个逗号)。如果你愿意,可以再次修改句子。最终会得到“The funny chalkboard burped over the lazy brown gecko”,或者其他更为有趣的句子。

在每一章的最后,我们可以通过尝试一些挑战来练习所学的内容,甚至创建一个更酷的程序(如果你遇到困难,请访问http://www.nostarch.com/teachkids/寻找示例解答)。


adjective = input(“Please enter an adjective: “)
noun = input(“Please enter a noun: “)
verb = input(“Please enter a verb ending in -ed: “)
print(“Your MadLib:”)
print(“The”, adjective, noun, verb, “over the lazy brown dog.”)
>>> 
Please enter an adjective: smart
Please enter a noun: teacher
Please enter a verb ending in -ed: sneezed
Your MadLib:
The smart teacher sneezed over the lazy brown dog.
>>>

在本章中,我们将编写简短的、简单的程序来创建漂亮的、复杂的视觉效果。为了做到这一点,我们可以使用海龟作图软件。在海龟作图中,我们可以编写指令让一个虚拟的(想象中的)海龟在屏幕上来回移动。这个海龟带着一只钢笔,我们可以让海龟无论移动到哪都使用这只钢笔来绘制线条。通过编写代码,以各种很酷的模式移动海龟,我们可以绘制出令人惊奇的图片。

使用海龟作图,我们不仅能够只用几行代码就创建出令人印象深刻的视觉效果,而且还可以跟随海龟看看每行代码如何影响到它的移动。这能够帮助我们理解代码的逻辑。

让我们使用海龟作图来编写第一个程序。在一个新的IDLE窗口中输入如下的代码并将其保存为SquareSpiral1.py(你也可以通过http://www.nostarch. com/teachkids/下载该程序以及本书中的所有其他的程序)。

SquareSpiral1.py

# SquareSpiral1.py - Draws a square spiral
import turtle
t = turtle.Pen()
for x in range(100):
   t.forward(x)
   t.left(90)

当运行这段代码的时候,我们会得到一幅漂亮整齐的图片(如图2-1所示)。

图2-1 用简短的SquareSpiral1.py程序创建的一个炫目的正方形螺旋线

让我们一行一行地分析这个程序,看看它是如何工作的。SquareSpiral1.py的第1行是注释。正如我们在第1章中所学过的,注释以一个井号(#)开头。注释允许我们在程序中写入给自己或以后可能阅读该程序的其他人一些提示。计算机不会阅读或试图理解井号之后的任何内容;注释只是让我们写出关于程序是做什么的一些说明。在这个例子中,我们将程序的名称以及针对其做什么的一个简单说明放入到注释之中。

第2行导入(import)了绘制海龟图形的功能。导入已经编写过的代码,这是编程工作的最酷的事情之一。如果我们编写了一些有趣并有用的程序,可以将其与其他的人分享,同时也可以自己重用它。尽管海龟作图最初源自20世纪60年代的Logo编程语言[1],但一些很酷的Python程序员构建了一个库(library,库就是可以重用的代码的一个集合),来帮助其他程序员在Python中使用海龟作图。当我们输入了import turtle,就表示我们的程序能够使用那些Python程序员所编写的代码。图2-1中的小的黑色箭头表示海龟,它在屏幕上移动的时候会使用钢笔绘图。

程序的第3行是t = turtle.Pen(),它告诉计算机,我们将使用字母t表示海龟的钢笔。这使得我们只需要录入t.forward(),而不是turtle.Pen().forward(),就可以让海龟在屏幕上移动的时候用海龟的钢笔进行绘制。字母t是告诉海龟做什么的一种快捷方式。

第4行最为复杂。在这里,我们创建了一个循环(loop),它重复一组指令很多次(一次又一次地循环这些代码行)。这个特定的循环设置了一个范围(range,或列表),其中拥有从0~99的100个数字(计算机几乎总是从0开始计数,而不是像我们通常那样从1开始)。在该循环中,字母x遍历了范围中的每一个数字。因此,x从0开始,然后变为1,然后是2,依次类推,直到99,一共100个步骤。

x叫作变量(variable)[2](在第1章中的YourName.py程序中,name就是变量)。变量存储了在程序进行的过程中可以修改(变化)的一个值。我们在所编写的几乎每一个程序中,都要使用变量,因此,早点认识变量为好。

接下来的两行代码缩进了,或者说,在左边留出了空格。这意味着,它们位于该循环之中(in the loop)并且和上面的那一行代码一起,每次x从0~99的范围中获取一个新的数字的时候,这些代码行都会重复,直到达到100次。

让我们看看Python初次读取这一组指令的时候发生了什么。命令t.forward(x)让海龟的钢笔在屏幕上向前移动x个点。因为x是0,钢笔根本不会移动。最后一行代码t.left(90)让海龟向左转90°,或者说转四分之一个圈。

由于这个for循环,程序继续运行并且回到了循环的开始位置。计算机加1后将x移动到范围中的下一个值,因为1仍然位于从0~99的范围中,循环继续。现在x是1,因此,钢笔向前移动1个点。然后,钢笔向左旋转90度,因为代码是t.left(90)。这样一次一次地继续执行,当x到达99,即循环的最后一次迭代,钢笔围绕着正方形螺旋线的外围画了一条长长的线条。

下面我们随着x从0增加到100,将循环的每一步可视化地表示出来。

for x in range(100):
   t.forward(x)
   t.left(90)

循环0到4:绘制了前4条线(在x = 4之后)。

循环5到8:绘制了另外4条线;正方形出现了。

循环9到12:正方形螺旋线变为了12条线(3个正方形)。

计算机屏幕上的点或像素可能太小了,以至于我们无法很好地看到它们。但是,随着x变得越来越接近100,海龟绘制的线条包含了越来越多的像素。换句话说,当x变得越来越大,t.forward(x)绘制的线条越来越长。屏幕上的海龟箭头,绘制一会儿,然后向左转,再绘制一会儿,再向左转,这样一次又一次地绘制,每次线条都变得越来越长。

最后,我们有了一个炫目的正方形形状。连续4次向左转90°,就可以得到一个正方形,就像是围绕一栋建筑连续4次左转的话,将会带着我们绕建筑转一圈并且回到起点一样。

在这个示例中,我们之所以得到一个螺旋线,是因为每次左转的时候,都走得更远一点。绘制的第一个线条只是1步长(x = 1的时候),然后是2(循环的下一次迭代),然后是3,然后是4,以此类推,直到达到100步长,这时候,线条的长度为99像素。再一次强调下,屏幕上的像素可能太小了,以至于我们无法很容易地看到单个的点,但是,它们是存在的,而且我们会看到随着程序包含更多的像素,线条会变得越来越长。

通过完成所有的90°角的旋转,我们得到了完美的正方形。

让我们看看当修改了程序中某一个数值的时候,会发生什么?学习和程序相关的新知识的一种方法是,当我们修改其某一个部分的时候,看看发生了什么。我们不会总是得到一个很好的结果,但是,即使是某些地方出错的时候,我们也能学到东西。

我们只是将程序的最后一行修改为t.left(91),将其保存为SquareSpiral2.py。

SquareSpiral2.py

import turtle
t = turtle.Pen()
for x in range(100):
   t.forward(x)
   t.left(91)

我们提到了向左转90°会创建一个完美的正方形。每次向左转的比90°多一点点的话(在这个例子中,是91°),会将正方形略微向外抛出一点点。由于我们进行下一次旋转的时候,已经偏离了一点点,随着程序继续进行,新的图形越来越不像是一个正方形。实际上,它创建了一个开始向左旋转的、漂亮的螺旋形,就像是楼梯一样,如图2-2所示。

图2-2 正方形螺旋线程序略作修改后变成了一个螺旋形的楼梯

这也是一个漂亮的图形,可以帮助我们理解如何只略微修改一个数字,就显著地改变程序的结果。1°似乎并不是一个很大的偏差,除非我们偏离1° 100次(这加起来就是100°),或者1000次,或者,如果我们使用的是飞机着陆程序……

如果还不知道度是如何工作的,现在先不要担心,我们只要尝试修改数字,看看发生了什么就好了。我们通过修改range后面的圆括号中的值,让程序绘制的线条数达到200或500,或者50。

我们再尝试将最后一行的角度修改为91、46、61或121等。记住每次都保存程序,然后,我们运行它,看看所做的修改会如何影响到程序的绘制。年龄大一点的读者了解一些几何知识,可能会根据不同的角度看到一些熟悉的形状,甚至能够在程序运行之前根据角度来预测出形状。较小的读者则只能够感受修改带来的变化,等他们某一天上了几何课之后,可以再回头来看这个练习。

说到几何,海龟作图可以绘制很多有趣的形状,而不只是直线。我们将在2.4节中再次回到正方形,但现在,让我们来更多地了解一下Python Turtle库。

我们再来修改一行代码:t.forward(x)。我们在前面看到了这条命令或函数,它将海龟的钢笔向前移动x个像素并且绘制一条笔直的线段;然后,海龟转向并且再次绘制。如果我们修改这行代码来绘制更为复杂一点的图形,例如圆,那会怎么样呢?

好在,绘制一个固定大小(或半径)的圆的命令,和绘制一条直线的命令一样简单。我们将t.forward(x)修改为t.circle(x),如下面的代码所示。

CircleSpiral1.py

import turtle
t = turtle.Pen()
for x in range(100):
   t.circle(x) 
   t.left(91)

哦,将一条命令从t.forward修改为t.circle,会得到一个复杂得多的形状,如图2-3所示。t.circle(x)函数让程序在当前位置绘制了一个半径为x的圆。注意,这个绘制和简单的正方形螺旋线有一些相同点:它也有4组圆形的螺旋线,就像是正方形的螺旋线有4个边一样。这是因为我们使用t.left(91)命令,每次向左旋转都将超过90°一点点。如果我们学习过几何就知道,围绕一个点转一圈有360°,就像是一个正方形有4个90°的角(4×90 = 360)。海龟通过每次围绕图形旋转的比90°多一点点,从而绘制出这个螺旋线的形状。

图2-3 只需在改动一点就得到一组漂亮的4个螺旋线的圆

我们将会看到的一个区别是,圆形螺旋线比正方形螺旋线要大一些,实际上,大约是前者两倍那么大。这是因为t.circle(x)使用x作为圆的半径,而这是从圆心到边缘的距离,大概是圆的宽度的一半。

半径为x意味着,圆的直径,也就是说总的宽度是x的两倍。换句话说,t.circle(x)绘制的圆,当x等于1的时候,总宽度为2个像素;当x为2的时候总宽度为4个像素;按照这种方式,直到x等于99的时候,其宽度为198个像素。这几乎是200个像素宽了,或者说是正方形边最大的时候的两倍,因此,圆螺旋线看上去是正方形螺旋线的两倍的大小,当然,也会加倍的酷!

这些螺旋线的形状不错,但是,如果它们能够更多彩一些,是不是更酷呢?让我们回到正方形螺旋线代码,在t = turtle.Pen()这一行的后面再添加一行代码,从而将钢笔颜色设置为红色。

SquareSpiral3.py

import turtle
t = turtle.Pen()
t.pencolor(“red”)
for x in range(100):
    t.forward(x)
    t.left(91)

运行该程序,我们将会看到正方形螺旋线的一个更多色彩的版本,如图2-4所示。

图2-4 正方形螺旋线变得更多彩一些了

我们尝试用另一种常用的颜色(如“blue”或“green”)来替换掉“red”或“green”并且再次运行该程序。我们可以通过Turtle库使用数百种不同的颜色,包括一些奇怪的颜色,如“salmon”和“lemon chiffon”(访问http://www.tcl.tk/man/tcl8.4/TkCmd/colors.htm可以查看完整的列表)。让整个螺旋线呈现一种不同的颜色是很不错的一步,但是,如果想要让每一边都显示一种不同的颜色,我们该怎么办呢?这需要对程序做一些更多的修改。

让我们来考虑一下算法(algorithm)。算法就是一系列的步骤,它可以将单色的螺旋线变为4色的螺旋线。大多数的步骤和之前的螺旋线程序中相同,但是,这里还增加了一些调整:

(1)导入turtle模块并且设置一个海龟;

(2)告诉计算机应该使用何种颜色;

(3)设置一个循环,绘制螺旋线中的100条线段;

(4)为螺旋线的每一边选取一种不同的钢笔颜色;

(5)向前移动海龟以绘制每一边;

(6)将海龟向左转,以准备好绘制下一边。

首先,我们需要颜色名称的一个列表,而不是单个的颜色,因此,我们要创建一个名为colors的列表变量并且在列表中放置4种颜色,如下所示。

colors = [“red”, “yellow”, “blue”, “green”]

这个4种颜色的列表,将会针对正方形的每一边给出一种颜色。注意,我们将颜色的列表放在了方括号“[”和“]”之间。这里要确保引号中的每一种颜色名都像我们在第1章中打印出来的单词一样,因为这些颜色名都是字符串(string)或文本值,这是我们稍后要传递给pencolor函数的值。正如前面所提到的,我们使用一个名为colors的变量来存储4种颜色的列表。因此,任何时候,当想要从列表中获取颜色的时候,我们都要使用colors变量来表示钢笔的颜色。记住,变量存储的值是变化的,这正如同其名称一样,变量嘛。

我们需要做的下一件事情是,每次遍历绘制循环的时候修改钢笔颜色。为了做到这一点,我们需要将t.pencolor()函数移入到for循环下的一组指令之中,还需要告诉pencolor函数,我们想要使用列表中的哪一种颜色。

我们输入如下的代码并运行它。

ColorSquareSpiral.py

import turtle
t = turtle.Pen()
colors = [“red”, “yellow”, “blue”, “green”]
for x in range(100):
    t.pencolor(colors[x%4])
    t.forward(x)
    t.left(91)

4种颜色的列表起作用了,我们在这个运行的示例中看到了它们(如图2-5所示)。到目前为止,一切还不错。

图2-5 正方形螺旋线程序的一个更加多彩的版本

pencolor函数中唯一的新增部分是(colors[x%4])。这条语句中的x和我们在程序中其他地方所使用的x是同一个变量,因此,x将持续从0~99增加,就像我们前面所见到的那样。圆括号中的colors变量名告诉Python,从我们在程序前面所添加的、名为colors的颜色名称列表中选取一种颜色。

[x%4]告诉Python我们将使用colors列表中的前4种颜色,即编号从0~3的颜色并且每当x变化的时候就遍历它们。在这个例子中,我们的颜色列表只有4种颜色,因此,我们需要一次又一次地遍历这4种颜色。

colors = [“red”, “yellow”, “blue”, “green”]
       0       1        2       3

[x%4]中的“%”叫作取模操作符(modulo operator),表示一次除法运算中的余数(remainder)(5÷4商1余1,因此,5可以包含4一次并且还剩下1;6÷4余2,以此类推)。当我们想要遍历列表中一定数目的项时,例如我们对4种颜色列表所做的操作,取模操作符很有用。

在100步中,colors[x%4]将遍历4种颜色(0、1、2和3,分别表示红色、黄色、蓝色和绿色)整整25次。如果我们有时间(并且有一个放大镜),可以数一数图2-5中有25条红色的、25条黄色的、25条蓝色的和25条绿色的线段。第1次遍历绘制循环的时候,Python使用列表中的第一种颜色,红色;第2次遍历的时候,它使用黄色,以此类推。第15次遍历循环的时候,Python又回过头来使用红色,然后是黄色,等等;每通过循环4次之后,总是又回过头来使用红色。

让我们再次加入一点内容,创造出比图2-5更漂亮一些的内容。正如我5岁的儿子Alex所指出来的那样,黄色部分太难以识别出来了。这就像是在白色的绘画纸上使用黄色的蜡笔一样,屏幕上的黄色像素无法在白色背景上明显地显示出来。让我们把背景颜色修改为黑色,来修正这个问题。我们在程序中的import行之后的任何位置,输入如下的代码行。

turtle.bgcolor(“black”)

添加这一行之后,图片更加漂亮,所有的颜色现在都处在一个黑色的背景之上。注意,海龟钢笔(在程序中由变量t表示)没有任何变化。相反,我们修改了海龟屏幕的一些内容,也就是背景颜色。turtle.bgcolor()命令允许我们将整个绘制屏幕修改为Python中指定的任何颜色。在turtle.bgcolor(“black”)这一行中,我们选择了黑色作为屏幕颜色,因此,红色、黄色、蓝色和绿色都显示得很好。

此外,我们可以将循环中的range()修改为200甚至更大,以使得螺旋线中的正方形更大。在黑色背景上显示200个线段的新版本的图片,如图2-6
所示。

图2-6 螺旋线程序的路还很长(这是一个简单的开始)

Alex总是想帮助我的程序变得更为惊人,他要求再做一项修改:如果现在把线段替换为圆,那会怎么样呢?那会不会是最酷的图片呢?好吧,我必须承认,这甚至会更酷。完整的代码如下所示。

ColorCircleSpiral.py

import turtle
t = turtle.Pen()
turtle.bgcolor(“black”)
colors = [“red”, “yellow”, “blue”, “green”]
for x in range(100):
    t.pencolor(colors[x%4])
    t.circle(x)
    t.left(91)

我们可以在图2-7中看到结果。

图2-7 Alex的惊人的圆螺旋线— 一共8行代码,简单而优雅

到目前为止,我们已经使用变量来修改颜色、大小以及螺旋线形状的旋转角度。让我们再添加一个sides变量,来表示形状的边数。这个新的变量如何改变我们的螺旋线呢?如果要搞清楚这一点,我们尝试这个新的程序ColorSpiral.py。

ColorSpiral.py

import turtle
t = turtle.Pen()
turtle.bgcolor(“black”)
# You can choose between 2 and 6 sides for some cool shapes!
sides = 6
colors = [“red”, “yellow”, “blue”, “orange”, “green”, “purple”]
for x in range(360):
    t.pencolor(colors[x%sides])
    t.forward(x * 3/sides + x)
    t.left(360/sides + 1)
    t.width(x*sides/200)

我们可以将sides的值从6改为2(1个边并不是很有趣,也不能使用太大的数字,除非我们在程序的第6行中的列表中,添加更多的颜色),然后保存该程序并且可以运行任意多次。图2-8展示了用sides=6、sides=5,一直到sides=2所创建的图像,其中sides=2的图像很奇怪,这就是图2-8(e)所显示的扁平的螺旋线。我们可以改变列表中的颜色的顺序,也可以在绘制循环之中的任意函数中,使用较大一些或较小一点的数字。如果把程序给搞乱了,我们只需要返回到最初的ColorSpiral.py程序重新来玩就好了。

a)

b)

c)

d)

e)

图2-8 通过把变量sides从6(a)修改为2(e)所创建的5种彩色的形状

ColorSpiral.py程序使用了一条新的命令t.width(),它修改了海龟钢笔的宽度。在我们的程序中,随着钢笔绘制的形状越来越大,钢笔变得越来越宽(其线条变得更粗)。在第3章和第4章,我们学习创建程序所需的其他技能的时候,还会再次遇到这个程序以及其他类似的程序。

在本章中,我们使用Turtle库的工具绘制了令人印象深刻的彩色形状。我们使用import命令把这个库导入到自己的程序中,同时了解到,以这种方式来重用代码是编程的最强大的功能之一。一旦编写了有用的内容,或者借用某些人慷慨分享的代码,我们不仅能够节省时间,而且能够使用这些导入的代码做全新的事情。

我们还介绍了程序中像x和sides这样的变量。这些变量存储或记住一个数字或值,以便我们能够在程序中多次使用它,甚至修改其值。在第3章中,我们将学习变量的作用以及Python如何能够帮助你完成数学作业。

现在,我们应该能够做如下这些事情:

#1:修改边数

在ColorSpiral.py程序中,我们使用了一个变量sides,但是我们并没有改变它或修改其值,只是再次编辑、保存和运行程序。我们尝试将sides的值改为另一个数字,例如5,保存并运行程序,看看这会对绘制有何影响;现在,试一试4、3、2甚至是1。现在,我们在程序的第6行,向颜色列表中添加两种或更多的颜色,颜色名用引号括起来,用逗号隔开。我们可以增加sides的值,来使用这些新的颜色,尝试一下8或者10甚至更大。

#2:有多少边

如果想要在程序运行的时候由用户来决定边数,我们该怎么做呢?使用我们在第1章中学习的内容,可以让用户输入边数并且将其存储到sides变量中。唯一额外的步骤是,计算(evaluate)用户所输入的数字。我们可以使用eval()函数得到用户输入的数字,如下所示。

我们使用前面这一行,替换掉ColorSpiral.py中的sides = 6这一行。新的程序将会问用户想要看到有多少个边。然后,程序将绘制用户所要求的形状。尝试一下!

#3:橡皮筋球体

我们尝试将ColorSpiral.py程序修改为一个更大的角度,而且通过在绘制循环的末尾添加一个额外的转向来扭曲形状。我们在for循环的末尾添加诸如t.left(90)的一行,使得角度更加尖锐(记住缩进,或者说留下空格,以保证该语句位于循环之中)。结果如图2-9所示,看上去像是一个几何玩具,或者是用彩色的橡皮筋制作的球体。

图2-9 在ColorSpiral.py程序的每一轮循环中添加一个额外的90°将其变为RubberBandBall.py程序

我们把这个新的版本保存为RubberBandBall.py,或者访问http://www.nostarch.com/teachkids/并且在Chapter2的源代码中找到该程序。

尝试这些挑战以练习我们在本章中所学习的知识(如果遇到困难,可以访问http://www.nostarch.com/teachkids/寻找示例解答)。


sides = eval(input(“Enter a number of sides between 2 and 6: “))

[1] Logo编程语言创建于1967年,这是一种教育编程语言,在50年之后的今天,它仍然用来教授基本的编程。这很酷,是不是?

[2]  小读者可能会把x当作未知数,就像当他们求解x + 4 = 6以求得未知的x一样。年龄大一点的读者可能会通过代数课或其他的数学课程认识x,早期的程序员正是从代数和数学中借用了变量的概念。编写代码的过程中会有很多数学的典型例子,我们甚至会在后面见到一些很酷的几何示例。


相关图书

深度学习的数学——使用Python语言
深度学习的数学——使用Python语言
动手学自然语言处理
动手学自然语言处理
Web应用安全
Web应用安全
Python高性能编程(第2版)
Python高性能编程(第2版)
图像处理与计算机视觉实践——基于OpenCV和Python
图像处理与计算机视觉实践——基于OpenCV和Python
Python数据科学实战
Python数据科学实战

相关文章

相关课程