第一个 Python 程序
欢迎进入编程世界!
这是编程语言书籍的一个传统,第一句话永远是上面这句问候。而第一个编写的程序就是打印出“Hello World!”这句话。我们也沿用这一传统,从 Hello World 开始。
实现这一功能只需要运行以下的语句:
print("Hello, World!")
使用在线编辑环境
使用在线编辑环境非常简单,不要任何额外工作。打开编辑环境的页面,输入上面那句代码,运行即可。比如: https://qizhen.xyz/python 或者 https://qizhen.xyz/brython
直接在 Python 解释器中运行
如果不使用任何 IDE,那么可以打开计算机的命令行终端,然后输入 python
并回车,系统会启动 Python 解释器。读者现在应该看到 >>> 这样的提示符,表示 Python 解释器已经准备好接受命令了。
在 >>> 提示符后,输入以下代码:
print("Hello, World!")
然后回车。
读者应该看到输出为:
Hello, World!
恭喜!你刚刚编写并运行了你的第一个 Python 程序。
使用集成开发环境(IDE)
如果使用的是前文介绍过的任何一种集成开发环境编写程序,总是需要先创建一个文件来保存程序的。把下面这行文字复制到新建的文件里:
print("Hello, World!")
然后保存从任何名为 *.py 的文件。在点击 IDE 上的运行按钮,就可以运行程序了。
运行一个 .py 文件
对于任何已经保存好的 .py 文件,我们在 IDE 中打开他们运行。也可以在命令行中端里运行它们。比如我们有一个名为“welcome.py”的文件,其内容是如下代码:
name = input("你叫什么名? ")
print(f"你好,{name}!欢迎来到 Python 的编程世界!")
打开命令行或终端,导航到 welcome.py 文件所在的目录。输入以下命令并回车:
python welcome.py
当程序提示输入名字时,输入你的名字并回车。
现在应该看到一个类似 你好,ruanqizhen!欢迎来到 Python 的编程世界!
的消息了。
Python 的语法
编程语言的语法是一套规则和约定,用于定义如何书写和组织代码,使计算机能够理解和执行。就像自然语言的语法规定了如何构造句子一样,编程语言的语法也规定了如何构造程序中的各种元素。
Python 以其简洁明了的语法而著称。我们下面简要介绍一下 Python 的语法,主要是方便已有其它编程语言经验的读者快速熟悉 Python 的特点。对于没有经验的读者,如果觉得介绍的太过笼统,也不要紧,后文还会对它们做详细解析。
和大多数主流编程语言一样,Python 由一行一行的“语句”组成。比如下面的程序:
print("Hello, World!")
在这一行语句中,“print”是一个函数的名字。如果读者没有接触过其它编程语言,可以把这里的函数想象成类似数学函数的概念,在函数名后面的括号中传入一个变量数据,函数就会产生相应的结果。在这里,输入的数据是一串字符“Hello, World!”。Python 语言中,双引号中间的内容表示字符串。“print”的运行结果是把输入的字符串打印在屏幕上。
如果运行:
print(1+2)
这时候 print 函数的输入变成了一个数值运算表达式。Python 会首先计算这个表达式的值,然后再打印出结果“3”。
如果程序有多行代码,比如:
name = input("你叫什么名? ")
print(f"你好,{name}!欢迎来到 Python 的编程世界!")
那么程序一般会按照从上到下的顺序逐句运行。在上面的示例中,input 也是一个函数,跟 print 函数相似,它也会把它的参数打印在屏幕上,区别在于,input 函数会随后读取用户使用键盘输入的内容。name 是一个变量,用于保存 input 函数返回的数据,也就是用户使用键盘输入的内容。接下来的 print 函数会把它的数据,连同变量 name 里的内容一起打印在屏幕上。
程序语句通常由数据、变量、操作符、表达式等部分组成。下面我们简要解释一下这些部分以及一些其它常见编程术语的含义:
数据
数据(Data)是程序中存储和处理的基本信息。在上面示例程序中,我们看到的数字 1、2,文字 "Hello, World!" 等等都是程序中的数据。Python 支持多种数据类型,用于存储不同类型的信息。最常见的几种数据类型包括:
- 数字类型:如整数 int 和浮点数 float。例如:
42
,3.14
- 字符串类型:用引号括起来的字符序列,例如:
"Hello, World!"
- 布尔类型:表示逻辑值
True
和False
,用于条件判断。 - 列表、字典等集合数据:用来存储多个数据项的集合,例如列表(list)可以包含多个元素
[1, 2, 3]
,字典(dict)用键-值对存储数据{"name": "Alice", "age": 30}
。
关于数据,我们将在数据与变量一节做详细介绍。
变量
变量(Variable)是用来保存数据的命名空间,可以将数据赋值给变量,通过变量来操作数据。在 Python 中,变量的定义不需要声明类型,可以直接用等号赋值。例如:
age = 25 # 整数类型
name = "Alice" # 字符串类型
is_student = True # 布尔类型
上面每一行代码中,等号左边的文字是变量名,它可以包含字母、数字和下划线,不能以数字开头;等号右边是变量的数据。在数据与变量一节,我们会对变量做详细的讨论。
操作符
操作符(Operator)是用于操作数据和变量的符号,比如,用于数学计算的加减乘除(+
-
*
/
)等操作符。Python 中还有用于处理其它类型数据的操作符,我们将会在基础数学运算一节详细介绍这些操作符。
关键字
在编程语言中,关键字(Keyword)是指被该语言赋予了特殊意义的词汇,用于定义语法和结构规则。关键字是编程语言的一部分,被预先定义在语言的规范中,我们在编程时,可以直接拿它们来用。由于关键字具有特殊的意义,它们作为保留字,只能用于特定用途,不能再被用作变量名、函数名或其他标识符。如果把关键字用作普通的标识符,比如变量名,将会导致语法错误。
Python 中常用的关键字包括 if, else, for 等。运行下面的代码可以打印出 Python 中所有的关键字:
import keyword
print(keyword.kwlist)
我们将在后续章节分别对这些关键字做详细介绍。
标识符
标识符(Identifier)是用于命名变量、函数、类或其他用户定义对象的名称。标识符是程序中可用来标记和引用对象的唯一名称。
标识符的定义必须遵循以下规则:
- 由字母(a-z 或 A-Z 或其它语言的字母文字)、数字(0-9)和下划线(_)组成。
- 首字符必须是字母或下划线,不能是数字。
- 不能与 Python 的关键字冲突。
- 不允许特殊符号,比如空格、@、$、% 等。
比如,一些合法的标识符:my_variable
、_privateVar
、var1
、Σ_value
;
下面这些是非法标识符:1variable
、var-name
、me@qq.com
、def
、my var
。
标识符可以包含 unicode 字符。Unicode 是一套覆盖了全世界所有的字符的字符集。这使得标识符可以使用任何语言,如中文、希腊文等。Python 标识符是大小写敏感的(比如大写的 A 与小写的 a 代表不同的标识符),但是对于等效的 unicode 字符(比如对应的半角和全角字母),Python 会认为它们相同的标识符。Unicode 的等效字母的定义还是有些复杂的,多数人都不太会记得所有的等效字母。使用中文命名标识符,对于不熟悉英语的编程者是个优势,但是由于等效字母的存在,以及在整个 unicode 字符集中,存在着大量看起来极其相似,但含义不同的字符,这使得使用 unicode 有时会让程序变得非常难以理解。所以,还是应当尽量只使用英文字母作为标识符。下面示例只用来展示一些合法的标识符,但不推荐这样使用:
变量 = 42
print(变量) # 使用中文字符作为变量名
print("全角字母") # 全角英文字符组成的函数名,相当于 print() ,全角字母与半角字母等价
fi = 1
print(fi) # fi 与 fi 和 fi 是同一个标识符
xⁿ = 1
print(xn) # xⁿ 与 xn 是同一个标识符
var = 1
print(Var) # 报错,因为 var 和 Var 是两个不同的标识符。
表达式
表达式(Expression)是计算机科学中的一个术语,指一个可以计算出一个值的代码单元。它是由数据、变量和操作符组成的序列,总是产生或返回一个结果值。表达式可以非常简单,如单独一个数字、变量;或者更复杂,如整个数学公式或者函数调用等。
比如下面是一些表达式的例子:
3 + 4
返回 7"Hello" + " " + "World"
返回 "Hello World"my_function(2, 3)
返回函数 my_function 的运行结果print("Hello World")
返回 None
有些函数看似没有返回结果,比如 print() 我们不会把它的返回值赋值给任何变量,比如 x = print(1)
。但实际上,所有函数都有返回值,如果没有写明,则默认返回 None。
在 Python 中,我们可以把表达式放在任何需要一个值的地方,比如作为函数参数,作为 if 语句中的条件,作为其它表达式的一部分等。
表达式可以直接作为一行代码放在程序中。有些编辑环境在运行程序的时候,会把程序最后一行表达式的运算结果打印出来,以方便编程者查看。
语句
语句(Statement)是执行一个操作的完整命令。语句不像表达式那样返回值,它做的是指导程序去做某件事,例如声明一个变量、执行一个条件判断、执行一个循环等。比如:
x = 3 + 2
赋值语句if x > 0
条件控制语句
语句在 Python 中是一个完整的句子,它不能再成为其它语句或表达式的一部分了。
如果使用分号分隔每个语句,那么可以在一行代码中书写多个语句。其它一些编程语言也是这样的,但这样并不符合 Python 的编程规范。我们在编写程序的时候,每一行就应该只放置一条语句,以提高程序的清晰度和可读性。
注释
注释(Comment)用于对代码进行说明和解释,它不会影响程序的逻辑。注释通常是为了帮助更方便的阅读了理解程序。
Python 有两种方式添加注释:
- 单行注释:以
#
开头。在一行中,所有字符#
之后的内容都是注释 - 多行注释:可以使用 ''' 或 """ 包裹的字符串作为注释。
上文介绍变量的示例程序中,就包含有注释:
age = 25 # 整数类型
"""
这也是一段注释
"""
代码块
代码块(code block)是指由多行代码组成的结构,这些代码被组织在一起,用于完成一个特定的功能或逻辑单元。代码块通常用于条件判断、循环、函数、类等结构中,以便将代码逻辑清晰地划分和组织。
在多数编程语言中,代码块的界限通常由特定的符号(比如花括号 {}
、小括号 ()
)或特定的关键字(比如 begin 和 end)等定义。在 Python 中,代码块的定义方式比较特殊,它依赖缩进来表示代码的层级和逻辑关系。
代码缩进是编程中的一个常见概念,指的是某一行代码行的起始部分有一定数量的空白空间,空白后面才是真正的代码。在那些使用特定符号定义代码块的语言中,代码缩进只是为了美观和提高可读性,代码缩进不会影响程序的逻辑。但由于 Python 利用缩进定义代码块的这种特殊设定,使得不同的缩进会改变程序的逻辑。
Python 的这种设计决策旨在使代码更加可读,并鼓励程序员写出结构清晰、整洁的代码。在同一个代码块中,每一行代码的缩进必须是一致的。这意味着,如果使用了四个空格作为缩进,那么整个代码块中必须都使用四个空格。官方 Python 样式指南(PEP 8)推荐使用 4 个空格作为标准的缩进大小。
我们之前看到的示例程序的每一行代码之间,都仅有最简单的顺序逻辑关系,因此每个示例程序都只有一个代码块,还不用考虑缩进的问题。但之后的程序示例将会变得更加复杂,将会包含多个代码块了。
Pythora 星球的居民最开始其实不是特别喜欢 Python 的这种设计。主要是觉得缩进是比较容易搞错的,很容易多几个、少几个空格。毕竟在其它语言中,缩进只影响美观不影响逻辑,因此它没那么重要,容易被忽视。不过,随着时间的推移,大家很快发现,担心是有些多余的,在习惯了 Python 的代码分块方式之后,这种缩进方式并没有导致更多的错误,而且它也确实可以提高代码的整洁度和可维护性。
下面,我们以 Python 中最主要的两种控制结构,以及函数为例,演示一下代码块的含义。
代码执行流程
前文介绍过,如果有多行代码,程序一般会按照从上到下的顺序逐句运行。比如:
print("第一行")
print("第二行")
print("第三行")
上面这个示例中,每一行代码都是 0 缩进的,它们都在同一个代码块中。同一代码块中的代码,总是按顺序,逐行执行。
但很多时候,我们是需要改变代码执行的流程的,比如在满足一定条件时,需要跳过部分代码,或重复执行部分代码。这时,就需要使用到控制结构来控制代码执行的流程。Python 主要的控制结构包括条件判断和循环结构,使程序能够根据条件进行分支或重复执行。
本书会在后面的章节详细讨论这两种控制结构,但是因为它们太过常用,有必要先简单介绍一下它们的基本用法,也可以帮助读者尽快了解 Python 的用法。
条件判断
Python 使用 if
和 else
关键字来执行条件判断。当遇到 if 语句时,会根据条件表达式的真假决定是否执行相应的代码块。满足条件时执行代码块,条件不满足则跳过:
age = 18
if age >= 18:
print("成年人")
print("这是 if 的子代码块")
else:
print("未成年人")
print("这是 else 的子代码块")
在上面的代码中,程序会先判断 age >= 18
是否为 True
。若条件为真则执行 if
语句下面的子代码块,也就是 if
语句下一行开始,所有相对缩进了 4 列的代码行;若判断条件为假,则执行 else 语句下面的子代码块,也就是 else 语句下一行开始,所有相对缩进了 4 列的代码行。
for 循环
Python 中有两种常用的循环结构:for
循环和 while
循环。for
循环用于遍历序列(如列表、元组、字符串等)或范围内的数字。
下面的程序演示了如何使用 for` 循环遍历一个列表中的数据:
# 遍历列表
fruits = ["苹果", "香蕉", "鸭梨"]
for fruit in fruits:
print(fruit)
print("这是 for 循环的代码块")
这段程序首先定义了一个包含三个水果名称的列表 fruits。for fruit in fruits:
表示使用 for 循环遍历列表中的每一个元素。其中,fruit
变量在循环体内依次代表列表中的每个水果。比如当首次进入循环迭代时,fruit
变量的值为 "苹果";再次迭代,值变为 "香蕉"。
循环每次迭代将会执行循环体内的代码块,也就是 for
语句下一行开始,所有相对缩进了 4 列的代码行。
下面我们再看一个遍历范围内数字的示例:
# 遍历范围
for i in range(3): # range(3) 生成 0, 1, 2
print(i)
print("这是 for 循环的代码块")
range() 是一个经常与 for
循环配合使用的函数。我们会在后文对其做详细介绍,目前我们只需要知道 range(n)
函数可以生成一组从 0 到 n-1 的整数数值即可。使用 for
循环遍历这个范围内的数字,i 变量会在每次循环时依次代表这个范围中的一个数字。
while 循环
while
循环与 for
循环的主要区别在于它的循环次数通常无法预先设定。while
循环 在条件为 True
时反复执行代码块,直到条件为 False
时退出循环。例如:
count = 0
while count < 3:
print("循环次数:", count)
count += 1 # 更新 count 值,否则会变成死循环
在此示例中,while
循环会在 count < 3
为 True
时继续执行,一旦 count
达到 3,则退出循环。
函数
函数(Function)是编程中的一个基本概念,指的是一段具有特定功能的代码块。它接收输入(参数),通过执行代码逻辑来完成任务,并且可以返回一个或多个结果。函数帮助我们将代码进行模块化,使得代码更加结构化、易读、易维护、可复用。在上面示例中,我们已经见到了一些 Python 内置的函数,比如 print()、rang() 等。我们将在后续章节详细讲解函数,这里,我们先看几个简单示例程序,了解一下函数的基本使用方法:
一个基本的 Python 函数定义如下:
def function_name(parameters):
statement_1
statement_2
...
return expression
函数定义以 def 关键字开头,表示定义一个新的函数。紧跟 def 之后的是函数名,函数名的命名规则与变量相同。函数名后面紧跟参数列表,用小括号 () 包围。参数列表可以为空,也可以包含一个或多个参数,以逗号分隔。参数列表后面必须加一个冒号 :,标志函数头的结束,进入函数体。函数体是包含实际代码逻辑的部分,缩进一级。return
用于返回函数的计算结果,有些函数不需要返回任何结果,可以省略 return。
下面我们编写一个最简单的函数,它用于计算两个数的和:
def add(a, b):
result = a + b
return result
在这个例子中:add
是函数的名称。a
和 b
是函数的参数。result = a + b
是函数的处理过程。return
语句将计算结果返回给调用者。
我们可以多次调用这个函数来计算不同的和:
print(add(3, 5)) # 打印 8
print(add(10, 20)) # 打印 30
使用函数有很多优点,比如它可以:
- 代码复用:定义一次函数后,可以在代码中多次调用,而不必重复编写逻辑。
- 模块化:将大任务分解成小的、可管理的代码块,使代码更易于理解和调试。
- 简化代码:函数的调用可以使主程序更加简洁和清晰。
- 便于维护:修改函数代码会自动影响所有调用的地方,减少了出错的概率。