非原創,系轉載。 ...
非原創,系轉載。
1 # _*_ coding: utf-8 _*_ 2 3 """類型和運算----類型和運算----類型和運算----類型和運算----類型和運算----類型和運算----類型和運算----類型和運算----類型和運算----類型和運算----類型和運算""" 4 5 # -- 尋求幫助: 6 dir(obj) # 簡單的列出對象obj所包含的方法名稱,返回一個字元串列表 7 help(obj.func) # 查詢obj.func的具體介紹和用法 8 9 # -- 測試類型的三種方法,推薦第三種 10 if type(L) == type([]): 11 print("L is list") 12 if type(L) == list: 13 print("L is list") 14 if isinstance(L, list): 15 print("L is list") 16 17 # -- Python數據類型:哈希類型、不可哈希類型 18 # 哈希類型,即在原地不能改變的變數類型,不可變類型。可利用hash函數查看其hash值,也可以作為字典的key 19 "數字類型:int, float, decimal.Decimal, fractions.Fraction, complex" 20 "字元串類型:str, bytes" 21 "元組:tuple" 22 "凍結集合:frozenset" 23 "布爾類型:True, False" 24 "None" 25 # 不可hash類型:原地可變類型:list、dict和set。它們不可以作為字典的key。 26 27 # -- 數字常量 28 1234, -1234, 0, 999999999 # 整數 29 1.23, 1., 3.14e-10, 4E210, 4.0e+210 # 浮點數 30 0o177, 0x9ff, 0X9FF, 0b101010 # 八進位、十六進位、二進位數字 31 3 + 4j, 3.0 + 4.0j, 3J # 複數常量,也可以用complex(real, image)來創建 32 hex(I), oct(I), bin(I) # 將十進位數轉化為十六進位、八進位、二進位表示的“字元串” 33 int(string, base) # 將字元串轉化為整數,base為進位數 34 # 2.x中,有兩種整數類型:一般整數(32位)和長整數(無窮精度)。可以用l或L結尾,迫使一般整數成為長整數 35 float('inf'), float('-inf'), float('nan') # 無窮大, 無窮小, 非數 36 37 # -- 數字的表達式操作符 38 yield x # 生成器函數發送協議 39 lambda args: expression # 生成匿名函數 40 x if y else z # 三元選擇表達式 41 x and y, x or y, not x # 邏輯與、邏輯或、邏輯非 42 x in y, x not in y # 成員對象測試 43 x is y, x is not y # 對象實體測試 44 x < y, x <= y, x > y, x >= y, x == y, x != y # 大小比較,集合子集或超集值相等性操作符 45 1 < a < 3 # Python中允許連續比較 46 x | y, x & y, x ^ y # 位或、位與、位異或 47 x << y, x >> y # 位操作:x左移、右移y位 48 +, -, *, /, //, %, ** # 真除法、floor除法:返回不大於真除法結果的整數值、取餘、冪運算 49 -x, +x, ~x # 一元減法、識別、按位求補(取反) 50 x[i], x[i:j:k] # 索引、分片、調用 51 int(3.14), float(3) # 強制類型轉換 52 53 # -- 整數可以利用bit_length函數測試所占的位數 54 a = 1; 55 a.bit_length() # 1 56 a = 1024; 57 a.bit_length() # 11 58 59 # -- repr和str顯示格式的區別 60 """ 61 repr格式:預設的交互模式回顯,產生的結果看起來它們就像是代碼。 62 str格式:列印語句,轉化成一種對用戶更加友好的格式。 63 """ 64 65 # -- 數字相關的模塊 66 # math模塊 67 # Decimal模塊:小數模塊 68 import decimal 69 from decimal import Decimal 70 71 Decimal("0.01") + Decimal("0.02") # 返回Decimal("0.03") 72 decimal.getcontext().prec = 4 # 設置全局精度為4 即小數點後邊4位 73 # Fraction模塊:分數模塊 74 from fractions import Fraction 75 76 x = Fraction(4, 6) # 分數類型 4/6 77 x = Fraction("0.25") # 分數類型 1/4 接收字元串類型的參數 78 79 # -- 集合set 80 """ 81 set是一個無序不重覆元素集, 基本功能包括關係測試和消除重覆元素。 82 set支持union(聯合), intersection(交), difference(差)和symmetric difference(對稱差集)等數學運算。 83 set支持x in set, len(set), for x in set。 84 set不記錄元素位置或者插入點, 因此不支持indexing, slicing, 或其它類序列的操作 85 """ 86 s = set([3, 5, 9, 10]) # 創建一個數值集合,返回{3, 5, 9, 10} 87 t = set("Hello") # 創建一個唯一字元的集合返回{} 88 a = t | s; 89 t.union(s) # t 和 s的並集 90 b = t & s; 91 t.intersection(s) # t 和 s的交集 92 c = t – s; 93 t.difference(s) # 求差集(項在t中, 但不在s中) 94 d = t ^ s; 95 t.symmetric_difference(s) # 對稱差集(項在t或s中, 但不會同時出現在二者中) 96 t.add('x'); 97 t.remove('H') # 增加/刪除一個item 98 s.update([10, 37, 42]) # 利用[......]更新s集合 99 x in s, x not in s # 集合中是否存在某個值 100 s.issubset(t); 101 s <= t # 測試是否 s 中的每一個元素都在 t 中 102 s.issuperset(t); 103 s >= t # 測試是否 t 中的每一個元素都在 s 中 104 s.copy(); 105 s.discard(x); # 刪除s中x 106 s.clear() # 清空s 107 {x ** 2 for x in [1, 2, 3, 4]} # 集合解析,結果:{16, 1, 4, 9} 108 {x for x in 'spam'} # 集合解析,結果:{'a', 'p', 's', 'm'} 109 110 # -- 集合frozenset,不可變對象 111 """ 112 set是可變對象,即不存在hash值,不能作為字典的鍵值。同樣的還有list等(tuple是可以作為字典key的) 113 frozenset是不可變對象,即存在hash值,可作為字典的鍵值 114 frozenset對象沒有add、remove等方法,但有union/intersection/difference等方法 115 """ 116 a = set([1, 2, 3]) 117 b = set() 118 b.add(a) # error: set是不可哈希類型 119 b.add(frozenset(a)) # ok,將set變為frozenset,可哈希 120 121 # -- 布爾類型bool 122 type(True) # 返回<class 'bool'> 123 isinstance(False, int) # bool類型屬於整型,所以返回True 124 True == 1; 125 True is 1 # 輸出(True, False) 126 127 # -- 動態類型簡介 128 """ 129 變數名通過引用,指向對象。 130 Python中的“類型”屬於對象,而不是變數,每個對象都包含有頭部信息,比如"類型標示符" "引用計數器"等 131 """ 132 # 共用引用及在原處修改:對於可變對象,要註意儘量不要共用引用! 133 # 共用引用和相等測試: 134 L = [1], M = [1], L is M # 返回False 135 L = M = [1, 2, 3], L is M # 返回True,共用引用 136 # 增強賦值和共用引用:普通+號會生成新的對象,而增強賦值+=會在原處修改 137 L = M = [1, 2] 138 L = L + [3, 4] # L = [1, 2, 3, 4], M = [1, 2] 139 L += [3, 4] # L = [1, 2, 3, 4], M = [1, 2, 3, 4] 140 141 # -- 常見字元串常量和表達式 142 S = '' # 空字元串 143 S = "spam’s" # 雙引號和單引號相同 144 S = "s\np\ta\x00m" # 轉義字元 145 S = """spam""" # 三重引號字元串,一般用於函數說明 146 S = r'\temp' # Raw字元串,不會進行轉義,抑制轉義 147 S = b'Spam' # Python3中的位元組字元串 148 S = u'spam' # Python2.6中的Unicode字元串 149 s1 + s2, s1 * 3, s[i], s[i:j], len(s) # 字元串操作 150 'a %s parrot' % 'kind' # 字元串格式化表達式 151 'a {1} {0} parrot'.format('kind', 'red') # 字元串格式化方法 152 for x in s: print(x) # 字元串迭代,成員關係 153 [x * 2 for x in s] # 字元串列表解析 154 ','.join(['a', 'b', 'c']) # 字元串輸出,結果:a,b,c 155 156 # -- 內置str處理函數: 157 str1 = "stringobject" 158 str1.upper(); 159 str1.lower(); 160 str1.swapcase(); 161 str1.capitalize(); 162 str1.title() # 全部大寫,全部小寫、大小寫轉換,首字母大寫,每個單詞的首字母都大寫 163 str1.ljust(width) # 獲取固定長度,左對齊,右邊不夠用空格補齊 164 str1.rjust(width) # 獲取固定長度,右對齊,左邊不夠用空格補齊 165 str1.center(width) # 獲取固定長度,中間對齊,兩邊不夠用空格補齊 166 str1.zfill(width) # 獲取固定長度,右對齊,左邊不足用0補齊 167 str1.find('t', start, end) # 查找字元串,可以指定起始及結束位置搜索 168 str1.rfind('t') # 從右邊開始查找字元串 169 str1.count('t') # 查找字元串出現的次數 170 # 上面所有方法都可用index代替,不同的是使用index查找不到會拋異常,而find返回-1 171 str1.replace('old', 'new') # 替換函數,替換old為new,參數中可以指定maxReplaceTimes,即替換指定次數的old為new 172 str1.strip(); # 預設刪除空白符 173 str1.strip('d'); # 刪除str1字元串中開頭、結尾處,位於 d 刪除序列的字元 174 str1.lstrip(); 175 str1.lstrip('d'); # 刪除str1字元串中開頭處,位於 d 刪除序列的字元 176 str1.rstrip(); 177 str1.rstrip('d') # 刪除str1字元串中結尾處,位於 d 刪除序列的字元 178 str1.startswith('start') # 是否以start開頭 179 str1.endswith('end') # 是否以end結尾 180 str1.isalnum(); 181 str1.isalpha(); 182 str1.isdigit(); 183 str1.islower(); 184 str1.isupper() # 判斷字元串是否全為字元、數字、小寫、大寫 185 186 # -- 三重引號編寫多行字元串塊,並且在代碼折行處嵌入換行字元\n 187 mantra = """hello world 188 hello python 189 hello my friend""" 190 # mantra為"""hello world \n hello python \n hello my friend""" 191 192 # -- 索引和分片: 193 S[0], S[len(S)–1], S[-1] # 索引 194 S[1:3], S[1:], S[:-1], S[1:10:2] # 分片,第三個參數指定步長,如`S[1:10:2]`是從1位到10位沒隔2位獲取一個字元。 195 196 # -- 字元串轉換工具: 197 int('42'), str(42) # 返回(42, '42') 198 float('4.13'), str(4.13) # 返回(4.13, '4.13') 199 ord('s'), chr(115) # 返回(115, 's') 200 int('1001', 2) # 將字元串作為二進位數字,轉化為數字,返回9 201 bin(13), oct(13), hex(13) # 將整數轉化為二進位/八進位/十六進位字元串,返回('0b1101', '015', '0xd') 202 203 # -- 另類字元串連接 204 name = "wang" "hong" # 單行,name = "wanghong" 205 name = "wang" \ 206 "hong" # 多行,name = "wanghong" 207 208 # -- Python中的字元串格式化實現1--字元串格式化表達式 209 """ 210 基於C語言的'print'模型,並且在大多數的現有的語言中使用。 211 通用結構:%[(name)][flag][width].[precision]typecode 212 """ 213 "this is %d %s bird" % (1, 'dead') # 一般的格式化表達式 214 "%s---%s---%s" % (42, 3.14, [1, 2, 3]) # 字元串輸出:'42---3.14---[1, 2, 3]' 215 "%d...%6d...%-6d...%06d" % (1234, 1234, 1234, 1234) # 對齊方式及填充:"1234... 1234...1234 ...001234" 216 x = 1.23456789 217 "%e | %f | %g" % (x, x, x) # 對齊方式:"1.234568e+00 | 1.234568 | 1.23457" 218 "%6.2f*%-6.2f*%06.2f*%+6.2f" % (x, x, x, x) # 對齊方式:' 1.23*1.23 *001.23* +1.23' 219 "%(name1)d---%(name2)s" % {"name1": 23, "name2": "value2"} # 基於字典的格式化表達式 220 "%(name)s is %(age)d" % vars() # vars()函數調用返回一個字典,包含了所有本函數調用時存在的變數 221 222 # -- Python中的字元串格式化實現2--字元串格式化調用方法 223 # 普通調用 224 "{0}, {1} and {2}".format('spam', 'ham', 'eggs') # 基於位置的調用 225 "{motto} and {pork}".format(motto='spam', pork='ham') # 基於Key的調用 226 "{motto} and {0}".format('ham', motto='spam') # 混合調用 227 # 添加鍵 屬性 偏移量 (import sys) 228 "my {1[spam]} runs {0.platform}".format(sys, {'spam': 'laptop'}) # 基於位置的鍵和屬性 229 "{config[spam]} {sys.platform}".format(sys=sys, config={'spam': 'laptop'}) # 基於Key的鍵和屬性 230 "first = {0[0]}, second = {0[1]}".format(['A', 'B', 'C']) # 基於位置的偏移量 231 # 具體格式化 232 "{0:e}, {1:.3e}, {2:g}".format(3.14159, 3.14159, 3.14159) # 輸出'3.141590e+00, 3.142e+00, 3.14159' 233 "{fieldname:format_spec}".format(......) 234 # 說明: 235 """ 236 fieldname是指定參數的一個數字或關鍵字, 後邊可跟可選的".name"或"[index]"成分引用 237 format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type] 238 fill ::= <any character> #填充字元 239 align ::= "<" | ">" | "=" | "^" #對齊方式 240 sign ::= "+" | "-" | " " #符號說明 241 width ::= integer #字元串寬度 242 precision ::= integer #浮點數精度 243 type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%" 244 """ 245 # 例子: 246 '={0:10} = {1:10}'.format('spam', 123.456) # 輸出'=spam = 123.456' 247 '={0:>10}='.format('test') # 輸出'= test=' 248 '={0:<10}='.format('test') # 輸出'=test =' 249 '={0:^10}='.format('test') # 輸出'= test =' 250 '{0:X}, {1:o}, {2:b}'.format(255, 255, 255) # 輸出'FF, 377, 11111111' 251 'My name is {0:{1}}.'.format('Fred', 8) # 輸出'My name is Fred .' 動態指定參數 252 253 # -- 常用列表常量和操作 254 L = [[1, 2], 'string', {}] # 嵌套列表 255 L = list('spam') # 列表初始化 256 L = list(range(0, 4)) # 列表初始化 257 list(map(ord, 'spam')) # 列表解析 258 len(L) # 求列表長度 259 L.count(value) # 求列表中某個值的個數 260 L.append(obj) # 向列表的尾部添加數據,比如append(2),添加元素2 261 L.insert(index, obj) # 向列表的指定index位置添加數據,index及其之後的數據後移 262 L.extend(interable) # 通過添加iterable中的元素來擴展列表,比如extend([2]),添加元素2,註意和append的區別 263 L.index(value, [start, [stop]]) # 返回列表中值value的第一個索引 264 L.pop([index]) # 刪除並返回index處的元素,預設為刪除並返回最後一個元素 265 L.remove(value) # 刪除列表中的value值,只刪除第一次出現的value的值 266 L.reverse() # 反轉列表 267 L.sort(cmp=None, key=None, reverse=False) # 排序列表 268 a = [1, 2, 3], b = a[10:] # 註意,這裡不會引發IndexError異常,只會返回一個空的列表[] 269 a = [], a += [1] # 這裡實在原有列表的基礎上進行操作,即列表的id沒有改變 270 a = [], a = a + [1] # 這裡最後的a要構建一個新的列表,即a的id發生了變化 271 272 # -- 用切片來刪除序列的某一段 273 a = [1, 2, 3, 4, 5, 6, 7] 274 a[1:4] = [] # a = [1, 5, 6, 7] 275 a = [0, 1, 2, 3, 4, 5, 6, 7] 276 del a[::2] # 去除偶數項(偶數索引的),a = [1, 3, 5, 7] 277 278 # -- 常用字典常量和操作 279 D = {} 280 D = {'spam': 2, 'tol': {'ham': 1}} # 嵌套字典 281 D = dict.fromkeys(['s', 'd'], 8) # {'s': 8, 'd': 8} 282 D = dict(name='tom', age=12) # {'age': 12, 'name': 'tom'} 283 D = dict([('name', 'tom'), ('age', 12)]) # {'age': 12, 'name': 'tom'} 284 D = dict(zip(['name', 'age'], ['tom', 12])) # {'age': 12, 'name': 'tom'} 285 D.keys(); 286 D.values(); 287 D.items() # 字典鍵、值以及鍵值對 288 D.get(key, default) # get函數 289 D.update(D_other) # 合併字典,如果存在相同的鍵值,D_other的數據會覆蓋掉D的數據 290 D.pop(key, [D]) # 刪除字典中鍵值為key的項,返回鍵值為key的值,如果不存在,返回預設值D,否則異常 291 D.popitem() # pop字典中隨機的一項(一個鍵值對) 292 D.setdefault(k[, d]) # 設置D中某一項的預設值。如果k存在,則返回D[k],否則設置D[k]=d,同時返回D[k]。 293 del D # 刪除字典 294 del D['key'] # 刪除字典的某一項 295 if key in D: if 296 key not in D: # 測試字典鍵是否存在 297 # 字典註意事項:(1)對新索引賦值會添加一項(2)字典鍵不一定非得是字元串,也可以為任何的不可變對象 298 # 不可變對象:調用對象自身的任意方法,也不會改變該對象自身的內容,這些方法會創建新的對象並返回。 299 # 字元串、整數、tuple都是不可變對象,dict、set、list都是可變對象 300 D[(1, 2, 3)] = 2 # tuple作為字典的key 301 302 # -- 字典解析 303 D = {k: 8 for k in ['s', 'd']} # {'s': 8, 'd': 8} 304 D = {k: v for (k, v) in zip(['name', 'age'], ['tom', 12])} # {'age': 12, 'name': tom} 305 306 307 # -- 字典的特殊方法__missing__:當查找找不到key時,會執行該方法 308 class Dict(dict): 309 def __missing__(self, key): 310 self[key] = [] 311 return self[key] 312 313 314 dct = dict() 315 dct["foo"].append(1) # 這有點類似於collections.defalutdict 316 dct["foo"] # [1] 317 318 # -- 元組和列表的唯一區別在於元組是不可變對象,列表是可變對象 319 a = [1, 2, 3] # a[1] = 0, OK 320 a = (1, 2, 3) # a[1] = 0, Error 321 a = ([1, 2]) # a[0][1] = 0, OK 322 a = [(1, 2)] # a[0][1] = 0, Error 323 324 # -- 元組的特殊語法: 逗號和圓括弧 325 D = (12) # 此時D為一個整數 即D = 12 326 D = (12,) # 此時D為一個元組 即D = (12, ) 327 328 # -- 文件基本操作 329 output = open(r'C:\spam', 'w') # 打開輸出文件,用於寫 330 input = open('data', 'r') # 打開輸入文件,用於讀。打開的方式可以為'w', 'r', 'a', 'wb', 'rb', 'ab'等 331 fp.read([size]) # size為讀取的長度,以byte為單位 332 fp.readline([size]) # 讀一行,如果定義了size,有可能返回的只是一行的一部分 333 fp.readlines([size]) # 把文件每一行作為一個list的一個成員,並返回這個list。其實它的內部是通過迴圈調用readline()來實現的。如果提供size參數,size是表示讀取內容的總長。 334 fp.readable() # 是否可讀 335 fp.write(str) # 把str寫到文件中,write()並不會在str後加上一個換行符 336 fp.writelines(seq) # 把seq的內容全部寫到文件中(多行一次性寫入) 337 fp.writeable() # 是否可寫 338 fp.close() # 關閉文件。 339 fp.flush() # 把緩衝區的內容寫入硬碟 340 fp.fileno() # 返回一個長整型的”文件標簽“ 341 fp.isatty() # 文件是否是一個終端設備文件(unix系統中的) 342 fp.tell() # 返迴文件操作標記的當前位置,以文件的開頭為原點 343 fp.next() # 返回下一行,並將文件操作標記位移到下一行。把一個file用於for … in file這樣的語句時,就是調用next()函數來實現遍歷的。 344 fp.seek(offset[, whence]) # 將文件打開操作標記移到offset的位置。whence為0表示從頭開始計算,1表示以當前位置為原點計算。2表示以文件末尾為原點進行計算。