收集了一些不太常用的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 - 白色
例如:
特别地,最后记得加上 \033[0m
将显示改为默认设置