Rendering of reStructured text is not possible, please install Docutils.
.. contents::
:status: 草稿 ;HuangYi; 10%;
===================
Python过程控制
===================
python 向来秉承简洁的设计原则,在语法的设计上体现得尤为明显!
稍有编程经验的朋友对下面这些语法应当不会陌生。
对于许多读者来说,可能只需要注意两点,本章的内容就可以飞快得浏览过去了:
一是 python 以缩进控制作用范围并且缩进都以冒号开头;
二是所有这些过程控制语句都可以跟个 ``else`` 子句!
``if`` 语句后面跟 ``else`` 自不必说,连 ``for`` 、 ``while`` 语句也可以跟 ``else`` 子句!
TODO: 关于不同语句中的 ``else``
if 分支
=========
::
if a == b:
print 'a 等于 b'
else:
print 'a 不等于 b'
也许你还需要更细致地控制:
::
if a == b:
print 'a 等于 b'
elif a < b:
print 'a 小于 b'
elif a > b:
print 'a 大于 b'
else:
print '在本宇宙中这是不可能滴!'
``elif`` 就是 else if 的缩写。
python 没有 switch 语句,因为觉得没必要,原因之一是 if elif else 已经足以应付大部分情况。
况且对于很大一部分其他的 switch 应用场景,python 还有更加优雅的方式来处理,请看:
::
# 伪码
switch( sys.argv[1] ):
case '-e':
walk_cd()
case '-d':
search_cd()
...
default:
raise CommandException("Unknown Commend: " + sys.argv[1])
# 使用 if 替代
if sys.argv[1]=='-e':
walk_cd()
elif sys.argv[1]=='-d':
search_cd()
...
else:
raise CommandException("Unknown Command: " + sys.argv[1])
# 更好的做法
commands = {
'-e' : walk_cd,
'-d' : search_cd,
}
try:
commands[ sys.argv[1] ]()
except KeyError:
raise CommandException("Unknown Command: " + sys.argv[1])
还记得上一章 python 数据类型中的习题 1 吗?我们要求读者用 and 和 or 操作符模拟 c 语言的 ? : 三元操作符。
实际上在 python2.5 以前,这确实是一个还算实用的技巧,不过 python2.5 中应广大 python 程序员的强烈呼吁,
终于加入了新的语法,终于可以用更优美的方式表达这种常用分支:
TODO: 换成更有实际意义的例子
::
a = b*2 if b else default_value
等价于:
::
if b:
a = b*2
else:
a = default_value
用 and or 技巧也可以写成:
::
a = b and b*2 or default_value
显然是第一种写法看起来最顺眼了。
for 循环
=========
::
for item in some_list:
do something with item
python 的 for 与 c 的 for 不同,要类比的话,大家可以想象一下某些语言的 foreach 。
python 只支持这一种 for 语句,而没有类似 c 的 for 语句,
因为用这种 for 语句很容易就可以模仿出 c 那种类型的 for 语句
(还记得上一章的习题2吧,对,就是它:range ;-):
::
# 伪码,c 类型的 for 语句:
for(i=0;i<10;i++):
...
# python 等价物:
for i in range(10):
...
.. topic:: Under the hood
::
for item in some_list:
do some thing with item
实际上等价于:
::
iterator = iter(some_list)
try:
item = iterator.next()
do some thing with item
item = iterator.next()
do some thing with item
...
except StopIteration:
pass
也就是说 for in 操作的是任意的迭代器!
TODO: 关于迭代器!
while 循环
============
异常处理
============
小结
==========
练习
===========
.. macro:: [[PageComment2(nosmiley=1, notify=1)]]