首发于微信公众号: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

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

复制代码

03. 改变默认递归次数限制

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

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

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

复制代码

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。

06. 空字符串计数

求一个字符串里,某子字符(串)出现的次数。在Python中使用 count() 函数,就可以轻松实现。

比如下面几个常规例子

>>> "aabb".count("a")

2

>>> "aabb".count("b")

2

>>> "aabb".count("ab")

1

复制代码

但是如果使用空字符串呢,你可能想不到会是这样的结果。

>>> "aabb".count("")

5

复制代码

具体原因,我不敢妄下结论。

由此我还衍生出另一个想法,实验了下。不知道空字符串,是一种什么样的存在,难道字母与字母之间 “缝隙” 也算吗?

>>> "" in ""

True

>>> "" in "ab"

True

复制代码

有兴趣的可以去看看CPython的源码实现。

07. 负负得正

从初中开始,我们就开始接触了负数 这个概念。知道了负负得正,这和武侠世界里的以毒功毒,有点神似。

Python 作为一门高级语言,它的编写符合人类的思维逻辑,这其中也包括负负得正这个思想。

>>>5-3

2

>>>5--3

8

>>>5+-3

2

>>>5++3

8

>>>5---3

2

复制代码

08. 数值与字符串的比较

在 Python2 中,数字可以与字符串直接比较。结果是数值永远比字符串小。

>>> 100000000 < ""

True

>>> 100000000 < "ming"

True

复制代码

但在 Python3 中,却不行。

>>> 100000000 < ""

TypeError: '

复制代码

09. 循环中的局部变量泄露

在Python 2中x的值在一个循环执行之后被改变了。

# Python2

>>> x = 1

>>> [x for x in range(5)]

[0, 1, 2, 3, 4]

>>> x

4

复制代码

不过在Python3 中这个问题已经得到解决了。

# Python3

>>> x = 1

>>> [x for x in range(5)]

[0, 1, 2, 3, 4]

>>> x

1

复制代码

10. 字典可排序

字典不可排序的思想,似乎已经根深蒂固。

# Python2.7.10

>>> mydict = {str(i):i for i in range(5)}

>>> mydict

{'1': 1, '0': 0, '3': 3, '2': 2, '4': 4}

复制代码

在 Python3 中字典已经是有序的。

# Python3.6.7

>>> mydict = {str(i):i for i in range(5)}

>>> mydict

{'0': 0, '1': 1, '2': 2, '3': 3, '4': 4}

复制代码

11. 链式比较

先给看一个示例

>>> False == False == True

False

复制代码

你知道这个表达式会返回 False 吗?

我再给你举个例子,你可能就懂了。

f 18 < age < 60:

print("young man")

复制代码

如果还不明白,再给你整个等价写法。

>>> False == False and False == True

False

复制代码

12. 奇怪的字母

直接看下列例子。

在Python 2.x 中

>>> value = 11

>>> valuе = 32

File "", line 1

valuе = 32

^

SyntaxError: invalid syntax

复制代码

在Python 3.x 中

>>> value = 11

>>> valuе = 32

>>> value

11

复制代码

我相信你一开始看到这里,一定是目瞪口呆。你可以在自己的电脑上尝试一下,你会发现你不管在哪个版本的 Python 里运行都没有问题。

如果你想重现我这个场景,你可能复制我上面的代码粘贴至自己的命令行中即可。

在这里,也不卖关子了,上面代码中第二行的 е 和 第一行的 e 是不一样的。

第二行的 e 是 Cyrillic(西里尔)字母,而不是我们熟悉的英文字母。

>>> ord('е') # cyrillic 'e' (Ye)

1077

>>> ord('e') # latin 'e', as used in English and typed using standard keyboard

101

>>> 'е' == 'e'

False

复制代码

细思恐极,平时可千万不要得罪同事们,万一辞职的时候,把你项目里的 e 全局替换成 e,到时候连错都不知道错哪了哈哈。

13. x == +x 吗?

在大多数情况下,这个等式是成立的。

>>> n1 = 10086

>>> n2 = +n1

>>>

>>> n1 == n2

True

复制代码

什么情况下,这个等式会不成立呢?

由于Counter的机制,+ 用于两个 Counter 实例相加,而相加的结果如果元素的个数 <= 0,就会被丢弃。

>>> from collections import Counter

>>> ct = Counter('abcdbcaa')

>>> ct

Counter({'a': 3, 'b': 2, 'c': 2, 'd': 1})

>>> ct['c'] = 0

>>> ct['d'] = -2

>>>

>>> ct

Counter({'a': 3, 'b': 2, 'c': 0, 'd': -2})

>>>

>>> +ct

Counter({'a': 3, 'b': 2})

复制代码

14. 有趣的import

import 是 Python 导包的方式。

你知道 Python 中内置了一些很有(wu)趣(liao)的包吗?

Hello World

>>> import __hello__

Hello World!

复制代码

Python之禅

>>> import this

The Zen of Python, by Tim Peters

Beautiful is better than ugly.

Explicit is better than implicit.

Simple is better than complex.

Complex is better than complicated.

Flat is better than nested.

Sparse is better than dense.

Readability counts.

Special cases aren't special enough to break the rules.

Although practicality beats purity.

Errors should never pass silently.

Unless explicitly silenced.

In the face of ambiguity, refuse the temptation to guess.

There should be one-- and preferably only one --obvious way to do it.

Although that way may not be obvious at first unless you're Dutch.

Now is better than never.

Although never is often better than *right* now.

If the implementation is hard to explain, it's a bad idea.

If the implementation is easy to explain, it may be a good idea.

Namespaces are one honking great idea -- let's do more of those!

复制代码

反地心引力漫画

在 cmd 窗口中导入antigravity

>>> import antigravity

复制代码

就会自动打开一个网页。

15. 局部/全局变量分不清?

在开始讲之前,你可以试着运行一下下面这小段代码。

a = 1

def func01():

a += 1

func01()

复制代码

看似没有毛病,但实则已经犯了一个很基础的问题,这个报错相当常见吧?

>>>func01()

Traceback (most recent call last):

File "", line 1, in

File "", line 2, in func01

UnboundLocalError: local variable 'a' referenced before assignment

复制代码

回顾一下,什么是局部变量?在非全局下定义声明的变量都是局部变量。

当程序运行到 a += 1 时,Python 解释器就认为在函数内部要给 a 这个变量赋值,当然就把 a 当做局部变量了,报错是理所当然的。

参考文档

python的运算符号使等式成立_你所不知道的 Python 冷知识!(二)(建议收藏)相关推荐

  1. python的运算符号使等式成立_那些年被我坑过的Python——不得不知(第二章)

    问题一: Python3.5.X中的数据类型有哪些? 答:包括整型.布尔型.字符串型.浮点型.复数.列表.字典.集合.元组. 细化来说: 1.整型包括短整型和长整型,不过我们不必过度操心细节,因为短整 ...

  2. python 函数调用 不允许关键字参数_你所不知道的Python|函数参数的演进之路

    原标题:你所不知道的Python|函数参数的演进之路 函数参数处理机制是Python中一个非常重要的知识点,随着Python的演进,参数处理机制的灵活性和丰富性也在不断增加,使得我们不仅可以写出简化的 ...

  3. python可以引流吗_python能干嘛?你所不知道的Python有趣用途(上)

    前言 很多人都觉得Python虽然好学,但却不晓得如何将其应用到生活中,或是只知道Python可以拿来做「数据分析」.「爬虫」.甚至是「人工智慧」,但却觉得那些东西离自己很遥远 (尤其是初学者,经常会 ...

  4. 你所不知道的 Python 冷知识!(建议收藏)

    01. 省略号也是对象 ... 这是省略号,在Python中,一切皆对象.它也不例外. 在 Python 中,它叫做 Ellipsis . 在 Python 3 中你可以直接写-来得到这玩意. > ...

  5. Python可以做什么?你所不知道的Python——生活中的奇妙用途

    大家都知道Python可以用来做数据分析.爬虫,甚至是人工智能,但却觉得那些东西比较遥远,会担心孩子学Python为时过早. Python 其实Python并不只是能做一些很专业.高端的应用,它在生活 ...

  6. php随机数字不重复使等式成立_当随机数遇上量子

    导读 小墨读大学的时候,坊间流传着一段顺口溜,用来描述大学几门特别难学的课,其中有一句:"-随机过程随机过,量子力学量力学...",可见这两门课消耗了多少学子的脑细胞.那么,当&q ...

  7. 你所不知道的Python奇技淫巧

    有时候你会看到很Cool的Python代码,你惊讶于它的简洁,它的优雅,你不由自主地赞叹:竟然还能这样写.其实,这些优雅的代码都要归功于Python的特性,只要你能掌握这些Pythonic的技巧,你一 ...

  8. java strim性能_你所不知道的Java性能优化之String!

    Java性能优化之String字符串优化 1.字符串对象及其特点 Java中八大基本数据类型没有String类型,因为String类型是Java对char数组的进一步封装. String类的实现主要由 ...

  9. 微信和Python之间,还能这样玩,你所不知道的骚操作!

    安装 pip3 install itchat 主要用到的方法: itchat.login() 微信扫描二维码登录 itchat.get_friends() 返回完整的好友列表,每个好友为一个字典, 其 ...

最新文章

  1. EventBus源码解析
  2. 使用Spring2.5的Autowired实现注释型的IOC(转载)
  3. java web 线程_多线程在javaweb中的应用
  4. jpa 自定义sql if_mybatis仿jpa 使用@createDate @updateDate
  5. CentOS7下搭建SVN服务器
  6. html5比赛策划书,FashionAI 天池竞赛 - Top5 技术方案简汇
  7. java随机抽取_java 随机抽取案例,不重复抽取
  8. android 存储空间监控,浅谈 Android 内存监控(中)
  9. 实验平均梯度与图像的模糊程度(matlab 代码)
  10. php网页文件在,php是网页文件吗
  11. MySQL嵌套查询(子查询)
  12. 中国杀防论坛[ANTI-CN BBS] 新版上线
  13. 基于PHP+MySQL企业工资管理系统的设计与实现(含论文
  14. Qt之如何识别小键盘(数字键盘)
  15. Linux电源管理_Wakeup events framework--(二)
  16. Codeforces446C - DZY Loves Fibonacci Numbers
  17. 跟谁学盈利神话已破,烧钱大战没有赢家
  18. 网易互娱的一道笔试题
  19. Java有序数组——原地去重——不使用额外空间
  20. sql注入危害利用及防护详解+sqlmap使用

热门文章

  1. SAP 金税接口介绍
  2. 基于动物标签识别的基础知识以及FDX-B协议与结构介绍。
  3. 虚拟机工作站创建虚拟机并安装Linux教程
  4. 详解软件人力外包对于需求企业和外包it人员的好处
  5. django创建应用程序_使用Django创建基于机器学习的Web应用程序
  6. Updating...门店零售业数据分析实战
  7. 呕心沥血整理,Nginx看这个就够了
  8. php动漫随机图源码,随机图片API源码
  9. angular判断用户设备为移动设备还是PC
  10. 机器学习中常见的损失函数和代价函数