{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 流程控制语句\n", "\n", "本章介绍流程控制相关的内容,例如循环语句与判断语句。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## if 判断语句\n", "\n", "判断语句是最简单的流程控制语句:\n", "\n", "- 语句首行由 `if` 开头,后接逻辑表达式,然后以冒号结尾\n", "- 前面提到过,语句主体代码块每行的行首需要(相比语句首行)向右缩进 4 个空格\n", "\n", "下例判断了逻辑表达式 `x > 0` 的结果是 True,因此执行了代码块中的内容,使 x 增加了 1 。" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n" ] } ], "source": [ "x = 1\n", "if x > 0:\n", " x = x + 1\n", "print(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "if 语句也支持 `else` 结构,用来添加一个逻辑表达式为 False 时要执行的代码块;不过该结构不是必须的。" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-1\n" ] } ], "source": [ "x = -0.1\n", "if x > 0:\n", " x = 1\n", "else:\n", " x = -1\n", "print(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "如果判断支有多个分岔,可以使用若干个 `elif` 在中间进行连接,开启若干个代码块:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Equal to zero.\n" ] } ], "source": [ "x = 0\n", "if x > 0:\n", " print(\"Larger than zero\")\n", "elif x < 0:\n", " print(\"Smaller than zero\")\n", "else:\n", " print(\"Equal to zero.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## for 循环语句\n", "\n", "for 语句的标准格式是 `for xxx in yyy` ,其中 `yyy` 需要是一个可迭代的数据(常用的是序列类的数据,比如列表),而 `xxx` 则是依次取 `yyy` 中的数值。for 语句内部的代码会在 xxx 每读取一次数据后执行一遍,直到 `yyy` 中的所有项被遍历。\n", "\n", "一个简单的例子是计算 1+2+3+…+5 求和,我们这里创建一个列表 `lst` 来对其中的每项进行遍历:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "15\n" ] } ], "source": [ "lst = [1, 2, 3, 4, 5]\n", "s = 0\n", "for i in lst:\n", " s += i\n", "print(s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "for 语句还包含一个 else 的写法,能让循环在正常结束(即非break跳出的结束)后执行一段内容:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3\n" ] } ], "source": [ "s = 0\n", "for i in (1,2,3):\n", " pass\n", "else:\n", " s = i\n", "print(s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## while 循环语句\n", "\n", "while 语句的标准格式是 `while xxx` ,其中 `xxx` 是循环条件。如果循环条件不满足,则结束循环。" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "2\n", "3\n", "4\n" ] } ], "source": [ "i = 1\n", "while i < 5:\n", " print(i)\n", " i += 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "while 语句也支持 else 写法,让循环在正常结束(即非break跳出的结束)后执行一段内容:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4\n" ] } ], "source": [ "s, i = 0, 1\n", "while i <= 3:\n", " i += 1\n", "else:\n", " s = i\n", "print(s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 循环内控制:break 与 continue\n", "\n", "循环内控制是进行复杂循环的重要一环。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### break:跳出\n", "\n", "循环内在特定的条件下,需要跳出循环语句。这时需要 `break` 关键字,它会跳出它所在的这一层循环语句:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "j = 1\n", "j = 2\n", "k = 1\n", "j = 1\n", "j = 2\n", "k = 2\n" ] } ], "source": [ "for k in [1,2]:\n", " for j in [1,2,3]:\n", " if j > 2:\n", " break\n", " print(\"j =\", j)\n", " print(\"k =\", k)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "上例中,在 `j=3` 时判断 `j>2` 为真,因此执行 `break` 跳出了内层的 j 循环;但外层的 k 循环并不受影响。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "