Skip to main content

第一个 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!"
  • 布尔类型:表示逻辑值 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 标识符是大小写敏感的(比如大写的 A 与小写的 a 代表不同的标识符),但是对于等效的 unicode 字符(比如对应的半角和全角字母),Python 会认为它们相同的标识符。Unicode 的等效字母的定义还是有些复杂的,多数人都不太会记得所有的等效字母。使用中文命名标识符,对于不熟悉英语的编程者是个优势,但是由于等效字母的存在,以及在整个 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)。但实际上,所有函数都有返回值,如果没有写明,则默认返回 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 使用 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()、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 是函数的名称。ab 是函数的参数。result = a + b 是函数的处理过程。return 语句将计算结果返回给调用者。

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

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

使用函数有很多优点,比如它可以:

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