3.3 固定次数的循环之一

除了顺序语句、条件判断语句外,还有最后一种控制语句,即循环语句。我们先看看看最为简单一种:固定次数的循环。

循环更是一种强大的控制语句,它可以让我们反复执行某段代码,并在一定条件下结束。比如在数据分析中,我们需要对所有记录进行相同的数值处理,那么此时就是一种循环,通过循环遍历每个记录,分别进行处理,处理完全部记录后即可结束。

 还是从一个例子开始。假设要完成5个整数数据的输入再相加应该怎么写呢?有了前面的变量定义基础,最为直观的方法就是不停的重复粘贴刚才的代码,对于初学者这倒是一个很好的机会,好好熟悉代码的写法和操作的灵活度。

num1 = int(input())
num2 = int(input())
num3 = int(input())
num4 = int(input())
num5 = int(input())
print(num1 + num2 + num3 + num4 + num5)

大家可以试着连续输入5个整数,最终能看到输出总和。

下面窗格中的绿色文字为输入的整数,黑色为输出内容。

虽然没问题,但是不是觉得好像做了很多重复劳动!而且如果要输入100个数呢?在更为灵活情况下,输入的次数甚至不能完全确定,比如假设输入数字为0,则表示累加过程结束?或者总和超过100也要结束,这些该如何处理呢?

可以肯定一点,这些操作都使得你不可能在代码中通过这种重复的方法来完成,太多个数字的输入也并不现实,后面的灵活情况让我们更无法确定该重复多少次,因为此时受到用户输入数据的影响,这个在编程时也无法预知。

回到代码上来,你也会注意到这些代码高度相似,只是变量名称不一样,而且此时好像只是那个序号不一样。

由于我们对这些变量分开表示,虽然序号是连续的,但是从本质上看,这些变量名称和其他随意起的名称并无区别,他们之间并不存在可以被利用的连续性访问方法。

可否考虑将这个数字当做序号单拿出来?我们不妨先更改这些不同的变量名称。比如:

此时我们可以注意到,不同的变量已经非常相似,只有一个位于方括号中的序号在独立的变化。

这其实就是列表(list)的思路。我们定义列表,是因为我们需要列表。所谓列表,就是一组数据,通常类型是一样的,比如这里都是整数,但是个数更多,它们都使用一个名称来统一表示,但是通过不同的序号来彼此区分。

num[1] = int(input())
num[2] = int(input())
num[3] = int(input())
num[4] = int(input())
num[5] = int(input())
print(num[1] + num[2] + num[3] + num[4] + num[5])

不过运行这个代码仍然会出现错误,它会提示num没有定义,也就是列表num没有定义。

为此我们需要在开头增加一个专门的列表定义:

num = [0] * 5
num[1] = int(input())
num[2] = int(input())
num[3] = int(input())
num[4] = int(input())
num[5] = int(input())
print(num[1] + num[2] + num[3] + num[4] + num[5])

第一行代码就是定义一个列表,名称是num,每个列表元素都是0,共有5个列表元素,可以看成是5个整型变量组合在一起,但是都没有直接的变量名称。但是可以通过num[1]和num[2]来读取。

但是运行这个代码会产生一个常见的错误“list assignment index out of range(列表序号出界)”:

说的简单些,就是我们列表使用的序号出界了。原因也很简单,默认列表第一个序号是从0开始,这个很奇怪,确实如此,这是计算机语言一直的老传统。

于是,我们修改为:这次没有问题了,功能也一样,只是序号从0开始写。

num = [0] * 5
num[0] = int(input())
num[1] = int(input())
num[2] = int(input())
num[3] = int(input())
num[4] = int(input())
print(num[0] + num[1] + num[2] + num[3] + num[4])

有了这个基础,接下来该怎么简化输入呢?为了简单,我们可以想象输入函数应该是这个样子:

请注意,这里的序号为了实现灵活,我们也换成了变量i,因为变量的值可以灵活的被改变。读者可能又会问,不是说变量名称不能太简单吗?没错,不过,这个i也是习惯。通常列表的序号一般都使用i、j、k之类的简单变量定义形式。

此时i为了表达列表的5个元素,就需要具有0、1到4等多个值。这时我们就可以利用循环来表达这个过程,方法很固定。完整代码为:

num = [0] * 5
for i in range(5):
    num[i] = int(input())
print(num[0] + num[1] + num[2] + num[3] + num[4])

这里的for就是循环语句,range是个函数,表示范围,在参数为5的时候,表示自动生成0到4共计5个元素,正好和列表5个元素序号对应。

in表示i依次去取每一个序号,每次都执行循环里的语句,但是序号每次都不一样,正好实现以前书写5次输入的相同效果。和前面的分支判断一样,这里也是使用冒号表示循环条件结束,采用缩进表示循环内的语句块。

当然,这里也有更为灵活的改进:

num = [0] * 5
for i in range(len(num)):
    num[i] = int(input())
print(num[0] + num[1] + num[2] + num[3] + num[4])

这里我们使用len(num)替换了5,这样做的好处在于避免以后修改了列表长度后,忘记此时没有对应的修改而产生很难发现的错误,这也是我们在编写代码时应该注意的一个重要问题,即为了保证代码的可修改性,尽量避免“硬编码”,而采用这种灵活和动态的方式来进行。

for其实是一种最简单的循环语句,循环的意思就是反复,但是在反复中变量适当的被改变,不变中有变,取得一种灵活的效果。通过执行你会发现,这个循环语句就像一个加工机器,随着生产进行,不断地产生一些语句块,每个语句块正好满足了我们预定的要求。

当然,大家可能注意到了,那为什么最后一个输出语句还是那么麻烦?且听下回分解。

配套学习资源、慕课视频:

Python大数据分析-李树青icon-default.png?t=M1FBhttps://www.njcie.com/python/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leeshuqing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值