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 ...
随机推荐
- 算法训练 s01串
问题描述 s01串初始为"0" 按以下方式变换 0变1,1变01 输入格式 1个整数(0~19) 输出格式 n次变换后s01串 样例输入 3 样例输出 101 数据规模和约定 0~ ...
- 爬取豆瓣电影信息保存到Excel
from bs4 import BeautifulSoup import requests import html.parser from openpyxl import Workbook,load_ ...
- 2、hive的基本操作
1.创建数据库和表 1)创建数据库 hive> CREATE DATABASE IF NOT EXISTS userdb; OK Time taken: 0.252 seconds hive&g ...
- MySQL的SQL MODE
SQL MODE:定义mysqld对约束等的响应行为: 查看当前模式: mysql> SHOW GLOBAL VARIABLES LIKE 'sql_mode'; 修改 ...
- redis性能测试以及影响性能的因素
redis-benchmark测试工具的命令使使用方法及参数如下:redis-benchmark [-h <host>] [-p <port>] [-c <clients ...
- Android 结束进程的方法forceStopPackage
ActivityManager sd = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); Method method = Clas ...
- 前端 css续
CSS选择器 1.标签选择器 为类型标签设置样式例如:<div>.<a>.等标签设置一个样式,代码如下: <style> /*标签选择器,找到所有的标签应用以下样式 ...
- yii2判断数据库字段is null
$query = new Query; $query->select('ID, City,State,StudentName') ->from('student') ->]) -&g ...
- ArchiMate进行业务架构建模的参考
业务服务视图 业务渠道视图 业务服务实现视图 业务角色协作视图 业务流程协作视图 业务流程视图 业务对象视图 产品化业务服务视图 分层视图 除了以上内容,在TOGAF中完整的推荐视图是 在ArchiM ...
- HP小型机维护
(一)文件系统维护 . 监控文件系统的使用 # bdf . 监控文件目录的使用 # du -sk /myfs2/* (二)网络系统维护 1. 相关配置文件 1). 主机名定义文件:/etc/hosts ...