python条件与循环-循环,,1 while语句w


1 while语句

while用于实现循环语句,通过判断条件是否为真,来决定是否继续执行。

1.1 一般语法

语法如下:

while expression:

  suite_to_repeat

1.2 计数

 1  2  3 >>> cnt = 0 4  5 >>> while(cnt < 9): 6  7 ... print ‘the index is ‘, cnt 8  9 ... cnt += 110 11 ...12 13 the index is 014 15 the index is 116 17 the index is 218 19 the index is 320 21 the index is 422 23 the index is 524 25 the index is 626 27 the index is 728 29 the index is 8

代码块里包含print和自增语句,将被重复执行,知道cnt不下于9。

1.3 无限循环

while True:

  suite_to_repeat

条件表达式一直为真。

2 for语句

for语句是python提供的另一个循环机制,可以用于遍历序列,可以用在列表解析和生成器表达式中。

2. 1 一般语法

for循环会访问一个可迭代对象(例如序列或叠加器)中的所有元素,并在所有条目处理过后结束循环。语法如下:

for iter_var in iterable:

  suite_to_repeat

每次循环,iter_var迭代变量被设置为可迭代对象(序列、迭代器或其他支持迭代的对象)的当前元素,提供给suite_to_repeat语句块使用。

2.2 用于序列类型

主要介绍for循环迭代不同的序列对象:字符串、列表及元组。

迭代序列的三种方法:

(1)通过序列项迭代

每次迭代,eachName变量都被设置为列表中特定的某个元素。

(2)通过序列索引迭代

>>> namelist = [‘Bob‘, ‘Lisa‘, ‘Henry‘]

>>> for nameIndex in range(len(namelist)):

... print namelist[nameIndex]

...

Bob

Lisa

Henry

使用len()函数获取序列长度,使用range()函数创建了要迭代的序列。

(3)使用项和索引迭代

使用内建的enumerate()函数

>>> namelist = [‘Bob‘, ‘Lisa‘, ‘Henry‘]

>>> for i, eachName in enumerate(namelist):

... print i,eachName

...

0 Bob

1 Lisa

2 Henry

3 range()内建函数

range()完整语法如下:

range([start,] stop[, step])

range()会返回一个包含所有k的列表(start<=k<end),从start到end,k每次递增step,step不能为0。

>>> range(3, 7)

[3, 4, 5, 6]

4 与序列相关的内建函数

sorted()、reversed()、enumerate()、zip()

reversed():返回一个反序访问的迭代器;

 1 >>> namelist = [‘Bob‘, ‘Lisa‘, ‘Henry‘] 2  3 >>> years = [1978, 1989, 1990, 2003] 4  5 >>> for name in sorted(namelist): 6  7 ... print name, 8  9 ...10 11 Bob Henry Lisa12 13 >>> namelist14 15 [‘Bob‘, ‘Lisa‘, ‘Henry‘]16 17 >>> for name in reversed(namelist):18 19 ... print name,20 21 ...22 23 Henry Lisa Bob24 25 >>> for i, name in enumerate(namelist):26 27 ... print i, name28 29 ...30 31 0 Bob32 33 1 Lisa34 35 2 Henry36 37 >>> for name, year in zip(namelist, years):38 39 ... print year, name40 41 ...42 43 1978 Bob44 45 1989 Lisa46 47 1990 Henry

5 break语句

break语句用于结束当前循环跳转到下条语句。

6 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

7 pass语句

pass语句不做任何事情(即NOP,No Operation,无操作),用于在需要有语句块的地方不写任何语句。

8 迭代器和iter()函数

从根本上来说,迭代器就是有一个next()方法的对象,而不是通过索引来计数。当你或是一个循环机制需要下一项时,调用迭代器的next()方法就可以获得它。

迭代器为类序列对象提供了一个类序列的接口,它们是一组数据结构,可以利用它们的索引从0开始一直"迭代"到序列的最后一个条目。

8.1 使用迭代器

(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

...

8.2 创建迭代器

对一个对象调用iter()就可以得到它的迭代器。语法如下:

iter(obj)

iter(func, sentinel)

如果传递一个参数给iter(),会检查传递的参数是不是一个序列,如果是,根据索引从0一直迭代到序列结束。如果是传递的两个参数给iter(),会重复的调用func,直到迭代器的下个值等于sentinel。

9 列表解析

列表解析可用于动态的创建列表,语法如下:

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

10 生成器表达式

生成器表达式是列表解析的一个扩展。生成器是特定的函数,允许你返回一个值,然后"暂停"代码的执行,稍后恢复。

列表解析的不足是必须生成所有的数据,用以创建整个列表。生成器的基本语法和列表相似,不过不是真正的创建数字列表,而是返回一个生成器,这个生成器每次计算出一个条目后,把这个条目"产生"(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)重构样例

获取文件中长度最大的行:

1 f = open(‘/etc/motd‘,‘r‘)2 3 longest = max(len(x.strip()) for x in f)4 5 f.close()6 7 return longest

简化如下:

1 return max(len(x.strip()) for x in open(‘/etc/motd‘))

python条件与循环-循环

评论关闭