Python编程无师自通:专业程序员的养成
微信读书导出笔记
收录《Python编程无师自通:专业程序员的养成》的阅读划线、摘录与个人笔记。
本文由个人微信读书导出内容整理而成,包含阅读划线、摘录和个人笔记,仅用于个人学习与回顾。
阅读摘录
第1章 概述
“大多数优秀的程序员从事编程工作,不是因为期望获得报酬或得到公众的称赞,而是因为编程是件有趣的事儿。”
他没有和其他人一样研究开局,而是从学习象棋残局(棋盘上只剩下少数几个棋子)开始。这样做让他对国际象棋有了更深的理解,并赢得了多次大赛冠军
开始。这样做让他对国际象棋有了更深的理解,并赢得了多次大赛冠军。与此类似,我认为先学习如何编程再学习理论的方法更高效,因为你会拥有了解背后原理的强烈驱动。这就是为什么本书一直到第五部分才介绍计算机科学理论,而且内容也尽量精简。虽然理论很重要,但是在你拥有了编程经验之后,理论的价值才更大。
我认为先学习如何编程再学习理论的方法更高效,因为你会拥有了解背后原理的强烈驱动。
你选择读这本书,不是出于老师布置的任务,而是因为你内心学习的渴望,这一点是你所拥有的最大优势。
不管你从事什么工作,编程都有助于你的职业发展。学习编程将给你自己赋能。
这是错误的印象,不过编程确实是一件困难的工作。幸运的是,本书涵盖的内容将让这一切变得比你想象得更加容易。
为了提高编程技巧,你应该每天练习编程。挡在你面前的唯一障碍就是无法坚持,所以我们要采取一些措施确保自己能够坚持不懈。
为了提高编程技巧,你应该每天练习编程。挡在你面前的唯一障碍就是无法坚持,所以我们要采取一些措施确保自己能够坚持不懈。准备一张检查清单,来确保每天都有做练习,而且也能够帮助你保持专注。
第2章 起步
Python自带了一个叫IDLE的程序,全称是交互式开发环境
第3章 编程概论
即使你完全理解了这段代码,也可能并不知道如何计算长方形的对角线长度,因此这里的注释就是有用的。
有时一段代码比较长,超过了一行,可以用三引号、圆括号、方括号或者大括号扩展至新一行
另外,还可以使用反斜杠\对代码进行换行
3.5 关键字
Python等编程语言中有一些具备特殊意义的字,即关键字(keyword)。前面见过的for就是一个关键字,用来多次执行代码。本章中还会学习更多的关键字。
3.6 间距
Python等编程语言中有一些具备特殊意义的字,即关键字(keyword)。前面见过的for就是一个关键字,用来多次执行代码。本章中还会学习更多的关键字。
即使编程语言不强制使用空格,程序员为了让代码更便于阅读,也会倾向于使用空格来分隔代码。
3.7 数据类型
Python将数据划分成不同的类别,即数据类型(data type)。在Python中,每一个数据值,如2或”Hello, World! “,被称为对象(object)。本书第二部分会详细介绍数据类型,现在可以把对象看作拥有3个属性的数据值:唯一标识(identity)
Python将数据划分成不同的类别,即数据类型(data type)。在Python中,每一个数据值,如2或”Hello, World! “,被称为对象(object)
,现在可以把对象看作拥有3个属性的数据值:唯一标识(identity)、数据类型和值
变量由一个或多个字符组成的名称构成,并使用赋值符(assignment operator)等号赋予了这个名称一个值。
ython有两种错误:语法错误和异常。不属于语法错误的错误,就是异常(exception)。如果用0作为分母,则会出现“ZeroDivisionError”异常。
要记住,在碰到语法错误或异常时,先找到出现问题的那行代码,然后仔细检查并找到解决办法(如果没有头绪可以在网上搜索错误或异常提示信息)。
这些示例中所使用到的符号被称为操作符
对两个数取模时,如果没有余数(返回0),则被取模的数字为另一个数字的倍数。如果有余数,则不是其倍数。因此取模运算被用于检验数字的奇偶性,示例如下:
两个操作数和一个操作符共同构成一个表达式(expression)。
比较操作符(comparison operator)是Python中的另一种操作符
比较操作符==是用于检查两侧是否相等的
语句(statement)这个术语可用来描述Python语言的多种构成部分。可以将一个Python语句视作一个命令或计算。
if语句和if-else语句,以及本章编写的第一个程序(打印Hello, World!100次)都是复合语句
关于语句还有一点要注意,语句之间是可以有空格的,这不会影响代码的执行。空格有时被用来提高代码的可读性。
[插图]
3.16 术语表
关于语句还有一点要注意,语句之间是可以有空格的,这不会影响代码的执行。空格有时被用来提高代码的可读性。
第4章 函数
[插图]
第4章
函数
“函数应该做一件事。做好这件事。只能做这一件事。”
——罗伯特·C.马丁(Robert C.Martin)
“函数应该做一件事。做好这件事。只能做这一件事。”
本章将介绍函数(function):可接受输入,执行指令并返回输出的复合语句
通过函数,我们可以在程序中定义功能,并重复使用
函数可以有一个或多个参数,也可以不接受任何参数。如要定义不需要参数的函数,只需要在定义函数时把圆括号内置为空即可:
函数不仅可用于计算并返回值,还可以封装我们希望复用的功能
因为可以对函数进行复用,所以利用函数可以减少代码量
函数可接受两种参数。目前所看到的都是必选参数
异常处理使用try和except关键字。在你修改程序使用异常处理之后,如果用户第二个数字输入0,程序不会报错,而是会打印一段话告诉用户不要输入0。
try从句包含可能会发生的错误,except从句包含仅在错误发生时执行的代码。下面是在程序中进行异常处理的一个示例
这些注释被称为文档字符串(docstring)。文档字符串用于解释函数的功能,记录所需的参数类型。
档字符串的其他行列出了函数的参数、参数类型和返回值。文档字符串有助于开发者快速编程,因为不必通读代码,只需通过文档字符串即可了解函数的作用等必要信息。
函数:可接受输入和执行指令,并返回输出的复合语句。
第5章 容器
[插图]
第5章
容器
“愚者困惑,智者提问。”
——本杰明·迪斯雷利(Benjamin Disraeli)
“愚者困惑,智者提问。”
容器就像是文件柜,可有效整理数据。这里将学习3个常用的容器:列表、元组和字典
方法是与指定数据类型紧密相关的函数。方法与函数一样,可执行代码并返回结果。不同的是,只有在对象上才能调用方法。同样也可以传递参数给方法。调用字符串的upper和replace方法的示例如下:
方法是与指定数据类型紧密相关的函数。方法与函数一样,可执行代码并返回结果。不同的是,只有在对象上才能调用方法。同样也可以传递参数给方法。调用字符串的upper和replace方法的示例如下:
列表(list)是以固定顺序保存对象的容器
列表不仅可以保存字符串,它还可以保存任意数据类型。
如果可以使用循环访问对象中的每一个元素,那么该对象是可迭代的,被称为可迭代对象。
你可以使用加法操作符来合并两个列表
也可以使用关键字in检查某个元素是否在列表中
使用关键字not检查某个元素是否不在列表中:
即使元组中只有一个元素,也需要在该元素的后面加上逗号。只有这样,Python才能将其与其他为了表示运算顺序而放在圆括号中的数字标记进行区分
字典(dictionary)是另一种用于存储对象的内置容器。它们被用来链接键(key)和值(value)这两个对象
字典中存储的对象是无序的。字典的价值在于键与值之间的关联
需要成对存储数据的场景很多
字典是可变的。创建字典后,可通过语法“[字典名][[键]] = [值]”添加新的键值对,并通过语法“[字典名][[键]]”查找值
可以使用关键字in检查某个键是否在字典中,但不能用其检查某个值是否在字典中。
可以在容器中存储容器。
你可以在列表中保存列表
第6章 字符串操作
理论上,理论和实践没有区别。但实践上,是有区别的。
如果字符串跨越一行以上,可以使用三引号
与列表和元组一样,字符串也是可迭代的。
Python还支持使用负索引(negative index)查找列表中的元素:可用来从右向左查找可迭代对象中元素的索引(必须是一个负数)。使用索引-1可以查找可迭代对象中的最后一个元素
字符串和元组一样都是不可变的,无法修改字符串中的字符。如果想要修改,就必须创建一个新的字符串:
可使用乘法操作符,将字符串与数字相乘
可使用format方法创建新字符串,该方法会把字符串中的“{}”替换为传入的字符串
在replace方法中,第一个参数是要被替换的字符串,第二个参数是用来替换的字符串
可使用index方法,获得字符串中某个字符第一次出现的索引。将希望查找的字符作为参数传入,index方法可以返回该字符在字符串中第一次出现的索引:
[插图]
如果index方法没有找到匹配的结果,Python会报告异常错误。
可使用index方法,获得字符串中某个字符第一次出现的索引
在双引号前加上反斜杠,即可解决这个错
切片(slicing)可将一个可迭代对象中元素的子集,创建为一个新的可迭代对象。切片的语法是[可迭代对象][[起始索引:结束索引]]。起始索引(start index)是开始切片的索引,结束索引(end index)是结束索引的位置。
切片的语法是[可迭代对象][[起始索引:结束索引]]。起始索引(start index)是开始切片的索引,结束索引(end index)是结束索引的位置。
进行列表切片的示例如下:
起始索引和结束索引均留空,则会返回原可迭代对象:
第7章 循环
“百分之八十的成功只是出席。”
循环的意义是直到代码中定义的条件满足时才停止执行的代码块
7.5 continue语句
可使用continue语句(带关键字continue的语句)来终止循环的当前迭代,并进入下一次迭代。假设你想打印从1到5之间除了3以外的所有数字,可通过for循环和continue语句实现。示例如下:
可使用continue语句(带关键字continue的语句)来终止循环的当前迭代,并进入下一次迭代。
在上述循环中,当i的值等于3时,程序执行continue语句,但不会像break关键字那样让循环完全终止,而是会继续进行下一次迭代
循环中可嵌套的循环数量没有限制,但是最好要控制数量不要过多
第8章 模块
“坚韧与志气在任何时代都会带来奇迹。
假设你写了一个有10000行代码的程序。如果把全部代码写在一个文件里,查询起来将会非常困难。每次出现错误或异常时,不得不快速浏览10000行代码来查找导致问题的那行。为解决这个问题,程序员将大型程序分割成多个包含Python代码的文件,也被称为模块(module)。
假设你写了一个有10000行代码的程序。如果把全部代码写在一个文件里,查询起来将会非常困难。每次出现错误或异常时,不得不快速浏览10000行代码来查找导致问题的那行。为解决这个问题,程序员将大型程序分割成多个包含Python代码的文件,也被称为模块(module)。
使用模块之前,必须先导入(import):意味着要写代码,以便让Python知道从哪获取模块。可使用语法import [模块名]导入模块,将[模块名]替换为希望导入模块的名字。导入模块之后,即可使用其中的变量和函数。
8.2 导入其他模块
本节中,我们将创建一个模块,然后在另一个模块中导入该模块并使用其中的代码。首先,在计算机上创建一个名为tstp的新文件夹。在文件夹中,新建一个名为hello.py的文件。将如下代码添加到hello.py并保存文件:
本节中,我们将创建一个模块,然后在另一个模块中导入该模块并使用其中的代码
导入模块时,其中的代码都会被执行。创建一个名为module1.py的模块,代码如下:
[插图]
在名为module2.py的另一个模块中导入module1.py时,其中的代码将会被执行:
导入模块时,其中的代码都会被执行。创建一个名为module1.py的模块
[插图]
这个行为有时候会导致不便。比如你的模块中可能有测试代码,不希望在导入时执行。那么将模块中所有的代码放置在if name == “main“语句中,即可解决该问题。例如,可以将上例中的module1.py的代码改成如下示例:
这个行为有时候会导致不便。比如你的模块中可能有测试代码,不希望在导入时执行。那么将模块中所有的代码放置在if name == “main“语句中,即可解决该问题
运行该程序时,输出总是不变的。但是在module2.py中导入该模块时,module1.py中的代码不会运行,不会打印Hello!。
第9章 文件
为了避免程序在不同操作系统中运行出错,应使用内置的os模块来创建文件路径。模块中的path函数接受文件路径中的文件夹名作为参数,并自动构建完整的文件路径。示例如下:
[插图]
为了避免程序在不同操作系统中运行出错,应使用内置的os模块来创建文件路径。模块中的path函数接受文件路径中的文件夹名作为参数,并自动构建完整的文件路径
以下是支持的文件打开模式。
•”r”以只读模式打开文件。
•”w”以只写模式打开文件。如果文件已存在,会覆盖文件。如果文件不存在,则会创建一个新文件。
•”w”以只写模式打开文件。如果文件已存在,会覆盖文件。如果文件不存在,则会创建一个新文件。
open函数会返回一个叫文件对象(file object)的对象,可用来读/写文件
在使用上述语法打开文件时,会在[执行代码]运行完毕后自动关闭文件。下面是使用新语法读、写、关闭文件的示例:
[插图]
只要还在with语句内,就可以访问文件对象。在本例中,文件对象被命名为f。
在使用上述语法打开文件时,会在[执行代码]运行完毕后自动关闭文件。下面是使用新语法读、写、关闭文件的示例:
在本例中,文件对象被命名为f。Python执行完with语句中的代码后,会自动关闭文件。
如果要读取文件,可传入”r”作为open函数的第二个参数。然后调用文件对象的read方法,会返回一个包含文件所有行的可迭代对象
在没有关闭又重新打开文件的情况下,你只能调用文件对象的read方法一次
因此,如果后续程序需要,应该将文件内容保存在一个变量或容器中
需要管理如Excel等报表软件的程序员经常使用CSV文件。CSV文件中用逗号分隔的每个数据代表报表中的一个单元格,每行代表一个报表行
第11章 练习
练习成就不了完美。多练习会产生髓磷脂,是髓磷脂让你做到完美。
还建议多逛逛http://www.stackoverflow.com,可以在上面提出编程相关的问题,会得到社区成员的解答。
学会寻求他人的帮助是非常重要的。想办法解决问题是学习过程中很重要的部分;但是在某些时候,可能会事倍功半。过去笔者在做项目时,常常纠结于要自己解决所有问题。
http://www.stackoverflow.com,可以在上面提出编程相关的问题,会得到社区成员的解答。
学会寻求他人的帮助是非常重要的。想办法解决问题是学习过程中很重要的部分;但是在某些时候,可能会事倍功半
过去笔者在做项目时,常常纠结于要自己解决所有问题。这样就导致效率低下。如果今天再出现类似的情况,则会上网提问。每次提问后都会有人提供新的思路。因此,编程社区对于程序员的帮助是十分巨大的。
这样就导致效率低下。如果今天再出现类似的情况,则会上网提问。每次提问后都会有人提供新的思路。因此,编程社区对于程序员的帮助是十分巨大的。
第12章 编程范式
编程范式(programming paradigm),即编程风格。当前有许多不同的编程范式。要达到专业程序员水平,则需要学习面向对象编程或函数式编程范式。本章中将学习过程式编程、函数式编程和面向对象编程,并着重介绍面向对象编程。
编程范式(programming paradigm),即编程风格。当前有许多不同的编程范式。要达到专业程序员水平,则需要学习面向对象编程或函数式编程范式
12.1 状态
不同编程范式之间的根本区别之一,就是对状态(state)的处理。状态,是程序运行时其内部变量的值。全局状态(global state)是程序运行时其内部全局变量的值。
不同编程范式之间的根本区别之一,就是对状态(state)的处理。状态,是程序运行时其内部变量的
过程式编程(procedural programming):这种编程风格要求你编写一系列步骤来解决问题,每步都会改变程序的状态。在过程式编程中,写的是“先做这个,再做那个”这样的代码。
由于我们将程序的状态都保存在全局变量中,如果程序慢慢变大就会碰到问题。因为随着程序规模扩大,可能会在多个函数中使用全局变量,我们很难记录都有哪些地方对一个全局变量进行了修改
因为随着程序规模扩大,可能会在多个函数中使用全局变量,我们很难记录都有哪些地方对一个全局变量进行了修改。例如,某个函数可能改变了一个全局变量的值,在后面的程序中又有一个函数改变了相同的变量,因为写第二个函数时程序员忘记了已经在第一个函数中做了修改。
例如,某个函数可能改变了一个全局变量的值,在后面的程序中又有一个函数改变了相同的变量,因为写第二个函数时程序员忘记了已经在第一个函数中做了修改。这种情况经常发生,会严重破坏程序的数据准确性。
随着程序越来越复杂,全局变量的数量也逐渐增加。再加上程序需要不断添加新的功能,也需要修改全局变量,这样程序很快会变得无法维护。而且,这种编程方式也会有副作用(side effects),其中之一就是会改变全局变量的状态。使用过程式编程时,经常会碰到意料之外的副作用,比如意外递增某个变量两次。
而且,这种编程方式也会有副作用(side effects),其中之一就是会改变全局变量的状态。使用过程式编程时,经常会碰到意料之外的副作用,比如意外递增某个变量两次。
这些问题促使了面向对象编程和函数式编程的出现,二者采取了不同的方法来解决上述问题。
他们唯一使用的状态就是传给函数的参数。一个函数的结果通常被继续传给另一个函数。因此,这些程序员通过函数之间传递状态,避免了全局状态的问题,也因此消除了由此带来的副作用和其他问题。
函数式编程的专业术语很多,有人下过一个还算精简的定义:“函数式代码有一个特征:没有副作用。它不依赖当前函数之外的数据,也不改变当前函数之外的数据。”并给出了一个带副作用的函数。示例如下:
函数式代码有一个特征:没有副作用。它不依赖当前函数之外的数据,也不改变当前函数之外的数据。
函数式编程的一个优点,在于它消除了所有由全局状态引发的错误(函数式编程中不存在全局状态)。但是也有缺点,即部分问题更容易通过状态进行概念化。例如,设计一个包含全局状态的人机界面,比设计没有全局状态的人机界面要更简单。
函数式编程的一个优点,在于它消除了所有由全局状态引发的错误(函数式编程中不存在全局状态)。但是也有缺点,即部分问题更容易通过状态进行概念化。例如,设计一个包含全局状态的人机界面,比设计没有全局状态的人机界面要更简单。
12.4 面向对象编程
面向对象(object-oriented)编程范式也是通过消除全局状态来解决过程式编程引发的问题,但并不是用函数,而是用对象来保存状态。在面向对象编程中,类(class)定义了一系列相互之间可进行交互的对象。类是程序员对类似对象进行分类分组的一种手段。
面向对象(object-oriented)编程范式也是通过消除全局状态来解决过程式编程引发的问题,但并不是用函数,而是用对象来保存状态。在面向对象编程中,类(class)定义了一系列相互之间可进行交互的对象
每个对象都是类的示例。如果定义了一个叫Orange的类,然后创建两个Orange对象,那么每个对象都是Orange类的实例;它们的数据类型相同,都是Orange。
对象和实例这两个术语可以替换使用。在定义类时,该类的所有实例是类似的:都拥有类中定义的属性,如颜色或种类,但是每个实例的具体属性值是不一样的。
Python中的类名都是以大写字母开头,且采用驼峰命名法,即如果类名由多个单词组成,每个单词的第一个字母都应该大写,如LikeThis,而不是用下划线分隔
类中的代码主体可以是一个单一语句,或一个叫方法(method)的复合语句。方法类似于函数,但因为是在类中定义的,只能在类创建的对象上调用方法
方法的定义方式与函数定义方式相同,但有两处区别:一是必须在类的内部定义方法,二是必须接受至少一个参数(特殊情况除外)。按照惯例,方法的第一个参数总是被命名为self。创建方法时,至少要定义一个参数,因为在对象上调用方法时,Python会自动将调用方法的对象作为参数传入。
方法的定义方式与函数定义方式相同,但有两处区别:一是必须在类的内部定义方法,二是必须接受至少一个参数(特殊情况除外)。按照惯例,方法的第一个参数总是被命名为self
创建方法时,至少要定义一个参数,因为在对象上调用方法时,Python会自动将调用方法的对象作为参数传入。示例如下
示例如下:
[插图]
可使用self定义实例变量(instance variable):属于对象的变量。如果创建多个对象,各自都有不同的实例变量值。通过语法self.[变量名] = [变量值]定义实例变量。通常是在特殊方法__init__(代表初始化)
可使用self定义实例变量(instance variable):属于对象的变量。如果创建多个对象,各自都有不同的实例变量值。通过语法self.[变量名] = [变量值]定义实例变量
双下划线包围的方法(如__init__),被称为魔法方法(magic method),即Python用于创建对象等特殊用途的方法。
创建新对象的过程,也被称为创建类的实例。
可以使用Orange类创建多个橘子对象。示例如下
面向对象编程有多个优点:鼓励代码复用,从而减少了开发和维护的时间;还鼓励拆解问题,使代码更容易维护。但有一个缺点便是编写程序时要多下些功夫,因为要做很多的事前规划和设计。
面向对象编程有多个优点:鼓励代码复用,从而减少了开发和维护的时间;还鼓励拆解问题,使代码更容易维护。但有一个缺点便是编写程序时要多下些功夫,因为要做很多的事前规划和设计。
第13章 面向对象编程的四大支柱
面向对象编程有四大概念:封装、抽象、多态和继承
封装(encapsulation)包含两个概念。第一个概念是在面向对象编程中,对象将变量(状态)和方法(用来改变状态或执行涉及状态的计算)集中在一个地方——即对象本身
封装包含的第二个概念,指的是隐藏类的内部数据,以避免客户端(client)代码(即类外部的代码)直接进行访问。
多态(polymorphism)指的是“为不同的基础形态(数据类型)提供相关接口的能力”
组合(composition)。通过组合技巧,将一个对象作为变量保存在另一个对象中,可以模拟“拥有”关系。例如,可使用组合来表达狗和其主人之间的关系(狗有主人)。
第16章 Bash
当然,要想做到职业编程的水平,需要一定的天赋。但是还有其他应该掌握的技能,比如命令行的使用。命令行是除了编码之外,其他工作的“控制中心”。
第21章 数据结构
本章将学习如何创建两个新的数据结构:栈和队列。
队列可模拟等待购买电影票的队伍
第22章 算法
本章将简要介绍算法。算法(algorithm)是解决问题的一系列步骤。问题的类型多种多样,从列表检索到打印歌词都可以用算法解决
第23章 最佳编程实践
生产代码(production code)是用户使用的产品中的代码
这些原则大多源自《The Pragmatic Programmer》这本书,读完这本书后我的代码质量大幅提升。
23.1 写代码是最后的手段
作为一名软件工程师,你在工作时应尽量少写代码。碰到问题时,你首先想到的不应该是“我怎么解决这个问题”
写代码是最后的手段
作为一名软件工程师,你在工作时应尽量少写代码。碰到问题时,你首先想到的不应该是“我怎么解决这个问题”,而是“其他人是不是已经解决了这个问题,我能使用他们的方案吗?”如果你自己去解决一个常见的问题,很有可能别人已经有了解决方案
,而是“其他人是不是已经解决了这个问题,我能使用他们的方案吗?”如果你自己去解决一个常见的问题,很有可能别人已经有了解决方案。先在网上检索解决办法,只有在确定没人解决过该问题之后,才开始自己动手解决。
先在网上检索解决办法,只有在确定没人解决过该问题之后,才开始自己动手解决。
23.2 DRY
DRY是不要重复自己(Dont’t Repeat Yourself)的简称,指的是不要在程序中编写重复的或是基本相同的代码。正确的做法是将代码封装至函数中,后续可重复使用。
23.3 正交性
23.2 DRYDRY是不要重复自己(Dont’t Repeat Yourself)的简称,指的是不要在程序中编写重复的或是基本相同的代码。正确的做法是将代码封装至函数中,后续可重复使用。
正交性(Orthogonality)是《The Pragmatic Programmer》中提倡并普及的另一个重要编程原则。亨特和托马斯认为,“该术语已经被用来表示某种独立性或解耦化。如果两个或多个事物之间的变化不会相互影响,那么它们之间就存在正交性。在设计优良的系统中,数据库代码与用户界面之间是正交的;调整用户界面不会影响数据库,替换数据库也不会改变用户界面。”
如果两个或多个事物之间的变化不会相互影响,那么它们之间就存在正交性。在设计优良的系统中,数据库代码与用户界面之间是正交的
23.4 每个数据都只应保存在一处
假设手上有一个数据,我们只需要将其存储在一个地方。例如,我们正在开发用来处理手机号码的软件,其中有两个函数要使用地区编号的列表,这里要确保程序中只有一个地区编号列表,而不是为每个函数重复创建。
每个数据都只应保存在一处
23.5 函数只做一件事
如果发现函数太长,请检查其是否在完成多个任务。将函数限制为只完成一个任务有很多好处。首先,代码可读性增强,因为函数名称可以直接说明其功能。如果代码出错,调试也将更加方便,因为每个函数只负责一个特定的任务,我们可以快速隔离并调试问题函数。
将函数限制为只完成一个任务有很多好处。首先,代码可读性增强
软件的复杂性大多源自试图两件事当一件事做。
若耗费时间过长,你的做法很可能就是错的
23.7 第一次就要用最佳的方法完成
在编程时你可能会这样想:“我知道有一个更好的做法,但是我已经开始编码了,不想回头重写。”那我建议你停止编码,改用更好的方法来完成。
第一次就要用最佳的方法完成
在编程时你可能会这样想:“我知道有一个更好的做法,但是我已经开始编码了,不想回头重写。”那我建议你停止编码,改用更好的方法来完成。
学习新编程语言的惯例,能够提升阅读用该语言编写的代码的速度。PEP8是一系列编写Python代码的指南,强烈建议阅读,可前往https://www.python.org/dev/peps/pep-0008/查看。
笔者使用JetBrains公司开发的一款名为PyCharm的IDE。他们提供了免费版和专业版两个版本,
记录日志(logging)指的是在软件运行时记录数据的做法
程序测试指的是检查程序是否“达到了设计和开发要求,对各类输入返回正确的结果,功能执行耗时在可接受范围,可用性足够高,可在目标环境下安装和运行,并且实现了相关利益方所期待的效果。”为了进行程序测试,程序员要额外编写程序。
python.org/3/library/unittest.html学习如何使用Python自带的unittest模块。
23.12 代码审查
在代码审查(code review)时,同事会阅读你的代码并提供反馈。建议尽可能多地进行代码审查,尤其对于自学成才的程序员来说。即使你遵守了本章中所列的所有最佳实践,也有可能存在错误的做法。
在代码审查(code review)时,同事会阅读你的代码并提供反馈。建议尽可能多地进行代码审查,尤其对于自学成才的程序员来说
你需要有经验的程序员对你的代码进行检查,指出所犯的错误,这样才有可能解决。
Code Review是一个专注于代码审查的程序员社区。任何人都可以登入该网站,提交代码。社区的其他成员会审查代码,并反馈做得好的地方以及可以改进的地方。
你需要有经验的程序员对你的代码进行检查,指出所犯的错误,这样才有可能解决
Code Review是一个专注于代码审查的程序员社区。任何人都可以登入该网站,提交代码
第24章 第一份编程工作
本书最后一部分的目标是帮助大家求职。拿下第一份编程工作需要付出更多努力,但是如果采纳书中的建议,应该不会有太大问题。幸运地是,只要你得到了第一份工作且积累了经验,在寻找新的工作机会时,招聘者会主动接触你。
本书最后一部分的目标是帮助大家求职。拿下第一份编程工作需要付出更多努力,但是如果采纳书中的建议,应该不会有太大问题
我的建议是专注某一个感兴趣的编程领域,成为该领域内的专家。专注一个编程方向会使得求职更容易。
专注一个编程方向会使得求职更容易。
Web开发和移动开发是两个非常流行的编程方向,各自包含两个细分领域:前端和后端。应用的前端是用户可见的部分,如Web应用的图形界面;后端是用户看不见的地方,是向前端提供数据的部分。
Web开发和移动开发是两个非常流行的编程方向,各自包含两个细分领域:前端和后端
应用的前端是用户可见的部分,如Web应用的图形界面;后端是用户看不见的地方,是向前端提供数据的部分。市场上招聘的岗位名称大多类似“Python后端开发”,意味着公司寻找的是负责网站后端开发且熟悉Python的程序员。岗位描述中会列出理想的候选人应该熟悉的技术,以及其他需要掌握的能力。
有的公司则只招聘全栈程序员,即前后端均掌握的程序员
我们还可以从事许多其他编程领域,如安全、平台开发和数据科学。在招聘程序员的网站上查看岗位职责,可以方便了解不同编程领域的要求
Python官网提供了一个Python工作列表:https://www.python.org/jobs,可以先从这里找起。先查看几个岗位的要求以及所使用的技术,了解需要学习哪些内容才能成功竞争该岗位。
24.2 积累初期经验
在成功应聘上第一个编程工作前,你需要积累经验。
Python官网提供了一个Python工作列表:https://www.python.org/jobs,可以先从这里找起。先查看几个岗位的要求以及所使用的技术,了解需要学习哪些内容才能成功竞争该岗位。
在成功应聘上第一个编程工作前,你需要积累经验。但是如果没有公司愿意在你没有经验的情况下雇佣你,怎么积累经验呢?有几个解决办法。首先,你可以参与开源项目,自己启动一个开源项目或向GitHub上的其他开源项目提交代码。
但是如果没有公司愿意在你没有经验的情况下雇佣你,怎么积累经验呢?有几个解决办法。首先,你可以参与开源项目,自己启动一个开源项目或向GitHub上的其他开源项目提交代码。
另一个方式是做外包。在Upwork等类似网站创建账号,试着申请规模较小的编程工作。
另一个方式是做外包。在Upwork等类似网站创建账号,试着申请规模较小的编程工作。我建议去找确实有编程外包需求的朋友,让他们在Upwork等网站注册账号,然后正式雇用你完成任务。这样后续可以给你很不错的评价。其他人看到你至少成功完成了一项工作之后,被雇佣的概率就会提高,因为你已经成功建立了可信度。
24.3 拿到面试机会
通过开源项目获外部工作成功积累编程经验后,可以开始寻找面试机会。我发现一个有效地获取面试机会的方法,就是通过LinkdedIn。如果你还没有LinkedIn账号,建议创建账号并试着与潜在雇主进行沟通。
通过开源项目获外部工作成功积累编程经验后,可以开始寻找面试机会
电话面试是与招聘者进行的,所以通常不涉及技术问题,但是我也在第一轮面试中被问过技术问题。面试内容为你熟悉的技术,之前的工作经验,并判断能否适应公司的文化等。
如果面试效果不错,将进入第二轮技术电话面试,与技术团队成员进行交流。
面试内容为你熟悉的技术,之前的工作经验,并判断能否适应公司的文化等。
他们可能会问与第一轮面试中相似的问题,但是这轮中的问题会新增一个技术测试。负责面试的工程师会提供一个网址,上面有已经准备好的编程问题,需要你来解决
我建议买一块白板提前练习,因为在白板上解决编程问题比在计算机上解决问题要难得多。
24.5 面试技巧
大部分编程面试聚焦两个主题:数据结构和算法。要想顺利通过编程面试,你需要精通这两个领域。这也会帮助你成为一名更优秀的程序员。
大部分编程面试聚焦两个主题:数据结构和算法。要想顺利通过编程面试,你需要精通这两个领域
我强烈建议使用LeetCode网站练习,因为我发现别人在面试中问的问题,在这个网站上都可以找到答案。
第25章 团队协作
由于主要依靠自学,因此你可能会习惯独自编程。但是在加入公司后,你需要学习如何进行团队协作。即使你自己创业,最终也要招聘其他程序员,这时也要学会团队协作
提问前请先搜索
25.4 冒名顶替综合征每名程序员都会偶尔感到无力,不管自己多么努力,总是会出现意料之外的事情。作为一名自学成才的程序员,在别人让你做一件从未听说过的事情时,很容易就会感到挫败,或者觉得自己还有很多不了解的计算机科学概念。每个人都会碰到这些事情,不仅仅是你。
每个人都会碰到这些事情,不仅仅是你。
我有一位获得斯坦福计算机硕士学位的朋友告诉我,他也有类似的感受,这让我很吃惊。他说,他所处的项目中每个人都有冒名顶替综合征(imposter syndrome)。他发现大家要么非常谦虚,愿意承认自己有些事情并不了解,要么假装自己什么情况都清楚(事实上不是)
我要告诉大家的是,你走到如今这一步付出了很大的努力,即使做不到无所不知也是可以理解的,因为没有人能够做到。只需要保持谦虚的心态,不断学习不了解的问题,你就会持续成长。
第27章 下一步
[插图]
第27章
下一步
“热爱你所掌握的行业,知足常乐。”
——马库斯·奥勒留斯(Marcus Aurelius)
热爱你所掌握的行业,知足常乐。
27.1 找到导师
导师能够帮助你将编程能力提升一个档次。学习编程的一个困难在于,有太多你做得不够好的地方,但是你自己不知道。我前面也提到,可以通过代码审查来发现不足。导师可以和你一起做代码审查,帮助你优化编码过程,推荐优秀的书籍,教会你之前不理解的编程概念。
找到导师
导师能够帮助你将编程能力提升一个档次。学习编程的一个困难在于,有太多你做得不够好的地方,但是你自己不知道
编程领域中有一个叫“黑盒”的概念,指的是某个你在使用,但是并不了解其工作原理的东西。刚开始编程时,对你来说一切都是黑盒。提升编程能力的一个最好的方式,就是打开碰到的每个黑盒,努力掌握其原理。有位朋友曾经跟我说,他自己的一个重大的“啊哈”时刻,就是意识到命令行本身其实就是一个程序。打开黑盒,就是我所说的加深理解。
我必须要加深自己的理解。不要停留在一个答案,寻找所有能发现的解释。敢于在网络上提问,接纳不同的观点。
另外一种加深理解的方法,便是亲自去开发希望获得更深理解的东西。不懂版本控制?那就试着业余时间自己开发一个简易的版本控制系统。
不要停留在一个答案,寻找所有能发现的解释。敢于在网络上提问,接纳不同的观点。
另外一种加深理解的方法,便是亲自去开发希望获得更深理解的东西
读完丹尼尔·科伊勒的《The Talent Code》提升了我的编程能力,因为他教会了我掌握任何一个技能所需要的方法论。时刻注意编程领域之外的动态,注重吸收那些有助于编程的知识。
我要给你的最后一个建议,是尽可能多花时间阅读其他人的代码。这也是程序员自我提升的最好办法之一。在学习过程中,记得保持写代码和读代码之间的平衡
这也是程序员自我提升的最好办法之一。在学习过程中,记得保持写代码和读代码之间的平衡。刚开始时,阅读其他人的代码会有些困难,但是要坚持,因为你可以从其他程序员身上学到宝贵的财富。
我希望你对本书感到满意。
刚开始时,阅读其他人的代码会有些困难,但是要坚持,因为你可以从其他程序员身上学到宝贵的财富。