python基础教程八(循环二)

发布时间:2024年01月15日

1. 跳出循环

通常,循环会不断地执行代码块,直到条件为假或使用完序列当中的所有元素。但是在有些情况下,你可能想中断循环,开始新迭代或直接结束循环。

1. break

要跳出循环,可使用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向下迭代

2. continue

语句continue没有break用得多。他结束当前迭代,并挑到下一次迭代的开头。这基本上意味着跳过循环体中余下的语句,但不结束循环。这在循环体庞大而复杂,且存在多个要跳过它的原因时很有用。

3.while True/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

2. 循环中的else子句

通常,在循环中使用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子句。

3. 简单推导

列表推导式一种从其他列表创建列表的方式,类似于数学中的集合推导。列表推导的原理非常简单,有点类似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前面有个用冒号分隔的表达式,这俩个表达式分别为键及其对应的值。

文章来源:https://blog.csdn.net/qq_44063802/article/details/135597689
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。