for死循环、怪异字符串、两次return……Python冷知识(三)
本文转载自Python编程时光(ID:Python-Time)
冷知识系列,已经更新至第三篇。前两篇传送门小明给你准备好了,还没阅读的可以学习一下。
谈谈 Python 那些不为人知的冷知识(一)
谈谈 Python 那些不为人知的冷知识(二)
for 死循环
for 循环可以说是 基础得不能再基础的知识点了。但是如果让你用 for 写一个死循环,你会写吗?
这是个开放性的问题,在往下看之前,建议你先尝试自己思考,你会如何解答。
好了,如果你还没有思路,那就来看一下 一个海外 MIT 群友的回答:
for i in iter(int, 1):pass
是不是懵逼了。iter 还有这种用法?这为啥是个死循环?
这真的是个冷知识,关于这个知识点,你如果看中文网站,可能找不到相关资料。
还好你可以通过 IDE 看 py 源码里的注释内容,介绍了很详细的使用方法。
原来iter有两种使用方法,通常我们的认知是第一种,将一个列表转化为一个迭代器。
而第二种方法,他接收一个 callable 对象,和一个sentinel 参数。第一个对象会一直运行,直到它返回 sentinel 值才结束。

那int
呢,这又是一个知识点,int 是一个内建方法。通过看注释,可以看出它是有默认值0的。你可以在终端上输入 int()
看看是不是返回0。

由于int() 永远返回0,永远返回不了1,所以这个 for 循环会没有终点。一直运行下去。
奇怪的字符串
示例一
# Python2.7
>>> a = "Hello_Python"
>>> id(a)
32045616
>>> id("Hello" + "_" + "Python")
32045616
# Python3.7
>>> a = "Hello_Python"
>>> id(a)
38764272
>>> id("Hello" + "_" + "Python")
32045616
示例二
>>> a = "MING"
>>> b = "MING"
>>> a is b
True
# Python2.7
>>> a, b = "MING!", "MING!"
>>> a is b
True
# Python3.7
>>> a, b = "MING!", "MING!"
>>> a is b
False
示例三
# Python2.7
>>> 'a' * 20 is 'aaaaaaaaaaaaaaaaaaaa'
True
>>> 'a' * 21 is 'aaaaaaaaaaaaaaaaaaaaa'
False
# Python3.7
>>> 'a' * 20 is 'aaaaaaaaaaaaaaaaaaaa'
True
>>> 'a' * 21 is 'aaaaaaaaaaaaaaaaaaaaa'
True
两次return
我们都知道,try…finally… 语句的用法,不管 try 里面是正常执行还是报异常,最终都能保证finally能够执行。
同时,我们又知道,一个函数里只要遇到 return 函数就会立马结束。
基于以上这两点,我们来看看这个例子,到底运行过程是怎么样的?
>>> def func():
... try:
... return 'try'
... finally:
... return 'finally'
...
>>> func()
'finally'
惊奇的发现,在try
里的return居然不起作用。
原因是,在try…finally…语句中,try中的return会被直接忽视,因为要保证finally能够执行。
小整数池
先看例子。
>>> a = -6
>>> b = -6
>>> a is b
False
>>> a = 256
>>> b = 256
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False
>>> a = 257; b = 257
>>> a is b
True
为避免整数频繁申请和销毁内存空间,Python 定义了一个小整数池 [-5, 256] 这些整数对象是提前建立好的,不会被垃圾回收。
以上代码请在 终端Python环境下测试,如果你是在IDE中测试,并不是这样的效果。
那最后一个示例,为啥又是True?
因为当你在同一行里,同时给两个变量赋同一值时,解释器知道这个对象已经生成,那么它就会引用到同一个对象。如果分成两成的话,解释器并不知道这个对象已经存在了,就会重新申请内存存放这个对象。
intern机制
字符串类型作为 Python 中最常用的数据类型之一,Python解释器为了提高字符串使用的效率和使用性能,做了很多优化。
例如:Python 解释器中使用了 intern(字符串驻留)的技术来提高字符串效率。
什么是 intern 机制?就是同样的字符串对象仅仅会保存一份,放在一个字符串储蓄池中,是共用的,当然,肯定不能改变,这也决定了字符串必须是不可变对象。
>>> s1="hello"
>>> s2="hello"
>>> s1 is s2
True
# 如果有空格,默认不启用intern机制
>>> s1="hell o"
>>> s2="hell o"
>>> s1 is s2
False
# 如果一个字符串长度超过20个字符,不启动intern机制
>>> s1 = "a" * 20
>>> s2 = "a" * 20
>>> s1 is s2
True
>>> s1 = "a" * 21
>>> s2 = "a" * 21
>>> s1 is s2
False
>>> s1 = "ab" * 10
>>> s2 = "ab" * 10
>>> s1 is s2
True
>>> s1 = "ab" * 11
>>> s2 = "ab" * 11
>>> s1 is s2
False
(本文为 AI科技大本营转载文章,转载请微信联系原作者)
◆
精彩推荐
◆
5月25-27日,由中国IT社区CSDN与数字经济人才发展中心联合主办的第一届CTA核心技术及应用峰会将在杭州国际博览中心隆重召开。首届CTA核心技术及应用峰会将围绕人工智能,邀请技术领航者,与开发者共同探讨机器学习和知识图谱的前沿研究及应用。
同时,我们推出会议双日开发者盲定票,仅售299元(原票价1099元),限量30张。大会详情以及票务问题,请扫描下方二维码咨询。
推荐阅读
从对ML一窍不通到斩获AT等special offer,拿下大厂算法岗就靠它了
以女大学生相亲为例,给你讲明白数据挖掘算法
Python分析《权力的游戏》最终季...... | 附源码
谷歌大神Jeff Dean点赞网红博士论文:技术头条
滴滴全链路压测解决之道 | 技术头条
手机导航已死!
如何嫁给年入百万的阿里人?
《捕鱼达人》幕后的开发引擎玩起区块链, 区块链游戏的春天已近?| 人物志
程序员如何向女友解释:为啥软件都要装C盘?
❤点击“阅读原文”,查看更多精彩文章。
相关文章:

snmpd 子代理模式编译测试
1、参考链接 1)Net-snmp添加子代理示例https://blog.csdn.net/eyf0917/article/details/395466512、操作步骤1)网络拷贝下面的文件http://www.net-snmp.org/tutorial/tutorial-5/toolkit/mib_module/NET-SNMP-TUTORIAL-MIB.txthttp://www.net-snmp.org/t…

【数据库】适用于SQLite的SQL语句(三)
目录十七、重新引索REINDEX十八、查询SELECT1、简单查询2、复合查询十九、更新UPDATE二十、公用表表达式(CTE)WITH1、普通表达式2、递归表达式二十三、VACUUM二十四、UPSERT十七、重新引索REINDEX REINDEX命令用于从头开始删除和重新创建索引。 十八、…

算法系列15天速成——第二天 七大经典排序【中】
首先感谢朋友们对第一篇文章的鼎力支持,感动中....... 今天说的是选择排序,包括“直接选择排序”和“堆排序”。 话说上次“冒泡排序”被快排虐了,而且“快排”赢得了内库的重用,众兄弟自然眼红,非要找快排一比高下。…

如何构建优质的推荐系统服务?| 技术头条
作者丨gongyouliu来源 | 大数据与人工智能(ID:ai-big-data)任何一个优质的软件服务都必须考虑高性能、高可用(HighAvailability)、可伸缩、可拓展、安全性等5大核心要素,推荐系统也不例外。所以,我们会围绕这5个点来说明ÿ…

DispatcherServlet之HandlerAdapter的handle
2019独角兽企业重金招聘Python工程师标准>>> 注:SpringFramework的版本是4.3.x。 1.DispatcherServlet的doService方法时序图 图1 DispatcherServlet的doService方法时序图 2.AnnotationMethodHandlerAdapter的handle方法时序图 图2的原图在Gith…

【C++】C++11 STL算法(九):番外篇
1、如果获取指针或迭代器指向的类型 详见:C 11:如何获取一个指针或迭代器指向的类型? decltype(*std::declval<Pointer>())decltype:c11关键字,类型推导。详见:【C】C11新增关键字详解 std::declva…

IBM Tivoli Netview在企业网络管理中的实践(附视频)
今天我为大家介绍的一款高端网管软件名叫IBM Tivoli NetView,他主要关注是IBM整理解决方案的用户,分为Unix平台和Windwos平台两种,这里视频演示的是基于Windows 2003 server下的IBM Tivoli NetView 6.1在企业中的部署应用,可以为大…

【C++】C++11 STL算法(十):使用STL实现排序算法
一、快速排序 1、适用于c11版本 template <class ForwardIt> void quicksort(ForwardIt first, ForwardIt last) {if(first last) return;auto pivot *std::next(first, std::distance(first,last)/2);ForwardIt middle1 std::partition(first, last, [pivot](con…

“你行你上”:有本事跟OpenAI Five打一把DOTA?| 极客头条
整理 | 一一出品 | AI科技大本营(ID:rgznai100)你们不是嫌弃世界冠军 OG 团队实力太水吗?“你行你上”的机会来了。4 月 14 日凌晨,OpenAI Five 以 2:0 击败了 DOTA 世界冠军团队 OG 引发热议。比赛当天,OpenAI 也宣布…

Java学习笔记二十五:Java面向对象的三大特性之多态
Java面向对象的三大特性之多态 一:什么是多态; 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现。 现实中,比如我们按下 F1 键这个动作&am…

省钱之道--图解域域树域林根域的含义
省钱之道--图解域域树域林根域的含义 标签:域 域林 图解域域树域林根域的含义 域树 根域原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://angerfire.blog.51cto.com/198455/1…

AI算法在FPGA芯片上还有这种操作?| 技术头条
作者 | 杨付收出品 | CSDN(ID:CSDNnews)碾压与崛起AI算法的崛起并非一帆风顺的,现在的主流的NN类的卷积神经网络已经是第二波浪潮了,早在上个世纪80年代,源于仿生学,后又发展于概率学的早期AI算…

[Doctrine Migrations] 数据库迁移组件的深入解析三:自定义数据字段类型
自定义type 根据官方文档,新建TinyIntType类,集成Type,并重写getName,getSqlDeclaration,convertToPHPValue,getBindingType等方法。 TinyIntType.php完整代码: <?php namespace db\types; …

【网络编程】同步IO、异步IO、阻塞IO、非阻塞IO
IO分两阶段: 1.数据准备阶段:在该阶段,根据是否等待数据准备,将IO分成阻塞和非阻塞; 2.内核空间复制回用户进程缓冲区阶段:在该阶段,只要程序需要等待复制完成,才能往下运行…

PowerDesigner 使用的一些技巧(转)
-> Generate Database ,在弹出的 Database Generation 对话框中选择脚本存取路径及脚本文件名称 3、点击确定后生成数据库建库脚本(*.sql) 二、生成脚本时报错: Column Code maxinum lenght 原因:字段超过15字符就发生错误&…

【网络编程】epoll 笔记
一、最大连接数 1、select select在单进程中最多同时监听1024个fd;要想实现百万并发需要一千个进程,并且性能会很差、内存消耗巨大。所以select只适用于连接数在一千个以下的场景。 2、epoll epoll本身不限制连接数,但是连接数会受到系统…

交通图网络太大太复杂,没法处理?DMVST-Net巧妙处理
参加「CTA 核心技术及应用峰会」,请扫码报名 ↑↑↑作者 | Huaxiu Yao, Fei Wu, Jintao Ke, Xianfeng Tang等译者 | 一步一步望着天上星编辑 | Jane出品 | AI科技大本营(id:rgznai100)【导语】自 2018 年 6 月 DeepMind 发表论文“…

小程序这件事 撸起袖子加油干
写在前面的话: 初次接触小程序,便被它开发的简易与便捷所吸引。总按耐不住对未知的探索欲望,于是乎撸起袖子来干一个吧。附:小程序开发文档 项目介绍 艺龙酒店小程序实践 使用<swiper>标签实现网页轮播图的效果,…

mutt使用小技巧 指定发件人 添加附件
经常我们需要从linux服务器上直接发送一些邮件到自己,或者用户的邮箱里,mail命令固然重要,但是缺点是不能方便的进行插入附件。这里选择使用mutt,方便又好用。 实例: echo "邮件内容" | mutt -e "my_hd…

恶犬秒变萌汪:东京大学开源“治愈系”GAN图片拼贴工具 | 技术头条
参加「CTA 核心技术及应用峰会」,请扫码报名 ↑↑↑译者 | linstancy责编 | 琥珀出品 | AI科技大本营(id:rgznai100)教新手画画?字体风格迁移?换明星“假脸”?毫无疑问,在图像生成中…

【视频】视频传输协议:RTSP、RTP、RTCP、RTMP、HTTP
一、RTSP、RTP、RTCP RTSP、RTP、RTCP是一组协议,其中RTSP在应用层、RTP和RTCP在传输层。RTP用于传输流媒体数据,而RTCP对RTP进行控制、同步。 二、RTSP、RTMP、HTTP 1、共同点 RTSP、RTMP、HTTP都是用在应用层。理论上这三种协议都可以做直播和点播,但直播一般用RTSP和…

ActiveMQ5.14.5配置参数详解
Activemq-.xml1.加载properties配置参数。下面加载是访问broker的身份信息,即用户名和密码 <bean class"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name"locations"><value>file:…

正则表达式实现最小匹配
正则表达式默认情况下实现的是最大化匹配,这在有些情况下是非常不愿意出现的,比如下面这段代码: # starting IndiaInventoryAPP.exe" ~~DisplayVariableValues "parameterGroup,mailRecipients,ModuleArgs"~DisplayVariableVa…

Azure系列2.1.15 —— SharedAccessBlobPolicy
(小弟自学Azure,文中有不正确之处,请路过各位大神指正。) 网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少。这次由于公司项目需要使用Azure,所以对Azure的一些学习…

Facebook AI新架构:全景FPN,同时完成图像实例与语义分割 | 极客头条
参加「CTA 核心技术及应用峰会」,请扫码报名 ↑↑↑整理 | 刘旭坤、Jane出品 | AI科技大本营(id:rgznai100)实例分割和语义分割长期以来都是运用不同的神经网络架构来完成的,虽然最近出现了将语义和实例分割进行结合的…

【经验】向word中插入格式化的代码块
参考博客:如何在word中插入代码块 1、打开http://www.planetb.ca/syntax-highlight-word网站 语法高亮显示Word文档中的代码 2、将你的代码复制进去,选择编译语言,点击“Show Highlighted” 3、复制格式化后的代码 4、直接在word中粘贴代…

用路由器限制局域网的带宽流量
有时在上班的时候,带宽并不是很高,但又因个别人过量占用带宽导致其它人正常上网的速度都很慢,正常的工作都无法开展,所以对局域网内主机带宽流量的管理就必不可少了。 公司并不是很多的电脑,且预算不是很多的&…

Lumen / Laravel 5.5 使用网易邮箱 SMTP 发送邮件
2019独角兽企业重金招聘Python工程师标准>>> Laravel 是目前最流行的PHP框架,而Lumen 是 Laravel 的精简版,主要用于接口开发。 Laravel 邮件发送服务基于 Symfony 组件 Swift Mailer。 本文记录了在 Lumen / Laravel 5 环境中,使…

终于有人把数据、信息、算法、统计、概率和数据挖掘都讲明白了!
插画设计:万娟01什么是数据数据是什么?这几乎成为一个我们熟视无睹的问题。有不少朋友脑子里可能会直接冒出一个词“数字”——“数字就是数据”,我相信会有一些朋友会斩钉截铁地这么告诉我。一些朋友会在稍作思考后回答“数字和字符、字母&a…

【经验】配置Anaconda源
配置清华源: conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/