while语句
while用于实现循环语句,通过判断条件是否为真,来决定是否继续执行。
一般语法
语法如下:
while expression:
suite_to_repeat
计数循环
>>> cnt = 0
>>> while(cnt < 9):
... print 'the index is ', cnt
... cnt += 1
...
the index is 0
the index is 1
the index is 2
the index is 3
the index is 4
the index is 5
the index is 6
the index is 7
the index is 8
代码块里包含print和自增语句,将被重复执行,知道cnt不下于9。
无限循环
while True:
suite_to_repeat
条件表达式一直为真。
for语句
for语句是python提供的另一个循环机制,可以用于遍历序列,可以用在列表解析和生成器表达式中。
一般语法
for循环会访问一个可迭代对象(例如序列或叠加器)中的所有元素,并在所有条目处理过后结束循环。语法如下:
for iter_var in iterable:
suite_to_repeat
每次循环,iter_var迭代变量被设置为可迭代对象(序列、迭代器或其他支持迭代的对象)的当前元素,提供给suite_to_repeat语句块使用。
用于序列类型
主要介绍for循环迭代不同的序列对象:字符串、列表及元组。
迭代序列的三种方法:
- 通过序列项迭代
>>> namelist = ['Bob', 'Lisa', 'Henry']
>>> for eachName in namelist:
... print eachName
...
Bob
Lisa
Henry
每次迭代,eachName变量都被设置为列表中特定的某个元素。
(2)通过序列索引迭代
>>> namelist = ['Bob', 'Lisa', 'Henry']
>>> for nameIndex in range(len(namelist)):
... print namelist[nameIndex]
...
Bob
Lisa
Henry
使用len()函数获取序列长度,使用range()函数创建了要迭代的序列。
使用项和索引迭代
使用内建的enumerate()函数
>>> namelist = ['Bob', 'Lisa', 'Henry']
>>> for i, eachName in enumerate(namelist):
... print i,eachName
...
0 Bob
1 Lisa
2 Henry
range()内建函数
range()完整语法如下:
range([start,] stop[, step])
range()会返回一个包含所有k的列表(start<=k<end),从start到end,k每次递增step,step不能为0。
>>> range(3, 7)
[3, 4, 5, 6]
与序列相关的内建函数
sorted()、reversed()、enumerate()、zip()
reversed():返回一个反序访问的迭代器;
>>> namelist = ['Bob', 'Lisa', 'Henry']
>>> years = [1978, 1989, 1990, 2003]
>>> for name in sorted(namelist):
... print name,
...
Bob Henry Lisa
>>> namelist
['Bob', 'Lisa', 'Henry']
>>> for name in reversed(namelist):
... print name,
...
Henry Lisa Bob
>>> for i, name in enumerate(namelist):
... print i, name
...
0 Bob
1 Lisa
2 Henry
>>> for name, year in zip(namelist, years):
... print year, name
...
1978 Bob
1989 Lisa
1990 Henry
break语句
break语句用于结束当前循环跳转到下条语句。
continue语句
当遇到continue语句时,程序终止当前循环,并忽略剩余的语句,然后回到循环的顶端。在开始下一次迭代前,如果是条件循环(while循环),将验证条件表达式;如果是迭代循环(for循环),验证是否还有元素可以迭代,只有在验证成功的情况下,才开始下一次迭代。
>>> valid = False
>>> count = 3
>>> while count > 0:
... input = raw_input('Enter passsword:')
... for eachPasswd in passwdList:
... if input == eachPasswd:
... valid = True
... break
... if not valid:
... print "invalid input"
... count -= 1
... continue
... else:
... break
pass语句
pass语句不做任何事情(即NOP,No Operation,无操作),用于在需要有语句块的地方不写任何语句。
迭代器和iter()函数
从根本上来说,迭代器就是有一个next()方法的对象,而不是通过索引来计数。当你或是一个循环机制需要下一项时,调用迭代器的next()方法就可以获得它。
迭代器为类序列对象提供了一个类序列的接口,它们是一组数据结构,可以利用它们的索引从0开始一直"迭代"到序列的最后一个条目。
使用迭代器
(1)序列
>>> i = iter(myTuple)
>>> i.next()
123
>>> i.next()
'abc'
>>> i.next()
45.600000000000001
>>> i.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
序列会自动的产生它们字节的迭代器。
for I in seq:
do_something_to(i)
(2)字典
字典也是可迭代的python数据类型。字典的迭代器会遍历它的键(key)。语句for eachKey in myDict.keys()可以缩写为for eachKey in myDict。
>>> myDict = {'a':10, 'b':20, 'c':30}
>>> for eachKey in myDict:
... print eachKey, myDict[eachKey]
...
a 10
c 30
b 20
另外,python还有三个新的内建字典方法来定义迭代:myDict.iterkeys()(通过键迭代)、myDict.itervalues()(通过值迭代)及myDict.iteritems()(通过键-值对迭代)。
(3)文件
文件对象生成的迭代器会自动调用readline()方法,这样循环可以访问文本文件的所有行,就可以使用for eachline in myFile替换for eachline in myFile.readlines()
>>> myFile = open('testfile.txt')
>>> for eachline in myFile:
... print eachline
...
创建迭代器
对一个对象调用iter()就可以得到它的迭代器。语法如下:
iter(obj)
iter(func, sentinel)
如果传递一个参数给iter(),会检查传递的参数是不是一个序列,如果是,根据索引从0一直迭代到序列结束。如果是传递的两个参数给iter(),会重复的调用func,直到迭代器的下个值等于sentinel。
列表解析
列表解析可用于动态的创建列表,语法如下:
[expr for iter_var in iterable]
前面的expr应用于序列的每个成员,最后的结果值是该表达式产生的列表。迭代变量并不需要是表达式的一部分。
>>> [x**2 for x in range(6)]
[0, 1, 4, 9, 16, 25]
还可以和if表达式结合使用,扩展语法如下:
[expr for iter_var in iterable if cond_expr]
这个语法会过滤或"捕捉"满足条件表达式cond_expr的序列成员。
>>> [x for x in range(6) if x % 2]
[1, 3, 5]
(1)举例:矩阵样例
如一个3行5列的矩阵
>>> [(x+1, y+1) for x in range(3) for y in range(5)]
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5)]
生成器表达式
生成器表达式是列表解析的一个扩展。生成器是特定的函数,允许你返回一个值,然后"暂停"代码的执行,稍后恢复。
列表解析的不足是必须生成所有的数据,用以创建整个列表。生成器的基本语法和列表相似,不过不是真正的创建数字列表,而是返回一个生成器,这个生成器每次计算出一个条目后,把这个条目"产生"(yield)出来。
生成器表达式如下:
(expr for iter_var in iterable if cond_expr)
(1)举例:交叉配对样例
>>> rows = [1, 2, 3, 17]
>>> def cols():
... yield 56
... yield 2
... yield 1
>>> x_product_pairs = ((i, j) for i in rows for j in cols())
>>> for pair in x_product_pairs:
... print pair
...
(1, 56)
(1, 2)
(1, 1)
(2, 56)
(2, 2)
(2, 1)
(3, 56)
(3, 2)
(3, 1)
(17, 56)
(17, 2)
(17, 1)
(2)重构样例
获取文件中长度最大的行:
f = open('/etc/motd','r')
longest = max(len(x.strip()) for x in f)
f.close()
return longest
简化如下:
return max(len(x.strip()) for x in open('/etc/motd'))