python语法混乱_Python 有哪些糟糕的语法?

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那样压缩到一行,在复制粘贴、分享给别人时可能会很麻烦。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值