Python是一门语法优雅,功能强大,开发效率高,应用领域广泛的解释性语言。其有非常多的优点,但是也并不是完美的,除了大家都知道的执行速度不够快,Python2和Python3的兼容问题,以及GIL锁,在其语法上也有一些特点(是否是缺点见仁见智啦):
1. 使用可变对象作为函数默认值代码如下:
def func(a = []):
a.append(1)
print(a)
func()
func()
func()
输出:
[1]
[1, 1]
[1, 1, 1]
在Python中,字典,集合,列表等等对象不适合作为函数默认值。因为这个默认值在函数创建时就会生成, 每次调用都调用了这个对象的”缓存”。
2. bool是int的子类 我们可以用以下代码来测试:
print(2 + True)
print(2 * False)
输出:
3
0
我们在来看看bool的类型:
print(bool.__bases__)
输出:
(,)
3.‘==’ 和 is 的区别 ”Is”是判断两个对象是否是同一个对象, “==“是判断两个对象的值,但我们通过以下代码来测试:
a = 257
b = 256+1
print(bool(a is b))
输出:False
c = 256
d = 257-1
print(bool(c is d))
输出:True
e = -5 + 1
f = -4
print(bool(e is f))
输出:True
g = -5 - 1
h = -6
print(bool(g is h))
输出:False
x = float('nan')
print(bool(x is x))
print(bool(x == x))
输出:
True
False
上边我们四段代码,我们可以想象出python的内存管理,缓存了-5——256的对象。 最后一段,因为float(‘nan’)的类型就是nan,“==”代表值相同,而nan并不是一个值nan和nan的比较关系只能是nan != nan,就如同我们说,负无穷不可能等于负无穷一样。
4. lambda在闭包中会保存局部变量 代码如下:
myList = [lambda : i for i in range(5)]
for j in myList:
print(j())
输出:
4
4
4
4
4
原因是当赋值给myList,lambda表达式就执行了循环,直到 i =4结束,i被保留。
5.列表取值超出索引数 我们可以这样写一段代码:
myList = [1, 2, 3, 4, 5]
print(myList[5])
结果抛出异常:
IndexError: list index out of range
但如果我们这样写:
myList = [1, 2, 3, 4, 5]
print(myList[5 : ])
输出:
[]
6. 缩进的问题见仁见智。
如果考虑“在网络上传播代码片段”这个问题,强制的换行和缩进可能是一个障碍。
换句话说,python代码无法像Lua、JS那样压缩到一行,在复制粘贴、分享给别人时可能会很麻烦。