反转字符串/列表、改变递归次数限制、else用法...Python 冷知识(四)

本文转载自Python编程时光(ID:Python-Time)
冷知识系列,已经更新至第四篇。前三篇传送门在此,还没阅读的可以学习一下。
交互式“_”操作符
对于?_?,我想很多人都非常熟悉。
给变量取名好艰难,用?_;
懒得长长的变量名,用?_;
无用的垃圾变量,用?_;
以上,我们都很熟悉了,今天要介绍的是他在交互式中使用。
>>>?3?+?4
7
>>>?_
7
>>>?name='ming'
>>>?name
'ming'
>>>?_
'ming'
它可以返回上一次的运行结果。
但是,如果是print函数打印出来的就不行了。
>>>?3?+?4
7
>>>?_
7
>>>?print("ming")
ming
>>>?_
7
我自己写了个例子,验证了下,用__repr__输出的内容可以被获取到的。
首先,在我们的目录下,写一个文件 ming.py。内容如下
#?ming.py
class?mytest():
????def?__str__(self):
????????return?"hello"
????def?__repr__(self):
????????return?"world"
然后在这个目录下进入交互式环境。
>>>?import?ming
>>>?mt=ming.mytest()
>>>?mt
world
>>>?print(mt)
hello
>>>?_
world
知道这两个魔法方法的人,一看就明白了。
优雅的反转字符串/列表
反转序列并不难,但是如何做到最优雅呢?
先来看看,正常是如何反转的。
最简单的方法是使用列表自带的reverse()方法。
>>>?ml?=?[1,2,3,4,5]
>>>?ml.reverse()
>>>?ml
[5,?4,?3,?2,?1]
但如果你要处理的是字符串,reverse就无能为力了。你可以尝试将其转化成list,再reverse,然后再转化成str。转来转去,也太麻烦了吧?需要这么多行代码(后面三行是不能合并成一行的),一点都Pythonic。
mstr1?=?'abc'
ml1?=?list(mstr1)
ml1.reverse()
mstr2?=?str(ml1)
对于字符串还有一种稍微复杂一点的,是自定义递归函数来实现。
def?my_reverse(str):
????if?str?==?"":
????????return?str
????else:
????????return?my_reverse(str[1:])?+?str[0]
在这里,介绍一种最优雅的反转方式,使用切片,不管你是字符串,还是列表,简直通杀。
>>>?mstr?=?'abc'
>>>?ml?=?[1,2,3]
>>>?mstr[::-1]
'cba'
>>>?ml[::-1]
[3,?2,?1]
改变递归次数限制
上面才提到递归,大家都知道使用递归是有风险的,递归深度过深容易导致堆栈的溢出。如果你这字符串太长啦,使用递归方式反转,就会出现问题。
那到底,默认递归次数限制是多少呢?
可以使用sys这个库来查看
>>>?import?sys
>>>?sys.getrecursionlimit()
1000
可以查,当然也可以自定义修改次数,退出即失效。不过友情提醒,这玩意还是不要轻易去碰,万一导致系统崩溃了小明可不背锅。
>>>?sys.setrecursionlimit(2000)
>>>?sys.getrecursionlimit()
2000
一行代码实现FTP服务器
搭建FTP,或者是搭建网络文件系统,这些方法都能够实现Linux的目录共享。但是FTP和网络文件系统的功能都过于强大,因此它们都有一些不够方便的地方。比如你想快速共享Linux系统的某个目录给整个项目团队,还想在一分钟内做到,怎么办?很简单,使用Python中的SimpleHTTPServer。
SimpleHTTPServer是Python 2自带的一个模块,是Python的Web服务器。它在Python 3已经合并到http.server模块中。具体例子如下,如不指定端口,则默认是8000端口。
#?python2
python?-m?SimpleHTTPServer?8888
#?python3
python3?-m?http.server?8888
直接在浏览器访问即可。

SimpleHTTPServer有一个特性,如果待共享的目录下有index.html,那么index.html文件会被视为默认主页;如果不存在index.html文件,那么就会显示整个目录列表。
让你晕头转向的 else 用法
if else 用法可以说最基础的语法表达式之一,但是今天不是讲这个的,一定要讲点不一样的。
if else 早已烂大街,但可能有很多人都不曾见过 for else 和 try else 的用法。为什么说它曾让我晕头转向,因为它不像 if else 那么直白,非黑即白,脑子经常要想一下才能才反应过来代码怎么走。反正我是这样的。
先来说说,for else
def?check_item(source_list,?target):
????for?item?in?source_list:
????????if?item?==?target:
????????????print("Exists!")
????????????break
????else:
????????print("Does?not?exist")
在往下看之前,你可以思考一下,什么情况下才会走 else。是循环被 break,还是没有break?
给几个例子,你体会一下。
check_item(["apple",?"huawei",?"oppo"],?"oppo")
#?Exists!
check_item(["apple",?"huawei",?"oppo"],?"vivo")
#?Does?not?exist
可以看出,没有被 break 的程序才会正常走else流程。
再来看看,try else 用法。
def?test_try_else(attr1?=?None):
????try:
????????if?attr1:
????????????pass
????????else:
????????????raise
????except:
????????print("Exception?occurred...")
????else:
????????print("No?Exception?occurred...")
同样来几个例子。当不传参数时,就抛出异常。
test_try_else()
#?Exception?occurred...
test_try_else("ming")
#?No?Exception?occurred...
可以看出,没有 try 里面的代码块没有抛出异常的,会正常走else。
总结一下,for else 和 try else 相同,只要代码正常走下去,不被 break,不抛出异常,就可以走 else。
(本文为 AI科技大本营转载文章,转载请联系原作者)
◆
CTA核心技术及应用峰会
◆
5月25-27日,由中国IT社区CSDN与数字经济人才发展中心联合主办的第一届CTA核心技术及应用峰会将在杭州国际博览中心隆重召开,峰会将围绕人工智能领域,邀请技术领航者,与开发者共同探讨机器学习和知识图谱的前沿研究及应用。
更多重磅嘉宾请识别海报二维码查看,目前会议早鸟票发售中(原票价1099元),点击阅读原文即刻抢购。添加小助手微信15101014297,备注“CTA”,了解票务以及会务详情。

推荐阅读
他25岁进贝尔实验室,32岁提信息论,40岁办达特茅斯会议,晚年患上阿兹海默 | 人物志
重磅!Facebook更新PyTorch 1.1,打算跨GPU分割神经网络
小样,加张图你就不认识我了?“补丁”模型骗你没商量!| 技术头条

关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
关注网络尖刀微信公众号随时掌握互联网精彩
- 1 《求是》发表习近平总书记重要文章 7904298
- 2 勇敢夺枪老人与妻子相拥倒在现场 7808915
- 3 中美卫星惊险“擦肩”距离仅200米 7712617
- 4 明年经济工作政策取向确立这八个字 7618002
- 5 “中国最冷小镇”最低温降至-39℃ 7523164
- 6 男子陪女友逛街买刮刮乐中80万元 7429313
- 7 30万级的玛莎拉蒂两天被一抢而空 7332336
- 8 上海商场悬空挂数十件大衣被指吓人 7237597
- 9 MLXG成老赖 7140007
- 10 如何让你我的钱袋子鼓起来 7046623

AI100
