第一个程序

PythonPythonBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本节将讨论如何创建你的第一个程序、运行解释器以及一些基本的调试方法。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/ModulesandPackagesGroup(["Modules and Packages"]) python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) python(("Python")) -.-> python/DataStructuresGroup(["Data Structures"]) python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/ControlFlowGroup(["Control Flow"]) python/BasicConceptsGroup -.-> python/comments("Comments") python/BasicConceptsGroup -.-> python/python_shell("Python Shell") python/ControlFlowGroup -.-> python/conditional_statements("Conditional Statements") python/ControlFlowGroup -.-> python/for_loops("For Loops") python/ControlFlowGroup -.-> python/while_loops("While Loops") python/DataStructuresGroup -.-> python/lists("Lists") python/DataStructuresGroup -.-> python/tuples("Tuples") python/FunctionsGroup -.-> python/build_in_functions("Build-in Functions") python/ModulesandPackagesGroup -.-> python/standard_libraries("Common Standard Libraries") subgraph Lab Skills python/comments -.-> lab-132701{{"第一个程序"}} python/python_shell -.-> lab-132701{{"第一个程序"}} python/conditional_statements -.-> lab-132701{{"第一个程序"}} python/for_loops -.-> lab-132701{{"第一个程序"}} python/while_loops -.-> lab-132701{{"第一个程序"}} python/lists -.-> lab-132701{{"第一个程序"}} python/tuples -.-> lab-132701{{"第一个程序"}} python/build_in_functions -.-> lab-132701{{"第一个程序"}} python/standard_libraries -.-> lab-132701{{"第一个程序"}} end

运行 Python

Python 程序总是在解释器中运行。

解释器是一个“基于控制台”的应用程序,通常从命令 shell 运行。

python3
Python 3.6.1 (v3.6.1:69c0db5050, Mar 21 2017, 01:21:04)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

专业程序员通常可以毫无问题地以这种方式使用解释器,但对于初学者来说,它并不是那么用户友好。你可能正在使用一个为 Python 提供不同界面的环境。这没关系,但学习如何运行 Python 终端仍然是一项有用的技能。

交互模式

当你启动 Python 时,你会进入一个可以进行实验的交互模式。

如果你开始输入语句,它们会立即运行。不存在编辑/编译/运行/调试周期。

>>> print('hello world')
hello world
>>> 37*42
1554
>>> for i in range(5):
...     print(i)
...
0
1
2
3
4
>>>

这种所谓的读取-求值-输出循环(或 REPL)对于调试和探索非常有用。

注意:如果你不知道如何与 Python 进行交互,请停止你正在做的事情并弄清楚如何操作。如果你正在使用 IDE,它可能隐藏在菜单选项或其他窗口后面。本课程的许多部分都假设你可以与解释器进行交互。

让我们仔细看看 REPL 的各个元素:

  • >>> 是解释器提示符,用于开始新语句。
  • ... 是解释器提示符,用于继续语句。输入空白行以完成输入并运行你输入的内容。

... 提示符可能会根据你的环境显示或不显示。在本课程中,它显示为空白,以便于剪切/粘贴代码示例。

下划线 _ 保存上一个结果。

>>> 37 * 42
1554
>>> _ * 2
3108
>>> _ + 50
3158
>>>

这仅在交互模式下成立。 你在程序中从不使用 _

创建程序

程序被放在 .py 文件中。

## hello.py
print('hello world')

你可以使用你喜欢的文本编辑器在 /home/labex/project 目录中创建一个 hello.py 文件。

运行程序

要执行一个程序,在终端中使用 python 命令运行它。例如,在 Unix 命令行中:

$ python hello.py
hello world
bash %

或者在 Windows 命令提示符中:

C:\SomeFolder>hello.py
hello world

C:\SomeFolder>c:\python36\python hello.py
hello world

注意:在 Windows 上,你可能需要指定 Python 解释器的完整路径,例如 c:\python36\python。但是,如果 Python 是按照常规方式安装的,你可能只需输入程序的名称,如 hello.py

一个示例程序

让我们解决以下问题:

一天早上,你出门并在芝加哥西尔斯大厦旁的人行道上放了一张一美元的钞票。此后的每一天,你出门时都会将钞票的数量翻倍。那么需要多长时间这堆钞票的高度才能超过这座大厦的高度?

以下是在 /home/labex/project 目录中创建一个 sears.py 文件的解决方案:

## sears.py
bill_thickness = 0.11 * 0.001 ## 米(0.11 毫米)
sears_height = 442 ## 高度(米)
num_bills = 1
day = 1

while num_bills * bill_thickness < sears_height:
    print(day, num_bills, num_bills * bill_thickness)
    day = day + 1
    num_bills = num_bills * 2

print('天数', day)
print('钞票数量', num_bills)
print('最终高度', num_bills * bill_thickness)

当你运行它时,会得到以下输出:

$ python3 sears.py
1 1 0.00011
2 2 0.00022
3 4 0.00044
4 8 0.00088
5 16 0.00176
6 32 0.00352
...
21 1048576 115.34336
22 2097152 230.68672
天数 23
钞票数量 4194304
最终高度 461.37344

以这个程序为指导,你可以学习到一些关于 Python 的重要核心概念。

语句

一个 Python 程序是一系列语句的序列:

a = 3 + 4
b = a * 2
print(b)

每条语句都以换行符结束。语句会依次执行,直到控制流到达文件末尾。

注释

注释是不会被执行的文本。

a = 3 + 4
## 这是一条注释
b = a * 2
print(b)

注释由 # 表示,并延伸到该行的末尾。

变量

变量是一个值的名称。你可以使用从 a 到 z 的字母(大写和小写)。以及下划线字符 _。数字也可以是变量名的一部分,但不能作为第一个字符。

height = 442 ## 有效
_height = 442 ## 有效
height2 = 442 ## 有效
2height = 442 ## 无效

类型

变量不需要声明其值的类型。类型与右侧的值相关联,而不是变量的名称。

height = 442           ## 一个整数
height = 442.0         ## 浮点数
height = 'Really tall' ## 一个字符串

Python 是动态类型的。变量的“类型”在程序执行时可能会根据当前赋给它的值而改变。

大小写敏感性

Python 是大小写敏感的。大写字母和小写字母被视为不同的字母。这些都是不同的变量:

name = 'Jake'
Name = 'Elwood'
NAME = 'Guido'

语言语句总是小写的。

while x < 0:   ## 正确
WHILE x < 0:   ## 错误

循环

while 语句用于执行循环。

while num_bills * bill_thickness < sears_height:
    print(day, num_bills, num_bills * bill_thickness)
    day = day + 1
    num_bills = num_bills * 2

print('Number of days', day)

只要 while 后面的表达式为 ,缩进在 while 下面的语句就会执行。

缩进

缩进用于表示属于同一组的语句。看前面的例子:

while num_bills * bill_thickness < sears_height:
    print(day, num_bills, num_bills * bill_thickness)
    day = day + 1
    num_bills = num_bills * 2

print('Number of days', day)

缩进将以下语句组合在一起,作为重复执行的操作:

    print(day, num_bills, num_bills * bill_thickness)
    day = day + 1
    num_bills = num_bills * 2

因为末尾的 print() 语句没有缩进,所以它不属于循环。空行只是为了提高可读性,不影响执行。

缩进最佳实践

  • 使用空格而非制表符。
  • 每级缩进使用4个空格。
  • 使用支持Python的编辑器。

Python唯一的要求是同一代码块内的缩进需保持一致。例如,这是一个错误示例:

while num_bills * bill_thickness < sears_height:
    print(day, num_bills, num_bills * bill_thickness)
        day = day + 1 ## 错误
    num_bills = num_bills * 2

条件语句

if 语句用于执行条件判断:

if a > b:
    print('Computer says no')
else:
    print('Computer says yes')

你可以使用 elif 添加额外的检查来判断多个条件。

if a > b:
    print('Computer says no')
elif a == b:
    print('Computer says yes')
else:
    print('Computer says maybe')

打印

print 函数会输出一行包含所传递值的文本。

print('Hello world!') ## 输出文本 'Hello world!'

你可以使用变量。打印的文本将是变量的值,而非变量名。

x = 100
print(x) ## 输出文本 '100'

如果你向 print 传递多个值,它们会用空格分隔。

name = 'Jake'
print('My name is', name) ## 输出文本 'My name is Jake'

print() 总是会在末尾添加一个换行符。

print('Hello')
print('My name is', 'Jake')

这将输出:

Hello
My name is Jake

可以抑制额外的换行符:

print('Hello', end=' ')
print('My name is', 'Jake')

这段代码现在将输出:

Hello My name is Jake

用户输入

要读取用户输入的一行内容,可使用 input() 函数:

name = input('Enter your name:')
print('Your name is', name)

input 会向用户打印一个提示,并返回他们的响应。这对于小型程序、学习练习或简单调试很有用。在实际程序中它的使用并不广泛。

pass 语句

有时你需要指定一个空的代码块。为此可使用关键字 pass

if a > b:
    pass
else:
    print('Computer says false')

这也被称为“空操作”语句。它不执行任何操作。它用作语句的占位符,可能稍后会添加内容。

这是你需要创建 Python 文件并运行它们的第一组练习。从现在开始,假设你在 ~/project/ 目录中编辑文件。为了帮助你找到合适的位置,已经创建了一些带有适当文件名的空起始文件。查找第一个练习中使用的文件 bounce.py

练习1.5:弹跳球

一个橡胶球从100米的高度落下,每次撞击地面时,它会反弹至下落高度的3/5。编写一个名为 bounce.py 的程序,打印出显示前10次弹跳高度的表格。

以下是一个解决方案:

## bounce.py

height = 100
bounce = 1
while bounce <= 10:
    height = height * (3 / 5)
    print(bounce, round(height, 4))
    bounce += 1

你的程序应该生成一个类似这样的表格:

1 60.0
2 36.0
3 21.599999999999998
4 12.959999999999999
5 7.775999999999999
6 4.6655999999999995
7 2.7993599999999996
8 1.6796159999999998
9 1.0077695999999998
10 0.6046617599999998

注意:如果你使用 round() 函数,可以稍微清理一下输出。尝试用它将输出四舍五入到4位数字。

1 60.0
2 36.0
3 21.6
4 12.96
5 7.776
6 4.6656
7 2.7994
8 1.6796
9 1.0078
10 0.6047

练习1.6:调试

以下代码片段包含了西尔斯大厦问题的代码。其中也存在一个错误。

## sears.py

bill_thickness = 0.11 * 0.001    ## 米(0.11毫米)
sears_height   = 442             ## 高度(米)
num_bills      = 1
day            = 1

while num_bills * bill_thickness < sears_height:
    print(day, num_bills, num_bills * bill_thickness)
    day = days + 1
    num_bills = num_bills * 2

print('天数', day)
print('纸张数', num_bills)
print('最终高度', num_bills * bill_thickness)

将上述代码复制并粘贴到一个名为 sears.py 的新程序中。当你运行这段代码时,将会得到一个错误消息,导致程序崩溃,如下所示:

Traceback (most recent call last):
  File "sears.py", line 10, in <module>
    day = days + 1
NameError: name 'days' is not defined

阅读错误消息是Python编程的一个重要部分。如果你的程序崩溃了,回溯消息的最后一行就是程序崩溃的实际原因。在这之上,你应该会看到一段源代码片段,然后是一个标识文件名和行号。

  • 错误出在哪一行?
  • 错误是什么?
  • 修复错误
  • 成功运行程序

总结

恭喜你!你已经完成了“第一个程序”实验。你可以在LabEx中练习更多实验来提升你的技能。