python核心编程:杂记2
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
1. Python對(duì)象
? ? 所有的Python對(duì)象都擁有三個(gè)特性:身份,類(lèi)型和值.
身份: 每一個(gè)對(duì)象都有一個(gè)唯一的身份標(biāo)識(shí)自己,任何對(duì)象的身份可以使用內(nèi)建函數(shù)id()來(lái)得到.這個(gè)值可以被認(rèn)為是該對(duì)象的內(nèi)存地址.
類(lèi)型: 對(duì)象的類(lèi)型決定了該對(duì)象可以保存什么類(lèi)型的值,可以進(jìn)行什么樣的操作,以及遵循什么樣的規(guī)則.我們可以使用type()查看Python對(duì)象的類(lèi)型.
值: 對(duì)象表示的數(shù)據(jù)項(xiàng).
1. type在函數(shù)中起判斷作用
? ? 我們定義一個(gè)函數(shù),要求傳遞的參數(shù)必須是元組(因?yàn)樵M不可更改),則我們可以這樣判斷(可以引申到判斷參數(shù)為整數(shù),浮點(diǎn)數(shù),字典等等):
>>> def func(aTuple):if type(aTuple) != tuple:print 'not tuple'else:print 'tuple'>>> func([1, 2, 3]) not tuple >>> func((1, 2, 3)) tuple 2. is/is not, isinstance操作符A is B: A和B是同一個(gè)對(duì)象
A is not B: A和B不是同一個(gè)對(duì)象
isinstance(A, (int, long, float, complex)): A的類(lèi)型是否為(int, long, float, complex),也適用于類(lèi)實(shí)例的判斷
3. 內(nèi)建類(lèi)型,引用類(lèi)型的區(qū)別
內(nèi)建類(lèi)型: 整型,字符串,元組
引用類(lèi)型:列表,字典,類(lèi)對(duì)象
? ? 對(duì)內(nèi)建類(lèi)型的賦值,實(shí)際上是銷(xiāo)毀原對(duì)象,新建一個(gè)對(duì)象:
>>> ss = 'hello world' >>> id(ss) 46651264L >>> ss = 'what' >>> id(ss) 34271280L ? ? 而引用類(lèi)型則保持不變: >>> arr = [1, 2, 3] >>> id(arr) 45887240L >>> arr.append(4) >>> id(arr) 45887240L 4. 標(biāo)準(zhǔn)類(lèi)型的分類(lèi)以存儲(chǔ)模型為標(biāo)準(zhǔn)的類(lèi)型分類(lèi):
標(biāo)量/原子類(lèi)型(保持單個(gè)字面對(duì)象的類(lèi)型): 數(shù)值(所有的數(shù)值類(lèi)型),字符串
容器類(lèi)型(容納多個(gè)相同/不同對(duì)象的類(lèi)型): 列表,元組,字典
以更新模型為標(biāo)準(zhǔn)的類(lèi)型分類(lèi):
可變類(lèi)型: 列表,字典
不可變類(lèi)型: 數(shù)字,字符串,元組
以訪問(wèn)模型為標(biāo)準(zhǔn)的類(lèi)型分類(lèi):
直接訪問(wèn): 數(shù)字
順序訪問(wèn): 字符串,列表,元組
映射訪問(wèn): 字典
2. 序列:字符串,列表和元組
1. 通用函數(shù)
額外知識(shí):淺拷貝和深拷貝
? ? 淺拷貝只是拷貝對(duì)象的索引,而不是重新建立了一個(gè)對(duì)象。如果完全拷貝一個(gè)對(duì)象,則需要深拷貝:
In [22]: arr Out[22]: [1, 2, 3, [4, 5]]In [23]: Tuple1 = tuple(arr)In [24]: import copyIn [25]: Tuple2 = copy.deepcopy(tuple(arr))In [26]: [id(x) for x in arr] Out[26]: [42791256, 42791232, 42791208, 140595426198232]In [27]: [id(x) for x in Tuple1] Out[27]: [42791256, 42791232, 42791208, 140595426198232]In [28]: [id(x) for x in Tuple2] Out[28]: [42791256, 42791232, 42791208, 140595427957864] ? ? 這里arr和Tuple1的元素id全部一樣(由于整形1,2,3是不可改變,所以重新賦值會(huì)新建一個(gè)對(duì)象),而Tuple2的[4, 5]的id不一樣,說(shuō)明進(jìn)行了深拷貝。list(iter): 把可迭代對(duì)象轉(zhuǎn)換為列表。
str(obj): 把obj對(duì)象轉(zhuǎn)換成字符串
tuple(iter): 把一個(gè)可迭代對(duì)象轉(zhuǎn)換成一個(gè)元組對(duì)象
enumerate(iter): 接受一個(gè)可迭代對(duì)象作為參數(shù),返回一個(gè)enumerate對(duì)象(同時(shí)也是一個(gè)迭代器),該對(duì)象生成由iter每個(gè)元素的index值和item值組成的元組。
len(seq): 返回seq的長(zhǎng)度
max/min(iter, key = None):返回最大值,指定key則必須是一個(gè)可以傳給sort()方法的,用于比較的回調(diào)函數(shù)。
reversed(seq): 接受一個(gè)序列作為參數(shù),返回一個(gè)以逆序訪問(wèn)的迭代器。
sorted(iter, func = None, key = None, reverse = False): 接受一個(gè)可迭代對(duì)象作為參數(shù),返回一個(gè)有序的列表。
sum(seq, init = 0): 返回seq和可選參數(shù)init的總和,其效果等同于reduce(operator.add, seq, init)
zip([it0, it1, it2]):舉例說(shuō)明
In [29]: iter1 = (1, 2, 3)In [30]: iter2 = [11, 12, 13]In [31]: iter3 = [21, 22, 23]In [32]: zip(iter1, iter2, iter3) Out[32]: [(1, 11, 21), (2, 12, 22), (3, 13, 23)]3. 映射
1. 哈希表
? ? 哈希表是一種數(shù)據(jù)結(jié)構(gòu),哈希表中存儲(chǔ)的每一條數(shù)據(jù),叫做一個(gè)值,是根據(jù)與它相關(guān)的一個(gè)被稱(chēng)作鍵的數(shù)據(jù)項(xiàng)進(jìn)行存儲(chǔ)的。鍵和值合在一起被稱(chēng)為“鍵-值”對(duì)。哈希表的算法是活取鍵,對(duì)鍵執(zhí)行一個(gè)叫做哈希函數(shù)的操作,并根據(jù)計(jì)算的結(jié)果,選擇在數(shù)據(jù)結(jié)構(gòu)的某個(gè)地址中來(lái)存儲(chǔ)你的值。任何一個(gè)值存儲(chǔ)的地址皆取決于它的鍵。正因?yàn)檫@種隨意性,哈希表中的值是沒(méi)有順序的。你擁有的是一個(gè)無(wú)序的數(shù)據(jù)集。
? ? 你所能獲得的有序集合只能是字典中的鍵的集合或者值的集合。方法Keys()或values()返回一個(gè)列表,該列表是可排序的。你還可以用item()方法得到包含鍵,值對(duì)的元組的列表來(lái)排序。由于字典本身是哈希的,所以是無(wú)序的。
? ? 哈希表一般有很好的性能,因?yàn)橛面I查詢(xún)相當(dāng)快。
2. 字典的鍵必須是可哈希的
? ? 因?yàn)槲覀冃枰ㄟ^(guò)鍵來(lái)查找數(shù)據(jù),所以鍵必須保持不變,即鍵必須是可哈希的(通過(guò)hash判斷):
In [45]: dst = {}In [46]: dst[[1, 2]] = 3 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-46-70dfcbeb49dc> in <module>() ----> 1 dst[[1, 2]] = 3TypeError: unhashable type: 'list'In [47]: hash([1, 2]) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-47-0e7c08465b16> in <module>() ----> 1 hash([1, 2])TypeError: unhashable type: 'list'3. 映射相關(guān)函數(shù)
dict(): 工廠函數(shù),用來(lái)創(chuàng)建字典,參數(shù)為可迭代對(duì)象。
len(): 返回字典的長(zhǎng)度
hash(): 判斷對(duì)象是否可哈希,返回其哈希值。
in/ not in: 判斷鍵是否在字典中
映射類(lèi)型的內(nèi)建方法:
keys(), values(), items(): 返回字典的鍵,值,鍵-值對(duì)
clear(): 刪除字典中所有元素
copy(): 返回字典的一個(gè)副本(淺復(fù)制)
fromkeys(seq, val = None): 創(chuàng)建并返回一個(gè)新字典,以seq中的元素做該字典的鍵,val做該字典中所有鍵對(duì)應(yīng)的初始值。
get(key, default = None): 獲取鍵key對(duì)應(yīng)的值,如果不存在則返回默認(rèn)值default.
pop(key, [, default]): key存在,則刪除并返回dict[key],否則返回default。如果key不存在也不提供default,則引發(fā)KeyError異常。
setdefault(key, default = None): 如果字典中不存在key鍵,則用default賦值。
4. 迭代器,列表解析和生成器
1. 迭代器
? ? 從根本上說(shuō),迭代器就是有一個(gè)next()方法的對(duì)象,而不是通過(guò)索引來(lái)計(jì)數(shù),全部迭代完會(huì)引發(fā)一個(gè)StopIteration異常。
? ? 我們一般可以迭代序列,字典和文件:
In [56]: arr = [1, 2]In [57]: i = iter(arr)In [58]: i.next() Out[58]: 1In [59]: i.next() Out[59]: 2In [60]: i.next() --------------------------------------------------------------------------- StopIteration Traceback (most recent call last) <ipython-input-60-e590fe0d22f8> in <module>() ----> 1 i.next()StopIteration: ? ? 而迭代器實(shí)際上等價(jià)于for循環(huán): for i in seq:do_something_to(i) <==> fetch = iter(seq)while True:try:i = fetch.next()except StopIteration:breakdo_something_to(i)2. 列表解析
? ? 語(yǔ)法如下:
[expr for iter_var in iterable if cond_expr]實(shí)例如下:
In [61]: [x for x in range(6) if x % 2] Out[61]: [1, 3, 5]3. 生成器表達(dá)式
? ? 語(yǔ)法如下:
(expr for iter_var in iterable if cond_expr) ? ? 列表解析的一個(gè)不足就是必要生成所有的數(shù)據(jù)。但是生成器表達(dá)式是返回一個(gè)生成器,每次計(jì)算出一個(gè)條目后,把這個(gè)條目yield出來(lái),采用了延遲計(jì)算。 In [63]: lst = (x for x in range(6) if x % 2)In [64]: lst Out[64]: <generator object <genexpr> at 0x7fdeec558320>In [65]: for i in lst:....: print i,....: 1 3 5 <==> In [67]: def fun(arr):....: for i in arr:....: yield i....: In [68]: arr = [1, 2, 3]In [71]: for i in fun(arr):....: print i,....: 1 2 3
轉(zhuǎn)載于:https://my.oschina.net/voler/blog/394856
總結(jié)
以上是生活随笔為你收集整理的python核心编程:杂记2的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Mysql内存表主从复制【译】
- 下一篇: Java中List的排序