forked from swaroopch/byte-of-python
-
Notifications
You must be signed in to change notification settings - Fork 2
/
08-control-flow.pd
273 lines (190 loc) · 11.3 KB
/
08-control-flow.pd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
# 控制流
在程序中,到现在为止,我们看到,一直有一系列的语句被Python以由上而下的顺序如实地执行。如果你想改变它的流程,它会如何工作呢?例如,你想让程序作出一些决定,而且不同的情况做不同的事情,例如,根据一天的时间不同,打印“早上好”或“晚上好”?
正如你可能已经猜到的,这要通过使用控制流语句。在Python中有三个控制流语句-- `if`, `for` 和 `while`。
## if 语句
`if` 语句是用来检查一个条件:*如果*条件为真,我们运行一个语句块(你为*if块*),*(否则)else*,我们执行另一个语句块(称为*else块*)。*else*子语句是可选的。
例如 (保存为 `if.py`):
~~~python
number = 23
guess = int(input(`请输入一个整数: `))
if guess == number:
print(`恭喜,你猜对了。`) # 新块从这里开始
print(`(但你没有获得任何奖品!)`) # 新块在这里结束
elif guess < number:
print(`不对,你猜的有点儿小`) # 另一个块
# 在一个块中你可以做你想做的任何事...
else:
print(`不对,你猜的有点大`)
# 你猜的数比number大时才能到这里
print(`完成`)
# if语句执行完后,最后的语句总是被执行
~~~
输出:
~~~
$ python3 if.py
请输入一个整数: 50
不对,你猜的有点儿大
完成
$ python3 if.py
请输入一个整数: 22
不对,你猜的有点儿小
完成
$ python3 if.py
请输入一个整数: 23
恭喜,你猜对了。
(但你没有获得任何奖品!)
完成
~~~
它是如何工作的:
在这个程序中,我们获取来自用户的猜测,并检查这个数是否是我们设定的数。我们给变量`number`设置我们想要的任何整数,比如 `23`。然后,我们使用`input()` 函数获取用户的猜的数。函数是可重用的程序块。我们在[下一章](#函数)中会阅读关于它们的更多东西。
我们给内置的`input` 函数提供一个字符串,该函数将其打印到屏幕上并等待用户输入。一旦我们输入一些东西并按下`enter`键,`input()`函数把我们的输入作为一个字符串返回。然后,我们使用`int`将这个字符串转换为整数,然后将其存储在变量`guess`中。实际上,`int` 是一个类,但现在所有你需要知道的是,您可以使用它来将一个字符串转变为一个整数(假设文本中的字符串包含一个有效的整数)。
接下来,我们比较用户猜的数和我们选择的数,如果他们相等,我们打印一条成功的消息。注意,我们使用缩进级别告诉Python语句属于哪个块。这就是为什么缩进P在ython中是如此重要。我希望你坚持"一致的缩进"的规则,好吗?
注意,`if`语句在最后有一个冒号——我们指示Python一个语句块将跟随其后。
然后,我们检查猜的数是否小于这个数字,如果是,我们通知用户,他们猜的数必须比那个数稍高。我们这里使用的是“elif”子句,实际上将两个相关的 `if else-if else`语句组合为一个语句`if-elif-else`,这使程序更简单且减少所需要的缩进。
`elif`和`else`语句也必须在逻辑行结束时有一个冒号,后跟相应的语句块(当然要通过适当的缩进)
你可以在`if`语句的if块中有另一个`if`语句——这称为if语句嵌套。
记住,`elif` 和`else`部分是可选的。一个最小的有效的`if`语句是:
~~~python
if True:
print(`是的,它为真`)
~~~
在Python执行完成完整的`if`语句以及相关的`elif`和`else`子句,它移动到`if`包含语句的块中下一个语句块。在本例中,它是主要的块(程序开始执行的地方),接下来的语句是 `print(`完成`)`。在这之后,Python将看到程序的结尾,并简单的完成。
尽管这是一个非常简单的程序,但你应该注意,我已经指出很多东西。所有这些都是相当的直截了当(对那些有c/c++背景的人是惊人的简单)。最初,你需要意识到所有这些事情,但经过一些练习,对它们你将感到舒服,`自然`将是你所有的感觉。
C/C++程序员需要注意
: 在Python中没有`switch`语句。您可以使用一个`if..elif..else`语句做同样的事(和在某些情况下,使用[词典](#词典)去做更快速)
## while语句
只要条件为真,`while`语句允许您多次执行一个语句块。`while`语句是被称为**循环语句**的一种。`while`语句可以有一个可选的`else`子句。
例如 (保存为`while.py`):
~~~python
number = 23
running = True
while running:
guess = int(input(`输入一个整数 : `))
if guess == number:
print(`恭喜,你猜对了。`)
running = False # 这使while循环停止
elif guess < number:
print(`不对,你猜的有点儿小。`)
else:
print(`不对,你猜的有点儿大。`)
else:
print(`while循环结束。`)
# 在这做你想做的任何事
print(`完成`)
~~~
输出:
~~~
$ python3 while.py
输入一个整数 : 50
不对,你猜的有点儿大。
输入一个整数 : 22
不对,你猜的的点儿小。
输入一个整数 : 23
恭喜,你猜对了。
while循环结束。
完成
~~~
它是如何工作的:
在这个程序中,我们还是玩猜谜游戏,但优点在于,允许用户一直猜直到他猜对——每次猜测不需要重复运行该程序,正如我们在前一节中所做的。这演示了如何恰当的使用`while`语句。
我们移动`input`和`if`语句到`while`循环中,在while循环前,设置变量`running`为`True`。首先,我们检测变量`running`是否为`True`,然后往下执行相应的*while块*。在这个块执行完后,再检测条件,在这里是变量`running`,为真,我们再次执行while块,否则,我们执行可选的else块,然后执行下面的语句。
当`while`循环的条件变为`False时`--这也可能发生在条件检测时的第一次,执行`else`块。如果在`while`循环中有`else`子句,它将一直执行,除非你使用`break`语句打破循环。
在这里`True`和`False`被称为布尔类型,你可以认为它们分别相当于值`1`和`0`。
C/C++程序员注意:
: 记住, `while`循环可以的`else`子句。
## for循环
`for..in`语句是另一个循环语句,它*迭代*一个对象的序列,例如经历序列中的第一项。在后面的章节,我们将会看到更多关于[序列](#序列)的细节。现在,你需要知道的是一个序列只是一个有序的项目的集合。
例如 (保存为 `for.py`):
~~~python
for i in range(1, 5):
print(i)
else:
print(`for循环结束`)
~~~
输出:
~~~
$ python3 for.py
1
2
3
4
for循环结束
~~~
它是如何工作的:
打印一个数字*序列*。我们使用内置的`range`函数生成这个数字序列。
我们在这里所做的是提供两个数字,`range`返回一个从第一个数字到第二个数字的一个数字序列。例如, `range(1,5)`给出序列`[1, 2, 3, 4]`。默认情况下,`range` 步距取为1。如果我们提供第三个数字,`range`那么它变成了步距。例如`range(1,5,2)`得到`[1,3]`。请记住,范围扩展*到*第二号码,即它**不**包括第二个数字。
注意,range()生成一个数字序列,当for循环请求下一个项目时,它一次只生成一个数字。如果你想立刻看到完整的数字序列,使用list(range())。list(列表)将在[[数据结构章](#数据结构)]中解释。
`for`循环然后遍历这个范围,`for i in range(1,5)`相当于 `for i in [1, 2, 3, 4]` 这就像把序列中的每一个数(或对象)分配给i,一次一个,然后为每个`i`值执行该语句块。在本例中,在语句块中我们只是打印它的值。
记住,`else`部分是可选的。当包括它时,除非遇到[break][#中断)语句,当`for`循环结束时,它执行一次。
记住,`for..in`循环可以作用于任何序列。在这里,我们对一个由内建的`range`函数生成的一个数字列表,但是一般来说,我们可以使用任何种类对象的任何类型的序列!在后面的章节,我们将详细探讨这个想法。
C/C++/Java/C#程序要注意
: Python的`for`循环完全不同于C/c++的`for`循环。c#程序员会注意到,在Python中`for`循环类似于c中的`foreach`循环c#。Java程序员会注意到,同样类似于在Java 1.5中的to `for (int i : IntArray)`。
在C/c++中,如果你想写`for (int i = 0; i < 5; i++)`,那么在Python中你只要写 `for i in range(0,5)`。正如您可以看到的,在Python中`for`循环更简单,更富有表现力且不易出错。
## break语句
`break`语句是用来*跳出*一个循环语句,即停止执行一个循环语句,即使循环条件还没有成为`False`或序列的项目没有被完全遍历。
很重要的一点是,如果你*跳出*`for或`while`循环,任何相应的循环`else`块是**不**执行的。
例子 (保存为`break.py`):
~~~python
while True:
s = input(`输入一些东西 : `)
if s == `quit`:
break
print(`字符串的长度是`, len(s))
print(`完成`)
~~~
输出:
~~~
$ python3 break.py
输入一些东西: Programming is fun
字符串的长度是 18
输入一些东西: When the work is done
字符串的长度是 21
输入一些东西 : if you wanna make your work also fun:
字符串的长度是 37
输入一些东西 : use Python!
字符串的长度是 12
输入一些东西 : quit
完成
~~~
它是如何工作的:
在这个程序中,我们重复获取用户输入的东西并打印每次输入字符串的长度。我们提供一个特殊的条件--通过检查用户输入是否是 ``quit`来结束程序。我们通过*跳出k*循环停止程序,达到该程序的结束位置。
输入字符串的长度可以使用内建的`len`函数。
记住, `break`语句同样适用于`for`循环。
### Swaroop 的诗意的Python
我在这里输入的是一个我写的、名为*Swaroop 的诗意的Python*:的迷你诗:
~~~
当工作完成时
编程是有趣的
如果你想让你的工作也很有趣:
使用Python!
~~~
## continue语句
`continue`语句是用来告诉Python跳过当前循环块中其余的语句,*继续*循环的下一次迭代。
例子 (保存为`continue.py`):
~~~python
while True:
s = input(`输入一些东西: `)
if s == `quit`:
break
if len(s) < 3:
print(`太小`)
continue
print(`输入的东西有足够的长度`)
# 在这做其它各种处理...
~~~
输出:
~~~
$ python3 continue.py
输入一些东西: a
太小
输入一些东西: 12
太小
输入一些东西: abc
输入的东西有足够的长度
输入一些东西: quit
~~~
它是如何工作的:
在这个程序中,我们接受来自用户的输入,但是只有在输入的字符串至少有3个字符时才处理。因此,我们使用内建的`len`函数来获得长度,如果长度小于3,通过使用`continue`句,我们跳过块中的其余语句。否则,在循环中的其余语句将被执行--在这做其它各种处理。
注意,`continue`语句同样适用于`for`循环。
## 小结
我们已经看到了如何使用三个控制流语句--`if`、`while`和`for`以及与它们相关的 `break`和`continue`语句。这些都是Python最常用的部分,因此,变得对他们感到舒适是至关重要的。
接下来,我们将学习如何创建和使用函数。