暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

for循环(一)

coolpython 2017-02-24
591

没有循环,就什么都没有

我现在给你一个list,里面有5个元素,你不用程序只看内容找出其中最大的数,lst = [1,4,101,21,18] 。很快,你就能找出101是所有数中最大的,但如果我给你1亿个数呢,你怎么找?你只能挨个看,从第一个看到第1亿个,由于1亿个数太多了,我不能全写下来,你自己可以脑补一下。如果让你用程序呢,你想到用max函数,但如果不让你用max函数呢,你发现,自己束手无策了。

for循环

怎么能让程序像人一样,从第一个起,逐个查看list中的元素,从第一个查看到第1亿个呢?带着这个问题看示例1:

程序的输出结果为 0,1,2,3,4,5,6,7,8,9。

看不懂这段代码,没关系,先把range研究清楚,看三个例子,你便一清二楚。

以下的内容,适用于python2.7版本,3.x版本的python里,range返回的是一个生成器。关于生成器后续会讲解。

range

从下往上看这三个红框圈起来的代码,range(2,10,2),range函数里传入3个参数,第一个参数是起始值,第二个参数是结束值,第三个参数是步长,range(2,10,2)作用是生成一个list,元素值产生的规则是从2开始,以步长2增长,到10结束。

range(2,10),2是起始值,10是结束值,没有第三个参数,这种情况下,第三个参数默认为1,也就是步长为1,range(2,10)的意思生成一个list,元素产生的规则是从2开始,以步长1增长,到10结束。

range(10) 只传入了一个参数,这里的10是结束值,起始值默认为0,步长默认为1,等价于range(0,10,1)。理解了range函数的用法,再来看示例2

示例2和示例1是等价的

第一次进入到for循环的语句块时,i等于0,执行完print 0 后,循环不会退出,而是会再次进入到语句块中,此时i等于1,执行print 1,周而复始,最后i等于9,print 9  ,这已经是list中的最后一个元素了,循环结束。

找出最大值

现在回到最初的提问,1亿个数太多了,就用5个数来举例子吧

max = 0
lst = [1,4,101,21,18]
for item in lst:
if item > max:
max = item

print max

循环一共进行了5次,现在请思考,在循环过程中,每次进入到for循环的语句块里时,item的值和max的值分别是多少?

第一次:item = 1  ,max = 0

第二次:item = 4  ,max = 1

第三次:item = 101,max = 4

第四次:item = 21,max = 101

第五次:item = 18,max = 101

max的值为什么在变化呢,因为有一个if条件语句,每次都用item去和max比较,如果item比max大,则让max等于item,对max重新赋值,这样,max最终会被赋值为最大值。

除了上面这种写法外,也可以这样写

#coding=utf-8
max = 0
lst = [1,4,101,21,18]
for i in range(len(lst)):
if lst[i] > max:
max = lst[i]

print max

两种写法都可以,什么时候用带range的这种方法呢,简单总结,如果算法里涉及到了位置,范围或者数量的时候,就用带range的,比如,找出lst中最大的数和它的索引号

#coding=utf-8
max = 0
index = 0
lst = [1,4,101,21,18]
for i in range(len(lst)):
if lst[i] > max:
max = lst[i]
index = i
print max,index


不再做观察者

当lst中只有5个数时,你一眼就能看出101最大,可当lst中有1亿一个数时,你必然要从第一个开始寻找,一个一个比较,直到第1亿个数,而对于程序来说,不论是有5个数还是有1亿个数,它的处理方式不会变,都是从第一个数开始寻找,一个一个比较,直到最后一个数。

当数据量小时,我们人类解决问题的方法是直接观察,而当数据量太大,大到无法观察,我们不得不采用和程序一样的方法,程序是工具,工具是人类智力和体力的延伸,从1数到1亿,想想一个人要花多久的时间,你写两行python代码看看需要多长的时间。

许多初学者,迟迟入不了门,其关键就在于,他的思维仍然是观察的思维,一眼就看到结果,于是总想着程序也能一下子就给出结果,可对于程序来说,不管数据量大还是小,它都无法一眼就看出来结果,它必须把循环,条件语句,等其他技术手段组合在一起,以一种朴素的笨拙的远没有人类聪明智慧的方法来处理数据。我希望你能从这篇教程开始,接受程序的思维,你无法观察到全局,解决问题的着眼点不再是你看到了什么,而是要把你所看到的东西抽象成可用计算机编程语言表达描述的问题。


练练手

请找出10以内的既是2的倍数又是3的倍数的数,你瞬间就想到了6,把范围扩大一下,请找出1万以内,既是2的倍数又是3的倍数的数,你还能想的出来么?不能了,因为数据量太大,脑子已经不够用了,此时,请用python。但在用python写代码前,我们先要把问题抽象成可以用python语言表达描述的问题。

首先,我们得制造出1到10000这些数,其次,挨个判断他们是否同时是2和3的倍数,上代码

for i in range(1,10001):
if i % 2 == 0 and i % 3 == 0 :
print i


range(1,10001)创建了从1到10000这1万个数,for循环遍历了他们,if 语句对他们进行了判断,判断是否同时为2和3的倍数,如果是,则用print 语句进行输出。

没有循环,就无法扩大我们处理数据的数量级,在理解循环之前,你首先要放弃观察者的身份,不要再局限于你所看到的。

文章转载自coolpython,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论