开启Python的漫长道路
有个问题一定要说明,看代码跟你自己写代码真的是天壤之别。话不多说,当自己是小白开始走你。
今天的开工仪式让我懂得什么叫做殊途同归,做开发的,做测试的,做产品的,还有找食材的。真是6的不行。大家踏上同一条道路。
今天的测试题关于一道很简单的算法,本以为满简单的但是还是坑满满。
第一题:求100以内的素数
素数,所谓素数是指除了1和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被2~16的任一整数整除。
想法比较简单:挨个除呗,取余就好。逆向思维,能被不是1且不是自己本身的数除的就算素数,但凡能被除就直接去掉。之前看了一些python的语法,功能实在强大。对于list的操作很丰富。
第一版:
L = range(2,100)
for x in L:
for y in xrange(2,x):
if x%y==0
L.remove(x)
break
print L
怎么样是不是很赞?坑爹啊!!结果多了很多,很多数字没有被remove,为啥?关键问题在第一个for循环里面。
我直接通过L在循环,遇到不符合素数要求的就删掉,那么问题来了。我这么一删除,list的结构就发生了变化,对于数组的本质来说,后面的一个元素就会顶上去,到达数组当前指针的位置。辣么for还在跑着,指针+1下一个元素了,这样顶上去的那个元素就被忽视了,不做判断了。所以多出了那么多。于是稍微修改了一下,把第一个for循环中条件L换成另外一个list。
L = range(2,100)
for x in range(2,100):
for y in xrange(2,x):
if x%y==0:
L.remove(x)
break
print L
不过吸取教训,在for循环中对于切片,元组,字典之类的操作,在使用remove元素的时候还是要小心。完全可以自己操作指针指向。