简单好玩的Python知识点(四)

欢迎关注微信公众号:简说Python
关注后回复:1024,可以领取精选编程学习电子书籍。

640?wx_fmt=jpeg

本文授权转载自Python编程时光
禁止二次转载

大家好,我是老表

阅读文本大概需要 5 分钟

Smaller And Smarter,简单好玩的Python


冷知识系列,直至今日,已经更新至第三篇。


前两篇传送门小明给你准备好了,还没阅读的可以学习一下。



还是老规矩,一篇只分享五个,有时间了就整理。不想错过的,千万记得关注一下

01


交互式“_”操作符



对于 _ ,我想很多人都非常熟悉。

给变量取名好艰难,用 _
懒得长长的变量名,用 _
无用的垃圾变量,用 _

以上,我们都很熟悉了,今天要介绍的是他在交互式中使用。

 
   

>>> 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

知道这两个魔法方法的人,一看就明白了。



02


优雅的反转字符串/列表



反转序列并不难,但是如何做到最优雅呢?

先来看看,正常是如何反转的。

最简单的方法是使用列表自带的reverse()方法。

 
   

>>> ml = [1,2,3,4,5]
>>> ml.reverse()
>>> ml
[54321]

但如果你要处理的是字符串,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]
[321]



03


改变递归次限制



上面才提到递归,大家都知道使用递归是有风险的,递归深度过深容易导致堆栈的溢出。如果你这字符串太长啦,使用递归方式反转,就会出现问题。

那到底,默认递归次数限制是多少呢?

可以使用sys这个库来查看

 
   

>>> import sys
>>> sys.getrecursionlimit()
1000

可以查,当然也可以自定义修改次数,退出即失效。不过友情提醒,这玩意还是不要轻易去碰,万一导致系统崩溃了小明可不背锅。

 
   

>>> sys.setrecursionlimit(2000)
>>> sys.getrecursionlimit()
2000



04


一行代码实现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

直接在浏览器访问即可。

简单好玩的Python知识点(四)_第1张图片

SimpleHTTPServer有一个特性,如果待共享的目录下有index.html,那么index.html文件会被视为默认主页;如果不存在index.html文件,那么就会显示整个目录列表。


05


让你晕头转向的 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。


今日留言主题
说说你读完本文感受?
或者一句激励自己的话?
(字数不少于15字)
说明
今天是留言打卡第十九天
简说Python,等你~

640?wx_fmt=png

今日留言赠书《Python编程从0到1》

本书以Python语言构建了程序设计基础课程的教学体系。本书在对程序设计核心方法的探讨上较其他Python书籍更为全面和深入。通过对本书内容的学习,读者将全面地掌握用Python进行程序设计的基本能力。


2小时快速掌握Python基础知识要点

完整Python基础知识要点


640?wx_fmt=jpeg
学Python | 聊赚钱
 
      
640?wx_fmt=png
给个[在看]

你可能感兴趣的:(简单好玩的Python知识点(四))