如果你了解python,就会发现python不支持类c语言的许多东西:
switch
对于简单的选择,使用足够if... elif... elif... else
,除非很大才考虑用switch。
而且python也确实考虑过加入 switch
pep 275
当然,有geek的做法是 multiple dispatch
1 | def function_1(...): |
函数重载
首先,我认为重载的目的其实就是“懒的”为功能相似的函数命名。
可以重载的方式有:
- 参数类型不同
- 参数个数不同
其实对于以下三个函数。
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 | def func1(a): |
三元运算符
表面上看,三元运算符其本身可以用 if ... else
替代,实际上并不是这样。 因为三元运算符本身是一个表达式,它是可以赋值的。
而 if..else
则是通过逻辑判断来执行语句块的。
我们可以用 and or 来实现三元运算符,比如对于C类语言的这种三元运算符:
1 | // 返回a与b中的较大者 |
可以用 and … or 的方式来实现:
1 | # 使用 `and or` |
其原理就是逻辑运算的短路求值,不过这种写法是有bug的,假如a的值刚好是0,或者是其它的False值呢?
网上有其它一些geek的实现方式能够消除这种bug,这里不在重复。
简单的来说,动态语言自身的灵活特性,使得某些功能的实现方式完全不需要静态语言“被逼蹩脚”的灵活性。