条件和循环
8.1 if 语句8.1.1 if 语句的语法如下:8.1.2 多重条件表达式 8.1.3 else 语句8.1.4 避免“悬挂 else”8.1.5 elif (即 else-if )语句8.1.6 条件表达式(即"三元操作符") 8.2 while 语句8.2.1 while 循环的语法如下:8.2.2 无限循环 8.3 for 语句8.3.1 for的语法如下8.3.2 用于序列类型 8.4 range() &xrange()8.4.1 range() 内建函数8.4.2 xrange() 内建函数8.4.3 与序列相关的内建函数 8.5 循环其他关键字8.5.1 break 语句8.5.2 continue 语句8.5.3 pass 语句
8.1 if 语句
Python 中的 if 子句看起来十分熟悉. 它由三部分组成: 关键字本身, 用于判断结果真假的条件表达式, 以及当表达式为真或者非零时执行的代码块.
8.1.1 if 语句的语法如下:
if expression:expr_true_suite
if 语句的 expr_true_suite 代码块只有在条件表达式的结果的布尔值为真时才执行, 否则将继续执行紧跟在该代码块后面的语句.
8.1.2 多重条件表达式
单个 if 语句可以通过使用布尔操作符 and , or 和 not实现多重判断条件或是否定判断条件.
if not warn and (system_load >= 10):print "WARNING: losing resources"warn += 1
8.1.3 else 语句
和其他语言一样, Python 提供了与 if 语句搭配使用的 else 语句.如果 if 语句的条件表达式的结果布尔值为假, 那么程序将执行 else 语句后的代码. 它的语法你甚至可以猜到:
if expression:expr_true_suiteelse:expr_false_suite
这里是样例代码:
if passwd == user.passwd:ret_str = "password accepted"id = user.id valid = Trueelse:ret_str = "invalid password entered... try again!"valid = False
8.1.4 避免“悬挂 else”
Python 使用缩进而不是用大括号标记代码块边界的设计, 不仅帮助强化了代码的正确性, 而且还暗中帮助程序员避免了语法上正确的代码中存在潜在的问题. 其中一个问题就是(臭名)昭著的"悬挂 else (dangling else)"问题, 一种语义错觉.
8.1.5 elif (即 else-if )语句
elif 是 Python 的 else-if 语句, 它检查多个表达式是否为真, 并在为真时执行特定代码块中的代码. 和 else 一样, elif 声明是可选的, 然而不同的是, if 语句后最多只能有一个 else语句, 但可以有任意数量的 elif 语句.
if expression1:expr1_true_suiteelif expression2:expr2_true_suiteelif expressionN:exprN_true_suiteelse:none_of_the_above_suite
众所周知, 使用映射对象(比如字典)的一个最大好处就是它的搜索操作比类似if-elif-else语句或是 for 循环这样的序列查询要快很多.
8.1.6 条件表达式(即"三元操作符")
集成的语法为:
X if C else Y
x, y = 4, 3smaller = x if x < y else y
8.2 while 语句
Python 的 while 是本章我们遇到的第一个循环语句. 事实它上是一个条件循环语句. 与 if声明相比, 如果 if 后的条件为真, 就会执行一次相应的代码块. 而 while 中的代码块会一直循环执行, 直到循环条件不再为真.
8.2.1 while 循环的语法如下:
while expression:suite_to_repeat
while 循环的 suite_to_repeat 子句会一直循环执行, 直到 expression 值为布尔假. 这种类型的循环机制常常用在计数循环中
8.2.2 无限循环
while True:handle, indata = wait_for_client_connect()outdata = process_request(indata)ack_result_to_client(handle, outdata)
例如上边的代码就是故意被设置为无限循环的,因为 True 无论如何都不会变成 False. 这是因为服务器代码是用来等待客户端(可能通过网络)来连接的. 这些客户端向服务器发送请求, 服务器处理请求.
8.3 for 语句
Python 提供给我们的另一个循环机制就是 for 语句. 它提供了 Python 中最强大的循环结构.它可以遍历序列成员, 可以用在 列表解析 和 生成器表达式中, 它会自动地调用迭代器的 next()方法, 捕获 StopIteration 异常并结束循环(所有这一切都是在内部发生的).
for 循环会访问一个可迭代对象(例如序列或是迭代器)中的所有元素, 并在所有条目都处理过后结束循环.
8.3.1 for的语法如下
for iter_var in iterable:suite_to_repeat
8.3.2 用于序列类型
用 for 循环迭代不同的序列对象. 样例将涵盖字符串, 列表, 以及元组.
通过序列项迭代===通过序列索引迭代===
===使用项和索引迭代===
8.4 range() &xrange()
8.4.1 range() 内建函数
Python 提供了两种不同的方法来调用 range() . 完整语法要求提供两个或三个整数参数:
range(start, end, step =1)
range() 会返回一个包含所有 k 的列表, 这里 start <= k < end , 从 start 到 end , k 每次递增 step . step 不可以为零,否则将发生错误.
range() 简略语法
range() 还有两种简略的语法格式:
range(end)
range(start, end)
8.4.2 xrange() 内建函数
xrange() 类似 range() , 不过当你有一个很大的范围列表时, xrange() 可能更为适合, 因为它不会在内存里创建列表的完整拷贝. 它只被用在 for 循环中, 在 for 循环外使用它没有意义。同样地, 你可以想到, 它的性能远高出 range(), 因为它不生成整个列表。在 Python 的将来版本中, range() 可能会像 xrange() 一样, 返回一个可迭代对象(不是列表也不是一个迭代器)
8.4.3 与序列相关的内建函数
sorted(), reversed(), enumerate(), zip()
下边是使用循环相关和序列相关函数的例子. 为什么它们叫"序列相关"呢? 是因为其中两个函数( sorted() 和 zip() )返回一个序列(列表), 而另外两个函数( reversed() 和 enumerate() )返回迭代器(类似序列)
8.5 循环其他关键字
8.5.1 break 语句
Python 中的 break 语句可以结束当前循环然后跳转到下条语句, 类似 C 中的传统 break .常用在当某个外部条件被触发(一般通过 if 语句检查), 需要立即从循环中退出时. break 语句可以用在 while 和 for 循环中.
8.5.2 continue 语句
核心笔记: continue 语句
不管是 Python, C, Java 还是其它任何支持 continue 语句的结构化语言中, 一些初学者有这样的一个误解:continue 语句"立即启动循环的下一次迭代". 实际上, 当遇到 continue 语句时, 程序会终止当前循环,并忽略剩余的语句, 然后回到循环的顶端. 在开始下一次迭代前,如果是条件循环, 我们将验证条件表达式.如果是迭代循环,我们将验证是否还有元素可以迭代. 只有在验证成功的情况下, 我们才会开始下一次迭代.
8.5.3 pass 语句
Python 还提供了 pass 语句( C 中没有提供对应的语句). Python 没有使用传统的大括号来标记代码块, 有时,有些地方在语法上要求要有代码, 而 Python 中没有对应的空大括号或是分号( ; )来表示 C 语言中的 “不做任何事” , 如果你在需要子语句块的地方不写任何语句, 解释器会提示你语法错误. 因此, Python 提供了 pass 语句, 它不做任何事情 - 即 NOP , ( No OPeration , 无操作) 我们从汇编语言中借用这个概念.