Pulpcode

捕获,搅碎,拼接,吞咽

0%

python为什么不支持xxx?

如果你了解python,就会发现python不支持类c语言的许多东西:

switch

对于简单的选择,使用足够if... elif... elif... else,除非很大才考虑用switch。
而且python也确实考虑过加入 switch pep 275

当然,有geek的做法是 multiple dispatch

1
2
3
4
5
6
7
8
def function_1(...):
...

functions = {'a': function_1,
'b': function_2,
'c': self.method_1, ...}
func = functions[value]
func()

函数重载

首先,我认为重载的目的其实就是“懒的”为功能相似的函数命名。
可以重载的方式有:

  1. 参数类型不同
  2. 参数个数不同

其实对于以下三个函数。

int f(int a)
int f(int a, int b)
int f(double a)

它们会在编译期由编译器重命名函数:

int f_i_1(int a)
int f_i_i_2(int a, int b)
int f_d_1(double a)

需要注意的是缺省类型的实现机制其实和重载是两码事。而且功能不同,是不能相互代替的。

python的重载,由于动态类型的原因,并不能通过函数类型完成多态。
而靠参数个数的多态,实现方式和switch“类似”,可以通过 multiple dispatch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def func1(a):
....
def func2(a,b):
....
def func3(a,b,c):
....

def funs(*args):
l = len(args)
f = {
1: func1(args[0])
2: func2(args[0], args[1])
3: func(args[0], args[1], args[2])
}
return f[l]

三元运算符

表面上看,三元运算符其本身可以用 if ... else 替代,实际上并不是这样。 因为三元运算符本身是一个表达式,它是可以赋值的。
if..else 则是通过逻辑判断来执行语句块的。
我们可以用 and or 来实现三元运算符,比如对于C类语言的这种三元运算符:

1
2
// 返回a与b中的较大者
max = a > b ? a:b;

可以用 and … or 的方式来实现:

1
2
# 使用 `and or`
max = a > b and a or b

其原理就是逻辑运算的短路求值,不过这种写法是有bug的,假如a的值刚好是0,或者是其它的False值呢?
网上有其它一些geek的实现方式能够消除这种bug,这里不在重复。

简单的来说,动态语言自身的灵活特性,使得某些功能的实现方式完全不需要静态语言“被逼蹩脚”的灵活性。