一些你不知道的 Python Tips

前言

这篇文章是我基于「Daily Python Tip」(@python_tip)这个Twitter账号里面的内容整理的一些关于Python的有意思的小例子,另外我也基于我的知识对其进行了扩展。

dict更新

更新字典的键值需要使用update方法:

也就是update方法的参数也是一个dict。「@python_tip」提到了这么一个写法:

也就是说直接传入包含 (k,v) 这样的2项元组的列表也可以,但是如果列表中有只有单个元素的项,不能更新成功,但是不影响其他正常的项,如上面的4,5已经被更新进去了。

btw,看过我博客的同学是不是对那篇Python元组的赋值谜题有印象?

我立刻对update方法产生了浓厚的兴趣,看一下方法签名:

也就是说除了字典还可以接收 可迭代对象 或者 关键字参数 作为参数。且可以混用:

另外看方法签名说明可以知道,只要传入的参数或者其中的项有 keys 方法就可以:

隐式的字符串连接

工作中写代码经常遇到很长的字符串(如写SQL语句时),可能会超过单行长度限制,我一般用隐式的字符串连接:

但是「隐式」也可能给你带来非常隐蔽的错误:

由于b和c之前没有加逗号,会被隐式的拼在一起。这可能会让开发者调试很久才发现是逗号的问题

print的妙用

作为一个Python 2时代过来的开发者,我对Python 3强制把print作为函数特别不适应,所以当时还特别去学习和理解为什么作为函数更好。我觉得改成函数最好的地方是支持灵活的参数,实现更多样的打印效果,举几个例子:

上面 print(*lst,sep=', ') 我得额外说一点,大家应该这样写过代码:

如果要被join的列表项有非字符串的会抛错误,需要手动把数字转成字符串,在print函数中不用担心这点:

print还支持file参数,可以直接把内容打印到文件中:

print还支持flush参数,我们直接看下面这个例子就能理解了:

大家可以执行一下。会发现sleep了3秒,一次把全部内容都打印出来,没有倒计时的效果。这需要每次迭代都要强制刷新流,改成 print(countdown,end='...',flush=True) 就好了。

具体解释可以看延伸阅读链接1

另外print在Python2是关键字,而在Python3中可以直接替换掉:

__hello__ 和  __phello__

Python有2个隐藏模块:

它们主要用于CPython的测试,是由freeze工具生成的,主要用于CPython的测试,完全没有实际用处,具体源码可以参考延伸阅读链接2。

Python3打印emoji表情

在Python 3中可以直接通过CLDR(Unicode Common Locale Data Repository)中的 shortname 打印emoji表情,

格式是 '\N{CLDR_SHORT_NAME}' ,这样非常方便,原来需要安装emoji包才可以用。

不过emoji字符串用起来要注意:

全部的emoji可以在延伸阅读链接3中找到

延伸阅读

  1. https://realpython.com/python-print/

  2. https://github.com/python/cpython/blob/8c77b8cb9188165a123f2512026e3629bf03dc9b/Python/frozen.c#L39-L43

  3. https://unicode.org/emoji/charts/full-emoji-list.html