第1章 初识Python
这是针对有其他语言基础编写的Python教材,之前你可能学过C语言、学过Java,都能用自己熟悉的语言写出特定的代码让计算机工作,然后,对数据分析、办公自动化、机器学习或者深度学习感兴趣,这个时候你动了学Python的想法,Python和其他语言一样,也有自己的语法结构、标准库函数和开发环境功能,当然还有庞大的第三方类库,这弄得很多人学的很迷茫,要不要都学,应该学到什么程度才能满足自己的好奇心或者解决自己的问题,好在每个人都有自己的特殊需求,在学习过程中可以忽略大多数内容,只需要学习自己感兴趣的部分内容,就能编写出解决自己问题的程序,但是无论对什么方向感兴趣,Python的语言基础你还是要掌握的。
尽管你可能有其他计算机语言的基础,但在动手之前,你必须学习一些Python基本概念,就像学习大多数语言一样,基本概念既枯燥又啰唆,但是这些基本概念恰恰是你能指挥你的计算机完成你目标任务的基础。
本章会有几个简单的例子,简单到你几分钟就能完成,请不要跳过,这些简单的例子会告诉你在Python有关数据类型、定义变量、变量赋值和如何书写表表达式。我们建议你在你熟悉的开发环境中练习他,建议用集成IDE,比如PyCharm或者VsCode,当然有很多人对IDE有恐惧症,可以考虑使用mu-editor,或者Jupyter Notebook,这两者都是简洁Python的交互IDE,如果按照英文的翻译来说,也称为交互式环境,简称“REPL(‘读取—求值—输出’循环)”。交互式环境每次运行(或“执行”)一条Python指令,并立即显示结果。使用交互式IDE对于理解基本Python语法帮助很大,所以你在看本书的时候,建议使用自己熟悉的IDE练习,边看书边做这样的学习过效果远胜于纸面阅读。
1.1 Python环境的安装
我们可以从Python的官方网站下载到对应于Windows、macOS和Linux操作系统的Python版本。作者写书的时候的最新版是3.10,本书的代码均可以在这个版本上运行,当然,并不一定非要这个版本,笔者在成稿的时候做了的验证,Python3.5+即可完整运行本书所有实例,提醒各位读者,Python 2.X已经成为过去,本书的代码不能保证在Python 2.X的环境下可以完美运行,请不要在Python 2.X练习本书代码,尤其是后面的游戏和办公自动化环节。
1.1.1 官网安装Python
打开Python的下载官网https://www.python.org/downloads/,你可以在下载页面上找到针对64位或32位计算机以及特定容器的Python安装包,所以你要确你的操作系统是32位还是64位的,一般可以这么判定,2006年后的计算机,几乎都是64位;2006年之前的,就有可能是32位的,可以通过下面的操作或者命令确认计算机到底是64位还是32位的:
- 在Windows操作系统上,选择开始▶控制面板▶系统。检查系统类型是64位还是32位。
- 在macOS上,进入Apple菜单,也就是点击右上角那个小苹果图标,选择关于本机▶系统报告▶硬件,然后查看处理器名称字段。如果是Intel Core Solo或Intel Core Duo,则机器是32位的;如果是其他(包括Intel Core 2 Duo),则机器是64位的。
- 在Linux操作系统上,打开Terminal窗口,运行命令uname -m。如果显示是i686则是32位,x86_64则是64位。
在Windows操作系统上,下载Python安装程序(文件扩展名是.msi),并双击它。按照安装程序显示在屏幕上的指令来安装Python,步骤如下。
1.选择Install for All Users,然后单击Next。
2.在接下来的几个窗口中,依次单击Next,接受默认选项。
在macOS上,下载适合你的macOS版本的.dmg文件,双击它。按照安装程序向导安装Python,步骤如下:
1.当DMG包在一个新窗口中打开时,双击Python.mpkg文件,会提示输入管理员口令。
2.单击 继续,跳过欢迎部分,并单击 同意,并接受软件许可协议。
3.在最后的窗口中,单击 安装。
Linux有很多发行版,常见的要么是Redhat系的,要么是Arch系的,每个系的包管理工具不同,如果使用的是Debain系Linux操作系统,可以从命令行窗口安装Python,步骤如下。
1.打开Terminal窗口。
2.输入sudo apt-get install python3。
3.输入sudo apt-get install idle3。
4.输入sudo apt-get install python3-pip。
其他系的Linux发行版安装Python的方法,请查阅相应发行版的说明,当然网络也有很多这类的帖子。
还有个三个平台都通用的方法,使用Anaconda
1.1.2 通过Anaconda使用Python
Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。 因为包含了大量的科学包,Anaconda 的下载文件比较大(约 531 MB),如果只需要某些包,或者需要节省带宽或存储空间,也可以使用Miniconda这个较小的发行版(仅包含conda和 Python)。
Conda是一个开源的包、环境管理器,可以用于在同一个机器上安装不同版本的软件包及其依赖,并能够在不同的环境之间切换
Anaconda包括Conda、Python以及一大堆安装好的工具包,比如:numpy、pandas等,Miniconda包括Conda、Python
进入官网https://www.anaconda.com/products/individual,选择个人版,官网会自动侦测你的系统,定位到适合你i系统的安装包,笔者写稿的时候使用的是Linux故自动定位到如下界面:
下载,运行安装程序,根据提示回答相应问题即可。
1.1.3 代码编辑器的选择
适用于Python的IDE集成环境有很多,对练习来说,不建议采用复杂的集成环境,最好是界面简单,功能高度集中的那种,笔者习惯使用的开发环境是Visual Studio Code,当然还有社区版PyCharm,Visual Studio Code需要做一定配置才能使用,而且使用逻辑对新手不友好,如果你之前没有其他编程语言经验的人,不建议使用;PyCharm呢,也要学习一点其使用方法,但熟练后能大幅度提高学习体验,建议各位在熟悉Python语法后,选择一个合适的IDE工具,从学习的角度来说,一个简单直接的IDE是做好的,这里推荐mu-editor。为什么推荐这个,因为mu-editor和你使用文字处理器中输入内容的方式非常相似,可以很直观的看到所有功能,而且可以快速获得运行结果或者得到错误反馈。
1、安装和使用Mu-editor
mu-editor还有个好处都是跨平台,而且三个平台界面一致,安装过程简单,去官网https://codewith.mu/en/download或者https://github.com/mu-editor/mu,Windows系统和macOS上下载适合的安装程序,双击安装程序文件来安装它。如果你使用的是macOS,那么运行安装程序时会打开一个窗口,你必须在其中将Mu图标拖动到Applications文件夹中才能继续安装。如果你使用的是Linux操作系统,那么需要将Mu安装为Python软件包。在这种情况下,请单击下载页面“Python Package”部分中的Instructions按钮,会进入一个详细的安装说明,根据提示一步步安装即可。
1)、启动Mu-editor
安装完成后,让我们启动Mu。
- 在Windows 7操作系统或更高版本上,单击屏幕左下角的开始图标,在搜索框中输入Mu,然后点击弹出的Mu-editor,即可运行它。
- 在macOS上,打开访达窗口,单击“应用程序”(Applications),然后单击mu-editor,或者是点击Dock栏的显示应用程序的图标,打开程序选择屏幕,在上面的搜索栏输入Mu,找到运行即可。
- 在Linux操作系统上,打开终端(Terminal),然后输入python3 –m mu 或者mu-editor。
第一次运行Mu时,屏幕将显示一个“选择模式“窗口,其中包含选项Adafruit CircuitPython、BBC micro:bit、Pygame Zero和Python 3。选择Python 3。如果你后期想更改编辑器模式,可以通过单击编辑器窗口顶部的模式按钮来更改模式。
2)、使用Mu-editor
启动Mu后,出现的窗口称为“文件编辑器”窗口。单击REPL按钮打开“交互式环境”,该环境是一个程序,可以让你在计算机中输入指令,就像在macOS和Windows操作系统上各自的“终端”或“命令提示符”中输入一样。使用Python的交互式环境,输入指令,Python解释器会立即运行它们并给出结果。
在Mu中,交互式环境是窗口下半部分的窗体,会有以下文本:
Jupyter QtConsole 4.7.7
Python 3.8.12 (default, Oct 12 2021, 13:49:34)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.30.1 -- An enhanced Interactive Python. Type '?' for help.
In [1]:
In [1]:称为“提示符”,这种提示符是Python编辑器——Jupyter Notebook的标准提示符。
点击运行按钮
我们会在下面窗口能看到”>>>”这样符号,这种也是提示符,这种提示符是最常见的,故本书中的后面代码中将用>>>提示符表示交互式环境。如果你在命令行窗口中运行Python,它们也会使用>>>符号作为提示符。。
例如,在交互式环境或者终端打开的Python环境的提示符后输入以下指令:
>>> print('你好,Python!')
在输入该行并按下回车键后,注意输入的时候,表示字符串的符号’字符串’的标点一定是英文,不要使用中文的‘’标点符号,交互式环境会快速对输入的指令作出响应,如果你输入的指令合法,会给出运行结果:
>>> print('你好,Python!')
你好,Python!
如果不合法,会给出错误提示,并有个小箭头指向错误的开始点:
>>> print(“你好,Python!”)
File "<stdin>", line 1
print(“你好,Python!”)
^
IndentationError: unexpected indent
mu-editor在输入中文的时候可能会有点小瑕疵,如果你需要在代码中使用中文,建议使用PyCharm
2、使用PyCharm
1)、下载安装PyCharm社区版
进入官网的下载页面https://www.jetbrains.com/pycharm/download/,官网会自动侦测你的系统,点击下载即可
windows系统下载的pycharm-community-2021.3.exe的安装文件,作者写稿的时候是这个版本,你们在看到这本书的电子稿或者纸质本的时候,版本会高于这个,不过安装方法是相同的,双击该文件,会弹出安装向导,跟随向导一步步安装即可。
macOS系统,根据自己的平台特性,选择合适的版本下载下来后都是后缀为dmg的文件pycharm-community-2021.3.dmg,双击该文件,将PyCharm CE图标拖到Applications文件夹,然后打开Dock栏上的启动台,可以很直观的看到PyCharm CE图标。
Linux系统呢:
debian系Linux,打开Terminal窗口,在Terminal输入如下命令:
sudo add-apt-repository ppa:mystic-mirage/pycharm
sudo apt update
sudo apt install pycharm-community
Arch系linux,打开Terminal窗口,在Terminal输入如下命令:
sudo pacman -S pycharm-community-edition
2)、启动和使用PyCharm社区版
安装完成后,让我们启动PyCharm。
- 在Windows 7操作系统或更高版本上,单击屏幕左下角的开始图标,在搜索框中输入pycharm,然后点击弹出的pycharm ce,即可运行它。
- 在macOS上,打开访达窗口,单击“应用程序”(Applications),然后单击pycharm ce,或者是点击Dock栏的启动器的图标,打开程序选择屏幕,在上面的搜索栏输入PyCharm,找到看到PyCharm CE运行即可。
- 在Linux操作系统上,打开终端(Terminal),然后输入PyCharm即可。
3、第三方模块的使用
我们写Python程序的时候,一些功能标准的Python库不具备,我们就要使用第三方提供的模块,这些由Python核心开发团队之外的开发人员创建的第三方模块在使用之前我们需要通过pip命令进行安装,否则Python解释器无法找到对应的函数或者模块。如何使用pip或pip3命令安装第三方模块,本书会在附录中予以说明,当本书要求你安装特定的第三方模块时,请查阅附录。
1.2 Python基础
Python和其他编程语言一样,有自己一套标准的语法、库函数,实现一个小程序甚至是实现一个标准的应用也不是要精通Python的方方面面,只需要学习你程序涉及到部分内容内容即可。
但在动手之前,一些Python基本编程概念这是必须在掌握的。就像你在初中做物理实验一样,为了能获得好玩的效果,首先我们必须学习相关的物理概念,否则你没办法复现教材上很奇特的现象,这些概念既深奥又啰唆,但这是基础,只有了相应的基础知识和实践,你才能很自如地指挥计算机,完成你想做的事情。
本节给出一些很简单的小例子,建议你在“交互式环境”中反复练习,以达到熟悉Python基本概念的目的。交互式环境也称为“REPL(‘读取—求值—输出’循环)”。交互式环境中一般每次运行一条Python指令,并立即显示结果或者错误信息,可以第一时间让你看到你期望的结果,可以大大提高你学Python的体验。所以你在阅读对应的代码时一定要试一下,动手后获得经验教训远比读书时想象的记忆的深刻。
可以使用Mu-editor的交互式环境来运行本节中的小例子,在Windows操作系统上,打开“开始”菜单,输入“Mu”,然后打开Mu应用程序。在macOS上,打开“应用程序”文件夹,然后双击Mu;在Linux系统中,打开的teminal输入mu-editor,
~ :mu-editor
启动MuEditor ,单击New按钮,然后将一个空文件另存为ch1_2.py;单击Run按钮或按F5键运行这个空白文件时,交互式环境就会打开,该环境作为一个新窗格打开,该窗格在Mu-editor窗口的底部,你应该可以在交互式环境中看到>>>提示符。
尝试着在提示符处输入2 *3,使用Python联系一些简单的数学运算。Mu窗口现在应如下所示:
>>>2*3
6
>>>
在Python语言中,2 *3称为“表达式”,它是语言中最基本的结构。表达式包含“值”(例如3)和“操作符”(例如*),并且这个表达式总是可以计算为具体值或者一个单一的结果。这意味着在Python代码中,所有使用表达式的地方都可以使用一个值。
在前面的例子中,2 *3计算为单个值4。没有操作符的单个值也被认为是一个表达式,尽管它求值的结果就是它自己,像下面这样:
>>> 4
4
Python表达式中也可以使用大量其他操作符。例如,表 1-1 列出了Python的所有数学操作符。
表1-1 Python数学操作符,优先级从高到低
操作符 |
操作 |
例子 |
求值为 |
** |
指数 |
3 ** 2 |
9 |
% |
取模/取余数 |
12 % 8 |
4 |
// |
整除/商数取整 |
34 //6 |
5 |
/ |
除法 |
34 / 5 |
6.8 |
* |
乘法 |
3 * 7 |
21 |
− |
减法 |
7 −3 |
4 |
+ |
加法 |
1 + 1 |
2 |
Python数学操作符的“操作顺序”(也称为“优先级”)与数学中类似。**操作符首先求值;接下来是*、/、//和%操作符,从左到右;+和−操作符最后求值,也是从左到右。如果需要,可以用括号来改变通常的优先级。运算符和值之间的空格对于Python无关紧要(行首的缩进除外),但是惯例是保留一个空格。在交互式环境中输入下列表达式:
>>> 32+56*45
2552
>>> (32+56)*45
3960
>>> 3425565*324234
1110684642210
>>> 3**4
81
>>> 65/4
16.25
>>> 20/3
6.666666666666667
>>> 20//3
6
>>> 23%3
2
>>> 34+65
99
>>> (34-43)*((43/3)+(53-76)/(43-12))
-122.3225806451613
>>>
在这些小例子中,我们做的就是输入表达式,计算求值的工作交给Python解释器来做,解释器会将输入的表达式求值为单个值。如果输入的是复杂表达式,Python在计算过程中首先对对表达式的各个部分进行计算求值,直到它成为单个值为止,比如上图的最后一个表达式是复合表达式,其计算过程如下:
计算机语言和我们自然语言一样,语句的构成也有其规则,Python也不例外,如果想要计算机能按照我们的想法工作,我们的计算机语言就必须按照既定的规则来组织操作符和值形成一组计算机能理解的表达式,对于任何一门计算机语言,这些构成表达式的规则都是其语言的基本部分,Python也在其中,这些规则就是帮我们和计算机沟通的语法,就像帮助我们人与人沟通的语法一样,我们学习任何一门语言,最重要的就是学习其构成表达式的语法,然后才能顺利指挥计算机帮助我们完成既定的工作。比如我们人类之间交互,我按照如下的方式表述:
我跋山涉水、不远万里、历尽艰难、怀着一颗虔诚的心来到了昆仑朝见圣主,谁知道一只泼猴挡住了去路,让我不知如何进退。
这样表述我们学过汉语的一眼就看出了说话的郁闷、无奈。
要是不按照合理的语法仅仅是堆砌单词的话,你看看如下:
泼猴朝见我圣主不远万里、不知如何进退让我、挡住去路,怀着一颗虔诚的心,跋山涉水、历尽艰难来到了昆仑,谁知道一只
显然这这一句会看得你莫名其妙,因为它不符合自然语言的规则。同样,如果你不按Python的语法输入指令,Python解释器也不能正确工作,就会给你一条错误信息,像下面这样:
>>> A>
File "<stdin>", line 1
A>
^
SyntaxError: invalid syntax
>>> C<i<d
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'C' is not defined
>>> A(d)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'A' is not defined
>>> 46+dd+dd
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'dd' is not defined
>>>
在交互环境中输入一条指令,Python解释器会立刻检查指令是否符合语法,语法正确,就按照你的指令工作,不正确就是不工作报错,交互环境会精确的提示你指令什么位置开始它不能理解了,让你修正,使用Python,不要担心会弄坏计算机:最坏的情况就是Python给你来条错误信息。专业的软件开发者在编写代码时,错误信息就是平常的不能在平常。
1.3 第一次接触Python数据类型
前面已经说过,你输入给计算机的表达式,对所有的计算机语言来说,都是值和操作符的组合,最终它们可以通过求值成为单个值。所谓的“数据类型”表示的是值是以什么样的形式呈现给我们,在计算机的世界里,每个值都只能是一种数据类型。在Python语言中,我们最常见的整型、浮点型和字符串数据类型,表1-2列出了Python中最常见的数据类型。例如,值-100和30是“整型”的值。整型(或int)表明值是整数。带有小数点的数,如15.27,称为“浮点型”(或float)。请注意,书写形式不同,尽管可能在我们人类的眼中是相同的值,在计算机的世界中却会被归为不同的数据类型,比如2021是一个整型,如果写成2021.00那么在计算机的世界中就是一个浮点型,写成“2021”,就是字符串类型,所以我们在指挥计算机工作的时候,要明确每个值的确定的数据类型,不然计算机就是不知道如何处理,或者给出错误的结果。
表1-2 常见数据类型
数据类型 |
例子 |
整型 |
−100、−99、0、97、98、999、1000、101 |
浮点型 |
−11.252、−31.10、−0.25、0.0、0.15、11.20、21.75 |
字符串 |
'2021'、'2022'、'BBB'、'你好Python'、'2022年' |
和其他的编程语言一样,Python代码中也会需要有文本值,这类文本值,Python标称为“字符串”或strs(发音为“stirs”)。Python中的字符串就是用成对单引号(')包围的一串字符和数字的组合(例如'Hello'或'计算机语言'),记住单引号必须成对出现,只有这样Python才能判断字符串的开始和结束的位置。如果两个单引号之间没有任何字符和数字,这个类形式的字符串称之为“空字符串”或“空串”。
如果运行Python代码或者程序时,出现如下错误提示信息:
SyntaxError: EOL while scanning string literal,
肯定是你忘了字符串末尾的单引号,比如下面的例子:
>>> '你好,Python
File "<stdin>", line 1
'你好,Python
^
SyntaxError: EOL while scanning string literal
1.4 Python中操作符
计算机语言中最直观的操作符就是数学计算过程中的加减乘除,在计算机的世界中这类符号表现形式和标准的数学中有点区别,在计算机的世界中,乘号永*表示,而不是我数学中常见的×,除号用/表示,而不是标准的÷,主要原因是这两个数学符号在键盘中无法输入,当然还有数学中逻辑符号和比较运算符,这个差别更大,后面会有专门的章节来讲解,这里我们稍微讲解一下数学中标准的加号+在Python语言中的引申用法,
+号在每个计算机语言中都会有五花八门的引申和转义,会根据+两边的操作值不同表现为不同的计算功能,也就是根据操作符两边的值的数据类型,操作符的含义可能会改变。例如,在操作两个整型或浮点型值时,+是相加操作符;在交互式环境中输入以下内容:
>>> 1+2
3
>>> 1+2.0
3.0
>>>
第一个表达式是两个整数相加,最后的计算值是整型,但是第二个表达式,加号同样完成计算功能,但是它根据两边的类型不同,做操作数的类型转换,然后在相加。
如果在用于两个字符串之间时,这个功能是过去我们学习数学时候的所没见到过的,它的作用是将字符串连接起来,变成了“字符串连接”操作符。在交互环境中输入下面的代码:
>>> '中华人民共和国'+'台湾省'+'省会是'+'台北市'
'中华人民共和国台湾省省会是台北市'
>>> '中华人民共和国'+'sichuansheng'
'中华人民共和国sichuansheng'
>>>
表达式会将+号两边的字符串连接为一个新字符串,包含了+号两边的字符串的文本。但是,如果你对一个字符串和一个整型值使用+号,Python就不知道如何处理,比如我们想表达北京市2500万人口,我们使用了:'北京市'+2500+'万人口' 的表达式,Python就会明确告诉你+操作符的使用不符合Python的基本语言,将会给我们一条错误信息:
>>> '北京市'+2500+'万人口'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
错误信息Can only concatenate str(not "int")to str表示Python认为你试图将一个整数2500连接到字符串上。如果我们在字符串连接中使用不是字符串类型的数据类型,代码必须显式地将对应的数据类型转换为字符串,因为Python不能自动完成转换。(1.7节“程序剖析”在讨论str()、int()和float()函数时,将解释数据类型转换。)
在数学还有个基本操作符×,和前面讲的+操作符一样,*操作符在Python等计算机语言中也有一定转义,如果*操作符两边是整型或浮点型数值,*操作符的作用就是将两个数值相乘。但如果*操作符用于一个字符串值和一个整型值,它就变成了“字符串复制”操作符。比如我们在交互环境中输入以下代码:
>>> '北京市'*5
'北京市北京市北京市北京市北京市'
这个表达式就是将字符串'北京市'复制了5次构成一个更长的字符串,在写这类表达式的时候,*操作符的右边只能是整数,不能是浮点数,如果是浮点数,则会报错:
>>> '北京市'*5.0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'float'
*操作符只能用于两个数字(作为乘法),或一个字符串和一个整型值(作为“字符串复制”操作符)。不能用于两个字符串之间,比如下面的代码将会给出错误信息:
>>> '中华人民共和国'*'北京市'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'str'
Python无法理解这些表达式是有道理的:你不能把两个单词相乘,也很难将一个任意字符串复制小数次。
1.5 变量
这个概念也是从数学中拷贝过来的,但是两者的表示的意义不一样,数学中变量是代表一类数,而语言中的“变量”表示的是计算机内存中的一个固定的可以放置值的内存区域,相当于我们现实中盖的房子,根据用途不同可以住人或者储藏物品,房子类型对应于语言中的数据类型,只要定义了一个变量(现实中盖了一个房子)那么这个变量就可以存放一个数值(根据房子类型不同住人或放物品)。如果你的程序涉及到表达式求值计算问题,计算结果就可以保存在一个定义好的变量中。
1.5.1 赋值语句
“赋值语句”就是将一个具体的值保存在一个变量中。赋值语句包含一个变量名、一个等号(称为“赋值操作符”),以及要存储的值。如果输入赋值语句studengAge = 23,就是在名为studengAge的变量中存储一个整型值23。然后一个重要的提示,变量面可以是中文。
例如,在交互式环境中输入以下内容:
>>> studentAge=23 #变量初始化
>>> studentAge #显示变量
23
>>> 比我大=2 #定义中文变量初始化为2
>>> studentAge+比我大 #完成相加运算
25
>>> studentAge+比我大+studentAge #完成相加运算
48
>>> studentAge=studentAge+比我大+studentAge #完成运算并把结果存于studentAge
>>> studentAge
48
studentAge=studentAge+比我大+studentAge这一句这称为“覆写”该变量。在输入以下代码,尝试覆写一个字符串:
>>> name='王小利' #初始化name为王小利
>>> name
'王小利'
>>> name='刘能' #将name的值改写为 刘能,记住改写之后,name之前的
#值就被覆盖掉了,就没了
>>> name #显示当前变量值
'刘能'
1.5.2 Python变量命名方法
为什么要给变量命名,这个也是源于我们的日常生活,比如我们在某个地段盖了一片房子,为了更好的记忆,我通常会给这片房子起一个好听的名字:龙王官邸,以后只要我们提到龙王官邸这个名字我就知道在什么地段,里面有多少房子,在计算机中我们上面说了,变量就是代表计算机内存中的某个区域,为了能很好的利用这个内存,我们给这块内存也要起个容易记忆和使用的名字,现实世界中起名字我们有人为认可或者社会默认的规则,同样在计算机世界中给内存单元命名呢,也有个规则,一般在变量组成方式有约定,变量的名称含义也有约定,好的命名方式会让你在使用变量的时候一看到名字就能明确这个变量的作用,在Python的官方有命名规则,如果使用Python开发项目,项目组里面也有附加的命名约束,所以我们在定义Python的时候首先要符合官方的规则,其次是符合项目的命名规范,好的变量名会给后面的代码阅读和修改带来巨大的便利性。
Python命名限制如下,这个Python的强制标准。表1-3中列出了合法和非法的变量名,在你自己写练习代码的时候,要严格遵守下面3条规则:
1.变量名不能包含空格。
2.变量名只能由字母、数字和下划线组成。
3.变量名不能以数字开头。
表1-3 有效和无效的变量名
有效的变量名 |
无效的变量名 |
current_balance |
current-balance(不允许短横线) |
currentBalance |
current balanc(不允许空格) |
account4 |
4account(不允许数字开头) |
_42 |
42(不允许数字开头) |
TOTAL_SUM |
TOTAL_$UM(不允许$这样的特殊字符) |
hello |
'hello'(不允许'这样的特殊字符) |
Python中变量名是区分大小写的,这意味着:student_ID、student_id、Student_ID和Student_Id是4个不同的变量。Python中有个约定:变量以小写字母或下划线开头。另外说明一点,中文可以做作为Python的变量名称,在实际的工程中,不建议使用中文作为变量名称。
当然在实际编写Python代码和练习中,笔者觉得最好的命名方式就是使用“驼峰原则”,这也是大多数计算机语言变量命名的约定成俗规则,最好能用表明数据类型和数据内容或者其含义的名词或动词作为其名称,比如:studentName,我们看到名称就知道,这个变量表示的学生姓名,不建议使用student_name,这样尽管也能做到望文知意,但在看起来没有驼峰形式的清晰。当然肯定会有人以官方的Python代码风格PEP 8来说事:即应该使用下划线。满足代码风格一致这个很重要,但更重要的是要知道何时要不一致,因为有些场合PEP8指南就不一定合适。如果你写代码很多年,且对代码风格有自己的判定,建议坚持自己的原则。
1.6 编写第一个Python程序
交互式环境一次运行一条Python指令,能快速的获取结果或者知悉错误,少量代码这种方式清晰简洁,不失为一个代码校验的好办法,但对于稍大的功能或者具有复杂逻辑的算法来说,单步的执行会给给我们带来巨大的困扰和阻碍,要编写完整的Python程序,就需要通过使用文件编辑器来完成代码的编写。可以使用纯文本编辑器,比如Notepad、kate、gedit等等,这类编辑器功能简单,而且容易获得,但是仅仅只能完成文字的编辑,我们写代码过程中的期望得到辅助操作他们不能提供,最好的方法就是使用Python的集成开发IDE,比如我前面提及到的Visual Studio Code和PyCharm,当然还有前面提到的Mu-editor,Mu-editor输入中文的时候可能会碰到一些小问题,需要输入中文的话,建议使用PyCharm,下面就简单讲一下使用PyCharm创建项目,启动PyCharm看到如下画面。
根据箭头提示,选择Projects,然后点击New Project,出现下面画面
项目名称处,定位到自己的合适目录,并给出一个自己喜欢的工程名称,在预设Python环境处呢,建议采用系统默认的,并勾选Inherit global site-packages和Make available to all projects,然后建议勾选Create a main.py welcome script,然后单击右下角的create,进入程序的程序的编辑界面:
等待包更新完成后,单击箭头处的向右的三角符号运行,然后能看到运行结果:
红色箭头就是运行结果。
默认光标在代码编辑区,和我们通常的word编辑的一样,光标所在位置会一闪一闪的提示我们。和前面交互式环境不同,在交互式环境中,按回车键就会执行Python指令,PyCharm的代码编辑区允许输入多条指令,指令输入完成后可也通过右上角的运行按钮,运行该代码。
交互式环境窗口总是有>>>提示符,PyCharm的代码编辑窗口没有>>>提示符,有的是和word一样的输入提示符。
现在删除创建工程自动生成的代码,输入我们自己的代码:
# 这仅仅是一个演示如何编辑器中写Python代码,功能很简单,就是问一下您名字和年龄
# 然后复述出来
print('您好,欢迎使用PyCharm社区版!')
print('尊姓大名?') # 询问您的姓名
yourName = input()
print('很高兴您将PyCharm作为您的代码编辑器, ' + yourName)
print('你名字的长度是:')
print(len(yourName))
print('方便透露您的年龄吗?') # 询问您的年龄
yourAge = input()
print('按照农历来说你的虚岁是' + str(int(yourAge) + 1))
在输入完源代码后通过PyCharm的菜单或者CTRL+S快捷键保存它,这样的话就不必在每次启动PyCharm时重新输入。
在输入程序时,应该养成及时保存代码的习惯,以防计算机崩溃,或者不小心自己退出了编辑器。可以在Windows操作系统和Linux操作系统上按Ctrl+S快捷键,在macOS上按Command+S快捷键来保存文件。
在保存文件后,就可以运行程序。最直接的方法就是点击右上角的运行按钮,程序会在下面的交互式环境窗口中运行,也可以直接按SHIFT+F10快捷键运行。程序运行起来后会在交互窗口首先要求输入您的名字,然后是年龄。在交互式环境中,程序输出应该看起来像下面这样:
/home/oliver/PycharmProjects/pythonProject/venv/bin/python /home/oliver/PycharmProjects/pythonProject/main.py
您好,欢迎使用PyCharm社区版!
尊姓大名?
oliverwang
很高兴您将PyCharm作为您的代码编辑器, oliverwang
你名字的长度是:
10
方便透露您的年龄吗?
34
按照农历来说你的虚岁是35
Process finished with exit code 0
如果没有更多代码行要执行,Python程序就会“中止”。也就是说,它会停止运行。(也可以说Python程序“退出”了。)
可以通过单击代码编辑窗口顶部文件名右边的X图标关闭该文件。要重新加载一个保存了的程序,双击工程结构视图中的对应文件即可打开该文件。你现在可以尝试着关闭正在编辑的main.py,然后在工程结构视图中双击main.py文件重新打开它。
为了检查程序的执行情况,您可以用Python Tutor(https://pythontutor.com/visualize.html#mode=display)网站的可视化工具。把您的代码复制到该网站的代码输入区,然后根据网站的对应功能提示执行您的代码,就可以在该网站的可视化页面上看到这个程序的执行。单击next按钮就可以观看程序执行的每个步骤,在这个过程中您能详细地看到每个变量值和输出变化的详细细节。
1.7 Python代码中常见细节解读程序剖析
在工程结构视图中打开main.py,我们来解读一下这份代码中所有的有关命令和函数的解析,和其他计算机语言一样,Python中也有注释、输入和输出语句,还有内置的标准函数,下面我们就逐行解释上面的代码。
1.7.1 注释
Python代码中的注释以#号开头,Python解释器在执行的代码的时候会自动忽略该内容,注释时给人看的,用以说明其上或其下代码行或块的功能或者变量的含义,或提醒自己代码试图完成的事。其形式如下:
# 这仅仅是一个演示如何编辑器中写Python代码,功能很简单,就是问一下您名字
# 和年龄然后复述出来
有时候,我们测试代码的时候,不希望某些代码行执行,会在对应行代码前面加上#,临时删除这行代码,有时候会为了看中间结果输出,临时在程序中加些中间结果输出语句,在确定功能正确之后我们会在其前加上#号,这两种行为都称为“注释掉”代码。主要的目的都是搞清楚为什么程序功能不正确或者怎么样工作。
Python也会自动忽略注释之后的空行。在程序中,想加入空行时就可以加入。这会让你的代码更容易阅读,就像书中的段落一样,但是记住不能随意在行代码前任意增加或者减少空格,因为Python代码是用空格进行格式代码的,少了或多了空格都会造成Python解释器无法正确解析代码。
1.7.2 输出函数print()
这个函数的首要功能就是把传入给他的内容或者变量值输出在屏幕上,比如程序的中的:
print('您好,欢迎使用PyCharm社区版!')
print('尊姓大名?') # 询问您的姓名
代码行print('您好,欢迎使用PyCharm社区版!'),表示在屏幕上输出字符串'您好,欢迎使用PyCharm社区版!'的文本”。Python执行到这行时,表示Python在“调用”print()函数,并将该字符串的值“传递”给函数。传递给函数的值称为“参数”。请注意,引号不会输出在屏幕上,它们只是表示字符串的起止,不是字符串的一部分,print()函数还有个很有趣的功能就是输出空行,也就是不用给print()传入任何值,直接调用即可。
python3中,在使用print()函数时,函数名的末尾一定要带上括号以表明它是一个函数的名字。这也是Python2和python3的一个区别之一,你们可能会在网上或其他地方看到一些print不带括号的输出,那是python2的输出函数,python2已经停止维护,所以写代码的时候,以python3的函数格式为准,这也是为什么在本书中你看到的print(),而不是print的一个主要原因。后面第3章将更详细地探讨函数。
1.7.3 输入函数input()
我们在编写一些命令行程序的时候,需要从外部输入一定的数据以辅助程序完成功能,input()函数就是完成这个作用的,当程序中调用input()函数的时候,就会等待用户在键盘上输入一些文本,并以回车键为其输入结束标志:
yourName = input()
上面这行代码执行的时候,程序会暂停下来,要求你在屏幕上输入一定的文本,当输入完成后这样代码行会将你输入的字符串赋给变量yourName。
input()函数可以处理用户输入的任何字符串。如果用户输入'中华人民共和国',那么该变量的结果就是为yourName = '中华人民共和国'。
1.7.4 如何在print()函数中组合输出常量和变量值
输入名字后,下一行调用print()输出,在这一行中print()同时输出了常量和变量值,变量和常量之间用+号连接即可,前面我们讲过+操作符对字符串来说就是连接两个字符串,这里就是一个简单的应用场景,当然可以使用print()函数输出复杂格式数据,后面在会有专门章节讲解,实际上在括号内的通过+操作符连接的常量和变量就是表达式:'很高兴您将PyCharm作为您的代码编辑器, ' + yourName。
print('很高兴您将PyCharm作为您的代码编辑器, ' + yourName)
表达式无论包含多少计算最终都会计算成一个具体的值,如上一行代码中将'oliver'是保存在yourName中,那么这个表达式最后的计算结果就是:'很高兴您将PyCharm作为您的代码编辑器,oliver'。这个字符串传给print()函数,print()函数将其输出到屏幕上。
1.7.5 字符串长度计算函数:len()
len()函数的主要作用就是计算传递给它的字符串的长度,传入参数是字符串,返回结果就是该字符长的长度,这里要注意一下哎:如果传递的英文字符,则是字符的个数,以字节为单位,如果传入的是中文,则是汉字的个数,以两个字节为单位,如果传递的是混合字符串,汉字算一个长度单位,字符算一个长度单位,这里切记切记,在交互环境中运行以下代码,分别输入英文、中文、中英文混合,你会得到如下的结果:
1、全英文字符的len():以字节为单位
>>> yourName = input()
oliverwang
>>> print('很高兴您将PyCharm作为您的代码编辑器, ' + yourName)
很高兴您将PyCharm作为您的代码编辑器, oliverwang
>>> print('你名字的长度是:')
你名字的长度是:
>>> print(len(yourName))
10
- 全中文汉字的len():
>>> yourName = input()
中华人民共和国
>>> print('很高兴您将PyCharm作为您的代码编辑器, ' + yourName)
很高兴您将PyCharm作为您的代码编辑器, 中华人民共和国
>>> print('你名字的长度是:')
你名字的长度是:
>>> print(len(yourName))
7
非常明显的能看出,汉字的计数以整个汉字为单位,不是以字节为单位。
- 中英文混合输入的len():
混合输入的时候,会自动识别中英文计数的时候,英文以字节为单位,中文以汉字为单位
>>> yourName = input()
oliver王
>>> print('很高兴您将PyCharm作为您的代码编辑器, ' + yourName)
很高兴您将PyCharm作为您的代码编辑器, oliver王
>>> print('你名字的长度是:')
你名字的长度是:
>>> print(len(yourName))
7
从上面代码我们可以看出这样一个事实,print()不仅仅可以传入字符串,还可以传入整型值,这个时候我们发散以下思维,能不能传入浮点数呢,显然也是没问题的,请在交互环境尝试以下代码:
>>> print('中华人民共和国')
中华人民共和国
>>> print(1000)
1000
>>> print(2.5)
2.5
>>>
看到这里有个疑问了,我们能不能一次传入多种类型的参数呢,比如字符串+整型值,字符串+浮点型值,这里给个结论,不可以,为什么?我们前面讲过+操作符对字符串和数字的操作语义不一样,在介绍+操作符的时候我们强调了两边的数据类型必须一致,或者+操作符两边的数据python解释器可以做隐式转换的相同数据类型的数据。显然在Python中字符串和整型、字符串和浮点型,无法做隐式自动转换成相同的数据类型,但是print()的参数可以传入整型和浮点型的混合数据,因为python可以对他们做隐式自动转换,上代码:
>>> print('我喜欢'+29)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
>>> print('我喜欢'+25.5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "float") to str
>>> print(29+25.5)
54.5
>>> print(29+'是我喜欢的数')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
>>> print(25.5+'是我喜欢的数')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'float' and 'str'
>>> print(25.5+29)
54.5
>>>
从反馈的错误信息我们看到:python会自动扫描+操作符两边的数据类型,尝试做转换,如果可以转换,会从两边找出精度高的,统一朝精度高的数据类型上转换,如果不能隐式转换,则以左边的为准来反馈错误信息,你们可以比较以下字符串和整型、字符串和浮点型、整型和字符串、浮点型和字符串四种类型混合反馈的错误信息。
如果我确实有需要在需要在屏幕上输出字符串和数字混合信息怎么办?这就引出了另一类在实际写代码中实用的函数:强制数据类型转换。
1.7.6 强制数据类型转换函数:str()、int()和float()函数
如果确需在屏幕输出一个整数(如24)和一个字符串的混合体,python中的做法是先把数据类型统一,然后在传给print(),也就是通过数据类型强制转换函数把整数型和浮点型的数转换成字符串,然后在和字符串连接,在传递给print()函数,当然这个强制数据类型转换不仅仅可以在print()函数中使用,需要做数据类型统一的场合都可以使用。
1、将其他类型数据转成字符串的函数str()
可以将其他类型的数据强制转换成字符串,不仅仅是整型值、浮点型值,可以是一切合法的Python类型。这个后面会有专门的章节讲解。我们先解决挡墙的问题,怎么把整型和浮点型数值转成字符串,很简单,就是简单的把数值类型的数据传递给str()函数即可,还是以代码说话。
将整数型数值转成字符串,比如把25转成字符串’25’
>>> str(25)
'25'
将浮点型数值转成字符串,比如25.0转成’25.0’
>>> str(25.0)
'25.0'
在print()函数中混合输出字符串和数值型:
>>> print('我喜欢'+str(25))
我喜欢25
>>> print('我喜欢'+str(25.5))
我喜欢25.5
>>> print(str(25.5)+'是我喜欢的数')
25.5是我喜欢的数
>>> print(str(25)+'是我喜欢的数')
25是我喜欢的数
2、如何将将数值转换成整型和浮点型
在实际写代码过程中,除了其他类型转字符串以外,还有其他类型转整型和浮点型,这个转换也有其强制转换函数:int()和float()函数,这两个函数的作用就是将表达式计算后值转换为整数和浮点数形式。下面我用代码演示两个函数的功能:
将数字字符串转换成整数和浮点数
>>> int('32')
32
>>> int('-108')
-108
>>> int(2.34)
2
>>> float('-2.35')
-2.35
>>> float('6.87')
6.87
>>> float('20')
20.0
在类型转换的时候int()不能接受带有小数形式的数字字符串
>>> int('-2.35')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '-2.35'
int()和float()不能接受非数字字符串
>>> int('S')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'S'
>>> int(S)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'S' is not defined
>>> float('S')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: 'S'
前面的例子演示了str()、int()和float()函数的使用,向它们传入其他数据类型的值,最后得到了字符串、整型或浮点型的值。
如果想要将一个整数或浮点数与一个字符串连接,那么用str()函数就很方便。如果你有一些字符串值,希望将它们用于数学运算,那么int()和float()函数都是合适的转换函数。例如,通过input()函数从屏幕采集的数据是一个字符串,即便用户输入的是一个数字,最终采集到变量里面的数据也是字符串。我们可以通过以下代码验证,在交互式环境中输入exvar = input(),在它等待文本时输入45.01,然后输出exvar,屏幕打印出来是’45.01’:
>>> exvar = input()
45.01
>>> exvar
'45.01'
保存在exvar 中的值不是浮点数45.01,而是字符串'45.01'。如果想要用exvar中的值进行数学运算,那就用float()函数将exvar的转换成浮点数,然后将这个新值存在exvar中:
>>> exvar=float(exvar)
>>> exvar
45.01
现在就可将exvar变量作为浮点数使用,而不是作为字符串使用:
>>> exvar*100/50
90.02
当然如果你想把输入的数字转成整数,可以使用int()函数,这里就不举例了,读者可以仿照float的例子自行练习。
我们在写代码过程中,还有一类经常涉及到的操作:对浮点数进行取整,在Python里面可以通过int()函数来完成:
>>> int(113.122)
113
>>> int(-10.23)
-10
>>> int(-10.55)
-10
>>> int(-10.9)
-10
>>> int(12.37)+int(-45.67)
-33
3、文本和数字相等判断
我们写代码的时候会经常碰到这种情况,同样形式的值有好多形式:100,'100',100.00,000100.00,从人的理解角度,四个值认为完全相等,但是在计算机世界中,这四个值确实三种类型,整型、字符串和浮点型,既然类型都不用,显然相互之间要不能比较,就是能比较也有可能不相等,Python,应该是几乎所有的计算机语言,都有个默认的规则,字符串和数值是不能比较或者不能相等的,显然我们判定100和'100'不可能相等,而浮点型和整型之间,在Python的表达式中,会按照精度高的方向转换所有的数值类型,显然100、100.00和0000100.00都是数值类型,如果参与同一个表达式,会隐式转换成精度最高的数据类型,转换后这个三个值是完全相等的,为了验证我们的直观印象,我在交互环境中输入如下代码:
>>> 100=='100'
False
>>> 100==100.00
True
>>> 100==000100.00
True
显然从代码反馈的结果,和我们预期的一致。
在Python语言中,也可以说几乎所有计算机语言中有这种现象的原因就是:字符串是文本,整型值和浮点型值都是数字,文本和数字在计算机中是两种完全不一样的东西,就和我们自然界的事物是一样的原理,跨物种的东西是无法相互比较的。
1.8 小结
你可以使用一个计算器来完成复杂具体的运算,或使用文本处理器处理输入字符串连接,甚至可以通过复制粘贴文本,轻易地实现字符串无限复制,但是这些都需要通过人的主动操作才能完成,没有合理的语法结构支撑之前,无法交给计算机进行处理,为了能够让计算机帮助我们处理这些繁复的工作,我们必须把我们完成这些工作的方法和步骤用计算机能懂的方式给构造出来,也就是用计算机能理解的方式,把我们的工作的步骤写成一个个表达式,通过合理组织这些表达式来让计算机完成对人工作,对于任何的计算机语言来说,构成这些表达式的元素就是计算机语言的操作符、变量和函数调用。一旦我们掌握了这些计算机语言的元素,我们就能用相应的计算机语言帮我们处理和操纵大量的数据,Python语言也不例外,只有熟悉了Python的基本语言元素,我们才能使用Python指挥计算机分析数据、处理文本、收发电子邮件、数据格式相互转换等等。
本章是个简单的入门,介绍的Python中不同类型的操作符(+、-、*、/、//、%和**是数学操作符,+和*是字符串操作符),以及3种数据类型(整型、浮点型和字符串)。
本章还介绍了几个不同的函数。print()和input()函数处理简单的文本输出(到屏幕)和输入(通过键盘),len()函数计算字符串的长度,如何使用str()、int()和float()函数将数据转换成我们期望的字符串、整数或浮点数形式。
在下一章中,我们讲将讲解Python如何根据表达式的值,控制代码要运行流程,即:什么条件下执行什么代码,跳过什么代码、什么条件下重复执行相关代码。也就是计算机语言中的控制结构,这些结构会在你写复杂代码时起着至关重要的作用。
1.9 习题
1.下面哪些是操作符,哪些是值?
*
'台湾省'
-1980.2
-
/
+
25
2.下面哪个是变量,哪个是字符串?
studentId
'studentId'
3.说出3种数据类型。
4.表达式由什么构成?所有表达式都做什么事?
5.本章介绍了赋值语句,如studentAge = 10。表达式和语句有什么区别?
6.下列语句运行后,变量bacon的值是什么?
studentNum = 101
studengNum + 1
7.下面两个表达式求值的结果是什么?
'我们班来了' + '三个帅哥'
'帅哥美女' * 3
8.为什么studengName是有效的变量名,而0sutdentName是无效的变量名?
9.哪3个函数能分别取得一个值的整型、浮点型和字符串形式?
10.为什么下面这个表达式会导致错误?如何修复?
'隔壁老王买了' + 99 + '瓶啤酒.'
附加题:在线查找len()函数的Python文档。查看Python的其他函数的列表,查看round()函数的功能,针对同一个小数说明这个函数和int()的功能有什么区别,并在交互式环境中使用它。
0 条 查看最新 评论
没有评论