书名:Python编程无师自通——专业程序员的养成
ISBN:978-7-115-49710-9
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 [美] 科里•奥尔索夫(Cory Althoff)
译 宋秉金
责任编辑 杨大可
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
The Self-Taught Programmer
by Cory Althoff ISBN:978-1-5202-8817-8
Copyright ©2017 by Cory Althoff.
Original English language edition published by arrangement with Hodgman Literary LLC, through The Grayhawk Agency Ltd.
Simplified Chinese-language edition Copyright ©2018 by Posts & Telecom Press. All rights reserved.
本书中文简体字版由Hodgman Literary LLC授权人民邮电出版社独家出版。未经出版者书面许可,不得以任何方式复制或抄袭本书内容。
版权所有,侵权必究。
本书作者是一名自学成才的程序员,经过一年的自学,掌握了编程技能并在eBay找到了一份软件工程师的工作。本书是作者结合个人经验写作而成,旨在帮助读者从外行成长为一名专业的Python程序员。
本书包括5部分内容:第一部分(第1~11章)介绍了编程基础知识,以及函数、容器、字符串、循环和模型等概念;第二部分(第12~15章)介绍了编程范式和面向对象编程等知识;第三部分(第16~20章)介绍了Bash、正则表达式、包管理器和版本控制等编程工具方面的知识;第四部分(第21~22章)主要涉及数据结构和算法方面的知识;第五部分(第23~27章)则是关于求职与团队协作的内容。
本书可以满足几乎所有想要学习编程的初学者。本书适合高中、大学阶段想要自学编程的学生,以及其他行业想入门编程的人,同时也适合作为编程入门的培训教材。
我要感谢所有在本书撰写、出版过程中给予帮助的人。我的父母艾比•奥尔索夫和詹姆斯•奥尔索夫,在整个过程中给了我极大的支持。我父亲一页一页地读完了本书,并提出了非常宝贵的反馈建议。没有他的帮助,这本书就不会问世。我女朋友劳伦•沃德也没有抱怨我把大部分时间花在写书上。我要感谢本书的插画师布莱克•鲍尔斯,本书的编辑史蒂夫•布什、麦德林•鲁斯、潘•瓦拉塔和劳伦斯•圣菲利波,以及我的朋友安东尼•辛都,我在书中引用了我们之间多次讨论的内容。我还要感谢兰迪•芬勒支持我在 Kickstarter上发起的写作项目,并介绍潘•瓦拉塔给我认识。特别感谢我以前的领导安札•阿法克,在我加入 eBay 时那么地支持我。还要感谢所有参与审阅本书的读者,感谢你们提供的反馈。最后,我想感谢 Kickstarter 网站上所有支持本书项目的朋友,尤其是吉姆•春、萨尼•李和雷•福瑞斯特。非常感谢大家的支持!
本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。
本书提供如下资源:
挑战练习源代码;
书中示例源代码。
要获得以上配套资源,请在异步社区本书页面中点击,跳转到下载界面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。
如果您是教师,希望获得教学配套资源,请在社区本书页面中直接联系本书的责任编辑。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,点击“提交勘误”,输入勘误信息,点击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
我们的联系邮箱是contact@epubit.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit.com/selfpublish/submission即可)。
如果您是学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。
“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。
异步社区
微信服务号
本部分内容
■ 第1章 概述
■ 第2章 起步
■ 第3章 编程概论
■ 第4章 函数
■ 第5章 容器
■ 第6章 字符串操作
■ 第7章 循环
■ 第8章 模块
■ 第9章 文件
■ 第10章 综合练习
■ 第11章 练习
“大多数优秀的程序员从事编程工作,不是因为期望获得报酬或得到公众的称赞,而是因为编程是件有趣的事儿。”
——林纳斯·托瓦兹(Linus Torvalds)
我毕业于克莱门森大学政治学专业。我曾考虑过是否选择学习计算机科学专业,还在大一那年报名参加了“编程概论”课程,不过很快就退出了。实在是太难了。毕业后我一直住在硅谷,我发现我需要学习编程。一年后,我成为了eBay公司的一名中级软件工程师(介于初级工程师与高级工程师之间的一个职位)。我不想让大家觉得这是很轻松就能做到的。实际上,这是极具挑战的一件事。在这一年的不断尝试努力过程中,我得到了很多乐趣。
刚开始,我学习的是如何用流行的编程语言Python来进行编程。但是本书不仅是教你如何使用某种特定的语言编程(确实会有这方面的内容),还会介绍标准教材中所不包括的其他所有知识点。本书分享的是我在成为软件工程师过程中不得不自学的内容。本书不适合那些想要随意了解下编程知识、将写代码作为爱好的人,而是专门写给那些希望以编程为职业的人。不管你的目标是成为一名软件工程师、企业家,还是在其他的岗位上使用编程技能,你都是本书的目标读者。
学会一门编程语言还不够,你还需要学会其他技能,才能像计算机科学家一样地工作。我会教授大家我从编程新手到专业软件工程师过程中学到的一切。我写作本书,是为了向有志于编程岗位的人分享他们需要掌握的知识框架。编程概论的书籍都大同小异——用Python或Ruby介绍编程的基础知识,然后就让你自己摸索。我经常从读完类似书籍的朋友那听到这样的反馈:我现在该做什么?我还不是一名程序员,也不知道下一步该学什么。本书,就是我给出的答案。
本书中一章所涵盖的许多主题可能都可以独立成书。我的目标不是包罗你需要了解的每个主题的所有细节,而是提供一份指引——一个编程职业发展所需要的所有技能的导览。
第一部分:编程简介。让你尽快写出自己的第一个程序,最好在今天。
第二部分:面向对象编程简介。这部分将介绍不同的编程范式,着重阐述面向对象编程。你会开发一个游戏,体会编程的强大能力。读完这部分后你会沉迷于编程。
第三部分:编程工具简介。将介绍提升编程生产力的不同工具。这时,你已经沉迷于编程,并希望变得更好。你将会学习相关的操作系统、使用正则表达式提升效率、安装并管理他人的程序,以及使用版本控制与其他工程师协作的知识。
第四部分:计算机科学简介。将简要介绍计算机科学知识,主要涵盖两个主题——算法和数据结构。
第五部分:找到工作。最后一部分是关于最佳编程实践,如何找到软件工程师的工作,团队协作以及程序员的自我提升。我会分享如何通过技术面试与团队协作的建议,以及如何进一步提升自己的技能。
我学会编程的方式,与计算机科学通常的教学方式正好相反。本书的结构是根据我自己的方式组织的。一般来说,你会先花很多时间学习理论,理论知识学的太多以至于许多计算机科学的毕业生甚至不知道如何动手编程。杰夫·阿特伍德(Jeff Atwood),在其博客“为什么程序员不会编程”中写道:“和我一样,许多人都碰到了这样的情况,编程岗位的200位申请者中,有199个根本不会写代码。重申一遍:他们一点代码都不会写。”这种现象直接促使Atwood发明了FizzBuzz代码挑战,一种用来在面试中筛选申请者的编程测试。大部分人都通不过测试,这也是为什么你要学习本书并掌握实践中要使用到技能。放心吧,在本书中你还会学到如何通过FizzBuzz测试的。
《王者之旅》电影中的主角乔什(Josh Waitzkin),在《学习的艺术》一书中回忆了他如何反向学习国际象棋。他没有和其他人一样研究开局,而是从学习象棋残局(棋盘上只剩下少数几个棋子)开始。这样做让他对国际象棋有了更深的理解,并赢得了多次大赛冠军。与此类似,我认为先学习如何编程再学习理论的方法更高效,因为你会拥有了解背后原理的强烈驱动。这就是为什么本书一直到第四部分才介绍计算机科学理论,而且内容也尽量精简。虽然理论很重要,但是在你拥有了编程经验之后,理论的价值才更大。
毕业后再学习编程,已经越来越常见。Stack Overflow(一个程序员在线社区)在2015年的一份调查中显示,48%的受访者没有计算机科学学位。
在eBay工作期间,我的团队中有从斯坦福大学、加州大学和杜克大学计算机科学专业毕业的程序员,还有两名物理学博士。当时我25岁,而年仅21岁的同事对编程和计算机科学的知识比我强10倍这个事实,让我尤其惶恐。
虽然与拥有计算机科学学士、硕士甚至是博士学位的同事一起工作的压力很大,但别忘记了你还有“自学的优势”。你选择读这本书,不是出于老师布置的任务,而是因为你内心学习的渴望,这一点是你所拥有的最大优势。苹果公司的创始人斯蒂夫·沃兹尼亚克(Steve Wozniak)就是一位自学成才的程序员;还有因在美国宇航局的阿波罗登月计划中做出卓越贡献而获得总统自由勋章的玛格丽特·汉密尔顿(Margaret Hamilton);还有Tumblr 的创始人大卫·卡普(David Karp),Twitter的创始人杰克·多西(Jack Dorsey),Instagram 的创始人凯文·斯特罗姆(Kevin Systrom),他们都是自学成才的程序员。
不管你从事什么工作,编程都有助于你的职业发展。学习编程将给你自己赋能。我喜欢尝试新想法,时刻都有希望启动的新项目。学会编程后,我就可以坐下来自己实现,而不需要依赖他人。
编程也会提升你在其他方面的技能。因为你熟练掌握了问题解决能力,鲜有其他工作不会因此而受益。我最近要在Craiglist上租房,搜索并筛选房子是个非常费力的活儿。但是我写了一个程序来代替我搜索,最后将结果以邮件形式发送给我。学会编程,将把你从重复性工作中解放出来。
如果你想成为软件工程师,市场上对这类岗位的需求也日益增长,但是符合要求的候选者却总是供不应求。到2020年,预计将有一百万个编程岗位空缺。即使你的目标不是成为软件工程师,科学和金融等领域的岗位也开始倾向那些拥有编程经验的申请者。
如果你之前没有任何编程经验,担心自己无法胜任编程工作,本书想告诉你的是:你完全有能力做到。人们对程序员有一些常见的误解,比如程序员都得擅长数学。这是错误的印象,不过编程确实是一件困难的工作。幸运的是,本书涵盖的内容将让这一切变得比你想象得更加容易。
为了提高编程技巧,你应该每天练习编程。挡在你面前的唯一障碍就是无法坚持,所以我们要采取一些措施确保自己能够坚持不懈。准备一张检查清单,来确保每天都有做练习,而且也能够帮助你保持专注。
如果你还需要其他帮助,效率专家Tim Ferris建议采用如下技巧来保持驱动力。事先给家人或朋友一笔钱,如果你在规定的时间内完成了目标,就让他们把钱还给你,否则就将钱捐献给你讨厌的机构。
本书的各个章节紧密相关。如果你读到了某些看不懂的概念,可能在前一章已经做了介绍。书中尽量避免重复解释,所以牢记这个特点。在给重点词汇下定义时,会使用斜体。每个章节的末尾都有一个词汇表,对该章内出现的斜体名词进行解释。书中代码段前的注释为GitHub的网址,读者可于网站直接复制代码。
为了让读者尽可能的积累编程经验,本书会介绍多种技术。在某些情况下,必须在许多不同的技术中做出选择。在第19章“版本控制”中(对于不了解版本控制的读者,稍后会有解释),我们将会学习Git的基础知识。Git是一个流行的版本控制系统,选择介绍Git是因为笔者认为它已经成为版本控制的业界标准。书中用Python来编写大部分的编程示例,因为它是一门很流行的初学者语言,而且即使从来没有使用过Python的人学习起来也比较简单。此外,目前几乎每个领域对Python开发者的需求都非常大。不过,书中会尽量做到内容与技术无关——注重概念,而非技术本身。
首先需要有一台计算机,以便跟着本书进行示例练习。计算机有一个操作系统(operating system),即一个扮演人与计算机物理硬件之间的中间人的程序。可以在屏幕上看到的称为图形用户界面(Graphical User Interface,GUI),它是操作系统的一部分。
台式计算机和笔记本电脑目前有3种常用的操作系统:Windows、UNIX和Linux。Windows是微软推出的操作系统。UNIX操作系统发明于20世纪70年代,目前最流行的UNIX操作系统是苹果的OS X。Linux则是目前世界上大部分服务器(server)都在使用的一款开源操作系统。服务器指的是执行托管网站等任务的计算机或计算机程序。开源(open-source)意味着软件不归某个公司或个人所有,而是由一群志愿者维护。Linux和UNIX都是类UNIX操作系统,意味着二者之间非常相似。本书假设读者已经有一台运行Windows、OS X或Ubuntu(Linux的一个流行版本)操作系统的计算机。
FizzBuzz:用来在编程面试中筛选候选者的一种编程测试。
操作系统:扮演计算机物理组件与人之间的中间人的一个程序。
图形用户界面(GUI):操作系统的一部分,用户在屏幕上看到的内容。
开源:软件不归某个公司或个人所有,而是由一群志愿者维护。
Windows:微软推出的操作系统。
UNIX:发明于20世纪70年代的一种操作系统,苹果的OS X是UNIX的一个版本。
Linux:世界上大部分服务器(server)都在使用的一款开源操作系统。
服务器:执行特定任务(如托管网站)的计算机或计算机程序。
类UNIX操作系统:UNIX和Linux。
创建一个每日检查清单,在其中加入练习编程这个任务。
“一名优秀的程序员,在穿越单行道时也会确认双向的来车情况。”
——道格拉斯·林德(Doug Linder)
编程(programming)指的是编写让计算机执行的指令。这些指令可能告诉计算机打印Hello, World!
,从因特网爬取数据,或者读取某个文件的内容并保存至数据库。这些指令被称为代码(code)。程序员用许多不同的编程语言来编写代码。在过去,编程的难度更大,因为程序员必须要使用晦涩难懂的底层编程语言(low-level programming language),如汇编语言(assembly language)。说一门编程语言是底层语言,指的是其与高级编程语言(读起来更像英语的编程语言)相比,更接近用二进制(0和1)编写指令,因此也更难理解。下面是一个用汇编语言编写的简单程序:
# http://tinyurl.com/z6facmk
global _start
section .text
_start:
mov rax , 1
mov rdi , 1
mov rsi , message
mov rdx , 13
syscall
; exit(0)
mov eax , 60
xor rdi , rdi
syscall
message:
db "Hello, World!", 10
下面则是用一门现代编程语言编写的同一个程序:
1 # http://tinyurl.com/zhj8ap6
2
3
4 print("Hello, World!")
显而易见,如今程序员的工作容易多了。不再需要花费大量时间学习晦涩的底层语言才能编程,相反只要学习一门非常易读的语言Python即可。
Python 是一门开源编程语言,由荷兰程序员吉多·范·罗苏姆(Guido van Rossum)发明,并以英国喜剧团体“蒙提·派森(Monty Python)的飞行马戏团”命名。吉多发现程序员读代码的时间比写代码花的时间更长,因此他就发明了这门非常易读的语言。Python目前已经是世界上最流行最易学的编程语言之一。所有的主流操作系统和计算机都可运行Python,可将其用于从搭建网络服务器到创建桌面应用等所有领域。由于其如此流行,市场上对Python开发者的需求也很大。
需要先安装Python 3才能完成本书中的示例练习。可以从http://python.org/ downloads 下载针对Windows和OS X的Python版本。如果使用的是Ubuntu,操作系统中默认安装了Python 3。请确保下载的是Python 3,而不是Python 2。本书中的部分示例不适用于Python 2。
32位和64位操作系统的计算机均可使用Python。如果计算机是2007年后购买的,它很有可能是一台64位操作系统的计算机。如果不确定操作系统是32位还是64位,只需在网络上搜索相关内容即可确定。
如果使用的是Windows或Mac计算机,下载Python的32位版或64位版安装包,打开文件并按提示操作。还可以浏览http://theselftaughtprogrammer.io/ installpython网页,观看介绍如何在每个操作系统下安装Python的视频。
从上节开始,读者就需要安装好Python了。如果遇到了问题,可以直接跳到第2章的“获得帮助”一节。
Python自带了一个叫IDLE的程序,全称是交互式开发环境;它也是“蒙提·派森的飞行马戏团”的成员埃里克·艾多尔(Eric Idle)的姓氏。我们将在IDLE中输入Python代码。安装好Python之后,在Explorer(PC)、Finder(Mac)或Nautilus(Ubuntu)中搜索IDLE。建议为其创建一个桌面快捷方式,以方便查找。
点击IDLE程序的图标,带有如下文字说明的程序就会启动(准确的文字可能会有所变化,但是即使没有说明或略有不同都不用担心):
Python 3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44)[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin Type "copyright", "credits" or "license()" for more information.>>>
这个程序被称为交互式shell。可以直接在其中键入Python代码,程序就会打印出结果。在提示符>>>后面键入:
1 print("Hello, World!")
然后按下回车。
IDLE可能会拒绝执行从Kindle、其他电子书或Word等文字处理程序中复制的代码。如果使用复制的代码,且遇到了一个无法解释的错误,尝试直接在窗口中输入代码。并且必须键入与示例中一模一样的代码,包括双引号、括号和其他标点符号。
交互式shell会打印出Hello, World!
,如图2-1所示。
图2-1 交互式shell打印示例
在编程界有一个传统,每当教别人一门新编程语言时,第一个程序就是如何打印Hello, World!
。所以,恭喜你刚刚写出了自己的第一个程序。
交互式shell对于快速计算、测试小块代码和不会被重复利用的短程序来说很有用。还可以用IDLE保存一个程序以便重复使用。启动IDLE应用,点击“文件”按钮(IDLE编辑器左上角的菜单栏),然后选择“创建新文件”。选择该选项后,会打开一个文本编辑器,它的背景通常是白色的。你可以在编辑器中写代码,再保存以便之后运行。运行代码时,程序输出会出现在交互式shell中。再次运行之前,需要保存在编辑代码时所做的修改。在文本编辑器中输入“Hello, World!”程序,如图2-2所示。
图2-2 在文本编辑器的“Hello,World!”
再次回到“文件”菜单,然后选择“另存为”。将文件命名为hello_world.py并保存。Python文件的名称必须以.py结尾。保存好文件之后,点击“运行”菜单(也在IDLE编辑器左上角的菜单栏中),并选择“运行模块”。也可以直接按快捷键F5键,相当于从菜单栏中选择“运行模块”按钮。在交互式shell中将会打印出Hello, World!
,就好像你已经输入了这行代码。但现在,由于已经保存好了程序,之后你可以想运行多少次就运行多少次。
你创建的这个程序,实际只是一个以.py扩展名结尾的文件。给文件起的名字hello_world.py完全是随意选择的,可以改成其他任何名称。正如本例所示,用Python编程只需要将文本键入文件中,然后使用交互式shell运行即可。很简单,对吧?
本书将给出大量代码示例,以及最后的运行结果。碰到类似内容时,你应该试着输入相同的代码,自己运行一次。
短小的示例最好在交互式shell中运行,文本编辑器更适合希望保存并编辑的程序。如果在交互式shell中键入的代码有错误,比如拼写错误,导致代码出错,就必须得重新输入所有代码。而使用文本编辑器则可以省下不少工作,如果犯错了,只需要纠正并重新运行即可。
二者区别很大的另一个原因,是从文件运行程序与从交互式shell运行程序的输出会略有不同。如果直接在交互式shell中键入100
并按下回车,交互式shell会输出100
。但如果在.py文件中输入100
并运行,则不会有任何输出。这个区别可能会让人困惑,因此在运行程序时,如果没有得到书中示例相同的输出,请注意是从哪里运行的程序。
编程:编写让计算机执行的指令。
代码:程序员编写的、让计算机执行的指令。
底层编程语言:与高级编程语言(读起来更像英语的编程语言)相比,更接近用二进制(0和1)编写指令的编程语言。
汇编语言:一种很难阅读的编程语言。
高级编程语言:一种读起来比底层编程语言更像英语的编程语言。
Python:本书介绍的一种易读、开源编程语言。由吉多·范·罗苏姆发明,并以英国喜剧团体“蒙提·派森的飞行马戏团”命名。
尝试打印出除Hello, World!
以外的文字。
挑战练习源代码可从异步社区(www.epubit.com)本书详情页的配套资源中下载。