通常,循环会不断地执行代码块,直到条件为假或使用完序列当中的所有元素。但是在有些情况下,你可能想中断循环,开始新迭代或直接结束循环。
要跳出循环,可使用break。假设你要找出小于100的最大平方值,可从100开始向下迭代。找到一个平方值后,无需再迭代,直接跳出循环。
from math import sqrt
for n in range(99,0,-1):
root = sqrt(n)
if root == int(root):
print(n)
break
如果你运行这个程序,它将打印81并结束。注意到我向range传递了第三个参数-步长,即序列中相邻数的差。通过将步长设置为负数,可让range向下迭代
语句continue没有break用得多。他结束当前迭代,并挑到下一次迭代的开头。这基本上意味着跳过循环体中余下的语句,但不结束循环。这在循环体庞大而复杂,且存在多个要跳过它的原因时很有用。
在python中,for和while循环非常灵活,但偶尔遇到一些问题可能让你禁不住想:如果这些循环的功能更强一些就好了.例如,假设你要在用户根据提示输入单词时执行某种操作,并在用户没有提供单词时就结束循环。为此一种办法如下:
word='dasd'
while word:
word=input("please enter a word")
print("the word was",word)
但是发现问题了吗? 当你直接按下回车时候,还是会输出一个不想要的 the word was ,那怎么办,改良版用if break判断一下就好了
word='dasd'
while word:
word=input("please enter a word:")
if word:
print("the word was",word)
else :
break
但其实还是有问题的,就是在之前为了进入这个while循环我们还是给word赋了初值能不能不要,当然可以,例子如下:
while True:
word=input("please enter a word:")
if word:
print("the word was",word)
else:
break
通常,在循环中使用break是因为你发现了什么或出现了什么情况。要在循环提前结束时采取某种措施很容易,但有时候你可能想在循环正常结束时才采取某种措施。如何判断循环是提前结束还是正常结束的呢?可以在循环开始前定义一个bool变量并将其设置为False,在跳出循环是将其设置为True.这样就可在循环后面使用一条if语句来判断循环是否提前结束的。
一种更简单的办法是在循环中添加一条else子句,它仅在没有调用break时才执行。例子如下
from math import sqrt
for n in range(99,81,-1):
root = sqrt(n)
if root == int(root):
print(n)
break
else :
print("Didn't find it")
情注意,为了测试else子句,我将下限改成81(不包含)。如果你运行这个程序,它将打印Didn’t find it ,因为正如你前面讨论break时看到的,小于100的最大平方值为81.无论是for循环还是while循环中,continue,break,else子句。
列表推导式一种从其他列表创建列表的方式,类似于数学中的集合推导。列表推导的原理非常简单,有点类似for循环
[i*i for i in range(100)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961, 1024, 1089, 1156, 1225, 1296, 1369, 1444, 1521, 1600, 1681, 1764, 1849, 1936, 2025, 2116, 2209, 2304, 2401, 2500, 2601, 2704, 2809, 2916, 3025, 3136, 3249, 3364, 3481, 3600, 3721, 3844, 3969, 4096, 4225, 4356, 4489, 4624, 4761, 4900, 5041, 5184, 5329, 5476, 5625, 5776, 5929, 6084, 6241, 6400, 6561, 6724, 6889, 7056, 7225, 7396, 7569, 7744, 7921, 8100, 8281, 8464, 8649, 8836, 9025, 9216, 9409, 9604, 9801]
这个列表range(100)内每个值的平方组成。如果指向打印哪些能被3整除的平方值,该怎么办呢?可使用求模运算符:如果y能被3整除,y%3将返回0(请注意,仅当x能被3整除时,x*x才能被3整除)为实现这种功能,可以在列表推导中添加一条if语句。
[i*i for i in range(100) if i%3==0]
[0, 9, 36, 81, 144, 225, 324, 441, 576, 729, 900, 1089, 1296, 1521, 1764, 2025, 2304, 2601, 2916, 3249, 3600, 3969, 4356, 4761, 5184, 5625, 6084, 6561, 7056, 7569, 8100, 8649, 9216, 9801]
还可以添加更多for的部分
>>> [(x,y) for x in range(3) for y in range(3)]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
作为对比,下面的俩个for循环创建同样的列表:
result=[]
for i in range(3):
for j in range(3):
result.append((i,j))
print(result)
与以前一样,使用多个for部分时,也可以添加if子句。
>>> girls=['alice','bernice','clarice']
>>> boys=['chris','arnold','bob']
>>> [b+'+'+g for b in boys for g in girls if b[0]==g[0]]
['chris+clarice', 'arnold+alice', 'bob+bernice']
这些代码将名字的首字母相同的男孩和女孩配对
但是上述的需要遍历所有才能找到,假设如果有1000男和1000个女那得比1000*1000次,效率太慢了,那我们可以设定一个女孩的字典,首字母和名字作为键值对,然后遍历男孩方面,而女孩只要找男孩的首字母就可以了
代码如下:
girls=['alice','bernice','clarice']
boys=['chris','arnold','bob']
d={}
for i in girls:
d.setdefault(i[0],[]).append(i)
print([b+'+'+g for b in boys for g in d[b[0]]])
使用圆括号代替方括号并不能实现元组推导,而是将创建生成器。然而花括号来执行字典推导。
suqre={i:'{} suared is {}'.format(i,i**2) for i in range(10)}
print(suqre[8])
在列表推导中,for前面只有一个表达式,在字典推导中,for前面有个用冒号分隔的表达式,这俩个表达式分别为键及其对应的值。