前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >❓ 你看不懂的 Python 写法

❓ 你看不懂的 Python 写法

作者头像
布鲁斯鱼
发布2022-11-02 14:06:59
3410
发布2022-11-02 14:06:59
举报
文章被收录于专栏:布鲁斯鱼的妙想天开

近来在网上冲浪时看到了一个奇怪的 Python 语句:

代码语言:javascript
复制
>>> [0xfor x in (15, 10, 5)]
[15]

有那么一瞬间,对自己多年的 Python 语法产生了怀疑, 0xfor 是一个什么新的循环关键字?

经过一番探究,发现一个奇怪的 Python 语法世界。

上面这一句,实际上是 [0xf or x in (15, 10, 5)]

首先, 0xf 代表了 十六进制整型 15 ,同理还可以用二进制、八进制

代码语言:javascript
复制
>>> [0b010or x in (15, 10, 5)]
[2]

>>> [0o0or x in (15, 10, 5)]
[8]

还有一个特殊数字表示—— j ,代表 complex(复数)类型j 在这里表示虚数 i不用 i 的原因),也可以有很奇怪的写法:

代码语言:javascript
复制
>>> 0jor.0j
0j

>>> 0jis.0j
True

其次,在 Python 中操作符(Operator)左右的空格并不全是必须的

" Whitespace is needed between two tokens only if their concatenation could otherwise be interpreted as a different token"

所以理论上你可以写出类似这样的代码

代码语言:javascript
复制
>>> 0xfin[15]
True

>>> 0o7is[0xf]
False

>>> 0o7&0xf
7

>>> ~0o0**0o0
-2

最后,由于 or 操作符遵循最短求值原则,只要左侧表达式为真,右侧表达式是不会执行的,所以任何奇怪的表达都可以正常运行:

代码语言:javascript
复制
>>> 0xdeadbeefor whysoserious
3735928559

>>> 0xdeadbeefor whysoserious
3735928559

>>> 0o0and whysoserious
0

所以综上,我们来一个终极“乱码”:

代码语言:javascript
复制
>>> 0b010&0o0&0b0is(0j)in[0xdeadbeefor["是不是很奇怪这样也能运行"]]
False

现在再看一眼开头, [0xfor x in (15, 10, 5)] 是不是一眼就能能把 [15] 给看出来了呢?🥴

参考:

  1. https://stackoverflow.com/questions/67083039/why-does-python-return-15-for-0xfor-x-in-1-2-3
  2. https://twitter.com/nedbat/status/1382027078816653319
  3. https://stackoverflow.com/questions/24812444/why-are-complex-numbers-in-python-denoted-with-j-instead-of-i
  4. https://stackoverflow.com/questions/8370637/complex-numbers-in-python
  5. https://docs.python.org/3/reference/expressions.html#operator-precedence
  6. https://docs.python.org/3/reference/lexical_analysis.html#whitespace-between-tokens
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021 年 5 月 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档