Python编程环境设置
Python是一种解释性语言,它使用解释器来解释和执行代码,这对用户来说省去了C或C++之类语言的编译步骤,直接从源代码即可运行,因此更容易编写和调试。工欲善其事,必先利其器。在学习Python编程之前,先让我们安装好相应的工具并对编程环境进行设置。
首先进入Python官方下载频道https://www.python.org/downloads,点击“Download Python 3.11.2”按钮进入下载页面(此数字会随着版本的升级而改变)。找到适合自己系统的下载链接,比如笔者为Windows的64位系统,所以选择下载了“Windows installer (64-bit)”。双击下载所得的EXE可执行文件启动Python安装向导(图1)。
图1 Python安装向导
勾选“Add python.exe to PATH”项,这样就不用后期手动将Python程序添加到系统路径中了。点击“Install Now”即可自动安装。如果不希望安装到默认的C盘,可以点击“Customize installation”自定义安装项,根据向导提示一步步安装(图2)。
图2 Python自定义安装
作为初学者选择默认安装选项即可。安装成功后,对于Windows系统将会有一个“Disable path length limit(禁用路径长度限制)”的提示,这是因为Windows系统能够处理的文件路径长度有一定的限制(图3)。点击禁用这一限制可以避免处理长文件路径时出现的调试问题,不过这也可能导致与旧版本Windows 10的兼容性问题。对于我们初学者来说可以暂时跳过此选项,因为以后有需要时还可以修改注册表来解决。
图3 Python安装成功的界面
点击“Close”按钮关闭安装向导。现在我们测试Python是否安装成功。按Win+R键调出运行对话框,输入“cmd”后按回车键打开命令提示符窗口,然后输入“python”并按回车,如果能够显示出Python版本等信息内容,并且提示符变成了“>>>”,则表示安装成功了。此时可输入一行测试代码:
print(“嗨,欢迎来到Python世界!”)
按回车键执行,即可得到“嗨,欢迎来到Python世界!”的显示信息。几乎每种编程语言教程中都会展示一下“hello, world!”程序,虽然很俗套,但不得不说Python的实现是如此的简单。紧接着执行代码“exit()”退出Python环境,完成此一阶段的测试(图4)。
图4 Python的“hello, world!”程序示例
命令提示符的界面过于简陋,我们可以试试Python自带的IDLE交互式开发环境。点击系统“开始”按钮,在开始菜单顶部的最近添加中就可以看到“IDLE(Pyton 3.11 64-bit)”程序了,点击即可打开。
IDLE通过不同的颜色区分代码及执行结果,清晰明了。尤其方便的是,当我们输入某个函数时,它会智能显示参数提示,辅助我们输入代码,非常方便(图5)。
图5 Python的IDLE交互式开发环境
除了一行一行的交互式执行,IDLE还可以执行扩展名为“py”的Python程序文件,下面就来做个测试。首先点击菜单命令“File→New File”打开IDLE的代码编辑器,输入以下代码:
# Python 3: 显示n个数以内的斐波纳契(Fibonacci)序列
def fib(n):
a, b = 0, 1
while a < n:
print(a, end=’ ')
a, b = b, a+b
print()
fib(1000)
代码解释:“#”后面的文字表示注释,是程序员对代码的说明,这是给阅读代码的人看的,Python解释器会自动忽略这一行。接下来的“def fib(n):”定义了一个名为“fib”的函数,其后缩进的几行代码就是该函数的内容,其主体是一个“while”循环,通过斐波纳契数列公式反复运算,运算结果通过“print()”函数显示出来,其参数“end=’ '”表示每个数字后面加几个空格,是为了将数字隔开(用来显示的print函数在后面的示例中将频繁出现)。当然,函数定义只是表明此函数能做什么,真正运行还得对它进行调用,这就是最后一行代码“fib(1000)”的作用,在调用该函数时,传递了一个参数“1000”,表示要计算1000以内的斐波纳契数列(图6)。
图6 斐波纳契数列计算
对于初学者来说可能还理解不了这段代码,没有关系,这正是后文要介绍的内容。现在按Ctrl+S键保存,在打开的保存对话框中输入文件名(本例取名为“Fibonacci”),这里无需手动添加“py”后缀,它会自动添加(图7)。
图7 保存Python程序文件
保存完毕,点击代码编辑器的菜单命令“Run→Run Module”,或者直接按F5键,即可运行这段代码了。下次在IDLE中,随时可以执行菜单命令“File→Open”打开“Fibonacci.py”文件,并按F5键运行(图8)。
图8 斐波纳契数列计算程序的输出结果
PyCharm——Python开发好伴侣
IDE是Integrated Development Environment的缩写,意为集成开发环境,主要用来辅助程序开发。Python并不一定需要IDE,因为它可以在任何文本编辑器中编写并从命令行运行。但是IDE可以提供许多辅助功能,例如代码调试、智能完成和语法高亮显示等。另外,IDE还可以提供重构、代码导航和项目管理等工具,这些工具可以帮助我们更快、更轻松地编写Python代码,并且可以更轻松地调试和维护代码。
Python开发人员有多种IDE可用,相对来说PyCharm是个非常不错的选择,它可以让Python开发过程变得更加轻松和高效。值得称道的是,PyCharm提供一个强大的社区版本,可以免费使用,并且可以在网上获得免费支持。
首先进入PyCharm主页https://www.jetbrains.com/pycharm,点击“DOWNLOAD”按钮进入下载频道,在“Windows”选项卡下可以看到“Professional(专业版)”和“Community(社区版)”两种版本,其中社区版是免费的,点击其下的“Download”按钮下载即可。比较而言,社区版缺少对科学工具、网站开发、Web框架、远程开发、数据库等的支持,不过对于一个初学者来说,这些影响不大(图9)。
图9 PyCharm专业版和社区版功能比较
双击下载所得的EXE文件启动安装向导,点击“Next”按钮进入下一步,根据向导提示选择安装位置,创建快捷方式以及关联py文件等,最后点击“Install”进行安装即可。安装完成,需要重新启动系统(图10)。
图10 PyCharm社区版安装向导
重启系统后,点击“开始”按钮,在开始菜单顶部的最近添加项中点击“PyCharm Community Edition 2022.3.2 ”启动PyCharm。第一次使用PyCharm需要进行一些设置,首先显示用户协议,只有勾选“I confirm that I have read and accept the terms of this User Agreement”(同意该协议)才可以继续。单击“Continue”按钮进入数据共享页面,如果不希望自己的数据被搜集,可以点击“Don’t Send(不发送)”按钮继续,进入PyCharm的欢迎界面(图11)。
图11 PyCharm欢迎界面
在“Projects”选项卡下点击“New Project”按钮新建一个项目,接下来设置新项目的保存位置和名称(Location)。另外我们还得给PyCharm选定一个Python解释器,本例中笔者勾选了“New environment using”项,选择“Virtualenv”,可以看到其所用的解释器正是前文所安装的Python.exe(图12)。
图12 PyCharm新建项目窗口
设置完毕,点击“Create”按钮即可进入PyCharm主界面,可以看到新项目中已经自动生成了一个包含多行代码的Python文件“main.py”,这是因为本例在新建项目窗口中笔者勾选了“Create a main.py welcome script”项。点击菜单命令“Run→Run ‘main.py’”,或者按Shift+F10快捷键,主界面下方即可实时运行该程序(图13)。
图13 包含了预置文件的PyCharm文档
我们可以在此项目中添加新的文件。点击菜单命令“File→New”打开新建对话框,可以选择多种文件类型,如网页文件、资源文件等,这里笔者选择创建Python文件(图14)。
图14 PyCharm可以创建多种类型的文件
接下来为新文件取一个名称,我们继续以上文中的斐波纳契数列为例,所以将文件名设置为“Fibonacci”,按回车键回到主界面,输入上文中斐波纳契数列的示例代码,然后点击菜单命令“Run→Run”,在弹出的窗口中单击刚刚创建的“Fibonacci.py”即可运行它并在主界面下方显示出运行结果了。在手动输入代码时,能够明显感受到PyCharm的智能提示、自动补全、代码检查、快速修复等功能的强大,可以大大提高工作效率(图15)。
图15 PyCharm的智能提示和自动补全功能
PyCharm功能丰富,很难在一遍短文中讲清楚,本文我们只需了解它的基本使用方法就够了。下面我们将着重分析Python的语法和程序结构。
Python的数据类型和数据结构
计算机科学领域有一个著名的公式:计算机程序=数据结构+算法。这一公式表明,数据结构是程序的核心,而算法是解决问题的步骤。所以我们在学习某一编程语言的时候,很有必要先了解一下它的数据类型和数据结构。
Python支持各种数据类型和数据结构,它们具有不同的属性和特性,可以用于不同的任务。下面是Python中常用的数据类型和数据结构的介绍。
Python简单数据类型常见的有以下几种(图16):
1、整数类型(int)
整数类型是Python中最基本的数据类型之一。它代表整数值,可以是正数、负数或零。在Python中,整数没有大小限制。
2、浮点数类型(float)
浮点数类型代表实数值,即包含小数点的数字。在Python中,浮点数也没有大小限制。
3、布尔类型(bool)
布尔类型代表真和假两个值,分别用True和False表示。布尔类型通常用于条件判断和循环控制中。
4、字符串类型(str)
字符串类型代表文本,即一系列字符的序列。字符串用单引号、双引号或三引号表示。三引号可以将多行文本括起来。Python中的字符串是不可变的,也就是说,一旦创建了字符串,就不能修改它的值。
图16 Python中常见的数据类型示例
Python常见的数据结构有以下几种(图17):
1、列表(list)
列表是Python中最常用的数据结构之一,它是一个有序、可变的集合。列表中的元素可以是不同的数据类型。可以使用索引等操作来访问和修改列表中的元素。列表用中括号“[]”表示。
2、元组(tuple)
元组是另一个有序的集合,它是不可变的。元组中的元素可以是不同的数据类型。与列表不同,元组不能修改。元组用小括号“()”表示。
3、集合(set)
集合可以包含不同的元素,它是无序的,没有重复的值。集合可以用于集合运算,例如并集、交集和差集。集合用大括号“{}”表示。
4、字典(dict)
字典是Python中的映射类型,它是无序的键值对集合,没有重复的值。每个键都必须是唯一的,但值可以重复。可以使用键来访问和修改字典中的值。字典也用中括号“{}”表示,只是其中的数据都是键值对形式。
图17 Python常见的数据结构示例
以上只是Python中最基本和最常用的数据类型及数据结构。除此之外,Python还有其他一些数据类型,例如字节类型(bytes)、字节数组(bytearray)、内存视图(memoryview)、范围类型(range)、空类型(none)等等,这里不再一一细述。熟悉这些数据类型和数据结构的特性和用法,可以帮助我们更好地编写Python程序。
Python变量及赋值
如前文所述,计算机程序就是数据+算法。当一个程序运行时,其相关数据被加载到内存中。内存如同一个大仓库,被分割为一个个小库房。当程序需要使用某个库房时,首先要做一个声明,表示要占用该库房,并为其贴上一个标签。用编程术语来说,就是“声明”了一个“变量”。声明变量后,就可以在里面储存各色货物(数据)了,编程术语称之为“赋值”,这一操作通过等号运算符“=”来实现,等号左侧为变量名称,等号右侧即赋予该变量的数据。以下代码显示了Python中的几种赋值方式:
x = 1
x += 1
x, y, z = 1, 2, “Hello!”
x = y = z = 99.9
第1种是基本赋值,使用“=”将值赋给变量。
第2种是增量赋值,将一个值添加到变量的现有值中。假设变量x的初始值为1,那么“x += 2”就将x的值变成了1加2等于3了。这其实是一种复合运算符赋值,如果将等号前的加号换成减号(x -= 2)则x将被赋值为1减2等于“-1”,如果将加号换成乘号(x *= 2)将得到1乘2等于2的值,以此类推。
第3种是多元赋值,如果需要赋值的变量很多,可以将它们放到一行中进行赋值,只需用逗号将每个变量隔开即可,等号后面各变量对应的赋值也同样用逗号隔开。
第4种是链式赋值,适用于将同样一个数据同时赋值给多个变量。
理论上来说变量名可以由任意字符组成,不过Python对变量命名实际还是有一定限制的,规则要求:变量名只能由字母、数字和下划线组成,且不能以数字开头,另外变量名不能是Python关键字。比如“num_01”是合法变量名,而“01_num”则是非法变量名。再比如“my_var_name”是合法的,而带空格的“my var name”则是非法的。另外像“if”、“while”、“for”等Python所保留的关键字是不能用来做变量名的。对于Python变量名还有一点需要注意,就是它是区分大小写的,像“mytime”和“myTime”,这实际上是两个变量。
变量还有一个重要属性,即变量的类型,它规定了变量能够储存什么样的数据。变量类型即上文所介绍的各类数据类型。其实所谓布尔类型(bool)、整数类型(int)、浮点数类型(float)、字符串类型(str)等等,只是一个形象说法,其本质就是定义了该变量占用多大的空间,比如1个布尔变量只占用1位空间,而一个整数变量则需要8位(1字节)空间。其他编程语言,比如C++、Java等,声明一个变量时需要明确声明其数据类型,而Python则省略了这一步,它直接通过所赋值的数据来自动确定该变量的类型,比如“x = 1”自动将x设置为整数类型,而“x = 99.9”则自动将x设置为浮点数类型。
Python表达式和运算符
如果说变量是程序的“词汇”,那么表达式就是程序的“句子”。词汇量再丰富,不把它们组织成句子就毫无意义。Python中的表达式,是指由运算符、操作数(变量和值)和函数调用一起构成的组合,用以计算某种值的的公式。表达式总是会被计算并返回一个结果。
运算符是构成表达式的重要元素,它相当于粘合剂将数据连接到一起,作为算法的“执行者”它对变量和值进行操作。Python中的运算符大致分为以下七大类。
1、算术运算符:这类运算符执行基本的算术运算,如加(+)、减(-)、乘(*)、除(/)、模(%)和取幂(**)。以下代码中,首先声明了a、b两个整数变量并分别赋值,然后对它们依次进行了加、除、模等算术运算,并通过print函数打印出运算结果(见其后的注释语句,下同)。
# Arithmetic operators
a = 5
b = 2
print(a + b) # Output: 7
print(a / b) # Output: 2.5
print(a % b) # Output: 1
2、比较运算符:这类运算符比较两个值并返回一个布尔值(True或False)。它们包括等于(=)、不等于(!=)、大于(>)、小于(<)、大于或等于(>=)和小于或等于(<=)。以下代码首先声明了x、y两个整数变量并分别赋值,然后依次进行了大于和等于这两种比较运算,其计算结果,x大于y是对的,所以返回结果True(真),而x==y显然是错误的,所以返回结果为Flase(假)。
# Comparison operators
x = 10
y = 5
print(x > y) # Output: True
print(x == y) # Output: False
3、逻辑运算符:这类运算符对布尔值执行逻辑操作。它们包括逻辑与(AND)、逻辑或(OR)和逻辑非(NOT)。以下代码首先声明了a、b两个布尔变量,分别赋值为True(真)和Flase(假)。同一件事不可能同时又真又假,这个判断显然是错误的,所以逻辑与运算“a and b”返回的结果是False(假)。而一件事或者是真或者是假,必居其一,这个判断是正确的,所以逻辑或运算“(a or b)”返回的结果为True(真)。
# Logical operators
a = True
b = False
print(a and b) # Output: False
print(a or b) # Output: True
4、位运算符:这类运算符对二进制值执行位操作。包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)、右移(>>)。以下代码中,首先声明了x、y两个整数变量,不过它们的赋值采用的二进制,所以数字前面加上了“0b”标志,其中二进制的1010等于十进制的10,二进制的1100等于十进制的12。最后两行代码分别对两个变量进行了按位与以及按位或运算,得到了8和14的运算结果。
# Bitwise operators
x = 0b1010 # Binary representation of 10
y = 0b1100 # Binary representation of 12
print(x & y) # Output: 0b100 (binary representation of 8)
print(x | y) # Output: 0b1110 (binary representation of 14)
5、赋值运算符:这类运算符为变量赋值。上文已有详细介绍,此处不再赘述,下面仅举一个增量赋值的简单示例,“a += 2”表示在原有的值5之上再加2,所以最终赋值结果是7。
# Assignment operators
a = 5
a += 2
print(a) # Output: 7
6、标识运算符:这类运算符比较两个标识符的存储单元(内存地址),判断它们是不是引用自同一个对象(x is y),类似id(x) == id(y),如果引用的是同一个对象则返回True,如果不是则返回False。反之,则判断两个标识符是不是引用自不同的对象(x is not y)。以下代码首先声明了一个列表变量,接着又将该变量的地址赋值给了变量y,这两个变量实际指向的是同一个内存地址,所以“x is y”的标识运算结果为True(真)。反之,变量z虽然也是一个列表,并且其值和x相同,但它们并不在同一个内存地址上,所以“x is z”的标识运算结果为False(假)。
# Identity operators
x = [1, 2, 3]
y = x
z = [1, 2, 3]
print(x is y) # True
print(x is z) # False
7、成员关系运算符:这类运算符检查值是否为序列或集合的成员,它们包括in和not in。以下代码,通过“in”运算符指出2是列表numbers的成员,并以“not in”运算符指出6不是列表numbers的成员,这两个运算都是对的,所以返回的结果都为True(真)。
# Membership operators
numbers = [1, 2, 3, 4, 5]
print(2 in numbers) # Output: True
print(6 not in numbers) # Output: True
除了以上运算符表达式外,Python还有字符串表达式、函数调用表达式,以及针对列表、元组和字典进行运算的表达式。每一类表达式都有各自的特色,它们是编程的重要组成部分,理解它们如何工作对于编写有效的代码至关重要。
表达式是用来计算的,但是如何控制计算的流程和逻辑以实现特殊的算法,就需要用到控制语句了。和其他编程语言一样,Python的控制语句主要有三大类:顺序语句、条件语句(if语句)和循环语句(for语句和while语句)。其中顺序语句比较容易理解,即从先到后按顺序一条一条执行代码命令,我们上面的示例基本都是顺序语句。接下来我们重点介绍条件语句和循环语句。
条件语句
条件语句用于根据条件决定程序的执行路径,通常是实现分支选择。它的基本语法如下:
if condition:
# 如果condition为True,则执行这里的语句
elif condition2:
# 如果condition为False,但是condition2为True,则执行这里的语句
else:
# 如果上述所有条件都为False,则执行这里的语句
Python的条件语句使用if、elif和else关键字,其中if语句是必须的,elif和else语句是可选的。条件语句中的condition和condition2可以是任何返回布尔值的表达式,例如比较操作、逻辑操作或函数调用等。
下面是一个简单的例子,演示如何使用条件语句判断一个数是正数、负数还是零:
num = 5
if num > 0:
print(“这个数是正数”)
elif num == 0:
print(“这个数是零”)
else:
print(“这个数是负数”)
在这个例子中,如果num大于0,则打印出“这个数是正数”;否则,如果num等于0,则打印出“这个数是零”;当num小于0时,打印出“这个数是负数”。
注意,Python中缩进非常重要,因为它是区分代码块的方式。条件语句中的每个代码块必须缩进相同的空格数,通常是四个空格。
循环语句
循环语句用于重复执行一段代码。Python提供了两种循环语句:for循环和while循环。
for循环用于遍历序列(例如列表、元组、字符串等)中的每个元素。for循环的基本语法如下:
for variable in sequence:
# 在这里执行循环体代码
其中,variable是一个变量名,用于存储序列中当前遍历到的元素;sequence是一个序列,可以是列表、元组、字符串等。for循环将会遍历sequence中的每个元素,并将其赋值给variable,然后执行循环体代码,直到遍历完所有元素。
下面这个简单的例子演示了如何使用for循环遍历一个列表:
numbers = [1, 2, 3, 4, 5]
for num in numbers:
print(num)
这个例子中我们定义了一个列表numbers,然后使用for循环遍历列表中的每个元素,并将其赋值给变量num,最后打印出num的值(图18)。
图18 for循环遍历列表后输出
while循环重复执行一段代码,直到指定的条件不再满足。while循环的基本语法如下:
while condition:
# 在这里执行循环体代码
其中,condition是一个返回布尔值的表达式。只要condition为True,while循环就会一直执行循环体代码,直到condition变为False为止。
下面这个例子演示了如何使用while循环计算1到10的和:
total = 0
i = 1
while i <= 10:
total += i
i += 1
print(“1到10的和为:”, total)
本例我们定义了变量total和i,然后使用while循环重复执行计算1到10的和的代码,直到i大于10为止,最后打印出计算结果(图19)。
注意,在使用while循环时,必须确保条件可以在某个时刻变为False,否则循环将会无限执行下去,导致程序卡死。可以使用break语句或者修改循环变量的值来结束循环。
图19 while循环演示
Python函数定义和调用
函数是一组执行特定任务的代码,它可以重复使用,从而提高代码的重用性和可读性。在Python中,函数定义通常为以下格式:
def function_name(parameters):
“”"
Docstring:函数的文档字符串,用于描述函数的用途和参数。
“”"
# code block to be executed
return value # 可选
上述定义中,def是函数定义的关键字;function_name是函数的名称,由字母、数字和下划线组成;parameters是函数的参数,这是可选的,可以是零个或多个;Docstring是函数的文档字符串,用于描述函数的用途和参数,也是可选的;return是函数的返回值,同样也是可选的。
下面介绍一个简单的Python函数示例:
def greet(name):
“”"
此函数对作为参数传送的人表达欢迎。
“”"
print("嗨, " + name + “,欢迎光临!”)
greet(“韩梅梅”)
本例定义了一个名为greet的函数,它带有一个参数name,用于向函数传递一个名称。函数的主体包括一个打印语句,它将问候语与传递的名称一起打印。函数定义后,需要调用它才能够执行,所以代码的最后是函数调用语句,并传递了一个名称“韩梅梅”(图20)。
图20 Python函数定义和调用
这只是一个简单的例子,函数可以执行比这更复杂的任务。函数的优点之一,就是它们可以帮助你将代码组织成更小、更易于管理的模块,并将代码分解为可维护的部分。函数还可以使用return语句返回值,允许将计算结果传递回调用代码。
Python的程序结构
上面学习了Python的基础知识,现在就让我们来了解一下完整的Python程序文件是什么样。一般来说,Python的程序结构通常由以下几个部分分组成。
1、导入模块:在程序的开头,我们通常需要导入需要使用的模块。这些模块包含Python内置的模块,也包括第三方库和自定义模块。例如:
import math
import numpy as np
from my_module import my_function
2、全局变量和常量:在程序的顶部,通常定义一些全局变量和常量。这些变量可以在程序的任何地方访问。例如:
PI = 3.14159
name = “John”
3、函数定义:在程序的中间通常定义各种函数,用于执行特定的任务。
4、主程序代码:程序底部通常编写主程序代码,用于执行程序的主要功能。主程序代码可以调用导入的模块、全局变量和常量以及定义的函数。例如:
import math
PI = 3.14159
def area_of_circle(radius):
return PI * radius ** 2
def main():
r = 5
area = area_of_circle®
print(“The area of the circle with radius”, r, “is”, area)
if name == ‘main’:
main()
本例我们定义了一个计算圆的面积的函数area_of_circle(),然后在主程序代码中使用该函数计算圆的面积并输出结果。
注意,在这个例子中,我们使用“if name == ‘main’:”语句来检查是否在运行当前模块。如果模块是主程序运行的,它将执行main()函数,否则将忽略它。这个语句通常用于避免在模块被导入时执行一些不必要的代码。
总之,在Python中,程序结构的规范化编写有助于使代码更易于阅读、理解和维护。对于大型项目,通常需要更复杂的程序结构和更具体的组织方式,例如使用面向对象编程。