linux以循环来计算等差数列,循环

while 语句的语法如下:

while condition:

statement1

statement2

想要多次执行的代码必须以正确的缩进放在 while 语句下面。在表达式 condition 为真的时候它们才会执行。同 if-else 一样,非零值为真。启动python3交互页面,让我们写一个简单的代码,它按顺序打印 0 到 10 的数字:

n = 0

while n < 11:

... print(n)

... n += 1

...

0

1

2

3

4

5

6

7

8

9

10

在第一行我们使 n = 0,然后在 while 语句中把条件设置为 n < 11,这意味着在 while 语句下面缩进的所有行将会被执行,直到 n 的值大于等于11。在循环里我们只是打印 n 的值然后令它增一。

想想如果没有循环语句,你想要打印 0 到 10 的所有数字,那你得手动打印 11 次!

让我们来试试打印斐波那契数列。这个数列前两项为 1,之后的每一个项都是前两项之和。所以这个数列看起来就像这样:1,1,2,3,5,8,13 ..

917d7ea4ff6cabe731f079c1043d5751.png

运行结果如下

314cfc6b10353c570a2a00421fc936eb.png

第一行代码中我们初始化 a 和 b。当 b 的值小于 100 的时候,循环执行代码。循环里我们首先打印 b 的值,然后在下一行将 a + b 的值赋值给 b,b 的值赋值给 a。

学习其他语言的同学在这里可能有些困惑,你可以这样理解,Python 中赋值语句执行时会先对赋值运算符右边的表达式求值,然后将这个值赋值给左边的变量。

默认情况下,print() 除了打印你提供的字符串之外,还会打印一个换行符,所以每调用一次 print() 就会换一次行,如同上面一样。

你可以通过 print() 的另一个参数 end 来替换这个换行符,就像下面这样,下面的程序写入 /home/shiyanlou/fibonacci2.py:

f3f0b2dbd298798f256fcb41f410483d.png

运行程序结果如下

962da16bc59a5f40f37c3e8c849bf823.png

我们来写一个程序计算幂级数:e^x = 1 + x + x^2 / 2! + x^3 / 3! + ... + x^n / n! (0 < x < 1)。

该程序写入代码文件 /home/shiyanlou/powerseries.py

7db371dbaf0fe8156e9c4965230c01ea.png

运行结果如下:

dff61258badd5c13d6792f4fd34ae0ed.png

在这个程序里我们介绍一个新的关键字 break,它可以终止最里面的循环。这个例子里我们在 if 语句里使用 break :

if term < 0.0001:

break

这意味着如果 term 的值小于 0.0001 ,那么终止循环。

这个例子里我们打印 10 以内的乘法表。写入代码文件

30e95457accddf3d06b50bd4f974bbe8.png

运行结果如下

c4f2894836b7a7a1ed4b339cb658afab.png

这里我们在 while 循环里使用了另一个 while 循环,这被称为嵌套循环。你应该已经看到一条有趣的语句:

print("-" * 50)

字符串若是乘上整数 n,将返回由 n 个此字符串拼接起来的新字符串。

下面是一些例子:

7c3c8aa638c697d0fb6b1a846865d5b9.png

一些关于打星号的例子

设计一:

e1211dd7f4cc32fe330b9226e5fe30c5.png

运行结果如下

8d47767985311c97b7ab931177ce2798.png

设计二:

168146c37393dd117b9dea8951853189.png

运行结果如下

177e4daede3d1b9730eaded8fa6c1539.png

设计三

2cea0b29ae389d6635d117d96f3b908d.png

运行结果如下

480afd75b5d406acdddcc646fe303030.png

列表:

在继续学习循环之前,我们先学习一个叫做列表的数据结构。它可以写作中括号之间的一列逗号分隔的值。列表的元素不必是同一类型:

0a7b52b38abef9c1e7882305b63edaa1.png

你可以将上面的列表想象为一堆有序的盒子,盒子包含有上面提到的值,每个盒子都有自己的编号(红色的数字),编号从零开始,你可以通过编号访问每一个盒子里面的值。对于列表,这里的编号称为索引。

b446f1f43b3eb7c91c678d3b15acd928.png

我们像下面这样通过索引来访问列表中的每一个值:

b11b4171b0518624fc10a78aeafc77c9.png

如果我们使用负数的索引,那将会从列表的末尾开始计数,像下面这样:

b6e74eea46aaed338affaac4d9f60325.png

你甚至可以把它切成不同的部分,这个操作称为切片,例子在下面给出:

e5e8dd85f1b30c49d4c35760fe87a4c4.png

切片并不会改变正在操作的列表,切片操作返回其子列表,这意味着下面的切片操作返回列表一个新的(栈)拷贝副本:

90df55b86fb787abcc11c7d782bae520.png

切片的索引有非常有用的默认值;省略的第一个索引默认为零,省略的第二个索引默认为切片的字符串的大小:

cbb1d47f340ab3d78a1360399e1cf407.png

有个办法可以很容易地记住切片的工作方式:切片时的索引是在两个元素之间 。左边第一个元素的索引为 0,而长度为 n 的列表其最后一个元素的右界索引为 n。例如:

6ea0f397212bc4e9b51bf932e071fd49.png

上面的第一行数字给出列表中的索引点 0...5。第二行给出相应的负索引。切片是从 i 到 j 两个数值表示的边界之间的所有元素。

对于非负索引,如果上下都在边界内,切片长度就是两个索引之差。例如 a[2:4] 是 2。

Python 中有关下标的集合都满足左闭右开原则,切片中也是如此,也就是说集合左边界值能取到,右边界值不能取到。

对上面的列表, a[0:5] 用数学表达式可以写为 [0,5) ,其索引取值为 0,1,2,3,4,所以能将a中所有值获取到。 你也可以用a[:5], 效果是一样的。

而a[-5:-1],因为左闭右开原则,其取值为 -5,-4,-3,-2 是不包含 -1 的。

为了取到最后一个值,你可以使用 a[-5:] ,它代表了取该列表最后5个值。

试图使用太大的索引会导致错误:

1b37f7591efd7b716a317649fac3004e.png

Python 能够优雅地处理那些没有意义的切片索引:一个过大的索引值(即大于列表实际长度)将被列表实际长度所代替,当上边界比下边界大时(即切片左值大于右值)就返回空列表:

3425566b19fb8fb393a885d11fbb3a50.png

c8f5040e5c53d5e8164da83cec5fc84b.png

切片操作还可以设置步长,就像下面这样:

a[1::2]

[342, 'India']

它的意思是,从切片索引 1 到列表末尾,每隔两个元素取值。

列表也支持连接这样的操作,它返回一个新的列表:

e82d1df7e65ee9a41bcdbfb40250b6cb.png

列表允许修改元素:

fd39b747b45abed75c7feabde8e9e263.png

也可以对切片赋值,此操作可以改变列表的尺寸,或清空它:

0ce83a82e53715642612b83af1d4812c.png

细心的同学可能发问了,前面不是说过切片操作不改变列表么?严格来说,这里并不算真正的切片操作,只是上面代码中赋值运算符左边的这种操作与切片操作形式一样而已。

要检查某个值是否存在于列表中,你可以这样做:

a3f1109c9e9940e1787cdf7861525aa2.png

这意味着我们可以将上面的语句使用在 if 子句中的表达式。通过内建函数 len() 我们可以获得列表的长度:

22d23c6434a7ebe768f07071113d786e.png

如果你想要检查列表是否为空,请这样做:

eddbefe988f7e50ead646f1d55b676ba.png

列表是允许嵌套的(创建一个包含其它列表的列表),例如:

18f267f714a2450bc25f6e67b9f13f1f.png

for循环:

通过 for 语句我们可以使用 for 循环。Python 里的 for 循环与 C 语言中的不同。这里的 for 循环遍历任何序列(比如列表和字符串)中的每一个元素。下面给出示例:

26a7a9259a0bec42c5c3a24e64e5f42a.png

我们也能这样做:

07d1710ab74e8ebdc6979f5dee4c0851.png

range() 函数

如果你需要一个数值序列,内置函数 range() 会很方便,它生成一个等差数列(并不是列表):

56550d63bd95a79fca6c5760b71d5697.png

如同 break ,我们可以在循环中使用另一个语句 continue。它会跳过其后的代码回到循环开始处执行。这意味着它可以帮助你跳过部分循环。在下面的例子中,我们要求用户输入一个整数,如果输入的是负数,那么我们会再次要求输入,如果输入的是整数,我们计算这个数的平方。用户输入 0 来跳出这个无限循环。

程序如下

d1868e7c8f0d38146f82ce667308b9ae.png

结果如下

b01c8c83e239d6ae04ccadb0ffc5da89.png

循环else语句:

我们可以在循环后面使用可选的 else 语句。它将会在循环完毕后执行,除非有 break 语句终止了循环。

2213056306baf48357d7b887df05326b.png

这是一个非常简单的游戏。这里有 21 根棍子,首先用户选 1 到 4 根棍子,然后电脑选 1到 4 根棍子。谁选到最后一根棍子谁就输。判断一下用户有赢的机会吗?如果没有的话,如何修改游戏规则可以使用户有赢的机会呢?

特别说明:用户和电脑一次选的棍子总数只能是5。

程序如下:

e4de6f1887c9a4c743658d44952660c2.png

结果是不能,如果可以使用户和电脑一次选的棍子总数不只是5

而是可以随意选,就可能会赢。

这个实验中我们了解了两种循环:while 和 for 循环,其中的 for 循环我们通常与 range() 函数配合使用,要特别注意的是,range() 函数返回的并不是列表而是一种可迭代对象:

f1ab8a2f247368021a04304c4e1c7686.png

python 中 for 循环的 else 子句给我们提供了检测循环是否顺利执行完毕的一种优雅方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值