Python中有趣的特性

  • 2019 年 10 月 6 日
  • 筆記

以下實例均來自wtfpython。這裡寫了前幾個例子,讓你了解具體寫的是什麼。閱讀原版:後台回復 wtfpython 即可。

奇妙的字元串

# 1、  In [1]: a = "some_string"  In [2]: id(a)  Out[2]: 1741734895024  In [3]: id("some"+"_"+"string")  Out[3]: 1741734895024  # id是相同的  # 2、  In [4]: a = "wtf"  In [5]: b = "wtf"  In [6]: a is b  Out[6]: True  In [7]: a = "wtf!"  In [8]: b = "wtf!"  In [9]: a is b  Out[9]: False  '''  這裡涉及到python 的字元串駐留機制(為了節省記憶體)。  python的字元串駐留機制,並不是對所有的數字,字元串,他只對「  [0-9] [a-z] [A-Z]和"_"(下劃線)  」有效,  當字元串中由其他字元比如「!@ # ¥ % -」時字元駐留機制是不起作用的。  我們都知道is比較的是對象,而==比較的是值,當字元串中含有!@ # ¥ % -」的是否,字元駐留機制不起作用,此時就會是  兩個不同的引用。就會看到如上效果。  '''  # 3、  In [10]: 'a' * 20 is 'aaaaaaaaaaaaaaaaaaaa'  Out[10]: True  In [11]: 'a' * 21 is 'aaaaaaaaaaaaaaaaaaaaa'  Out[11]: False  '''  出現這樣的現象是因為常量摺疊,是編譯器的優化,當長度小於20,會被替換成'aaaaaaaaaaaaaaaaaaaa',  來減少運行的周期,只有長度小於20才會發生常量摺疊。  '''  # 4、  In [12]: some_dict = {}  In [13]: some_dict[6] = "Java"  In [14]: some_dict[5.0] = "Python"  In [15]: some_dict[5] = "C#"  In [16]: some_dict[6]  Out[16]: 'Java'  In [17]: some_dict[5.0]  Out[17]: 'C#'  In [18]: some_dict[5]  Out[18]: 'C#'  In [19]: some_dict  Out[19]: {6: 'Java', 5.0: 'C#'}  '''  可以看到some_dict[5.0]被some_dict[5]覆蓋掉了,在python字典中是通過比較鍵值是否相同和比較哈希值是否相等  來確定key是否相同。  由於  In [20]: 5 == 5.0  Out[20]: True  In [21]: hash(5) == hash(5.0)  Out[21]: True  所以前者就會被後者替換。  '''

返回值

In [22]: def some_func():      ...:     try:      ...:         return "from_try"      ...:     finally:      ...:         return "from_finally"  In [23]: some_func()  Out[23]: 'from_finally'  # 返回的是finally中的值。

評估時間的差異

# 1、  In [33]: array = [1,2,3]  In [34]: g = (x for x in array if array.count(x) > 0)  In [35]: array = [1,5,6]  In [36]: list(g)  Out[36]: [1]  '''  原因:in語句是在聲明的時候執行,而if語句是運行時執行。  也就是說in後面的array是[1,2,3]而if後的array是[1,5,6]  '''  # 2、賦值方式帶來的不同  In [37]: array_1 = [1,2,3]  In [38]: g1 = (x for x in array_1)  In [39]: array_1 = [1,2,3,4]  In [40]: list(g1)  Out[40]: [1, 2, 3]  In [41]: array_2 = [1,2,3]  In [42]: g2 = (x for x in array_2)  In [43]: array_2[:] = [1,2,3,4]  In [44]: list(g2)  Out[44]: [1, 2, 3, 4]  '''  切片操作更新了array_2的值,所以有所不同。  '''