0.说明
提及的内容为:if、while、for及与他们相搭配的else、elif、break、continue和pass语句。
1.if语句
- 语法
if expression: expr_true_suite
其中对于expression部分可以使用逻辑连接词an、or和not来实现多重判断条件。
- 单一语句的代码块
即如果只有一个语句执行时,可以写成下面这样:
if True: print ‘OK‘
但还是建议写在不同的行。
2.else语句
- 语法
if expression: expr_true_suite else: expr_false_suite
- 避免“悬挂else”
像C语言这种使用括号来分隔代码块的语言会出现这种情况(即在有多个if语句蛙,else语句不知道是属于哪一个if语句的),但由于Python是强制使用缩进来使代码对齐的,因此不可能会出现这种问题。
3.elif语句
- 语法
if expression1: expr1_true_suite elif expression2: expr2_true_suite elif expression3: expr3_true_suite …… elif expressionN: expr1_true_suite else: none_of_the_above_suite
可以有任意数量的elif语句,但只能有一个else语句。
- switch/case语句的替代品
在C语言中有switch/case语句用于在多个选项中进行选择,Python虽然没有switch/case语句,但却有更好的解决方案来实现同样的功能:
#方案一:大量的if-elif语句 if user.cmd == ‘create‘: action = ‘create item‘ elif user.cmd == ‘delete‘: action = ‘delete item‘ elif user.cmd == ‘update‘: action = ‘update item‘ #方案二:用序列和成员关系操作符 if user.cmd in (‘create‘, ‘delete‘, ‘update‘): action = ‘%s item‘ % user.cmd else: action = ‘invalid choice... try again!‘ #方案三:使用字典 msgs = {‘create‘, ‘create item‘, ‘delete‘: ‘delete item‘, ‘update‘: ‘update item‘} default = ‘invalid choice... try again!‘ action = msgs.get(user.cmd, default) #使用映射对象(比如字典)的一个最大好处就是它的搜索操作比类似if-elif-else语句或是for循环这样的序列查询要快很多
可以看到,对于实现同样的功能,Python中的解决方案更加强大和简洁。
4.条件表达式(三元操作符)
- 语法:X if C else Y
使用如下:
>>> x, y =4, 3 >>> smaller = x if x < y else y >>> smaller 3
5.while语句
- 语法
while expression: suite_to_repeat
- 计数循环
count = 0 while (count < 9): print ‘the index is: ‘,count count += 1
- 无限循环
while True: suite_to_repeat
无限循环主要是用在Server/Client模式中Server端的设计,用以等待来自客户端的连接,当然如果有必要的话也是可以通过break语句来结束循环的。
6.for语句
for语句提供了Python中最强大的循环结构,它可以遍历序列成员,可以用在列表解析和生成器表达式中,它会自动地调用迭代器的next()方法,捕获StopIteration异常并结束循环(这一切都是在内部发生的)。
(1)语法
for iter_var in iterable: suite_to_repeat
每次循环,iter_var抚迭代变量被设置为可迭代对象iterable(序列、迭代器或其他支持迭代的对象)的当前元素,提供给suite_to_repeat语句使用。
(2)用于序列类型
主要是下面用于序列迭代的三种方法:
- 通过序列项迭代
>>> nameList = [‘xpleaf‘, ‘clyyh‘, ‘cl‘] >>> for name in nameList: ... print name ... xpleaf clyyh cl
- 通过序列索引迭代
>>> nameList = [‘xpleaf‘, ‘clyyh‘, ‘cl‘] >>> for nameIndex in range(len(nameList)): ... print nameList[nameIndex] ... xpleaf clyyh cl
显然会比第一种方法慢很多。
- 使用项和索引迭代
>>> nameList = [‘xpleaf‘, ‘clyyh‘, ‘cl‘] >>> for nameIndex, name in enumerate(nameList): ... print nameIndex, name ... 0 xpleaf 1 clyyh 2 cl
(3)用于迭代器类型
for语句用于迭代器时,会自动帮我们处理很多问题(在内部调用next()并处理StopIteration异常),不过需要注意的是,迭代器并不代表循环条目的集合。
(4)range()内建函数
range()可以用来生成一个数字顺序列表,从而可以使用for来进行迭代,它主要有以下两种语法:
- 完整语法
如下:
range(start, end, step=1)
即默认步长为1,举例如下:
>>> range(1, 10) [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> range(1, 10, 3) [1, 4, 7]
但是步长不能为0,否则会出错:
>>> range(1, 10, 0) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: range() step argument must not be zero
- 简单语法
range(end) #即默认start=1 range(start, end) #其实就是默认步长为1的情况
举例如下:
>>> range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> range(0, 10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
(5)xrange()内建函数
当调用range()时,会直接生成一个列表并写入内存中,但当生成的列表很大时,使用range()就不适合了,这时可以考虑可以xrange(),它返回一个可迭代的对象,而并不会生成一个完整的列表,因此它只被用于for循环中,否则是没有意义的:
>>> xrange(10) xrange(10) >>> type(xrange(10)) <type ‘xrange‘> >>> for num in xrange(10): ... print num, ... 0 1 2 3 4 5 6 7 8 9
(6)与序列相关的内建函数
主要是:sorted()、reversed()、enumerate()、zip()
之所以说是与序列相关,是因为其中两个函数(sorted()和zip())返回一个序列(列表),而另外两个函数(reversed()和enumerate())返回迭代器,举例如下:
- sorted():返回一个列表
>>> nameTuple = (‘xpleaf‘, ‘cl‘) >>> years = (1994, 1995) >>> sorted(nameTuple) [‘cl‘, ‘xpleaf‘] >>> for name in sorted(nameTuple): ... print name, ... cl xpleaf
- reversed():返回一个迭代器
>>> reversed(nameTuple) <reversed object at 0x7f2fa02df390> >>> for name in reversed(nameTuple): ... print name, ... cl xpleaf
- enumerate():返回一个迭代器
>>> enumerate(nameTuple) <enumerate object at 0x7f2f9e1c1d20> >>> for nameIndex, name in enumerate(nameTuple): ... print nameIndex, name ... 0 xpleaf 1 cl
- zip():返回一个列表
>>> zip(nameTuple, years) [(‘xpleaf‘, 1994), (‘cl‘, 1995)] >>> for name, year in zip(nameTuple, years): ... print name, year ... xpleaf 1994 cl 1995
7.break语句
break可以结束当前循环然后跳转到下一条语句(如果存在的话),可用于while和for两各循环中:
>>> count = 0 >>> while True: ... if count>10: ... print ‘OK‘ ... break ... count += 1 ... OK
8.continue语句
continue语句的作用:当遇到ontinue语句时,程序会终止当前循环,并忽略剩余的语句,然后回到循环的顶端。在开始一次迭代前,如果是条件循环,我们将验证条件表达式;如果是迭代循环,我们将验证是否还有元素可以迭代。只有在验证成功的情况下,才会开始下一次迭代。
对在Python中,while循环是条件性的,for循环是迭代的,这就可以跟上面的两种情况对应起来,可简单举例如下:
>>> count = 0 >>> while count<10: ... count += 1 ... if count != 6: ... continue ... print count ... 6 >>> >>> for count in range(10): ... if count != 6: ... continue ... print count ... 6
9.pass语句
主要是下面几个方面会用到pass语句:
- 有些地方在语法上要求有代码
- 标记后来要完成的代码(比如先定义个类或函数,但什么也不做)
- 在异常处理中对于影响不大的异常可以直接pass
10.再谈else语句
在Python中,除了在条件语句中使用else外,还可以在while和for循环中使用else语句。当在循环中使用时,else子句只在循环完成后执行,即如果此时循环中存在break语句就会跳过该else语句。
举例如下:寻找一个数的最大约数
#!/usr/bin/env python def showMaxFactor(num): count = num / 2 #从一半开始计数,这样就可以检查这个数是否可以被2整除,如果可以,那就找到了最大的约数 while count > 1: if num % count == 0: print ‘largest factor of %d is %d‘ % (num, count) break count -= 1 else: print num, ‘is prime‘ if __name__ == ‘__main__‘: showMaxFactor(10) showMaxFactor(31)
这是是一个非常好的特性,可以考虑一下,如果没有该特性,要实现上面的功能,在逻辑上就肯定没有那么清晰了。