Python3復(fù)習(xí)總結(jié)


原文發(fā)布于個(gè)人博客(好望角)逗爹,并在博客持續(xù)修改更新,此處可能更新不及時(shí)镣屹。

抽空復(fù)習(xí)了一下python的語(yǔ)言特性女蜈,其中容易忘記逸寓、混淆的點(diǎn)特地記錄如下竹伸。


python 特性

  • 運(yùn)行速度
    1. python > java > c
    2. c 適合充分發(fā)揮硬件性能的任務(wù),貼近硬件的任務(wù)
  • python 優(yōu)點(diǎn)
    1. 完善的基礎(chǔ)代碼庫(kù)
    2. 高級(jí)語(yǔ)言簇宽,易理解勋篓,代碼短而優(yōu)雅
  • python 缺點(diǎn)
    1. 代碼不能加密,如果發(fā)布python程序必須發(fā)布源代碼
    2. 作為解釋型語(yǔ)言魏割,需要相應(yīng)語(yǔ)言的解釋器譬嚣,“翻譯”成目標(biāo)代碼后執(zhí)行,不可脫離解釋器運(yùn)行拜银。所以效率低……(不過(guò)這不是事兒,部署線上應(yīng)用時(shí)網(wǎng)絡(luò)更慢……)
  • cpython 是使用最廣的 python 解釋器

python 基礎(chǔ)

  • 輸入輸出

    1. a = input(‘寫(xiě)輸入提示’) 輸入數(shù)據(jù)的默認(rèn)類(lèi)型是字符串
    2. print()
  • 基本數(shù)據(jù)類(lèi)型

    1. 因?yàn)槭莿?dòng)態(tài)語(yǔ)言遭垛,不必事先設(shè)定好變量類(lèi)型
    2. ==地板除 // 相當(dāng)于取除法結(jié)果的整數(shù)部分==尼桶,常搭配取余運(yùn)算。
  • 編碼問(wèn)題

    1. 為了能統(tǒng)一表示各種語(yǔ)言锯仪,內(nèi)存中用的是unicode編碼泵督,但是為了提升網(wǎng)絡(luò)傳輸效率,我們保存的磁盤(pán)文件往往應(yīng)該寫(xiě)成utf-8編碼
    2. 格式化輸出
      1. 可以用占位符(%s) %d %f %s %x
      2. .format() 函數(shù)
    3. list 和 tuple
      1. 能用tuple 就多用卵酪,它一經(jīng)建立就不可進(jìn)行添加幌蚊、刪除等操作,相當(dāng)于一個(gè)只讀的list谤碳。這樣代碼更安全溃卡,魯棒;
      2. 它們內(nèi)部都可以放多種類(lèi)型的數(shù)據(jù)蜒简;
    4. 盡量避免過(guò)多地使用 continue 和 break 提前結(jié)束循環(huán)瘸羡,因?yàn)檫@樣會(huì)造成邏輯混亂。
  • dic & list

    1. 隨著數(shù)據(jù)量的變大搓茬,dic 的查詢(xún)性能優(yōu)勢(shì)就會(huì)越好的體現(xiàn)出來(lái)
    2. 但是會(huì)比較占用內(nèi)存
    3. dic 是一種用空間換時(shí)間的方法犹赖,查詢(xún)靠hash表完成
  • set

    1. 相當(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>

    1. str峻村、int 、float 锡凝、tuple 是不可變?cè)卣匙颍瑢?duì)于改變它的操作,本質(zhì)上是生成了一個(gè)新的字符串,應(yīng)該定義一個(gè)新的變量指向這個(gè)新的字符串

函數(shù)

  • 占位符

    1. pass沒(méi)有實(shí)際意義张肾,用于沒(méi)想好怎么寫(xiě)的函數(shù)體芭析。先把程序框架搭起來(lái)
  • 返回值

    1. 函數(shù)可以返回多個(gè)值。但其實(shí)相當(dāng)于返回一個(gè)tuple組吞瞪,多個(gè)變量接受對(duì)應(yīng)位置的返回值馁启。
    2. 默認(rèn)的自動(dòng)返回值是None
  • 檢查參數(shù)

    1. 在函數(shù)體內(nèi)部首先檢查參數(shù)的類(lèi)型是否輸入正確是一個(gè)好的習(xí)慣
  • 函數(shù)參數(shù)類(lèi)型

    1. 默認(rèn)參數(shù)放在必選參數(shù)后面,默認(rèn)參數(shù)一般是變化小的數(shù)芍秆。
    2. 使用默認(rèn)參數(shù)可以有效降低調(diào)用函數(shù)的難度惯疙。
      1. ==默認(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ì)改變的掉分。

    1. 當(dāng)參數(shù)數(shù)量不確定的時(shí)候用可變參數(shù),普通參數(shù)nums可以變成可變參數(shù)*nums克伊。想將一個(gè)列表中數(shù)據(jù)都傳入的時(shí)候也可以用 *list 酥郭, 可變參數(shù)傳入函數(shù)后一一個(gè)元組的形式存在。
    2. 關(guān)鍵字參數(shù)**other 可以接受一個(gè)dic愿吹,即任意個(gè)數(shù)的帶名字的參數(shù)不从。調(diào)用的時(shí)候和可變參數(shù)一樣,可以直接傳入一個(gè)dic
    3. 命名關(guān)鍵字參數(shù)犁跪。放在函數(shù)參數(shù)的最后椿息,用一個(gè) * 將他們與前面的位置參數(shù)分隔開(kāi)。如果有可變參數(shù)將命名關(guān)鍵字參數(shù)與位置參數(shù)分隔開(kāi)了坷衍,就不必再單獨(dú)用一個(gè) * 隔開(kāi)他們
    4. 函數(shù)參數(shù)定義的順序必須是:必選參數(shù)寝优、默認(rèn)參數(shù)、可變參數(shù)枫耳、命名關(guān)鍵字參數(shù)和關(guān)鍵字參數(shù)
    5. 但是最好不要同時(shí)使用多種參數(shù)類(lèi)型乏矾,導(dǎo)致程序可解釋性太差
  • 遞歸函數(shù)

    1. 理論上,所有的遞歸函數(shù)都可以寫(xiě)成循環(huán)的形式迁杨。但是寫(xiě)成循環(huán)邏輯不清晰
    2. 遞歸函數(shù)要小心過(guò)深的調(diào)用會(huì)導(dǎo)致堆棧溢出(缺點(diǎn))
    3. 采取尾遞歸的方式钻心,遞歸函數(shù)值只會(huì)占用一個(gè)棧幀,就不會(huì)堆棧溢出了铅协。即捷沸,return 的就是遞歸函數(shù)本身,而不是包含遞歸函數(shù)的一個(gè)表達(dá)式
    4. 可惜的是狐史,與大多數(shù)編程語(yǔ)言一樣痒给,python 并沒(méi)有實(shí)現(xiàn)尾遞歸的優(yōu)化坯钦。任何遞歸函數(shù)都存在棧溢出的風(fēng)險(xiǎn)。
    5. 一個(gè)遞歸函數(shù)例子:漢諾塔侈玄!
    6. 對(duì)字符串進(jìn)行遞歸刪除的時(shí)候小心索引錯(cuò)誤婉刀。

高級(jí)特性

  • 切片
    1. 切片操作為什么在對(duì)于空字符串只能用S[0:1]不報(bào)錯(cuò),而用s[0]就會(huì)報(bào)錯(cuò)序仙?
    2. ==切片操作允許超出索引突颊,或者部分缺失;但是對(duì)于數(shù)組取值是不可以的!==
    3. 切片操作能有效代替循環(huán),簡(jiǎn)化程序
  • 迭代
    1. 判斷某變量是否可以迭代 isinstance(s, Iterable)
    2. 想獲得迭代對(duì)象的角標(biāo)可以用 enumerate()函數(shù)
  • 列表生成式
    1. 把代碼寫(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']
  • 生成器
    1. 可以有效節(jié)省程序的內(nèi)存律秃,一個(gè)大的列表,其中的元素隨著程序的運(yùn)行而一個(gè)一個(gè)的生成治唤。
    2. 直接將列表生成式的[] 改成()就可以得到一個(gè)生成器
    3. generator 保存的是生成數(shù)據(jù)的算法棒动,可以通過(guò)for循環(huán)或者next()函數(shù)不斷的迭代新生成的數(shù)據(jù)。
    4. 可以把生成器做成一個(gè)函數(shù)的形式調(diào)用宾添,他和一般的函數(shù)執(zhí)行順序不一樣船惨。執(zhí)行一小段,然后返回 yield缕陕,下次調(diào)用的時(shí)候接著上次執(zhí)行的地方繼續(xù)往下執(zhí)行粱锐。
    5. 注意為生成器設(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'
  • 迭代器
    1. 可迭代對(duì)象list蔬崩、tuple恶座、dict、set沥阳、str跨琳、generator,帶有yield 的generator function
    2. 判斷是否可迭代 isinstance({}, Iterable)
      True
    3. 相比于可迭代對(duì)象list ,迭代器iter([])的好處就是可以放入一個(gè)任意大的迭代對(duì)象,不會(huì)占用大量?jī)?nèi)存沪袭。

模塊

  • 作用域
    1. 類(lèi)似_xxx和__xxx這樣的函數(shù)或變量就是非公開(kāi)的(private)湾宙,不應(yīng)該被直接引用,比如_abc冈绊,__abc等。一般的變量就是公開(kāi)的
    2. 對(duì)于那些不需要外部引用的函數(shù)埠啃,都可以定義成_private()的private形式死宣,代碼更規(guī)范
  • system
    1. 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
    1. map(f(),iterable) 相當(dāng)于把函數(shù)f作用在一個(gè)可迭代對(duì)象中的每一個(gè)元素母赵,返回指是對(duì)應(yīng)的處理后的 iterable 。
    2. 再看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 聲明
    1. 用于函數(shù)套嵌的內(nèi)部函數(shù)周蹭。如果內(nèi)部函數(shù)的變量與外部函數(shù)的變量重名,相當(dāng)于在內(nèi)部函數(shù)新建了一個(gè)同名變量疲恢,內(nèi)部函數(shù)并不能訪問(wèn)修改外部函數(shù)的變量谷醉。
    2. 但是只要在內(nèi)部函數(shù)聲明 nonlocal ‘變量名’ 就可以讓內(nèi)部函數(shù)對(duì)外部變量進(jìn)行==賦值==操作。
    3. 字典不需要nonlocal 聲明就可以在內(nèi)部函數(shù)改變外部字典冈闭。
    4. 可以起到像靜態(tài)變量的作用俱尼,‘只初始化一次,然后不斷改變它
  • filter 過(guò)濾函數(shù)
    1. 與map()函數(shù)的用法一致萎攒,都是輸入量?jī)蓚€(gè)參數(shù)遇八,第一個(gè)是一個(gè)函數(shù),第二個(gè)是iterable
    2. 所需要的返回是True or False 返回的是一個(gè)iter(惰性計(jì)算) ,所以需要套一個(gè)list 才能繼續(xù)工作
    3. 字符串倒序技巧 str(s)[::-1]
  • sorted 排序高階函數(shù)
    1. 可以接受三個(gè)參數(shù)(‘排序?qū)ο蟆?key = ‘函數(shù)’,reverse = True)
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']
  • 返回函數(shù)
    1. 當(dāng)某些功能不必立即執(zhí)行的時(shí)候耍休,定義一個(gè)內(nèi)部函數(shù)刃永,返回該內(nèi)部函數(shù)。
    2. 同樣的語(yǔ)句調(diào)用兩次羊精,返回的兩個(gè)函數(shù)也不會(huì)是一樣的斯够,他們的運(yùn)行結(jié)果也相互獨(dú)立
    3. 相關(guān)參數(shù)和變量都保存在返回的函數(shù)中,這種稱(chēng)為“閉包(Closure)”的程序結(jié)構(gòu)擁有極大的威力喧锦。++編寫(xiě)起來(lái)都是坑++
    4. ==返回閉包時(shí)牢記一點(diǎn):返回函數(shù)不要引用任何循環(huán)變量读规,或者后續(xù)會(huì)發(fā)生變化的變量。==
  • lambda 函數(shù)
    1. 冒號(hào)前面是函數(shù)參數(shù)燃少,后面是函數(shù)體束亏,運(yùn)算結(jié)果就是函數(shù)返回值
    2. 匿名函數(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ù)
    1. 輸入一個(gè)函數(shù)碍遍,返回一個(gè)函數(shù)定铜。在代碼運(yùn)行的期間動(dòng)態(tài)的為一些函數(shù)增加功能
    2. def wrapper(*args, **kw) 這樣的函數(shù)能接受任意參數(shù)形式的函數(shù)作為參數(shù),用在裝飾器內(nèi)部怕敬,接收舊函數(shù)揣炕,返回新函數(shù)是最好的選擇。
    3. 一個(gè)普通的不需要參數(shù)的裝飾器都要decorator 雙層嵌套东跪,而需要的參數(shù)的decorator 需要三層嵌套畸陡。
    4. decorator 會(huì)使func.name發(fā)生變化,導(dǎo)致某些調(diào)用出錯(cuò)越庇≌秩瘢可以在wrapper前面加上@functools.wraps(func)默認(rèn)的裝飾器。起到保持原函數(shù)名不變的功能卤唉。
  • partail 偏函數(shù)
    1. 為了簡(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í)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末隐圾,一起剝皮案震驚了整個(gè)濱河市伍掀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌暇藏,老刑警劉巖蜜笤,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異叨咖,居然都是意外死亡瘩例,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)甸各,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)垛贤,“玉大人,你說(shuō)我怎么就攤上這事趣倾∑傅耄” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵儒恋,是天一觀的道長(zhǎng)善绎。 經(jīng)常有香客問(wèn)我,道長(zhǎng)诫尽,這世上最難降的妖魔是什么禀酱? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮牧嫉,結(jié)果婚禮上剂跟,老公的妹妹穿的比我還像新娘减途。我一直安慰自己,他們只是感情好曹洽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布鳍置。 她就那樣靜靜地躺著,像睡著了一般送淆。 火紅的嫁衣襯著肌膚如雪税产。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天偷崩,我揣著相機(jī)與錄音辟拷,去河邊找鬼。 笑死环凿,一個(gè)胖子當(dāng)著我的面吹牛梧兼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播智听,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼渡紫!你這毒婦竟也來(lái)了到推?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤惕澎,失蹤者是張志新(化名)和其女友劉穎莉测,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體唧喉,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捣卤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了八孝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片董朝。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖干跛,靈堂內(nèi)的尸體忽然破棺而出子姜,到底是詐尸還是另有隱情,我是刑警寧澤楼入,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布哥捕,位于F島的核電站,受9級(jí)特大地震影響嘉熊,放射性物質(zhì)發(fā)生泄漏遥赚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一阐肤、第九天 我趴在偏房一處隱蔽的房頂上張望凫佛。 院中可真熱鬧,春花似錦、人聲如沸御蒲。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)厚满。三九已至府瞄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碘箍,已是汗流浹背遵馆。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丰榴,地道東北人货邓。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像四濒,于是被迫代替她去往敵國(guó)和親换况。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 一盗蟆、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 5,744評(píng)論 0 10
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,097評(píng)論 1 32
  • http://python.jobbole.com/85231/ 關(guān)于專(zhuān)業(yè)技能寫(xiě)完項(xiàng)目接著寫(xiě)寫(xiě)一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,574評(píng)論 1 118
  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,788評(píng)論 0 38
  • 01 和他的婚姻喳资,即將瀕臨破碎觉吭,造成這一切的原因有許多,他們存在一個(gè)非常大的問(wèn)題:溝通時(shí)“口是心非”仆邓。 在愛(ài)得濃烈...
    林小可樂(lè)的屋閱讀 1,077評(píng)論 2 11