zoukankan      html  css  js  c++  java
  • Python 中 3 个不可思议的返回

    第一个:神奇的字典键

    some_dict = {}
    some_dict[5.5] = "Ruby"
    some_dict[5.0] = "JavaScript"
    some_dict[5] = "Python"

    很多人学习python,不知道从何学起。

    很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。

    很多已经做案例的人,却不知道如何去学习更加高深的知识。

    那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!

    QQ群:1097524789

    Output:

    >>> some_dict[5.5]
    "Ruby"
    >>> some_dict[5.0]
    "Python"
    >>> some_dict[5]
    "Python"

    "Python" 消除了 "JavaScript" 的存在?

    说明:

    • Python 字典通过检查键值是否相等和比较哈希值来确定两个键是否相同.

    • 具有相同值的不可变对象在Python中始终具有相同的哈希值.

    注意: 具有不同值的对象也可能具有相同的哈希值(哈希冲突).

    >>> 5 == 5.0
    True
    >>> hash(5) == hash(5.0)
    True
    • 当执行 some_dict[5] = "Python" 语句时, 因为Python将 5 和 5.0 识别为 some_dict 的同一个键, 所以已有值 "JavaScript" 就被 "Python" 覆盖了.

    • 这个 StackOverflow的 回答(https://stackoverflow.com/a/32211042/4354153) 漂亮的解释了这背后的基本原理.

    第二个:异常处理中的return

    def some_func():
        try:
            return  from_try
        finally:
            return  from_finally

    Output:

    >>> some_func()
     from_finally

     说明:

    • 当在 "try...finally" 语句的 try 中执行 returnbreak 或 continue 后, finally 子句依然会执行.

    • 函数的返回值由最后执行的 return 语句决定. 由于 finally 子句一定会执行, 所以 finally 子句中的 return 将始终是最后执行的语句.

    第三个:相同对象的判断

    class WTF:
      pass

    Output:

    >>> WTF() == WTF() # 两个不同的对象应该不相等
    False
    >>> WTF() is WTF() # 也不相同
    False
    >>> hash(WTF()) == hash(WTF()) # 哈希值也应该不同
    True
    >>> id(WTF()) == id(WTF())
    True

    说明:

    • 当调用 id 函数时, Python 创建了一个 WTF 类的对象并传给 id 函数. 然后 id 函数获取其id值 (也就是内存地址), 然后丢弃该对象. 该对象就被销毁了.

    • 当我们连续两次进行这个操作时, Python会将相同的内存地址分配给第二个对象. 因为 (在CPython中) id 函数使用对象的内存地址作为对象的id值, 所以两个对象的id值是相同的.

    • 综上, 对象的id值仅仅在对象的生命周期内唯一. 在对象被销毁之后, 或被创建之前, 其他对象可以具有相同的id值.

    • 那为什么 is 操作的结果为 False 呢? 让我们看看这段代码.

    class WTF(object):
      def __init__(self): print("I")
      def __del__(self): print("D")

        Output:

    >>> WTF() is WTF()
    I
    I
    D
    D
    False
    >>> id(WTF()) == id(WTF())
    I
    D
    I
    D
    True

    正如你所看到的, 对象销毁的顺序是造成所有不同之处的原因.

    第一个:神奇的字典键

    some_dict = {}
    some_dict[5.5] = "Ruby"
    some_dict[5.0] = "JavaScript"
    some_dict[5] = "Python"

    Output:

    >>> some_dict[5.5]
    "Ruby"
    >>> some_dict[5.0]
    "Python"
    >>> some_dict[5]
    "Python"

     

    "Python" 消除了 "JavaScript" 的存在?

    说明:

    • Python 字典通过检查键值是否相等和比较哈希值来确定两个键是否相同.

    • 具有相同值的不可变对象在Python中始终具有相同的哈希值.

       

    注意: 具有不同值的对象也可能具有相同的哈希值(哈希冲突).

     

    >>> 5 == 5.0
    True
    >>> hash(5) == hash(5.0)
    True

     

    • 当执行 some_dict[5] = "Python" 语句时, 因为Python将 5 和 5.0 识别为 some_dict 的同一个键, 所以已有值 "JavaScript" 就被 "Python" 覆盖了.

    • 这个 StackOverflow的 回答(https://stackoverflow.com/a/32211042/4354153) 漂亮的解释了这背后的基本原理.

     

    第二个:异常处理中的return

    def some_func():
    try:
    return from_try
    finally:
    return from_finally

    Output:

    >>> some_func()
    from_finally

     

     说明:

    • 当在 "try...finally" 语句的 try 中执行 returnbreak 或 continue 后, finally 子句依然会执行.

    • 函数的返回值由最后执行的 return 语句决定. 由于 finally 子句一定会执行, 所以 finally 子句中的 return 将始终是最后执行的语句.

     

    第三个:相同对象的判断

    class WTF:
    pass

    Output:

    >>> WTF() == WTF() # 两个不同的对象应该不相等
    False
    >>> WTF() is WTF() # 也不相同
    False
    >>> hash(WTF()) == hash(WTF()) # 哈希值也应该不同
    True
    >>> id(WTF()) == id(WTF())
    True

    说明:

    • 当调用 id 函数时, Python 创建了一个 WTF 类的对象并传给 id 函数. 然后 id 函数获取其id值 (也就是内存地址), 然后丢弃该对象. 该对象就被销毁了.

    • 当我们连续两次进行这个操作时, Python会将相同的内存地址分配给第二个对象. 因为 (在CPython中) id 函数使用对象的内存地址作为对象的id值, 所以两个对象的id值是相同的.

    • 综上, 对象的id值仅仅在对象的生命周期内唯一. 在对象被销毁之后, 或被创建之前, 其他对象可以具有相同的id值.

    • 那为什么 is 操作的结果为 False 呢? 让我们看看这段代码.

    class WTF(object):
    def __init__(self): print("I")
    def __del__(self): print("D")

        Output:

    >>> WTF() is WTF()
    I
    I
    D
    D
    False
    >>> id(WTF()) == id(WTF())
    I
    D
    I
    D
    True

    正如你所看到的, 对象销毁的顺序是造成所有不同之处的原因.

  • 相关阅读:
    2020系统综合实践 第6次实践作业
    2020系统综合实践 第5次实践作业
    2020系统综合实践 第4次实践作业
    2020系统综合实践 第3次实践作业
    2020系统综合实践 第2次实践作业
    2020系统综合实践 第1次实践作业
    2019 SDN大作业
    2019 SDN上机第7次作业
    软工实践个人总结
    第03组 Beta冲刺(5/5)
  • 原文地址:https://www.cnblogs.com/shann001/p/13066325.html
Copyright © 2011-2022 走看看