跳到主要内容

第一个 Python 程序

欢迎进入编程世界!

这是编程语言书籍的一个传统,第一句话永远是上面这句问候。而第一个编写的程序就是打印出“Hello, World!”这句话。我们也沿用这一传统,从 Hello World 开始。

实现这一功能只需要运行以下的语句

print("Hello, World!")

使用在线编辑环境

使用在线编辑环境非常简单,不需要任何额外工作。打开在线编辑环境页面,输入上面那行代码并运行即可。比如:https://qizhen.xyz/pyodidehttps://qizhen.xyz/brython

直接在 Python 解释器中运行

如果不使用任何 IDE,可以打开计算机的命令行终端,然后输入 python(在 macOS 或 Linux 上通常需要输入 python3)并回车,系统会启动 Python 解释器。读者现在应该看到 >>> 这样的提示符,表示 Python 解释器已经准备好接受命令了。

在 >>> 提示符后,输入以下代码:

print("Hello, World!")

然后回车。

读者应该看到输出为:

Hello, World!

恭喜!你刚刚编写并运行了你的第一个 Python 程序。

使用集成开发环境(IDE)

如果使用前文介绍的任何一种集成开发环境编写程序,通常都需要先创建一个文件来保存程序。将下面这行代码复制到新建的文件中:

print("Hello, World!")

然后将其保存为以 .py 为后缀的文件(例如 hello.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),然后再打印出结果 3

如果程序有多行代码,比如:

name = input("你叫什么名字? ")
print(f"你好,{name}!欢迎来到 Python 的编程世界!")

那么程序一般会按照从上到下的顺序逐句运行。在上面的示例中,input 也是一个函数,它的主要作用是暂停程序运行,等待用户输入。括号里的文字是提示符,会先显示在屏幕上告诉用户该输入什么。name 是一个变量,用于保存 input 函数返回的数据(即用户通过键盘输入的内容)。接下来的 print 函数会把字符串数据连同变量 name 中的内容一起打印在屏幕上。

程序语句通常由数据、变量、操作符、表达式等部分组成。下面我们简要解释一下这些部分以及一些其它常见编程术语的含义:

数据

数据(Data)是程序中存储和处理的基本信息。在上面的示例程序中,我们看到的数字 12,文本 "Hello, World!" 等,都是程序中的数据。Python 支持多种数据类型,用于存储不同类型的信息。最常见的几种数据类型包括:

  • 数字类型:如整数 int 和浮点数 float。例如:42, 3.14
  • 字符串类型:用引号括起来的字符序列,例如:"Hello, World!"
  • 布尔类型:表示逻辑值 TrueFalse,用于条件判断。
  • 列表、字典等集合数据:用来存储多个数据项的集合,例如列表(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_privateVarvar1Σ_value; 下面这些是非法标识符:1variablevar-nameme@qq.comdefmy var

标识符可以包含 unicode 字符。Unicode 是一套覆盖了全世界所有的字符的字符集。这使得标识符可以使用任何语言(如中文、希腊文等)。我们可以利用这一点,使用中文来编写 Python 程序,比如这个示例程序

Python 标识符是大小写敏感的(比如大写的 A 与小写的 a 代表不同的标识符),但是对于等效的 Unicode 字符(比如对应的半角和全角字母),Python 会认为它们是相同的标识符。Unicode 中等效字符的定义相当复杂,大多数人并不能记住所有的等效字符。使用中文命名标识符对于不熟悉英语的开发者是个优势,但是由于 Unicode 中存在等效字符,且字符集中存在着大量外观极其相似但编码不同的字符,这可能导致程序变得难以理解和调试。所以,还是应当尽量只使用英文字母作为标识符。下面示例只用来展示一些合法的标识符,但不推荐这样使用:

变量 = 42
print(变量) # 使用中文字符作为变量名

print("全角字母") # 全角英文字符组成的函数名,相当于 print() ,全角字母与半角字母等价

= 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))。但实际上,Python 中的所有函数都有返回值,如果没有显式指定,则默认返回 None

在 Python 中,我们可以把表达式放在任何需要一个值的地方,比如作为函数参数,作为 if 语句中的条件,作为其它表达式的一部分等。

表达式可以直接作为一行代码放在程序中。有些编辑环境在运行程序的时候,会把程序最后一行表达式的运算结果打印出来,以方便编程者查看。

语句

语句(Statement)是执行一个操作的完整命令。语句不像表达式那样返回值,它做的是指导程序去做某件事,例如声明一个变量、执行一个条件判断、执行一个循环等。比如:

  • x = 3 + 2 赋值语句
  • if x > 0 条件控制语句

语句在 Python 中是一个完整的句子,它不能再成为其它语句或表达式的一部分了。

如果使用分号分隔每个语句,那么可以在一行代码中书写多个语句。其它一些编程语言也是这样的,但这样并不符合 Python 的编程规范。我们在编写程序的时候,每一行就应该只放置一条语句,以提高程序的清晰度和可读性。

注释

注释(Comment)用于对代码进行说明和解释,它不会影响程序的逻辑。注释通常是为了帮助更方便地阅读和理解程序。

Python 有两种方式添加注释:

  • 单行注释:以 # 开头。在一行中,所有字符 # 之后的内容都是注释
  • 多行注释:Python 并没有专门的多行注释符号,但通常可以使用三个单引号 ''' 或三个双引号 """ 包裹的一段文本来作为多行注释。如果不将这些文本赋值给变量,Python 运行时会忽略它们。

上文介绍变量的示例程序中,就包含有注释:

age = 25 # 整数类型
"""
这也是一段注释
"""

代码块

代码块(code block)是指由多行代码组成的结构,这些代码被组织在一起,用于完成一个特定的功能或逻辑单元。代码块通常用于条件判断循环函数等结构中,以便将代码逻辑清晰地划分和组织。

在多数编程语言中,代码块的界限通常由特定的符号(比如花括号 {}、小括号 ())或特定的关键字(比如 begin 和 end)等定义。在 Python 中,代码块的定义方式比较特殊,它依赖缩进来表示代码的层级和逻辑关系。

代码缩进是编程中的一个常见概念,指的是某一行代码行的起始部分有一定数量的空白空间,空白后面才是真正的代码。在那些使用特定符号定义代码块的语言中,缩进只是为了美观并提高可读性,不会影响程序的逻辑。但在 Python 中,由于利用缩进定义代码块的特殊设定,不同的缩进会直接改变程序的逻辑。

Python 的这种设计决策旨在使代码更加可读,并鼓励程序员写出结构清晰、整洁的代码。在同一个代码块中,每一行代码的缩进必须是一致的。这意味着,如果使用了四个空格作为缩进,那么整个代码块中必须都使用四个空格。官方 Python 样式指南(PEP 8)推荐使用 4 个空格作为标准的缩进大小。

我们之前看到的示例程序的每一行代码之间,都仅有最简单的顺序逻辑关系,因此每个示例程序都只有一个代码块,还不用考虑缩进的问题。但之后的程序示例将会变得更加复杂,将会包含多个代码块了。

起初大家觉得缩进很容易出错,多一个或少一个空格都会导致问题。毕竟在其他语言中,缩进只影响美观而不影响逻辑,因而容易被忽视。不过,随着时间的推移,大家很快发现这种担心是多余的。在习惯了 Python 的代码分块方式后,缩进并没有导致更多错误,反而显著提升了代码的整洁度和可维护性。

下面,我们以 Python 中最主要的两种控制结构,以及函数为例,演示一下代码块的含义。

代码执行流程

前文介绍过,如果有多行代码,程序一般会按照从上到下的顺序逐句运行。比如:

print("第一行")
print("第二行")
print("第三行")

上面这个示例中,每一行代码都是 0 缩进的,它们都在同一个代码块中。同一代码块中的代码,总是按顺序,逐行执行。

但很多时候,我们是需要改变代码执行的流程的,比如在满足一定条件时,需要跳过部分代码,或重复执行部分代码。这时,就需要使用到控制结构来控制代码执行的流程。Python 主要的控制结构包括条件判断循环结构,使程序能够根据条件进行分支或重复执行。

本书会在后面的章节详细讨论这两种控制结构,但是因为它们太过常用,有必要先简单介绍一下它们的基本用法,也可以帮助读者尽快了解 Python 的用法。

条件判断

Python 使用 ifelse 关键字来执行条件判断。当遇到 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 < 3True 时继续执行,一旦 count 达到 3,则退出循环。

函数

函数(Function)是编程中的一个基本概念,指的是一段具有特定功能的代码块。它接收输入(参数),通过执行代码逻辑来完成任务,并且可以返回一个或多个结果。函数帮助我们将代码进行模块化,使得代码更加结构化、易读、易维护、可复用。在上面示例中,我们已经见到了一些 Python 内置的函数,比如 print()range() 等。我们将在后续章节详细讲解函数。这里,我们先看几个简单示例,了解一下函数的基本用法:

一个基本的 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 是函数的名称。ab 是函数的参数。result = a + b 是函数的处理过程。return 语句将计算结果返回给调用者。

我们可以多次调用这个函数来计算不同的和:

print(add(3, 5)) # 打印 8
print(add(10, 20)) # 打印 30

使用函数有很多优点,例如可以实现:

  • 代码复用:定义一次函数后,可以在代码中多次调用,而不必重复编写逻辑。
  • 模块化:将大任务分解成小的、可管理的代码块,使代码更易于理解和调试。
  • 简化代码:函数的调用可以使主程序更加简洁和清晰。
  • 便于维护:修改函数代码会自动影响所有调用的地方,减少了出错的概率。