while循环

与C语言类似

In [1]:
x = 1
In [2]:
while x <=4:
    print x
    x += 1
1
2
3
4

for循环

常用于可迭代对象

In [5]:
for number in range(1, 4):      #range函数,返回一个列表,包含1~3的整数
    print number
1
2
3

In [6]:
#xrange函数与range函数类似
#range函数一次性产生整个序列
#xrange函数一次只产生一个数
In [7]:
#遍历字典元素
In [8]:
d = {'x': 1, 'y': 2, 'z':3}
In [9]:
for key in d:
    print key, 'corresponds to', d[key]
y corresponds to 2
x corresponds to 1
z corresponds to 3

一些迭代工具

  • 并行迭代
In [10]:
#同时迭代两个序列
In [11]:
names = ['Zk', 'Zps', 'Zjx', 'Jqj']
In [12]:
numbers = [1, 2, 3, 4]
In [13]:
for i in range( len(names) ):
    print names[i], 'is', numbers[i], '.'
Zk is 1 .
Zps is 2 .
Zjx is 3 .
Jqj is 4 .

In [14]:
#并行迭代,用zip函数把两个以上的序列压缩起来
In [15]:
zip(names, numbers)
Out[15]:
[('Zk', 1), ('Zps', 2), ('Zjx', 3), ('Jqj', 4)]
In [16]:
for name, number in zip(names, numbers):
    print name, 'is', number, '.'
Zk is 1 .
Zps is 2 .
Zjx is 3 .
Jqj is 4 .

In [18]:
#zip函数很屌哒!!!它甚至可以处理不等长序列,一直迭代到最短的序列结束为止
In [20]:
zip( range(5), xrange(100000000))     #这里可别拿range来代替xrange,不然算死你
Out[20]:
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
  • 按索引迭代
In [26]:
strings = ['Zk', 'Zxxxpxxxs', 'Jxxxqxxxj']
In [23]:
enumerate(strings)       #enumerate函数返回序列的索引-值对迭代器对象
Out[23]:
<enumerate at 0x7f5b090180a0>
In [28]:
for index, string in enumerate(strings):
    if 'xxx' in string:
        strings[index] = '==='
#这段程序把字符串序列中含xxx的字符串都替换为===
In [29]:
strings
Out[29]:
['Zk', '===', '===']
  • 翻转和排序迭代
In [30]:
#sorted函数,排序,返回列表
In [31]:
sorted([4,3,6,8,3])
Out[31]:
[3, 3, 4, 6, 8]
In [32]:
#reversed函数,翻转,返回迭代器对象
In [33]:
reversed('Hello, world')
Out[33]:
<reversed at 0x7f5b09c9dad0>
In [34]:
list( reversed('Hello, world') )
Out[34]:
['d', 'l', 'r', 'o', 'w', ' ', ',', 'o', 'l', 'l', 'e', 'H']
In [35]:
''.join( reversed('Hello, world') )      #连接字符成为字符串
Out[35]:
'dlrow ,olleH'

跳出循环

  • break语句
  • continue语句
    使用方法与C语言类似,此处不做详细解释
  • while True/break用法 其实就相当于while 1/break啦!

break语句应该尽量少用,提高程序可读性

  • else子句
    C语言中,我们常常需要用一个标志变量来确定循环是否有被执行,python里可是方便多咯!
In [36]:
from math import sqrt
In [37]:
for n in range(99, 81, -1):    #没错!range还可以加入步长参数
    root =sqrt(n)
    if root == int(root):       #判断是否为整数
        print n
        break
else:
    print "Didn't find it!"
#这段程序查找了99~80间开平方后能为整数的数
Didn't find it!

列表推导式——轻量级循环

艾玛!这不是数列通项嘛!
在列表内写for语句哦!

In [38]:
[x*x for x in range(10)]
Out[38]:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
In [39]:
[x*x for x in range(10) if x % 3 == 0]    #哇塞,还能给x加条件
Out[39]:
[0, 9, 36, 81]
In [44]:
[(x, y, x*y) for x in range(1,4)   for y in range(1,4)]     #建立九九乘法表(1~3)!!
Out[44]:
[(1, 1, 1),
 (1, 2, 2),
 (1, 3, 3),
 (2, 1, 2),
 (2, 2, 4),
 (2, 3, 6),
 (3, 1, 3),
 (3, 2, 6),
 (3, 3, 9)]
In [47]:
a = ['a1', 'b2', 'c3']
In [48]:
b = ['a2', 'b2', 'd3']
In [51]:
[x + '+' + y for x in a for y in b if x[0] == y[0]]    #加入if子句,只有首字符相等的字符串才会被创建到列表里
Out[51]:
['a1+a2', 'b2+b2']

不存在元组推导式这种东西哈!!
python2.3以前会报错,新版本中会产生一个生成器

In []: