python的奇妙用法


收集了一些不太常用的Python用法,其实大多数都没什么用,所以主要是用于知识积累(炫技吹逼),逃,-=≡ヘ(*・ω・)ノ

1. 条件语句的6种写法

  • 第一种

    常规 if ... else ... 写法,没什么好说的

    if <condition>:
        <on_true>
    else:
        <on_false>
  • 第二种

    if ... else ... 简写版

    <on_true> if <condition> else <on_false> 
  • 第三种

    逻辑语句取值

    <condition> and <on_true> or <on_false>
  • 第四种

    tuple下标取值

    (<on_true>, <on_false>)[condition]
  • 第五种

    和第四种方法差不多,字典索引取值

    {True: <on_true>, False: <on_false>}[<condition>]
  • 第六种

    第四种方法的变种,实际上也是tuple下标取值

    (lambda: <on_false>, lambda: <on_true>)[<condition>]()

2. 修改解释器提示符

如果是在terminal上面执行Python命令,界面是这样的

>>> for i in range(2):
...     print (i)

其实 >>>... 提示符是可以修改的

>>> import sys                      
>>> sys.ps1                         
'>>> '                              
>>> sys.ps2                         
'... '  
>>> sys.ps1 = '114 '
114 sys.ps2 = '514 '
114 for i in range(2):
514     print (i)

3. 类首字母不一定是大写

一般情况下,默认类名的首字母是大写,类的实例名首字母是小写。但“一般”都有例外。

例如,bool 是类名,而 True,False 是其实例; int,string,float,list,tuple,dict 等都是类名。

4. intern机制

intern机制Python提高字符串使用效率的机制,会把相同的字符串对象保存在同一个内存地址中

特别地,下面代码要在终端Python环境下运行,如果在IDE中运行会得到不一样的结果。只能猜测是IDE每次运行是所有代码都加载都内存中,属于一个整体,默认所有情况都启用intern机制,所以只能说明,IDE有自己的想法

>>> s1="hello"
>>> s2="hello"
>>> s1 is s2
True

# 如果有空格,默认不启用intern机制
>>> s1="hell o"
>>> s2="hell o"
>>> s1 is s2
False

# 如果一个字符串长度超过20个字符,不启动intern机制
>>> s1 = "a" * 20
>>> s2 = "a" * 20
>>> s1 is s2
True

>>> s1 = "a" * 21
>>> s2 = "a" * 21
>>> s1 is s2
False

# 字符串拼接不启用intern机制
>>> s1 = "hell"
>>> s2 = "hello"
>>> s1 + "o" is s2
False

5. 小整数池

类似字符串的intern机制,整数有小整数池,这是Python为避免整数频繁申请和销毁内存空间的一种优化机制。

Python 定义了一个小整数池 [-5, 256], 所有的小整数对象都共用同一个内存地址。

>>> a = -6
>>> b = -6
>>> a is b
False

>>> a = 256
>>> b = 256
>>> a is b
True

>>> a = 257
>>> b = 257
>>> a is b
False

# 这是一个特例,因为当你在同一行里,同时给两个变量赋同一值时,解释器知道这个对象已经生成,那么它就会引用到同一个对象。
>>> a = 257; b = 257
>>> a is b
True

6. 链式比较

多个并操作的逻辑比较可以写成链式比较形式

a > 0 and a < 10 可以写成链式比较形式 0 < a < 10

其实 == 也有链式比较的,看下面例子:

>>> a = 5, b = 15

# 等价于 `a > 0 and a < 10`
>>> 0 < a < 10
True

>>> 0 < a < 10 < b < 20
True

# 既然是逻辑符号,自然地 '==' 也可以用链式比较
>>> False == False == True
False

7. 负负得正

>>> 5 -- 3
8
>>> 5 +- 3
2

8. 奇怪的空字符串

空字符串有些奇怪的特性

>>> '' in 'ab'
True
>>> '' in ''
True

这里的解释是空串是空集,空集是所有字符串集合的子集,其中也包括空集

下面这种现象有点难解释

>>> 'aabb'.count('')
5

9. “_”操作符

  • 在交互界面中,作为单独的操作符,_ 会保存上一次调用 __repr__ 打印的结果,但不能保存调用 __str__ 打印的结果

    >>> 3 + 4
    7
    >>> _
    7
    >>> print("ming")
    ming
    >>> _
    7
  • Python3.6 新增的语法,作为连接符,用于连接整数位间的连接,方便阅读

    # 等价于 `a = 10000000`
    a = 10_000_000

10. 布尔值为假的对象

下列提到的对象都为假

>>> any([False, None, 0, .0])
False

# 所有的空集都为假
>>> any(['', [], (), {}])
False

# 特别地,基础类的默认返回值都为假
>>> any([int(), float(), bool(), str(), list(), tuple(), dict(), set()])
False

11. ... 省略号

Python3 新增的语法

... 是一个对象

>>> ...
Ellipsis
>>> type(...)
<class 'ellipsis'>
>>> bool(...)
True
>>> id(...)
4334434256

这玩意有什么用呢?主要有两处作用,

  • 用来表示省略,约等于 pass

    def a(): ...
  • numpy的语法糖,切片取值的时候,用来省去不写多余的维度

    >>> arr = np.random.randint(10, size=(2,3,4))
    >>> arr
    array([[[5, 4, 0, 6],
            [3, 1, 0, 1],
            [2, 2, 4, 5]],
    
           [[6, 3, 5, 0],
            [3, 7, 0, 5],
            [1, 2, 2, 8]]])
    >>> arr[..., 0]
    array([[5, 3, 2],
           [6, 3, 1]])
    >>> arr[..., 0, 0]
    array([5, 6])

12. 变量的类型注解

Python3.5 新增的语法,可以给函数的参数和返回值添加注解

这个只是建议输入/输出类型,并不是强制类型

def func(a: int, b: str) -> bool: pass

Python3.6 新增可以对变量添加注解

a :int = 1

13. F-string

Python3.6 新增的语法,用来格式化字符串,可以用来替代 str.format() 方法

>>> a = 5, b = 15

# 等价于 `'a={a},b={b}'.format(a=a, b=b)`
>>> f'a={a},b={b}'
'a=5,b=15'

14. 海象操作符 :=

Python3.8 新增的语法,可以值赋给表达式中的变量

# 等价于
# a = 2
# a > 3
>>> a := 2 > 3
False

>>> func(a=(b := 3)): pass

更多关于海象操作符的使用可以参阅PEP 572

15. 高亮打印

linux终端中的颜色是用转义序列控制的,转义序列是以ESC开头,可以用\033完成相同的工作(ESC的ASCII码用十进制表示就是27,等于用八进制表示的33)

格式:\033[显示方式;前景色;背景色m

显示方式:

0 - 终端默认设置

1 - 高亮显示

4 - 使用下划线

5 - 闪烁

7 - 反白显示

8 - 不可见

前景色/背景色:

30/40 - 黑色

31/41 - 红色

32/42 - 绿色

33/43 - 黃色

34/44 - 蓝色

35/45 - 紫红色

36/46 - 青蓝色

37/47 - 白色

例如:

210401

特别地,最后记得加上 \033[0m 将显示改为默认设置


评论
  目录