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)]]