人生苦短,我用Python![1]
这个系列是一个帮助零基础的人入门编程的教程,而本文作为第一篇作为导论将会介绍一些基础概念和环境搭建。
概要
在这个系列里将会:
- 理解基础知识关于如何通过编程来实现计算问题的解决方案
- 通过学习Python来理解编程概念
这个系列预计有12篇文章,如果能够成功读完的话,你将能:
- 使用Python设计,构建,测试和描述计算机程序
- 理解现实中的问题和程序设计的关系
- 理解基础数据结构和数据类型
- 对比不同算法的不同并根据现实问题选择最优解
推荐的网络资源:
- How to Think Like a Computer Scientist: Learning Python 3[2]
- How to Think Like a Computer Scientist: Interactive Edition[2]
- Problem Solving with Algorithms and Data Structures using Python[3]
- RUNOOB Python3 教程[4]
需要的软件:
- Python 3.8
- Jupyter Notebook
- 其他的IDE比如PyCharm
为什么是Python
这张图表达了Python简单的特点[5]。
Python是一个通用编程语言,可以用来编写多种不同目的的计算机程序。并且更重要的是,Python是一个相对简单,并且易于上手的编程语言,对于零基础的新手来说易于学习和使用。此外,Python支持大量的第三方库,我们可以通过别人写好的程序来完成复杂的操作。
也就是说,只要简单了解编程,就可以通过Python快速编写复杂操作的程序,并且投入到实际生活中。在这种情况下编程是很有成就感并且高效的。
Python可以做什么
如上所说,Python拥有大量的第三方库,所以通过这些工具可以简单实现各个领域的功能。
比如说:
- 脚本:可以帮助自己完成想要的工作,比如说在Windows这样的操作系统里实现某些自动化(批量复制移动文件,重命名,运行其他程序等等)。而且对于Word,Excel,PDF等常用的办公工具,Python也可以通过相关的第三方库进行操作,来替代手动的过程。Python是最受欢迎的写爬虫的工具,这使得程序可以自动化的访问网络上的内容,下载并解析数据[6]。
- 网页开发:可以通过Django[7], Flask[8]等第三方库(框架)编写Python程序,使其运行在服务器上并作为网站后端处理信息。
- 可视化:Python拥有一些数据可视化库可以用于绘制类似于Excel一样的数据图标。作为编程方法,Python实现的可视化比传统软件更加自由灵活和强大。
- 数据科学:Python是数据科学最受欢迎的语言[9]。通过Python及一些第三方库,可以探索数据处理,数据挖掘,自然语言处理(NLP),语音识别和计算机视觉等相关的应用。
- 桌面软件:Python也可以用于开发一些简单的带有图形界面(GUI)的桌面软件。
Python有谁在用
使用Python的相关企业。
Python是什么
Python 是由 Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的。[4]
这位作者以他最喜欢的喜剧“Monty Python’s Flying Circus”来命名的Python。Python的英文原意是“蟒蛇”,所以Python的图标也被设计成了和蛇有关的形状。基于此,很多和Python有关的技术比如说Anacond(水蟒)和Spydar(蜘蛛)都以相关的动物来命名。
Python是一个高级编程语言。一个高级编程语言不能直接被CPU读取运行,需要先翻译成机器能读懂的低级语言或者机器码。其他的高级语言有C,C++,Java,Ruby等。相对于其他的那些低级语言,高级语言编写起来更方便,更容易被人类理解(很像英语),而且高级语言体积小便携性高,且和平台(x86, ARM等)无关。所以高级语言只需要编写一次,就可以在多个平台运行而不用做很多修改,所以高级语言在开发效率上提升了不少。
在执行Python代码(.py后缀名)的时候,Python解释器会将其翻译成字节码,并以“.pyc”后缀名保存在“__pycache__”文件夹内。当程序被翻译成字节码的时候,字节码的每一步将会被一个运行时执行引擎,Python虚拟机(PVM)执行。
这张图描述了Python运行时模型[10]。
运行Python程序
运行Python程序有两种模式,交互式模式(Interactive mode)和脚本模式(Script mode)。
最原始的交互式模式是在命令行中输入“python”启动,接下来就可以在命令行中使用Python进行对话。一般每次用户都是一行一行输入的,控制台中也一般能依次返回结果,就像是用户和电脑用Python进行对话交流一样。而现在Jupyter[11]的出现让这样的交互式编程方式广泛的运用在了数据探索相关的领域。
而脚本模式则是编辑好全部的Python代码,并保存到一个“.py”后缀的文件中,并且在命令行输入指令进行运行。这种运行方式更加普遍,在运行一些写好的脚本时更加方便。举个例子,如果有一个Python源代码文件“program.py”,则可以在命令行中输入以下指令来执行。
1 | python program.py |
为了更好的编辑Python代码,现代的代码编辑器有强大的自动补全和代码上色的功能。而集成开发环境(IDE)的出现,则让代码的编写工作更加舒适,各种辅助工具可以让用户更容易的梳理程序脉络,编写不会出错的代码。除了代码上色之外,自动补全也更加强大,还支持方便的debug(调试)和运行功能。目前主流的Python编程工具主要是:
下图是PyCharm的截图[12]。
程序和算法
我们经常会在相关领域听到程序(Program)和算法(Algorithm)两个词,这两个词的意思差别很大,并不能简单的混用。其中,程序是一种为了某种目的用某一个计算机语言实现的解决方案,而算法是一个解决某一问题的通用方法[13]。
举个例子,如果想要从家里移动到学校,怎样找出最适合的线路呢?一般情况下,道路是错综复杂的,从家里到学校会有无数种路线可以选择,如果能想到用某种方法找到最适合的路线,那这种方法就是算法。而根据这个算法,用计算机语言实现的代码则是程序。程序可以直接执行并且得出结果,而算法是一个和语言无关的解决问题的思路。
假设我们有以下数字组成的一个单调递增的列表,我们应该用什么方法去判断一个数37是否在这个列表中呢?
如果我们使用二分法,则有更高的效率。下图动态的演示了这一点[14]。
对于一个算法来说,它由四大部分组成:
- 输入(Input):从某一地方获取的数据,可以是来自于键盘,也可以是文件等等。
- 输出(Output):从算法计算得到的结果。
- 运算(Operations):指定为用于解决计算问题的程序指令的算术和逻辑运算。
- 控制结构(Control Structures):确定执行流程的程序结构。
抽象化(Abstraction)是一种计算机科学概念,意思是忽略无关紧要的细节,而只关注重要信息[15]。在解决现实问题的过程中,我们只关心解决方案的重要内容,而不会考虑这个解决方案的各种细节。我们尝试将逻辑问题与计算问题的物理方面及其解决方案分开,以实现抽象化。
以下是一个Python程序解决了加法运算的问题。具体的Python语法将在之后说明。
1 | a = 1 |
Python的基本元素:对象和变量
每一种编程语言都由它自己的语法(Syntax)和语义(Semantics)定义[16]。
语法就像是现实中自然语言的语法一样,是语言的规则。根据这些规则,计算机才能在计算机语言的符号和结构中理解其中的意思。如果用不符合规范的语法,则会导致语法错误(syntax error)。
而语义则像是自然语言中的意思,是指和程序的指令相关联的含义,这些指令定义了程序要实现的目标。语义错误(semantic errors)一般发生在当程序运行正常,但是结果并不是我们想要的那种情况。比如说,如果我们想要实现以下的计算。
$$
(1 + 2) \times 3
$$
我们很容易能得知,预期的结果应该是$9$。但是如果我们用以下的代码进行计算
1 | 1 + 2 * 3 |
得到的结果将是7
。因为乘法的计算有优先级,所以会先计算$2 \times 3$然后和$1$相加。所以这个结果并不是我们想要的,尽管它的语法没有问题,也正常运行了,但是得到的结果并不是我们想要的,这就是语义错误。
对于一个Python程序而言,它是由多个模块(module)组成的,而模块则是由多个语句(statement)组成。继续细分,语句拥有一个或多个表达式(expression)。每一个表达式则包含了对象(object)和运算(operator)。
对象
对象(object)是Python中要操作的最核心元素,是计算机中保存着某一特定类型的值或内存位置,而且每一个对象都有一种特定的类型[17]。
以我们之前加法程序的代码进行举例。
1 | a = 1 |
- 其中数字1和2是int(整数)类型的对象。
- “a+b的结果:”是一个str(字符串)类型的对象。
如果我们想知道一个Python中的对象类型,我们可以使用一个Python内置函数type()
,例如type(1)
或者type(result)
。
变量
变量(variable)是一种将名称与计算机内存中存储的值相关联的手段[17]。在Python中,变量是对对象的引用。换句话说,变量指示了对象的位置。
在Python中,相同的变量可以与多个不同的对象相关联,这些对象可能具有不同的值或不同的数据类型。
1 | a = 1 |
请注意:Python变量没有数据类型,但是关联的对象却有。对象的类型由其包含的值确定[17]。
变量的命名
Python的变量命名需要遵循一系列规则:
- 只能包含:小写字母(a-z),大写字幕(A-Z),数字(0-9),下划线(_)
- 大小写敏感
- 不能以数字开头
- 不能用Python已经占用的关键字
False | await | else | import | pass |
None | break | except | in | raise |
True | class | finally | is | return |
and | continus | for | lambda | try |
as | def | from | nonlocal | while |
assert | del | global | not | with |
async | elif | if | or | yield |
当变量命包含多个单词的时候,我们可以用以下两种方法进行命名:
- 使用小写字母+下划线
- 例:
student_number
,number_list
- 例:
- 使用驼峰命名
- 例:
studentNumber
,numberList
- 例:
以上的命名方式要在程序中保持一致。不能一开始用小写字母下划线,然后写到后面就用驼峰命名了。此外,为了代码的可读性方便理解,变量名应该是有意义的,我们应该用studentNumber
去代表学生编号,而不能随便用a
作为变量名去表示。其他的命名规范将会在以后的文章中提到。
实践试试
这里我们可以一起来试试如何开始编程。
环境搭建
首先我们需要安装Python 3,具体的安装步骤可以去参考这里https://www.runoob.com/python3/python3-install.html。
其次,我们需要安装Jupyter来编写代码。首先需要打开命令行,输入以下指令。
1 | pip install jupyter |
pip是Python的包管理器,属于Python的一部分,用于安装与Python相关的第三方库。
接下来,请输入以下指令用于启动Jupyter Notebook。
1 | jupyter notebook |
输入并运行后,将会有一个Jupyter服务器在这台电脑上保持运行,请不要关闭命令行界面,否则将会导致Jupyter关闭。
与此同时,将会有一个浏览器页面被同时打开,这就是Jupyter Notebook的界面。接下来,我们点击右上角的“New”,并选择“Python 3”新建一个新的Jupyter笔记本文件。我们将在这个文件里编写并运行代码。
变量类型
在Jupyter Notebook里,每一块代码块都可以分别运行,并且共享变量信息。在第一个代码块中输入以下的代码。
1 | print("Hello World!") |
Shift+Enter运行代码块,可以看到,在代码块的下方出现了这部分的输出内容。print()
是可以将里面的变量的内容打印到输出的函数。我们需要用这个函数去观察某一变量中的值。
1 | Hello World! |
数据需要先存储,然后再用于计算。编程语言提供变量来存储数据。先定义三个变量a,b和c,并分别使用35、46.5和“hello world”的值对其进行初始化。
1 | a = 35 |
这一个代码块运行之后,并没有相应的输出结果,因为这部分的代码没有输出的指令。那每个变量的数据类型是什么呢?我们可以用type()
函数获得其中的类型。
1 | print(type(a)) |
输出结果如下。
1 | <class 'int'> |
其中a
的类型是int,也就是整数。b
的类型是float,主要是小数。而c
是str,字符串,实际上是指文字信息。关于具体的数据类型,我们将在下一篇文章中讲到。
算术计算
这一节我们将介绍简单的四则运算,更加复杂的部分将会在后面几章介绍。我们要在这一节使用上一节定义过的变量a
和b
。
1 | print(a + 2 * b) |
输出结果如下
1 | 128.0 |
我们可以看到,Python的算术计算是遵循乘除优先的法则,如果想要让加法先算,需要和数学一样加括号。
1 | print((a + 2) * b) |
输出结果如下
1 | 1720.5 |
字符串
这一节将简单介绍字符串的相关操作。
在代码块中输入以下内容并运行。
1 | a = "abc" |
输出结果为
1 | abc |
我们可以看到,对字符串执行加法操作将会使两个字符串连接在一起。而且内置函数len()
可以获得这个字符串的长度。而count()
方法可以在字符串中查找某一字符串在这个字符串中的出现次数。
那如果我们用int类型的数字去加字符串会发生什么呢?
1 | a = "He got " |
结果发生了报错。
1 | TypeError: can only concatenate str (not "int") to str |
根据错误提示,str字符串类型只能和另一个字符串相加来连接。也就是说在Python中,变量类型的控制是较为严格的,然而我们可以对对象进行类型转换。
类型转换
我们可以使用str()
函数将任意类型强制转换至str类型(如果可以转换的话)。在以下代码块中,我们将变量b
强制转换成str字符串类型。
1 | b = str(b) |
结果如下
1 | He got 35 marks in the test |
运行成功了。
关系运算符
Python还拥有关系运算符(大于号,小于号等),这里只做简单展示,具体的内容将会在下一章描述。
判断5是否小于12。
1 | print(5 < 12) |
返回值是
1 | True |
在Python中,True
代表真,而False
代表假。这说明Python成功判断了5是小于12的。
帮助信息
Python中拥有大量的函数,很多时候并不太可能能完全记住所有函数的具体用法。所以我们可以通过help()
函数来获得帮助信息。
1 | help(len) |
代码块下方会展示以下内容。
1 | Help on built-in function len in module builtins: |
参考文献
- [1] B. Eckel, "sebsauvage.net - Python", Sebsauvage.net, 2020. [Online]. Available: http://sebsauvage.net/python/.
- [2] A. Downey, J. Elkner and C. Meyers, How to Think Like a Computer Scientist. Wellesley, Massachusetts: Green Tea Press, 2008.
- [3] B. Miller and D. Ranum, Problem solving with algorithms and data structures using Python. 2014.
- [4] “Python3 教程 | 菜鸟教程”, Runoob.com, 2020. [Online]. Available: https://www.runoob.com/python3/python3-tutorial.html.
- [5] “Python”, xkcd, 2020. [Online]. Available: https://xkcd.com/353/.
- [6] “Top 5 programming Languages for Web Scraping”, Medium, 2020. [Online]. Available: https://xbytecrawling.medium.com/top-5-programming-languages-for-web-scraping-e592ce2192e4.
- [7] “The Web framework for perfectionists with deadlines | Django”, Djangoproject.com, 2020. [Online]. Available: https://www.djangoproject.com/.
- [8] “Flask”, Pallets, 2020. [Online]. Available: https://palletsprojects.com/p/flask/.
- [9] “Top Programming Languages for Data Science in 2020”, Medium, 2020. [Online]. Available: https://towardsdatascience.com/top-programming-languages-for-data-science-in-2020-3425d756e2a7.
- [10] M. Lutz, Learning Python. Beijing: O'Reilly, 2013.
- [11] “Project Jupyter”, Jupyter.org, 2020. [Online]. Available: https://jupyter.org/.
- [12] “PyCharm: the Python IDE for Professional Developers by JetBrains”, JetBrains, 2020. [Online]. Available: https://www.jetbrains.com/pycharm/.
- [13] “What is an algorithm and what is a program?”, Edu4java.com, 2020. [Online]. Available: http://www.edu4java.com/en/concepts/what-is-a-program-an-algorithm.html.
- [14] M. Johnson, "Binary Vs Linear Search Through Animated Gifs", Penjee, Learn to Code, 2020. [Online]. Available: https://blog.penjee.com/binary-vs-linear-search-animated-gifs/.
- [15] A. algorithms and M. Borgwardt, "Abstraction in algorithms", Software Engineering Stack Exchange, 2020. [Online]. Available: https://softwareengineering.stackexchange.com/questions/273590/abstraction-in-algorithms. [Accessed: 30- Nov- 2020].
- [16] "Difference Between Syntax and Semantics (with Comparison Chart) - Tech Differences", Tech Differences, 2020. [Online]. Available: https://techdifferences.com/difference-between-syntax-and-semantics.html#:~:text=The%20syntax%20of%20a%20programming%20language%20is%20a,symbols%2C%20characters%20or%20any%20part%20of%20a%20program.
- [17] B. Oakley, "What is an Object in Python?", Stack Overflow, 2020. [Online]. Available: https://stackoverflow.com/questions/56310092/what-is-an-object-in-python.