1.2 Python快速入门
从现在开始,我们就要进行Python编程了。在本节,你不需要知道我们编写的代码计算机是怎么执行的,只要关注代码逻辑就可以了。我们通过一个个重要的知识点,如百米冲刺般冲向Python,并拥抱它。
接下来,你将看到Python的基础语法,不需要动手写代码。如果你想跟着笔者编写本节的代码,记得去1.3节看看如何安装Python。
1.2.1 print()
print()是Python的一个内置函数。学习Python,你第一个要学会的就是print(),因为它可以让你输出程序员横空出世的第一声“啼哭”:“hello world!”。
以上代码的执行成功宣示着这个世界上又多了一位程序员。不过,在交互式编程环境下,我们并不需要借助print()来输出信息:
因此,在交互式编程环境下,我们尽量不用或者少用print(),毕竟需要多打那么多字。但无论在脚本执行还是交互式编程环境下,想输出过程数据,还是需要借助print()。比如,在for循环中,如果想看到每次循环处理的数据结果,就要使用print()。
print()可以输出多个内容,我们只要在括号内用英文逗号将它们隔开就行。还可以写一个sep并让它“等于”一个字符,就会用这个字符把它们连接起来:
最后一行代码中的\n是换行的意思。如果两个print()一起执行,数据会显示在两行上,如果让end“等于”一个字符,上一行输出的值与下一行输出的值会用这个字符连接起来:
鉴于我们刚开始学习,不能介绍太多关于print()的用法,如果你已经有一定的Python基础了,可以通过https://www.gairuo.com/p/python-print浏览它的更多功能。
1.2.2 基本数据类型
数据是计算机存储和处理的基本信息单元,它将我们要解决的原始问题素材以一定的结构形式抽象。Python内置定义了一些常见的数据结构形式,再通过这些数据结构衍生出众多的数据结构。
Python内置的不需要借助内部或者外部库的数据类型称为基本数据类型,主要有数字、字符串、布尔、元组、列表、字典和集合等。表1-1给出了这些数据类型的说明与示例。
表1-1 Python的基本数据类型
以上七大基本数据类型构成了Python编程的数据基座,也是执行效率最高的数据类型,它们的特性和支持的操作可以帮助我们解决很多现实问题,今后我们在自己定义的数据类型中会用到它们。
这里需要说明的是常用的布尔类型的True和False以及空类型的唯一值None。布尔类型表示逻辑真假,是数字类型的子类型,仅两个值,即True和False,参与数字计算时分别按1和0处理。None是Python的一个特殊类型,它是一个常量,经常表示数据中的缺失值或者不存在的值。
关于Python完整的数据类型系统以及各个类型支持的操作,我们将在后文详细介绍。
1.2.3 构造基本数据
由于基本数据类型会经常用到,为方便起见,Python可以让我们直接写出这些数据,或者提供了一些内置的函数来帮助我们构造这些类型的数据。接下来,我们在交互式编辑器中尝试定义这些数据。
直接写出数字就能构造相应的数字类型,也可以用内置的函数来构造数字类型:
字符串用引号包裹字符内容,也可以用内置函数str()来构造:
布尔类型直接写True和False,或者用内置函数bool()将其他类型转为布尔类型:
元组用圆括号包裹所有元素,元素之间用英文逗号分隔,如果只有一个元素,逗号不能省略。也可以用内置函数tuple()来构造元组。
列表和元组类似,但它用方括号包裹,可以用list()函数构造:
字典的每个元素是由键值对构成的,键与值用冒号分隔,每个元素用英文逗号分隔,最外层用花括号包裹。还有一种方法是用内置函数dict()中键值组成的“等式”来构造。
集合中的元素不能重复,如果指定的值有重复,它会舍弃重复的值。集合也用花括号包裹,但它与字典不同的是每个元素没有键值结构。内置函数set()是构造集合的方法。
以上是基本数据类型的构造方法,要特别注意它们返回时的样子,熟练掌握基本数据类型对于我们继续学习非常重要。
1.2.4 赋值
有些数据非常大,为了方便操作这些数据,同时也为了引用更多的对象(指Python对象,这是一个面向对象编程中的概念,我们后面会反复提到),Python可以为数据起一个名字,后续在使用数据的时候只要提及这个名字就可以了。给数据(对象)起名字的过程叫作赋值。
我们来看以下操作:
a和b分别是数字1和2的名字,两个等号并不是数学中的等于,而是赋值操作,a=1是一个赋值表达式。在后面的加法操作中直接使用a和b就可以分别引用数字1和2,得到最终的计算结果。
此外,名字引用的数据并不是一成不变的,可以随时为其赋其他的数据,还可以将计算后的结果赋值给它们,甚至可以将名字赋值给其他名字。见以下代码:
这些名字又称为变量,它们自身并不存储数据,只是指向所赋值的数据。命名有一定的要求,一般由非数字开头的英文字母、数字、下划线(_)组成,如果包含几个单词则用下划线连接,因为名字不能包含空格。
1.2.5 注释
注释是以井号(#)开头的内容,可以在行首,也可以在行中,井号后面至行末尾的所有内容就是注释的内容。Python不会执行注释里的内容。
注释的目的是告诉别人和自己(没错,因为人会遗忘)代码是干什么的,在上述构造数据类型的代码中,我们使用了大量的注释,包括交互模式中返回的内容我们也用井号标为注释。
注释还有个应用就是将暂时不用的代码注释掉以备后面使用,这在我们编写代码时非常有用。
以下代码显示了以上这几种场景:
要注意的是,Python只有单行注释,没有多行注释。以上代码开头用三引号包裹的代码介绍文字并不是注释,而是一个多行字符串,Python会执行,只是我们没有给它起名字,后续不容易引用它。
1.2.6 流程控制
如果只有数据,那么程序就是一潭死水,无法实现我们要实现的逻辑。各种程序算法都需要按一定的流程对数据进行操作。Python提供了多种流程控制机制,让我们能够对数据方便地进行操控。表1-2列出了常用的流程控制操作。
表1-2 Python的流程控制操作
灵活使用Python中的流程处理方法,能够让我们随心所欲地处理各种数据,完成复杂的操作。接下来我们快速感受一下这些操作。
if else是基础的流程控制语句,它的功能是如果满足一定的条件则进行对应的操作,例如:
for循环对多个元素的内容一一进行处理,直到全部处理完。例如以下的range()函数是Python内置的从0开始的一个等差数列,for循环对其值一一处理,丢弃大于5的内容:
while建立一个循环,在满足条件的情况下会无休止地执行循环,直到不满足条件时才停止。以下程序在每一次循环中会对年龄增加1,当年龄不满足条件“小于12岁”时停止执行,跳出循环。
break可以跳出循环。我们将上述代码写成一个死循环,然后设置条件跳出这个死循环,代码如下:
当age大于11的时候,程序跳出了这个死循环,停止执行。
continue可以跳过本次循环,进入下一次循环:
break和continue除了在while循环中使用外还可以应用在其他类型的循环中。pass表示不做任何事情,也可以在编写代码时用于占位,后期再编写对应位置的代码。
while很容易编写出死循环,因此对于有限长度的数据尽量用for循环来进行迭代。当然,很多应用程序其实是死循环,比如在电脑或者手机上运行的界面程序,除非你点击关闭按钮或者让它退到后台,否则它会永远执行下去,这时候还是需要用while来编写。
match case模式匹配是一个较新的功能,在后文中我们将详细介绍。
1.2.7 函数
函数是真正的工具,它能够帮助我们重复处理数据,就像计算器一样,无论什么时候,只要我们输入数字和符号,它总是能计算出结果。函数和数据一样,也有一个名称,有输入的数据格式,即参数,还有按逻辑返回的结果,名称、参数和返回结果是函数的三个重要元素。
Python内部提供了很多函数,前面讲过的print()和range()以及构造数据类型的list()、str()、dict()等都可以认为是函数。调用函数时写上函数的名称然后写一个括号,在括号里传入参数,执行,就得到了函数的返回结果。
Python是用def关键字来定义函数的,比如我们定义一个加法计算器并调用:
用return关键字来引导函数返回的内容,如果不写return语句,则返回的是None。
Python还允许定义匿名函数,也就是没有名字的函数,这在一些简单计算逻辑中很有用,可以让我们快速给出计算规则。匿名函数由lambda关键字来定义,示例代码如下:
上述代码定义了一个函数,其中参数func是一个函数,用来定义参数a和b的计算方法,在调用这个函数时,由于我们的计算方法比较简单,就使用匿名函数来定义计算方法。
1.2.8 类
Python中一切都是对象。这个说法你可能之前听过,也可能这是第一次听,但希望你时刻牢记这句话。对象(object)是一个非常抽象的概念,可以是一个数据结构、一个函数,甚至一段代码。关于对象的概念我们将在后文中详细介绍。
类(class)是产生对象的工具,或者可以称作模板,就像我们做幻灯片时,最好有个幻灯片模板,这样我们就能做出标准化的幻灯片,能够保证制作幻灯片的效率。
Python使用关键字class来创建类,比如我们创建一个学生类,将来用这个类生成一个个具体的学生实例。
我们定义的学生类有一个姓名属性,有say()和add()两个方法,一个用来说话,一个用来做加法运算。接下来我们生成一个具体的学生实例,也就是所谓的实例化。
类还可以继承(小学生继承学生)、重写方法(将加法重写为10以内的加法)等,在今后的学习的我们会一一介绍。
1.2.9 模块和包
Python自身提供了很多内置的模块来增强其功能,而且众多开发者还开发了数以百万计的库来解决各个领域的问题。
比如,要求一个弧度正弦值,Python内置的数学模块math可以帮助我们,只要用import语句导入即可使用:
还可以在终端中通过pip命令安装第三方库,如通过pip install numpy命令安装知名的矩阵运算库来解决向量的计算问题。以下代码用NumPy来完成向量的乘法:
在文件目录下增加名为__init__.py的空文件,可作为包被导入使用。
1.2.10 小结
在本节,我们了解了Python的基础能力,对Python的核心操作有了初步的认知。程序是由数据和算法组成的,Python为我们提供了7种基本数据类型,利用好这些基本数据类型,对于我们创建新的数据类型非常有帮助。
流程控制语句是程序的逻辑骨架,它可以串联起数据,产生新的数据和操作,满足我们对程序的控制。类是实现面向对象的特性的工具,它可以让我们自己定义数据结构和功能,完成对现实问题的抽象。
本节中有些内容并不是很容易理解,但不用在意,这只是开始。有了初步的印象,我们就可以学习更深层次的Python内容。