python 小技巧

1. 原地交换两个数字
Python 提供了一个直观的在一行代码中赋值与交换(变量值)的方法,请参见下面的示例:

In [1]: x,y = 10 ,20 

In [2]: print(x,y)
10 20

In [3]: x, y = y, x 

In [4]: print(x,y)
20 10

赋值的右侧形成了一个新的元组,左侧立即解析(unpack)那个(未被引用的)元组到变量 和 。

一旦赋值完成,新的元组变成了未被引用状态并且被标记为可被垃圾回收,最终也完成了变量的交换。

2. 链状比较操作符比较操作符的聚合是另一个有时很方便的技巧:

  In [5]: n = 10 

  In [6]: result = 1 < n < 20 

  In [7]: result 
  Out[7]: True

  In [8]: result = 1 > n <= 9 

  In [9]: result 
  Out[9]: False

3. 使用三元操作符来进行条件赋值
三元操作符是 if-else 语句也就是条件操作符的一个快捷方式:

  [表达式为真的返回值] if [表达式] else [表达式为假的返回值]
  这里给出几个你可以用来使代码紧凑简洁的例子。下面的语句是说“如果 y 是 9,给 x 赋值 10,不然赋值为 20”。如果需要的话我们也可以延长这条操作链。

  x = 10 if (y == 9) else 20
  同样地,我们可以对类做这种操作:

x = (classA if y == 1 else classB)(param1, param2)

在上面的例子里 classA 与 classB 是两个类,其中一个类的构造函数会被调用.

下面是另一个多个条件表达式链接起来用以计算最小值的例子:

In [10]: def small(a,b,c):
…: return a if a<=b and a<=c else (b if b<=a and b<=c else c)
…:

In [11]: small(1,0,1)
Out[11]: 0

In [12]: small(1,2,3)
Out[12]: 1
我们甚至可以在列表推导中使用三元运算符:

In [14]: [ m2 if m > 10 else m4 for m in range(20) ]
Out[14]:
[0,1,16,81,256,625,1296,2401,4096,6561,10000,121,144,169,196,225,256,289,324,61]
4. 多行字符串
基本的方式是使用源于 C 语言的反斜杠:

In [20]: multistr = " select * from multi_row
…: where row_id < 5"

In [21]: multistr
Out[21]: ’ select * from multi_row where row_id < 5’
另一个技巧是使用三引号

In [23]: multistr =“““select * from multi_row
…: where row_id < 5”””

In [24]: multistr
Out[24]: ‘select * from multi_row \nwhere row_id < 5’
上面方法共有的问题是缺少合适的缩进,如果我们尝试缩进会在字符串中插入空格。所以最后的解决方案是将字符串分为多行并且将整个字符串包含在括号中:

In [25]: multistr = ("select * from multi_row"
…: "where row_id < 5"
…: “order by age”)

In [26]: multistr
Out[26]: ‘select * from multi_row where row_id < 5 order by age’
5. 存储列表元素到新的变量中
我们可以使用列表来初始化多个变量,在解析列表时,变量的数目不应该超过列表中的元素个数:【译者注:元素个数与列表长度应该严格相同,不然会报错】

In [27]: testlist = [1,2,3]

In [28]: x,y,z = testlist

In [29]: print(x,y,z)
1 2 3
6. 打印引入模块的文件路径
如果你想知道引用到代码中模块的绝对路径,可以使用下面的技巧:

In [30]: import threading

In [31]: import socket

In [32]: print(threading)
<module ‘threading’ from ‘/usr/local/lib/python3.5/threading.py’>

In [33]: print(socket)
<module ‘socket’ from ‘/usr/local/lib/python3.5/socket.py’>