• python诡异特性


    http://azaleasays.com/2010/01/29/weird-python-features/

    在Strangest language feature这篇讨论里看到的,原文让人大开眼界啊!
    
    这里抄几个Python的:
    
    >>> def f():
    ...     try:
    ...         return True
    ...     finally:
    ...         return False
    ...
    >>> f()
    你说结果是啥呢?
    
    答案是False!原文的解释是:finally always wins..
    
    >>> (10 > 5 > 1)
    True
    >>> ((10 > 5) > 1)
    False
    这个是因为Python允许连续的比较运算,所以 10>5>1 相当于 10>5 and 5>1,于是True。
    
    而 (10>5) > 1 要先运算10>5,结果是True,True被转换成1进行比较,1>1,于是False。
    
    在Python 2.x 里:
    
    >>> True = False
    >>> True
    False
    把False赋值给True,True的值就变成了False = =! 在Python 3.x 里就不能这样做了。
    
    >>> a = "foo" "bar"
    >>> a
    'foobar'
    在Ruby, C里ms也是这样。虽然我不知道这个特性有啥用处。
    
    >>> a[0] = "hello"
    NameError: name 'a' is not defined
    >>> a[0:] = "hello"
    NameError: name 'a' is not defined
    >>> a = []
    >>> a[0] = "hello"
    IndexError: list assignment index out of range
    >>> a[0:] = "hello"
    >>> a
    ['h', 'e', 'l', 'l', 'o']
    上面把 a[0:] 改成 a[:] 或 a[42:] 或 a[:33] 同样work!
    
    今天自己遇到的:
    
    >>> a=[0]*10
    >>> a
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    >>> a[3:5] += [2]*2
    >>> a
    [0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0]
    >>> a[3:5] += [3]*2
    >>> a
    [0, 0, 0, 0, 0, 3, 3, 2, 2, 0, 0, 0, 0, 0]
    我没想到是这个结果,+= 相当于做了insert的事情,而不是改变list原位置elements的值
    
    一个workarround是用numpy,把a变成array:
    
    >>> import numpy
    >>> a=numpy.zeros(10)
    >>> a
    array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])
    >>> a[3:5] += [2]*2
    >>> a
    array([ 0.,  0.,  0.,  2.,  2.,  0.,  0.,  0.,  0.,  0.])
    >>> a[3:5] += [3]*2
    >>> a
    array([ 0.,  0.,  0.,  5.,  5.,  0.,  0.,  0.,  0.,  0.])
    大家知道有啥更好的方法么?
    
    又遇到一个:
    
    >>> L = [0]*10
    >>> L
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    >>> L[0] += 1
    >>> L
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    
    >>> L = [[]]*10
    >>> L
    [[], [], [], [], [], [], [], [], [], []]
    >>> L[0].append(1)
    >>> L
    [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
    解决方法:
    
    >>> L = []
    >>> for i in range(10):
    ...     L.append([])
    ...
    >>> L
    [[], [], [], [], [], [], [], [], [], []]
    >>> L[0].append(1)
    >>> L
    [[1], [], [], [], [], [], [], [], [], []]
    此文对此有详细讨论
    
    Oct 7, 2010添加:
    
    >>> -75/2+4 -34 >>> 4-75/2 -33
    
    解释:在-75/2+4里,Python把 -75看成个整体,然后除以2,得到-38 (向下取整)
    
    而在4-75/2里,Python先算75/2得到37,再用4-37=-33
    
    
  • 相关阅读:
    论文研读
    论文研读
    2019春 软件工程实践 助教总结
    第十三次作业成绩汇总
    第九次作业成绩汇总
    第十七周助教工作总结
    Docker 学习笔记(四):Bug 日志与其他零散知识
    bash 和 powershell 常用命令集锦
    Kubernetes 学习笔记(二):本地部署一个 kubernetes 集群
    Kubernetes 学习笔记(一):基础概念
  • 原文地址:https://www.cnblogs.com/amize/p/15166935.html
Copyright © 2020-2023  润新知