循环控制
一、while循环
while 条件表达式: 循环体 ... [else: 语句块 ... ]
流程图:
说明:
- 条件表达式可以是任何表达式,任何非零、或非空(null)的值均为true。
- 执行流程:先判断 while 后的条件,如果是 True 则开始执行循环体,执行完毕后,再去判断 条件,如果True 继续执行循环体...,如果条件不为真,则跳出循环,执行循环体后的语句。
- while 中的 else 是可选的。这和其他语言的很大的区别,其他的语言中 while 中没有 else。 当 while 中的条件为 False 时,开始执行 else 中语句。
- 如果提供了 else 语句,则 else 语句一定执行。除非你是通过 break 语句退出的循环。
- 在循环体内一定要有改变判断条件的语句,否则会出现“死循环”。
示例:
#打印1-10 i=1 while i<=10: print(i) i+=1 #改变判断条件的语句 else: print("1-10打印结束!") #循环结束执行
二、for...in...遍历
for 临时变量 in 可迭代对象: 循环体 ... [else: 语句块 ... ]
- 可迭代对象包括字符串、列表、元组、字典、集合、range等。
- 循环正常结束(执行完毕),而没有异常break跳出,就执行else后的语句,只要在循环体中执行了break语句,就不会执行else语句了。
for _ in 'hello': print(_)
h e l l o
for letter in 'hello': if letter == 'l': break print(letter) #输出'h','e'
i=1 while i<10: print(i) i+=1 if i==5: break print('循环结束') #输出1,2,3,4,循环结束
for letter in 'hello': if letter == 'l': continue print(letter) #输出'h','e','o'
continue配合while循环
i=0 while i<10: i += 1 if i%2: continue print(i) print('循环结束') #输出2,4,6,8,10 循环结束
四、多重循环
循环语句里可以嵌套循环语句,我们称之为多重循环。简单点说就是循环体是循环语句。一般来说我们把嵌套的循环称为外循环,把被嵌套的循环称为内循环。
while循环和for循环可以混合使用。
#九九乘法表 i = 1 while i <= 9: for j in range(1, i + 1): print('{}*{}={}'.format(i, j, i * j), end=' ') print() i += 1
运行结果:
1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
五、循环代码的优化
循环语句在代码里必不可少,虽然现代计算机速度越来越快,空间也越来越大,对于大量数据处理仍然需要优化代码,优化代码可以从这几方面考虑:
1、减少循环内部不必要的计算
什么算是不必要的计算,就是指那些无论放在循环里面还是放在循环外面都不会改变程序运行结果,对于这样的能放到循环外面的一定要放到循环外面。
2、嵌套循环中,尽量减少内层循环的计算
对于循环来说,越往里面计算的频率越高,我们都知道在循环中时间复杂度的计算是乘法的关系,所以也是能往外放的尽量往外放。
3、尽量使用局部变量
尽量使用局部变量来代替全局变量,因为局部变量查询比较快,有助于效率的提升。
4、使用 join() 连接字符串
这个技巧呢不仅适用在循环里,可以说在程序的任意地方都适用。
用 join() 来代替 ‘+’ 去连接字符串,因为 ‘+’ 拼接会产生新的字符串对象,如果你循环 10000次,那就会产生 10000 个对象,而 join 就不会,它只会产生 1 个对象,用这 1 个对象去重复计算。
# 循环代码优化测试 import time start = time.time() for i in range(1000): result = [] for m in range(10000): result.append(i * 1000 + m * 100) end = time.time() print("耗时:{0}".format((end - start))) start2 = time.time() for i in range(1000): result = [] c = i * 1000 for m in range(10000): result.append(c + m * 100) end2 = time.time() print("耗时1:{0}".format((end2 - start2)))
运行结果:
耗时:3.019031047821045 耗时1:2.49700665473938
六、推导式
推导式是从一个或者多个迭代器快速创建序列的一种方法。它可以将循环和条件判断结合, 从而避免冗长的代码。
1、列表推导式
列表推导式生成列表对象
[表达式 for item in 可迭代对象 ] 或者: [表达式 for item in 可迭代对象 if 条件判断]
示例:
l1=[x for x in range(5)] print(l1) # [0, 1, 2, 3, 4] l2=[x**2 for x in range(5)] print(l2) # [0, 1, 4, 9, 16] l3=[x**2 for x in range(5) if x%2==1] print(l3) # [1, 9] l4=[x for x in 'abcdefg'] print(l4) # ['a', 'b', 'c', 'd', 'e', 'f', 'g'] cells=[(row,col) for row in range(2) for col in range(3)] print(cells) # [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]
2、字典推导式
字典推导式生成字典对象
{key : value for 表达式 in 可迭代对象}
示例:
info = (('name', 'jack'), ('age', 14)) d = {k: v for k, v in info.__iter__()} print(d) # {'name': 'jack', 'age': 14} text = 'hello,world' char_count = {c: text.count(c) for c in text} # 统计字符个数 print(char_count) # {'h': 1, 'e': 1, 'l': 3, 'o': 2, ',': 1, 'w': 1, 'r': 1, 'd': 1}
3、集合推导式
集合推导式生成集合对象
{表达式 for item in 可迭代对象 } 或者: {表达式 for item in 可迭代对象 if 条件判断}
示例:
s = {x for x in range(100) if x % 7 == 0} print(s) # {0, 98, 35, 70, 7, 42, 77, 14, 49, 84, 21, 56, 91, 28, 63}
4、生成器推导式(生成元祖)
元祖有没有推导式?用圆括号试试看:
t = (x for x in range(8)) print(t) # <generator object <genexpr> at 0x0000000001DABA50>
结果是一个生成器,显然,元组是没有推导式的。
一个生成器只能运行一次。第一次迭代可以得到数据,第二次迭代发现数据已经没有了。
for elem in t: print(elem) # 0 # 1 # 2 # 3 # 4 # 5 # 6 # 7 for elem in t: print(elem) #