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: 一个程序引发的陷阱的更多相关文章

  1. 一个远程启动windows c++程序引发的技术决策现象

    还是因为那个8点半前要启动近百套报盘程序的问题,差不多两周前表示自己会抽空给解决掉,一次性启动,直到昨天才差不多能够抽点时间出来开始想怎么解决的问题. 这个问题的复杂点在于除了启动exe外,还需要鼠标 ...

  2. [Python 学习]2.5版yield之学习心得 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source …

    [Python 学习]2.5版yield之学习心得 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source - [Pyth ...

  3. 连载《一个程序猿的生命周期》-《发展篇》 - 3.农民与软件工程师,农业与IT业

    相关文章:随笔<一个程序猿的生命周期>- 逆潮流而动的“叛逆者”        15年前,依稀记得走出大山,进城求学的场景.尽管一路有父亲的陪伴,但是内心仍然畏惧.当父亲转身离去.准备回到 ...

  4. 连载《一个程序猿的生命周期》- 44.感谢,我从事了IT相关的工作

    感谢博客园一直以来的支持,写连载都是在这里首发,相比较CSDN和开源中国气氛要好的多. 节前,想以此篇文章结束<一个程序猿的生命周期>的<生存>篇,对过10的年做一个了断,准备 ...

  5. /var/run/yum.pid 已被锁定,PID 为 XXXX 的另一个程序正在运行。

    安装st-load时, 终端提示 “/var/run/yum.pid 已被锁定,PID 为 13908 的另一个程序正在运行.” 解决方法:直接在终端运行 rm -f /var/run/yum.pid ...

  6. 如果你恨一个程序员 忽悠他去做iOS开发(戏谑篇)

    .state { text-align: right; height: 16px; line-height: 16px; color: #999; padding-top: 5px; overflow ...

  7. [原创] Easy SysLite V1.2 (2016.5.29更新,新增加WIN10支持,一个程序适配所有系统减肥)

    [原创] Easy SysLite V1.2 (2016.5.29更新,新增加WIN10支持,一个程序适配所有系统减肥) nohacks 发表于 2016-5-29 17:12:51 https:// ...

  8. Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)

    <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...

  9. Replication的犄角旮旯(七)-- 一个DDL引发的血案(下)(聊聊logreader的延迟)

    <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...

随机推荐

  1. lodash的使用

    Lodash是一个一致性.模块化.高性能的 JavaScript 实用工具库,内部封装了很多字符串.数组.对象等常见数据类型的处理函数. 为什么选择 Lodash ? Lodash 通过降低 arra ...

  2. 关于like %%的优化思路

    测试数据:2亿行,被筛选出的数据,3KW多行. 众所周知 like %str%无法走索引,但是我们如果实在是有这种需求要达到like '%str%'的筛选目的,怎么优化好一些呢? 以下是我的一些思考: ...

  3. Ubuntu系统vi编辑器上下左右键变ABCD的解决方法(转)

    首先卸载旧版本的vi编辑器: $sudo apt-get remove vim-common 然后安装新版vi即可: $sudo apt-get install vim Ubuntu自带有几种版本的v ...

  4. 002-IP地址及分类以及子网掩码

    一.概述 IP地址是一个4段2进制码组成的,每一段二进制码有8位,共32位二进制数.占用4个字节. IP地址是指互联网协议地址(Internet Protocol Address,又译为网际协议地址) ...

  5. slf4j和log4j结合使用步骤

    使用slf4j的优点: 提供带参数的日志输出方法(SLF4J 1.7及以后版本). pom中只需引入slf4j-log4j12,然后maven会引入它所依赖的其它JAR包. slf4j和log4j结合 ...

  6. 【AWS】AWS云计算赋能数字化转型专题研讨会

    点我查看详情 欢迎莅临

  7. War-ftpd USER longString漏洞攻击之Java实现常见问题

    发表这篇文章的最重要原因是,在用Java实现War-ftpd缓冲区溢出实验时,我遇到了很多问题,而且我认为这些问题 都是非常不容易发现和解决的,为了以后学习的同学的便利,此处写下自己遇到的问题作为分享 ...

  8. 构建Ruby开发环境(Windows+Eclipse+Aptana Plugin)

    1.安装Ruby ①.从http://rubyinstaller.org/downloads/下载安装包:rubyinstaller-2.2.5-x64.exe,直接安装.(so easy) 2.安装 ...

  9. $用python玩点有趣的数据分析——一元线性回归分析实例

    Refer:http://python.jobbole.com/81215/ 本文参考了博乐在线的这篇文章,在其基础上加了一些自己的理解.其原文是一篇英文的博客,讲的通俗易懂. 本文通过一个简单的例子 ...

  10. Socke---转

      Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP ...