for...else: 一个程序引发的陷阱
python3菜鸟教程有一段关于for循环和else搭配的代码:
for n in range(2, 10): for x in range(2, n): if n % x == 0: print(n, '等于', x, '*', n//x) break else: # 循环中没有找到元素 print(n, ' 是质数')
这段代码的作用是在范围2-9之间查找质数,何为质数?除了1和它本身不能被其他数整除。
那么for...else是怎样的作用呢?当迭代的对象迭代完并为空时,将会执行else子句。
思路
理解这个程序最关键的地方在于,当n取2时,第二层for循环的范围是range(2, 2),range(2, 2)很有意思,在python2中它是一个[](空列表),对python3来说,它是一个可迭代对象,但它并不是一个迭代器,为什么这么说?我们可以用isinstance()判断一下:
#判断是否为可迭代对象 >>> from collections import Iterable >>> isinstance(range(2, 2), Iterable) True #判断是否为迭代器 >>> from collections import Iterator>>> isinstance(range(2, 2), Iterator) False
我们看到报错了,说明range(2, 2)不是一个迭代器,而是一个可迭代对象。
话说回来,当n取2时,可迭代对象已经为空了,这时程序根本不会再执行第二层for循环了,程序直接跳到了else语句,但我觉得2是质数这个结论,作者已经默认了,因为它没有经过程序的计算。
理解了这一层,接下来的第一层for循环取值从3到9,第二层for循环取除了1和它本身之外的值,举个例子,当n = 5时,x取值的范围是(2,5),只要这个范围内存在一个能被n整除的数,就能说明n不是质数,然后程序以一个break跳出循环体。
延伸
何为陷阱?陷阱就是在你看不到地方坑你一下,假设有如下代码:
for i in range(10): if i == 5: print 'found it! i = %s' % i else: print 'not found it ...'
你期望的结果当i = 5时打印:
found it! i = 5tho
但实际上它打印了两条结果:
found it! i = 5 not found it ...
当迭代到i = 5时,打印"found it! i = 5",当迭代完可迭代对象为空时,跳到else子句,又会打印“not found it...”
参考
https://www.cnblogs.com/dspace/p/6622799.html
https://www.cnblogs.com/AaronFan/p/6161159.html
https://www.cnblogs.com/scofi/p/4902640.html
for...else: 一个程序引发的陷阱的更多相关文章
- 一个远程启动windows c++程序引发的技术决策现象
还是因为那个8点半前要启动近百套报盘程序的问题,差不多两周前表示自己会抽空给解决掉,一次性启动,直到昨天才差不多能够抽点时间出来开始想怎么解决的问题. 这个问题的复杂点在于除了启动exe外,还需要鼠标 ...
- [Python 学习]2.5版yield之学习心得 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source …
[Python 学习]2.5版yield之学习心得 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source - [Pyth ...
- 连载《一个程序猿的生命周期》-《发展篇》 - 3.农民与软件工程师,农业与IT业
相关文章:随笔<一个程序猿的生命周期>- 逆潮流而动的“叛逆者” 15年前,依稀记得走出大山,进城求学的场景.尽管一路有父亲的陪伴,但是内心仍然畏惧.当父亲转身离去.准备回到 ...
- 连载《一个程序猿的生命周期》- 44.感谢,我从事了IT相关的工作
感谢博客园一直以来的支持,写连载都是在这里首发,相比较CSDN和开源中国气氛要好的多. 节前,想以此篇文章结束<一个程序猿的生命周期>的<生存>篇,对过10的年做一个了断,准备 ...
- /var/run/yum.pid 已被锁定,PID 为 XXXX 的另一个程序正在运行。
安装st-load时, 终端提示 “/var/run/yum.pid 已被锁定,PID 为 13908 的另一个程序正在运行.” 解决方法:直接在终端运行 rm -f /var/run/yum.pid ...
- 如果你恨一个程序员 忽悠他去做iOS开发(戏谑篇)
.state { text-align: right; height: 16px; line-height: 16px; color: #999; padding-top: 5px; overflow ...
- [原创] Easy SysLite V1.2 (2016.5.29更新,新增加WIN10支持,一个程序适配所有系统减肥)
[原创] Easy SysLite V1.2 (2016.5.29更新,新增加WIN10支持,一个程序适配所有系统减肥) nohacks 发表于 2016-5-29 17:12:51 https:// ...
- Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
- Replication的犄角旮旯(七)-- 一个DDL引发的血案(下)(聊聊logreader的延迟)
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
随机推荐
- [转载]在table上使用::before/::after的问题
在table上使用::before/::after的问题 转载自: 次碳酸钴的技术博客 http://www.web-tinker.com/article/20638.html 在table上使用:: ...
- Java的==与equals之辨
=======================原理速记=================================== equals重载后比较内容,==比较指针.否则equls等同于== (Ja ...
- CF85D Sum of Medians
CF85D Sum of Medians 题意翻译 一个集合,初始为空.现有三个操作: 1.add:向集合里加入数x,保证加入前集合中没有数x: 2.del:从集合中删除数x,保证删除前集合中有x: ...
- Navicat for MySQL远程连接虚拟机
在虚拟机中进入mysql mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT O ...
- Python判断网络是否可以访问
import urllib url = "http://www.baidu.com" try: status = urllib.urlopen(url).code print st ...
- make编译四
书写命令 每条规则中的命令和操作系统 Shell 的命令行是一致的. make 会按顺序一条一条的执行命令, 每条命令的开头必须以[Tab]键开头, 除非,命令是紧跟在依赖规则后面的分号后的.在命令行 ...
- 使用Kotlin开发Android应用(III):扩展函数和默认值
通过前面两篇文章,我们学习了Kotlin的基本知识,并知道如何配置工程,本文将接着介绍Java没有的而Kotlin实现了的有趣的特性.记住当你对Kotlin语言有任何疑问时,请参考官方指南.该指南组织 ...
- python之数据的序列化
参考博客:http://www.cnblogs.com/yyds/p/6563608.html 数据的序列化功能表 json.dumps() 将python数据类型转换为(json)字符串 json. ...
- 序列化+protobuff+redis
背景: 当redis里面需要存储 “key-字符串,value-对象” 时,是不能直接存对象,而是需要将序列化后的对象存进redis. redis没有实现内部序列化对象的功能,所以需要自己提前序列化对 ...
- 【LeetCode】【定制版排序】Sort Colors
之前转载过一篇STL的sort方法底层详解的博客:https://www.cnblogs.com/ygh1229/articles/9806398.html 但是我们在开发中会根据自己特定的应用,有新 ...