原文發(fā)布于個(gè)人博客(好望角)逗爹,并在博客持續(xù)修改更新,此處可能更新不及時(shí)镣屹。
抽空復(fù)習(xí)了一下python的語(yǔ)言特性女蜈,其中容易忘記逸寓、混淆的點(diǎn)特地記錄如下竹伸。
python 特性
- 運(yùn)行速度
- python > java > c
- c 適合充分發(fā)揮硬件性能的任務(wù),貼近硬件的任務(wù)
- python 優(yōu)點(diǎn)
- 完善的基礎(chǔ)代碼庫(kù)
- 高級(jí)語(yǔ)言簇宽,易理解勋篓,代碼短而優(yōu)雅
- python 缺點(diǎn)
- 代碼不能加密,如果發(fā)布python程序必須發(fā)布源代碼
- 作為解釋型語(yǔ)言魏割,需要相應(yīng)語(yǔ)言的解釋器譬嚣,“翻譯”成目標(biāo)代碼后執(zhí)行,不可脫離解釋器運(yùn)行拜银。所以效率低……(不過(guò)這不是事兒,部署線上應(yīng)用時(shí)網(wǎng)絡(luò)更慢……)
- cpython 是使用最廣的 python 解釋器
python 基礎(chǔ)
-
輸入輸出
- a = input(‘寫(xiě)輸入提示’) 輸入數(shù)據(jù)的默認(rèn)類(lèi)型是字符串
- print()
-
基本數(shù)據(jù)類(lèi)型
- 因?yàn)槭莿?dòng)態(tài)語(yǔ)言遭垛,不必事先設(shè)定好變量類(lèi)型
- ==地板除 // 相當(dāng)于取除法結(jié)果的整數(shù)部分==尼桶,常搭配取余運(yùn)算。
-
編碼問(wèn)題
- 為了能統(tǒng)一表示各種語(yǔ)言锯仪,內(nèi)存中用的是unicode編碼泵督,但是為了提升網(wǎng)絡(luò)傳輸效率,我們保存的磁盤(pán)文件往往應(yīng)該寫(xiě)成utf-8編碼
- 格式化輸出
- 可以用占位符(%s) %d %f %s %x
- .format() 函數(shù)
- list 和 tuple
- 能用tuple 就多用卵酪,它一經(jīng)建立就不可進(jìn)行添加幌蚊、刪除等操作,相當(dāng)于一個(gè)只讀的list谤碳。這樣代碼更安全溃卡,魯棒;
- 它們內(nèi)部都可以放多種類(lèi)型的數(shù)據(jù)蜒简;
- 盡量避免過(guò)多地使用 continue 和 break 提前結(jié)束循環(huán)瘸羡,因?yàn)檫@樣會(huì)造成邏輯混亂。
-
dic & list
- 隨著數(shù)據(jù)量的變大搓茬,dic 的查詢(xún)性能優(yōu)勢(shì)就會(huì)越好的體現(xiàn)出來(lái)
- 但是會(huì)比較占用內(nèi)存
- dic 是一種用空間換時(shí)間的方法犹赖,查詢(xún)靠hash表完成
-
set
-
相當(dāng)于dic 的 key ,同樣不可放入重復(fù)的元素。這里的集合不可改變針對(duì)的是不可變?cè)鼐砺兀绻蟽?nèi)有可變?cè)亓斜硎强梢愿淖兊摹?/p>
t1=(1,2,3,[1,2,3]) t1[-1][-1]=4 t1 >>> (1, 2, 3, [1, 2, 4])
-
-
不可變?cè)?/p>
- str峻村、int 、float 锡凝、tuple 是不可變?cè)卣匙颍瑢?duì)于改變它的操作,本質(zhì)上是生成了一個(gè)新的字符串,應(yīng)該定義一個(gè)新的變量指向這個(gè)新的字符串
函數(shù)
-
占位符
- pass沒(méi)有實(shí)際意義张肾,用于沒(méi)想好怎么寫(xiě)的函數(shù)體芭析。先把程序框架搭起來(lái)
-
返回值
- 函數(shù)可以返回多個(gè)值。但其實(shí)相當(dāng)于返回一個(gè)tuple組吞瞪,多個(gè)變量接受對(duì)應(yīng)位置的返回值馁启。
- 默認(rèn)的自動(dòng)返回值是None
-
檢查參數(shù)
- 在函數(shù)體內(nèi)部首先檢查參數(shù)的類(lèi)型是否輸入正確是一個(gè)好的習(xí)慣
-
函數(shù)參數(shù)類(lèi)型
- 默認(rèn)參數(shù)放在必選參數(shù)后面,默認(rèn)參數(shù)一般是變化小的數(shù)芍秆。
- 使用默認(rèn)參數(shù)可以有效降低調(diào)用函數(shù)的難度惯疙。
- ==默認(rèn)參數(shù)一定要是不可變對(duì)象==,否則每次調(diào)用默認(rèn)參數(shù)其實(shí)都會(huì)改變默認(rèn)參數(shù)的值妖啥,程序可能會(huì)出錯(cuò)
程序設(shè)計(jì)能設(shè)計(jì)成不變對(duì)象(例如:str,None等扽那個(gè))是最好的螟碎。因?yàn)椴灰讓?dǎo)致修改數(shù)據(jù)帶來(lái)的錯(cuò)誤。而且在多任務(wù)的環(huán)境下不用加鎖迹栓,因?yàn)閿?shù)據(jù)是不會(huì)改變的掉分。
- 當(dāng)參數(shù)數(shù)量不確定的時(shí)候用可變參數(shù),普通參數(shù)nums可以變成可變參數(shù)*nums克伊。想將一個(gè)列表中數(shù)據(jù)都傳入的時(shí)候也可以用 *list 酥郭, 可變參數(shù)傳入函數(shù)后一一個(gè)元組的形式存在。
- 關(guān)鍵字參數(shù)**other 可以接受一個(gè)dic愿吹,即任意個(gè)數(shù)的帶名字的參數(shù)不从。調(diào)用的時(shí)候和可變參數(shù)一樣,可以直接傳入一個(gè)dic
- 命名關(guān)鍵字參數(shù)犁跪。放在函數(shù)參數(shù)的最后椿息,用一個(gè) * 將他們與前面的位置參數(shù)分隔開(kāi)。如果有可變參數(shù)將命名關(guān)鍵字參數(shù)與位置參數(shù)分隔開(kāi)了坷衍,就不必再單獨(dú)用一個(gè) * 隔開(kāi)他們
- 函數(shù)參數(shù)定義的順序必須是:必選參數(shù)寝优、默認(rèn)參數(shù)、可變參數(shù)枫耳、命名關(guān)鍵字參數(shù)和關(guān)鍵字參數(shù)
- 但是最好不要同時(shí)使用多種參數(shù)類(lèi)型乏矾,導(dǎo)致程序可解釋性太差
-
遞歸函數(shù)
- 理論上,所有的遞歸函數(shù)都可以寫(xiě)成循環(huán)的形式迁杨。但是寫(xiě)成循環(huán)邏輯不清晰
- 遞歸函數(shù)要小心過(guò)深的調(diào)用會(huì)導(dǎo)致堆棧溢出(缺點(diǎn))
- 采取尾遞歸的方式钻心,遞歸函數(shù)值只會(huì)占用一個(gè)棧幀,就不會(huì)堆棧溢出了铅协。即捷沸,return 的就是遞歸函數(shù)本身,而不是包含遞歸函數(shù)的一個(gè)表達(dá)式
- 可惜的是狐史,與大多數(shù)編程語(yǔ)言一樣痒给,python 并沒(méi)有實(shí)現(xiàn)尾遞歸的優(yōu)化坯钦。任何遞歸函數(shù)都存在棧溢出的風(fēng)險(xiǎn)。
- 一個(gè)遞歸函數(shù)例子:漢諾塔侈玄!
- 對(duì)字符串進(jìn)行遞歸刪除的時(shí)候小心索引錯(cuò)誤婉刀。
高級(jí)特性
- 切片
- 切片操作為什么在對(duì)于空字符串只能用S[0:1]不報(bào)錯(cuò),而用s[0]就會(huì)報(bào)錯(cuò)序仙?
- ==切片操作允許超出索引突颊,或者部分缺失;但是對(duì)于數(shù)組取值是不可以的!==
- 切片操作能有效代替循環(huán),簡(jiǎn)化程序
- 迭代
- 判斷某變量是否可以迭代 isinstance(s, Iterable)
- 想獲得迭代對(duì)象的角標(biāo)可以用 enumerate()函數(shù)
- 列表生成式
- 把代碼寫(xiě)在一行非常的簡(jiǎn)潔
>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]
>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
>>> import os # 導(dǎo)入os模塊潘悼,模塊的概念后面講到
>>> [d for d in os.listdir('.')] # os.listdir可以列出文件和目錄
['.emacs.d', '.ssh', '.Trash', 'Adlm', 'Applications', 'Desktop', 'Documents', 'Downloads', 'Library', 'Movies', 'Music', 'Pictures', 'Public', 'VirtualBox VMs', 'Workspace', 'XCode']
- 生成器
- 可以有效節(jié)省程序的內(nèi)存律秃,一個(gè)大的列表,其中的元素隨著程序的運(yùn)行而一個(gè)一個(gè)的生成治唤。
- 直接將列表生成式的[] 改成()就可以得到一個(gè)生成器
- generator 保存的是生成數(shù)據(jù)的算法棒动,可以通過(guò)for循環(huán)或者next()函數(shù)不斷的迭代新生成的數(shù)據(jù)。
- 可以把生成器做成一個(gè)函數(shù)的形式調(diào)用宾添,他和一般的函數(shù)執(zhí)行順序不一樣船惨。執(zhí)行一小段,然后返回 yield缕陕,下次調(diào)用的時(shí)候接著上次執(zhí)行的地方繼續(xù)往下執(zhí)行粱锐。
- 注意為生成器設(shè)置一個(gè)程序停止條件。
>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>
# 楊輝三角的迭代生成
# 停止條件和輸出格式在調(diào)用的時(shí)候定義扛邑,最大限度地提高函數(shù)的重用率
# 列表元素還可以直接加怜浅?
def triangles():
l = [1]
while 1:
yield l
l = [1] + [l[n] + l[n + 1] for n in range(len(l) - 1)] + [1]
# 斐波那契數(shù)列的迭代生成
# 不需要中間變量的變量賦值方法,節(jié)省一點(diǎn)內(nèi)存
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
- 迭代器
- 可迭代對(duì)象list蔬崩、tuple恶座、dict、set沥阳、str跨琳、generator,帶有yield 的generator function
- 判斷是否可迭代 isinstance({}, Iterable)
True - 相比于可迭代對(duì)象list ,迭代器iter([])的好處就是可以放入一個(gè)任意大的迭代對(duì)象,不會(huì)占用大量?jī)?nèi)存沪袭。
模塊
- 作用域
- 類(lèi)似_xxx和__xxx這樣的函數(shù)或變量就是非公開(kāi)的(private)湾宙,不應(yīng)該被直接引用,比如_abc冈绊,__abc等。一般的變量就是公開(kāi)的
- 對(duì)于那些不需要外部引用的函數(shù)埠啃,都可以定義成_private()的private形式死宣,代碼更規(guī)范
- system
- sys.argv 可以存儲(chǔ)命令行調(diào)用函數(shù)的所有變量(至少會(huì)有一個(gè),就是.py的文件名本身)
內(nèi)置函數(shù)
屬性操作
Func | 語(yǔ)法 | 作用 | retype |
---|---|---|---|
hasattr | hasattr(object, name) | 判斷 對(duì)象中是否含有 該屬性碴开。 | True / False |
setattr | setattr(object, name, values) | 給對(duì)象的屬性 賦值毅该,若屬性不存在博秫,先創(chuàng)建再賦值。 | None |
getattr | getattr(object, name[,default]) | 獲取 屬性數(shù)值眶掌。 | 屬性存在時(shí)挡育,返回 屬性數(shù)值;否則根據(jù) 默認(rèn)輸出值 返回 或 報(bào) AttributeError朴爬。 |
delattr | delattr(object, name) | 刪除屬性即寒。 | 屬性存在則無(wú)返回,否則報(bào) AttributeError召噩。 |
函數(shù)式編程
- map & reduce
- map(f(),iterable) 相當(dāng)于把函數(shù)f作用在一個(gè)可迭代對(duì)象中的每一個(gè)元素母赵,返回指是對(duì)應(yīng)的處理后的 iterable 。
- 再看reduce的用法具滴。reduce把一個(gè)函數(shù)作用在一個(gè)序列[x1, x2, x3, ..…]上凹嘲,這個(gè)函數(shù)必須接收兩個(gè)參數(shù),reduce把結(jié)果繼續(xù)和序列的下一個(gè)元素做累積計(jì)算构韵,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
- 有用的 nonlocal 聲明
- 用于函數(shù)套嵌的內(nèi)部函數(shù)周蹭。如果內(nèi)部函數(shù)的變量與外部函數(shù)的變量重名,相當(dāng)于在內(nèi)部函數(shù)新建了一個(gè)同名變量疲恢,內(nèi)部函數(shù)并不能訪問(wèn)修改外部函數(shù)的變量谷醉。
- 但是只要在內(nèi)部函數(shù)聲明 nonlocal ‘變量名’ 就可以讓內(nèi)部函數(shù)對(duì)外部變量進(jìn)行==賦值==操作。
- 字典不需要nonlocal 聲明就可以在內(nèi)部函數(shù)改變外部字典冈闭。
- 可以起到像靜態(tài)變量的作用俱尼,‘只初始化一次,然后不斷改變它 ’
- filter 過(guò)濾函數(shù)
- 與map()函數(shù)的用法一致萎攒,都是輸入量?jī)蓚€(gè)參數(shù)遇八,第一個(gè)是一個(gè)函數(shù),第二個(gè)是iterable
- 所需要的返回是True or False 返回的是一個(gè)iter(惰性計(jì)算) ,所以需要套一個(gè)list 才能繼續(xù)工作
- 字符串倒序技巧 str(s)[::-1]
- sorted 排序高階函數(shù)
- 可以接受三個(gè)參數(shù)(‘排序?qū)ο蟆?key = ‘函數(shù)’,reverse = True)
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']
- 返回函數(shù)
- 當(dāng)某些功能不必立即執(zhí)行的時(shí)候耍休,定義一個(gè)內(nèi)部函數(shù)刃永,返回該內(nèi)部函數(shù)。
- 同樣的語(yǔ)句調(diào)用兩次羊精,返回的兩個(gè)函數(shù)也不會(huì)是一樣的斯够,他們的運(yùn)行結(jié)果也相互獨(dú)立
- 相關(guān)參數(shù)和變量都保存在返回的函數(shù)中,這種稱(chēng)為“閉包(Closure)”的程序結(jié)構(gòu)擁有極大的威力喧锦。++編寫(xiě)起來(lái)都是坑++
- ==返回閉包時(shí)牢記一點(diǎn):返回函數(shù)不要引用任何循環(huán)變量读规,或者后續(xù)會(huì)發(fā)生變化的變量。==
- lambda 函數(shù)
- 冒號(hào)前面是函數(shù)參數(shù)燃少,后面是函數(shù)體束亏,運(yùn)算結(jié)果就是函數(shù)返回值
- 匿名函數(shù)也是一個(gè)函數(shù)對(duì)象,也可以將其復(fù)制給一個(gè)變量阵具,然后再通過(guò)變量調(diào)用它
>>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
[1, 4, 9, 16, 25, 36, 49, 64, 81]
- decorator 裝飾器高級(jí)函數(shù)
- 輸入一個(gè)函數(shù)碍遍,返回一個(gè)函數(shù)定铜。在代碼運(yùn)行的期間動(dòng)態(tài)的為一些函數(shù)增加功能
- def wrapper(*args, **kw) 這樣的函數(shù)能接受任意參數(shù)形式的函數(shù)作為參數(shù),用在裝飾器內(nèi)部怕敬,接收舊函數(shù)揣炕,返回新函數(shù)是最好的選擇。
- 一個(gè)普通的不需要參數(shù)的裝飾器都要decorator 雙層嵌套东跪,而需要的參數(shù)的decorator 需要三層嵌套畸陡。
- decorator 會(huì)使func.name發(fā)生變化,導(dǎo)致某些調(diào)用出錯(cuò)越庇≌秩瘢可以在wrapper前面加上@functools.wraps(func)默認(rèn)的裝飾器。起到保持原函數(shù)名不變的功能卤唉。
- partail 偏函數(shù)
- 為了簡(jiǎn)化我們對(duì)于常用函數(shù)的調(diào)用涩惑,可以用fu’nctools.partail() 固定函數(shù)的常用參數(shù),返回一個(gè)新的函數(shù)桑驱,調(diào)用更方便
>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85
防坑指南
可變對(duì)象與不可變對(duì)象
- 不可變對(duì)象: int 竭恬、string 、float 熬的、tuple
- 可變對(duì)象: list 痊硕、dict、set
# 例子一
>>> a=b=['hello','world']押框;a.append('hello')
>>> print(b)
['hello','world','hello']
# 例子二
>>> a=b='hello'岔绸;a='world'
>>> print(b)
hello
對(duì)于可變類(lèi)型來(lái)說(shuō),兩個(gè)變量名指向相同的內(nèi)存地址的時(shí)候相當(dāng)于給同一個(gè)內(nèi)存地址起了兩個(gè)名字橡伞。如果改變一個(gè)變量名的內(nèi)容盒揉,并不會(huì)開(kāi)辟新的內(nèi)存,而是直接改變?cè)瓉?lái)內(nèi)存地址中的內(nèi)容兑徘。也就是說(shuō)對(duì)于不可變類(lèi)型刚盈,不同的變量名指向的內(nèi)存地址永遠(yuǎn)是相同的。
對(duì)于不可變類(lèi)型來(lái)說(shuō)挂脑,兩個(gè)變量指向相同的內(nèi)容時(shí)擁有共同的內(nèi)存地址(id(arg) 命令可以查看)藕漱,但是改變一個(gè)變量之后相當(dāng)于另外開(kāi)辟一塊新內(nèi)存,其內(nèi)存 id 會(huì)隨之改變崭闲。
但是起名可變和不可變的原因呢肋联?是相對(duì)于函數(shù)傳參來(lái)說(shuō)的。
def test(a_int, b_list):
a_int = a_int + 1
b_list.append('13')
print('inner a_int:' + str(a_int))
print('inner b_list:' + str(b_list))
if __name__ == '__main__':
a_int = 5
b_list = [10, 11]
test(a_int, b_list)
print('outer a_int:' + str(a_int))
print('outer b_list:' + str(b_list))
>>> inner a_int:6
>>> inner b_list:[10, 11, '13']
>>> outer a_int:5
>>> outer b_list:[10, 11, '13']
所謂的可變類(lèi)型镀脂,就是傳入函數(shù)中牺蹄,函數(shù)中的變化會(huì)同步到函數(shù)外的變量。類(lèi)似引用傳遞(可以把引用理解為一個(gè)箭頭薄翅,這個(gè)箭頭指向某塊內(nèi)存地址沙兰,而引用傳遞,傳遞過(guò)來(lái)的就是這個(gè)箭頭翘魄,當(dāng)你修改內(nèi)容的時(shí)候鼎天,就是修改這個(gè)箭頭所指向的內(nèi)存地址中的內(nèi)容,因?yàn)橥獠恳彩侵赶蜻@個(gè)內(nèi)存中的內(nèi)容的暑竟,所以斋射,在函數(shù)內(nèi)部修改就會(huì)影響函數(shù)外部的內(nèi)容。)
而不可變類(lèi)型但荤,傳入函數(shù)中的操作會(huì)事先新創(chuàng)造一個(gè)內(nèi)存地址罗岖,所以并不會(huì)影響函數(shù)外的變量值。類(lèi)似值傳遞(表示傳遞直接傳遞變量的值腹躁,把傳遞過(guò)來(lái)的變量的值復(fù)制到形參中桑包,這樣在函數(shù)內(nèi)部的操作不會(huì)影響到外部的變量)。
深拷貝與淺拷貝
- 直接賦值:其實(shí)就是對(duì)象的引用(別名)纺非。
a = [1,2,3,[1,2]]
b = a
b[-1] = [1,2,3]
print(a,b)
>>> [[1,2,3,[1,2,3]],[1,2,3,[1,2,3]]]
- 淺拷貝(copy):拷貝父對(duì)象哑了,對(duì)象的內(nèi)部的子對(duì)象仍是相同的。
l1=[1,2,3,[1,2,3]]
l2=l1.copy()
l2[-1].append(4) # 子對(duì)象仍相同烧颖,同步變化
l2.append(5) # 父對(duì)象不同弱左,不會(huì)同步變化
print(l1,l2)
>>> [[1,2,3,[1,2,3,4]], [1,2,3,[1,2,3,4],5]]
- 深拷貝(deepcopy): copy 模塊的 deepcopy 方法,完全拷貝了父對(duì)象及其子對(duì)象炕淮。
import copy
l1=[1,2,3,[1,2,3]]
l2=copy.deepcopy(l1)
l2[-1].append(4)
print(l1)
>>> [1,2,3,[1,2,3]]
# 深度拷貝是將原對(duì)象中所有的值完全復(fù)制一份存放在內(nèi)存中(包括可變數(shù)據(jù)類(lèi)型對(duì)象)拆火。這樣遇到原對(duì)象即使是更改,也不會(huì)影響其值涂圆。
# 復(fù)制引用與copy.copy, copy.deepcopy
import copy
a = [1, 2, 3, 4, ['a', 'b']] #原始對(duì)象
b = a #賦值们镜,傳對(duì)象的引用
c = copy.copy(a) #對(duì)象拷貝,淺拷貝
d = copy.deepcopy(a) #對(duì)象拷貝乘综,深拷貝
a.append(5) #修改對(duì)象a
a[4].append('c') #修改對(duì)象a中的['a', 'b']數(shù)組對(duì)象
print( 'a = ', a )
print( 'b = ', b )
print( 'c = ', c )
print( 'd = ', d )
>>> ('a = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
>>> ('b = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
>>> ('c = ', [1, 2, 3, 4, ['a', 'b', 'c']])
>>> ('d = ', [1, 2, 3, 4, ['a', 'b']])
python 運(yùn)算符優(yōu)先級(jí)
運(yùn)算符 | 描述 |
---|---|
** | 指數(shù) (最高優(yōu)先級(jí)) |
~ + - | 按位翻轉(zhuǎn), 一元加號(hào)和減號(hào) (最后兩個(gè)的方法名為 +@ 和 -@) |
* / % // | 乘憎账,除,取模和取整除 |
+ - | 加法減法 |
>> << | 右移卡辰,左移運(yùn)算符 |
& | 位 ‘AND’ |
^ | | 位運(yùn)算符 |
<= < > >= | 比較運(yùn)算符 |
<> == != | 等于運(yùn)算符 |
= %= /= //= -= += *= **= | 賦值運(yùn)算符 |
is is not | 身份運(yùn)算符 |
in not in | 成員運(yùn)算符 |
not or and | 邏輯運(yùn)算符 |
print(100 - 25 * 3 % 4)
>>> 97
IO operations
files operations
-
read([size])
文件當(dāng)前位置起讀取size個(gè)字節(jié)胞皱,若無(wú)參數(shù)size,則表示讀取至文件結(jié)束為止九妈,整個(gè)文件返回為一個(gè)字符串對(duì)象反砌,文件很大時(shí)候 -
readline()
每次讀出一行內(nèi)容,所以萌朱,讀取時(shí)占用內(nèi)存小宴树,比較適合大文件,但是速度慢熬邸>票帷(內(nèi)存不夠時(shí)采用)每次讀取返回一個(gè)字符串對(duì)象又憨。 -
reandlines()
讀取整個(gè)文件所有行,保存在一個(gè)列表(list)變量中锭吨,每行作為一個(gè)元素蠢莺,但讀取大文件會(huì)比較占內(nèi)存宝泵。 -
linecache
輸出某個(gè)文件的第n行, 使用示例如下:
text = lincache.getline('a.txt' , 2)
print(text)
keyboard operations
- raw_input([prompt]) 可以讀取一行任意字符串 str芯侥,將返回 str.strip()
s = raw_input('請(qǐng)輸入:')
print('你剛才輸入了:'+s)
請(qǐng)輸入:hhhh
你剛才輸入了:hhhh
- input([prompt]) 在 raw_input([prompt]) 的基礎(chǔ)上多了一個(gè)接受表達(dá)式的功能,可以返回運(yùn)算結(jié)果 呻引。
dict
a = {'s':1 , 'w':1}
b = {'w':1 , 'e':1}
z = {**a , **b}
- dict.update(dictnew) 命令可以用dictnew更新覆蓋原有的字典
- 在數(shù)字作為字典的key值時(shí)候考蕾,整數(shù)和浮點(diǎn)數(shù)是相等的祸憋,即 {1:5,1.0:6} == {1:6}
str
-
str.ljust(50,'@')
用 @ 將字符串填充為長(zhǎng)度 50 肖卧,@填補(bǔ)在字符串的后面蚯窥。 - 字符串可以通過(guò)切片訪問(wèn),但是不可以通過(guò)這種方式賦值喜命。
>>> a = '456123'
>>> a[-3,-1] = 'aaa'
TypeError: 'str' object does not support item assignment
-
創(chuàng)建新字典的方法
>>> print({}.fromkeys((1,2,8),(3,4))) {1: (3, 4), 2: (3, 4), 8: (3, 4)}
list
從本質(zhì)上講沟沙,自帶pop() 、append() 函數(shù)的列表結(jié)構(gòu)是以 stack 為基礎(chǔ)的壁榕。
刪除列表中的元素
- del 刪除某位置的元素矛紫。
a = ['a','b','c']
del a[0] #指定刪除0位的元素
print(a)
---
> ['b', 'c']
- list.remove() 刪除某指定值元素。
a = ['a','b','c']
a.remove('b') #刪除第一個(gè)匹配的指定元素牌里,直接改變?cè)瓟?shù)組颊咬,無(wú)返回值。
print(a)
---
> ['a', 'c']
- list.pop() 刪除指定位置元素牡辽,并且返回它的數(shù)值喳篇。如果沒(méi)有參數(shù),默認(rèn)參數(shù)為“-1”态辛。
a = ['a','b','c']
b = ['d','e','f']
# pop的命令麸澜,其有返回值,可賦值帶出
c = a.pop() #默認(rèn)刪除-1位置元素'c',并將刪除元素返回值賦值
d = b.pop(0) #刪除0位元素'd',并將刪除元素返回值賦值
print(a,b,c,d)
---
> ['a', 'b'] ['e', 'f'] c d
- list的引用才有append()函數(shù)奏黑,不可直接調(diào)用
# 錯(cuò)誤用法
[5,6].append(9)
list().append(9)
# 正確用法
a = [5,6]
a.append(9)
正則表達(dá)式
- ^ 符號(hào)不出現(xiàn)在中括號(hào)中炊邦,表示匹配開(kāi)始字符;而出現(xiàn)在中括號(hào)中熟史,表示匹配除了中括號(hào)中的其他所有字符馁害。
- \w 表示匹配字母、下劃線或者數(shù)字
- ? 表示正則表達(dá)式中的非貪婪模式
Others
- 任何一個(gè)內(nèi)置的
shuffle()
函數(shù)蹂匹,返回值類(lèi)型都為None碘菜,它們直接作用在原本的列表上,不會(huì)創(chuàng)建新對(duì)象。
import random
L = [2,3,4,56,78,9,0]
random.shuffle(L)
print(L)
當(dāng) python 中表示復(fù)數(shù)的時(shí)候忍啸,復(fù)數(shù)之間不能比較大小仰坦。
python 中表示復(fù)數(shù),實(shí)部可以是整數(shù)吊骤、也可以是浮點(diǎn)數(shù)缎岗; 而虛部是關(guān)于X軸的反轉(zhuǎn)程度静尼。
python 靜態(tài)類(lèi)變量可以被實(shí)例或者類(lèi)本身訪問(wèn)并且修改白粉。
heapq 是python自帶的完全二叉樹(shù)結(jié)構(gòu)的類(lèi)型,常用于堆排序(最小堆鼠渺,不受初始數(shù)據(jù)順序影響)
deque 是python中的雙端隊(duì)列結(jié)構(gòu)
檢查函數(shù)類(lèi)型時(shí)候只寫(xiě)函數(shù)名鸭巴,不加括號(hào);調(diào)用函數(shù)時(shí)侯加括號(hào)拦盹,返回函數(shù)的運(yùn)行結(jié)果值鹃祖。
python 是弱語(yǔ)言類(lèi)型, 不用對(duì)變量類(lèi)型進(jìn)行直接賦值普舆。但如果調(diào)用一個(gè)未賦值對(duì)象會(huì)報(bào) NameError 錯(cuò)誤恬口。
Python變量訪問(wèn)時(shí)有個(gè)LEGB原則,也就是說(shuō)沼侣,變量訪問(wèn)時(shí)搜索順序?yàn)長(zhǎng)ocal ==> Enclosing ==> Global ==> Builtin祖能,其實(shí)很多語(yǔ)言都遵循這個(gè)規(guī)則。簡(jiǎn)單地說(shuō)蛾洛,訪問(wèn)變量時(shí)养铸,先在當(dāng)前作用域找,如果找到了就使用轧膘,如果沒(méi)找到就繼續(xù)到外層作用域看看有沒(méi)有钞螟,找到了就使用,如果還是沒(méi)找到就繼續(xù)到更外層作用域找谎碍,如果已經(jīng)到了最外層作用域了還是實(shí)在找不到就看看是不是內(nèi)置對(duì)象鳞滨,如果也不是,拋出異常蟆淀。
自定義類(lèi)中拯啦,如果我們想要返回特定信息。需要改變函數(shù)中的 __ str __ 方法
Stackless并非以庫(kù)的形式和Python整合扳碍,Stackless提供的并發(fā)建模工具提岔,比目前其它大多數(shù)傳統(tǒng)編程語(yǔ)言所提供的工具都更加易用: 不僅用于Python自身,也包括Java笋敞、C++碱蒙,以及其它語(yǔ)言。
Scrapy是Python進(jìn)行網(wǎng)絡(luò)抓取的第三方庫(kù),包含Scrapy引擎赛惩,下載器哀墓,爬蟲(chóng),調(diào)度器喷兼,Item Pipeline以及中間件篮绰,并沒(méi)有溝通隧道(connect)。
常用模塊
os 模塊
os.listdir(dirname):列出dirname下的目錄和文件
os.getcwd():獲得當(dāng)前工作目錄
os.curdir:返回當(dāng)前目錄(’.’)
os.chdir(dirname):改變工作目錄到dirname
os.path.isdir(name):判斷name是不是一個(gè)目錄季惯,name不是目錄就返回false
os.path.isfile(name):判斷name是不是一個(gè)文件吠各,不存在name也返回false
os.path.exists(name):判斷是否存在文件或目錄name
os.path.getsize(name):獲得文件大小,如果name是目錄返回0
os.path.abspath(name):獲得絕對(duì)路徑
os.path.normpath(path):規(guī)范path字符串形式
os.path.split(name):分割文件名與目錄(事實(shí)上勉抓,如果你完全使用目錄贾漏,它也會(huì)將最后一個(gè)目錄作為文件名而分離,同時(shí)它不會(huì)判斷文件或目錄是否存在)
os.path.splitext():分離文件名與擴(kuò)展名
os.path.join(path,name):連接目錄與文件名或目錄
os.path.basename(path):返回文件名
os.path.dirname(path):返回文件路徑
參考
原文發(fā)布于個(gè)人博客(好望角)藕筋,并在博客持續(xù)修改更新纵散,此處可能更新不及時(shí)。