零.注意的细节
# Author:Zhang Yuan#Python中的字符串不能被修改,它們是 immutable 的#python中固定的不可變的對象內存地址是一樣的
a=3
b=3
print(a is b,a==b,id(a),id(b)) #True True 140716530557648 140716530557648
c=(3,)
d=(3,)
print(c is d,c==d,id(c),id(d)) #True True 2623132500824 2623132500824
class A:pass
e=A()
f=A()
print(e is f,e==f,id(e),id(f)) #False False 2623134376288 2623134314392#PS:列表List與List[:]值相同,但不是一個對象
words = ['cat', 'window', 'defenestrate']
print(words == words[:],words is words[:]) #True False#迭代器在內存中結束后,則不能迭代了。
a=range(10)
b=iter(a)
for i in b:print(i,end=",") #
#第二次再次訪問則沒有結果,因為b為迭代器.兩次都換成a則可以。a直接寫入了內存,b在內存中迭代
for j in b:print(j,end=",")
print("OK")
#0,1,2,3,4,5,6,7,8,9,OK#列表作為棧使用效率好(后進先出“last-in,first-out”)。
#PS:列表作為隊列使用(“先進先出”),單純使用效率低。若要實現一個隊列, collections.deque 被設計用于快速地從兩端操作,它類似于列表,但從左端添加和彈出的速度較快,而在中間查找的速度較慢。
from collections import deque
queue=deque([1,2,"a","b","c"]) #雙隊列
queue.append("Terry") #右端添加
print(queue.popleft()) #最端出#嵌套的列表推導式,一層層表述
matrix=[[i+4*j for i in range(4)] for j in range(3)]
print(matrix) #[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
matrix2=[[row[i] for row in matrix] for i in range(4)]
print(matrix2) #[[0, 4, 8], [1, 5, 9], [2, 6, 10], [3, 7, 11]]
#注意下面的區別:單獨的列表,相當于各成員與空內容zip成元組
print(list(zip(matrix))) #[([0, 1, 2, 3],), ([4, 5, 6, 7],), ([8, 9, 10, 11],)]
#注意下面的區別:加*讓列表的各個部分獨立開來,然后再zip成元組
print(list(zip(*matrix))) #[(0, 4, 8), (1, 5, 9), (2, 6, 10), (3, 7, 11)]#花括號或 set() 函數可以用來創建集合。注意:要創建一個空集合你只能用 set() 而不能用 {},因為后者是創建一個空字典
#類似于 列表推導式,集合也支持推導式形式
a = {x for x in 'abracadabra' if x not in 'abc'} #{'r', 'd'}#字典推導式可以從任意的鍵值表達式中創建字典
d={x: x ** 2 for x in (2, 4, 6)} #{2: 4, 4: 16, 6: 36}
#字典一個Key只能對應一個值,所以下面的4會被5覆蓋
D={a:b for a in "ABCDEF" for b in (4,5)} #{'A': 5, 'B': 5, 'C': 5, 'D': 5, 'E': 5, 'F': 5}#循環的技巧
#當在字典中循環時,用 items() 方法可將關鍵字和對應的值同時取出
#當在序列中循環時,用 enumerate() 函數可以將索引位置和其對應的值同時取出
#當同時在兩個或更多序列中循環時,可以用 zip() 函數將其內元素一一匹配。
#有時可能會想在循環時修改列表內容,一般來說改為創建一個新列表是比較簡單且安全的#布爾運算符 and 和 or 也被稱為 短路 運算符:它們的參數從左至右解析,一旦可以確定結果解析就會停止。#序列對象可以與相同類型的其他對象比較。它們使用 字典順序 進行比較:首先比較兩個序列的第一個元素,再比較每個序列的第二個元素,以此類推.
#字典順序對字符串來說,是使用單字符的 Unicode 碼的順序
print( (1, 2, ('aa', 'ab')) < (1, 2, ('abc', 'a'), 4) ) #True#必須要有 __init__.py 文件才能讓 Python 將包含該文件的目錄當作包。
#在 __init__.py 文件設置 __all__=["..."],遇到 from package import * 時會自動導入的模塊名列表,若沒有這句則不自動導入。#請注意,相對導入可以導入中涉及的兄弟模塊和父包。
#如果有下面語句,作為模塊導入其他,正常運行。由于主模塊的名稱總是 "__main__",作為主模塊會運行錯誤,因此用作Python應用程序主模塊的模塊必須始終使用絕對導入。
# from .import module_test1,module_test2#設計到需要加載句柄,關閉句柄的操作,多用with關鍵字。#異常執行:try執行,except發生異常時執行,else沒有異常時執行,finally在所有情況執行。
#raise拋出異常#global 語句可以用來指明某個特定的變量位于全局作用域并且應該在那里重新綁定; nonlocal 語句表示否定當前命名空間的作用域,尋找父函數的作用域并綁定對象。#Python3的多重繼承中,繼承的類有共同的基類:按照廣度優先、從左到右尋找父類和兄弟類。繼承的類沒有共同基類:按照深度優先、從左到右尋找不同的父類#Python中的類或類實例,可以自定義添加變量。不同于C++類的嚴格封裝作用。#Python的類可以迭代器化:__iter__(),__next__()讓類迭代器化
#for語句中底層會自動調用容器對象中的 iter(),產生迭代器,所以會有for循環。
#用yield寫生成器使得語法更為緊湊,因為它會自動創建 __iter__() 和 __next__() 方法。
#生成器表達式語法類似列表推導式,將外層為圓括號而非方括號。這種表達式返回生成器,且可以直接被外部函數直接使用(重疊的括號可以省略)。
print( sum(i*i for i in range(10)) )#大多數在浮點數方面都無法精確計算,因為部分小數無法用二進制精確表示
#如果要做數值相等判斷時要注意,可能不能絕對精確
print((0.1+0.1+0.1)==0.3) #False
from decimal import *
print((Decimal("0.1")+Decimal("0.1")+Decimal("0.1"))==Decimal("0.3")) #True
#round的四舍五入不準確,因為部分小數無法用二進制精確表示
#要準確需要自己寫函數判定
print(round(2.675,2)) #2.67 wrong
print(round(2.685,2)) #2.69
#decimal 模塊提供了一種 Decimal 數據類型用于十進制浮點運算
from decimal import *
print(round(Decimal('0.70') * Decimal('1.05'), 2)) #0.74
print(round(0.70 * 1.05, 2)) #0.73
#精確表示特性使得 Decimal 類能夠執行對于二進制浮點數來說不適用的模運算和相等性檢測
print(Decimal('1.00') % Decimal('.10')) #0.00
print(1.00 % 0.10) #0.09999999999999995
print(sum([Decimal('0.1')]*10) == Decimal('1.0')) #True
print(sum([0.1]*10) == 1.0) #False#Python3中下面定義為False:
# ?被定義為假值的常量: None 和 False。
# ?任何數值類型的零: 0, 0.0, 0j, Decimal(0), Fraction(0, 1)
# ?空的序列和多項集: '', (), [], {}, set(), range(0)#Python3中,讓代碼可控制的執行,可以把代碼字符串化。然后用exec()、eval()、compile()控制執行。#Python3類的進化:
#類方法:@classmethod 把一個方法裝飾成類方法。可以實現類中函數的直接調用。必須有隱式參數cls
#靜態方法:@staticmethod 把一個方法裝飾成靜態方法。也可以實現類中函數的直接調用。不需要隱式參數。與@classmethod不同處有,cls在繼承時指向類會變化。
#類迭代器化:__iter__(),__next__()讓類迭代器化
#函數方法屬性化:property與@property 讓類中設置的函數方法屬性化(變量化),讓實例可以直接以變量的形式操作。
#類的構造函數:__init__(self);析構函數:__del__(self)
#類的實例序列化:__init__(self)這個方法通常要設置字典為數據類型;__setitem__(self, key, value): 讓實例可直接設置:A[key]=...;__getitem__(self, item): 讓實例可直接訪問:A[item];__delitem__(self, key): 讓實例可直接運行del A[key];__len__(self): 讓實例可直接運行len(A)
?
轉載于:https://www.cnblogs.com/i201102053/p/10763829.html
總結
- 上一篇: Dividing the numbers
- 下一篇: [hackerrank]Manasa a