程序不总是顺序执行的,所以需要条件控制语句来支持分支处理,循环来处理反复多次调用。下面将减少python中的条件判断和循环语法。
条件判断
条件判断就是当某个条件为真时执行某个程序片段,否则执行另一个。
>>> x = int(input("Please enter an integer: ")) Please enter an integer: 2 >>> if x < 0: x = 0 print('Negative changed to zero') elif x == 0: print('Zero') elif x == 1: print('Single') else: print('More') More
循环
while
如果你需要在条件满足时反复的做一件事情,则可以使用while语句,下面是Fibonacci序列的例子。
>>> a, b = 0, 1 >>> while b < 100: print(b, end = ', ') a, b = b, a+b 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,
再看下面的例子,循环直到用户输入不为空的名字,然后打印名字。
name = '' while not name: name = input('Please enter your name : ') print('Hello.%s!' ,name)
for
Python中for语句和其它语言中的有些不同,Python中的for语句总是在序列(list或者String)上迭代,按照元素出现在序列中的顺序。例如:
>>> words = ['cat', 'window', 'defenestrate'] >>> for w in words: print(w, len(w)) cat 3 window 6 defenestrate 12
如果你需要修改你正在迭代的这个序列,你最好在迭代之前复制一个拷贝,使用切片可以很容易的做到。继续使用上面的words:
>>> for w in words[:]: if len(w) > 6: words.insert(0, w) >>> words ['defenestrate', 'cat', 'window', 'defenestrate']
range()
如果你需要在一个数字序列上做迭代,则可以使用range(),它用于产生一个数字序列。
>>> for i in range(5): print(i) 0 1 2 3 4
range()产生的序列不包含结束点,range(10)产生10个值,从0开始,9结束。可以为range()指定一个起始点,或者指定一个步长:
>>> list(range(5, 10)) [5, 6, 7, 8, 9] >>> list(range(0, 10, 3)) [0, 3, 6, 9] >>> list(range(-10, -100, -30)) [-10, -40, -70]
可以使用range()和len()方便的遍历一个序列:
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range(len(a)): print(i, a[i]) 0 Mary 1 had 2 a 3 little 4 lamb
需要注意的是,range()给人的感觉是返回一个序列,但实际上它不是。它返回的是一个对象,当你迭代该对象时,该对象将按照你指定的顺序返回你想要的元素,但是它不是一个真正的序列,因此不会占用空间。看下面的输出:
>>> print(range(10)) range(0, 10)
break、continue和else
break用于中断最近的那个循环(for或者while)。
循环可以有一个else子句,用于当循环完成后或者循环条件为false后执行,但不会在循环遭遇break后执行,看下面的例子:
>>> for n in range(2, 10): for x in range(2, n): if n % x == 0: print(n, 'equals', x, '*', n // x) break else: # loop fell through without finding a factor print(n, 'is a prime number') 2 is a prime number 3 is a prime number 4 equals 2 * 2 5 is a prime number 6 equals 2 * 3 7 is a prime number 8 equals 2 * 4 9 equals 3 * 3
上面例子中的else字句对应到内部的for循环,而不是if语句,当没有break执行时,else子句将被执行。
continue字句用于中止这次循环,继续下一次:
>>> for num in range(2, 10): if num % 2 == 0: print("Found an even number", num) continue print("Found a number", num) Found an even number 2 Found a number 3 Found an even number 4 Found a number 5 Found an even number 6 Found a number 7 Found an even number 8 Found a number 9
pass
pass什么也不做,当语法上要求需要一个子句,但你不想进行任何行为时,可以使用。例如:
>>> class MyEmptyClass: pass
这里定义了一个空类。也可以定义一个空函数:
>>> def initlog(*args): pass
一般在进行测试时可以使用pass。
循环技巧
循环获取字典的key和value
对字典进行循环时,使用字典的items()方法,可以同时获取key和value。
>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'} >>> for k, v in knights.items(): print(k, v) gallahad the pure robin the brave
循环序列同时获取索引和值
使用那个enumerate()函数可以同时获取序列的索引和值:
>>> for i, v in enumerate(['tic', 'tac', 'toe']): print(i, v) 0 tic 1 tac 2 toe
循环多个序列
只用zip()函数可以同时循环多个序列。
>>> questions = ['name', 'quest', 'favorite color'] >>> answers = ['lancelot', 'the holy grail', 'blue'] >>> for q, a in zip(questions, answers): print('What is your {0}? It is {1}.'.format(q, a)) What is your name? It is lancelot. What is your quest? It is the holy grail. What is your favorite color? It is blue.
反向遍历序列
使用reversed()函数可以反向遍历序列。
>>> for i in reversed(range(1, 10, 2)): print(i) 9 7 5 3 1
遍历排序后的序列
sorted()函数返回一个新的排序后的序列,用于遍历,并且避免源序列被改变。
>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana'] >>> for f in sorted(set(basket)): print(f) apple banana orange pear
循环期间改变序列
如果需要在循环期间改变序列,你需要在循环前先将序列拷贝一份,使用切片可以很容易做到:
>>> words = ['cat', 'window', 'defenestrate'] >>> for w in words[:]: #循环前拷贝 if len(w) > 6: words.insert(0, w) >>> words ['defenestrate', 'cat', 'window', 'defenestrate']