px普贤教程PuXian
普贤教程 › 基础教程

循环语句

两种循环:while 按条件循环,for 遍历集合。没有 do-while,没有 for(;;) 三表达式形式。

while

px
var i = 0
while i < 3:
    print("第 " + str(i + 1) + " 次")
    i += 1
text
第 1 次
第 2 次
第 3 次
别忘了推进条件循环体里没有改变条件的变量,就会无限循环。写 while 时先写下"什么时候退出",再写循环体。

for 遍历列表

px
var langs = ["px", "go", "py"]
for l in langs:
    print(l)
text
px
go
py

for 遍历字典

px
var scores = {"语文": 90, "数学": 95}
for k in scores:
    print(k + "=" + str(scores[k]))
text
语文=90
数学=95

遍历字典拿到的是键。要同时要键和值,用 d.keys() + 下标取值;顺序不保证,需要稳定顺序时先 sorted(d.keys())。

range

px
for i in range(0, 3):
    print(str(i))
text
0
1
2

range(起点, 终点, 步长),终点不含。步长可以是 2、3、甚至负数:

px
for i in range(0, 10, 3):
    print(str(i))
for i in range(3, 0, -1):
    print("倒计时 " + str(i))
text
0
3
6
9
倒计时 3
倒计时 2
倒计时 1

break 与 continue

px
for i in range(0, 10):
    if i == 2:
        continue        # 跳过本次
    if i == 5:
        break           # 结束整个循环
    print(str(i))
text
0
1
3
4

break 只跳出最内层循环。嵌套时需要跳出多层,用一个标志位:

px
var found = false
var grid = [[1, 2], [3, 4]]
for row in grid:
    if found:
        break
    for cell in row:
        if cell == 3:
            found = true
            break
print(str(found))
text
true

常见模式

累加与统计

px
var xs = [4, 8, 15, 16, 23, 42]
var sum = 0
var maxv = xs[0]
for x in xs:
    sum += x
    if x > maxv:
        maxv = x
print("和 " + str(sum))
print("最大 " + str(maxv))
text
和 108
最大 42

按行处理文本

px
var text = "alpha\nbeta\ngamma"
for line in split(text, "\n"):
    if len(trim(line)) == 0:
        continue
    print("[" + trim(line) + "]")
text
[alpha]
[beta]
[gamma]

边遍历边收集

px
def filter_by(xs, pred_true_value):
    var out = []
    for x in xs:
        if x == pred_true_value:
            out.append(x)
    return out

print(str(filter_by([1, 2, 1, 3, 1], 1)))
text
[1, 1, 1]

带索引的遍历

px
var items = ["a", "b", "c"]
var i = 0
while i < len(items):
    print(str(i) + " -> " + items[i])
    i += 1
text
0 -> a
1 -> b
2 -> c

循环里的字符串拼接

px
var parts = []
for i in range(0, 5):
    parts.append("第" + str(i) + "项")
print(join(", ", parts))
text
第0项, 第1项, 第2项, 第3项, 第4项
性能习惯循环里拼接上千段文本时,先 append 到列表再 join——比每次 += 快一个量级。

常见错误

写法结果
for i in range(0, 3):(全角冒号)E2001 语法错误
for (var i = 0; i < 3; i += 1)不支持 C 风格 for
循环体内修改正在遍历的列表下标错位,取值不符合预期