『Python 干貨』#1 基礎(chǔ)語法(簡明)

訪問博客查看 本文 最新內(nèi)容梦鉴,排版更美觀ヾ(?ω?`)o 如有錯(cuò)誤歡迎指出~

Python 系列學(xué)習(xí)筆記:

跟著貴系的暑培過了一遍語法擒悬,然而寫代碼時(shí)還是感到乏力啸臀,總覺得要打一遍才能記住,于是有了這篇博客呀酸。

本文部分內(nèi)容參考了清華 AYF 同學(xué)的教程厅篓,部分參考了 Python 官方的一份 Tutorial,函數(shù)用法參考了 xyfJASON 的博客透且。本文將持續(xù)更新撕蔼。

Python 特性

相比于 C 的編譯型、弱類型秽誊、靜態(tài)類型特點(diǎn)鲸沮,Python 則是一種解釋型、強(qiáng)類型锅论、動(dòng)態(tài)類型的語言讼溺。

交互式 vs 腳本

作為一種解釋型語言,Python 不需要像 C 一樣編譯運(yùn)行棍厌,它可以逐行運(yùn)行代碼肾胯,因此又分為交互式窗口運(yùn)行與腳本運(yùn)行兩種模式:

  • 交互式窗口:在 CLI 輸入 python,即可進(jìn)入交互式窗口耘纱,輸入一行代碼即可運(yùn)行敬肚。本文使用的交互式環(huán)境是 IPython,輸入 ipython 即可呼出束析。
  • 腳本:在 CLI 輸入 python xxx.py艳馒,就會(huì)依次執(zhí)行整個(gè)腳本文件。本文使用的 IDE 是 PyCharm

Hello World

>>> print('Hello, world!') # 打印輸出
Hello, world!

在交互式窗口弄慰,>>> 作為提示符第美,在 IPython 中則是 In [1]:。執(zhí)行 exit() 或者按下 Ctrl+D 就能退出窗口陆爽。

注意到什往,這行代碼中沒有 ; 分號(hào),可以直接運(yùn)行而無需編譯慌闭,字符串用了單引號(hào)别威,注釋用 # 開始【與 C 不同】。

簡單數(shù)據(jù)類型

變量類型

【與 C 不同】驴剔,Python 不用聲明變量類型省古,解釋器自動(dòng)解釋。

  • int:變長整數(shù)丧失,默認(rèn)是 4 字節(jié)豺妓,有需要時(shí)自動(dòng)增長,用于高精度運(yùn)算布讹,還支持十六進(jìn)制琳拭、八進(jìn)制和二進(jìn)制表示。
  • complex:自帶的復(fù)數(shù)類型炒事,表示為 real + imag*1j 的形式臀栈,虛部為 1 的時(shí)候不可省略 1,可以用 j 也可以用 J挠乳。實(shí)虛部分別為一個(gè) float权薯。
  • float:8 字節(jié)浮點(diǎn)數(shù),【相當(dāng)于 C 的 double】睡扬。
  • bool:True 和 False盟蚣,注意首字母大寫,用作數(shù)值計(jì)算時(shí)與 C 一樣視作 0 和 1卖怜。
  • NoneType: None屎开,空值,常用于返回值马靠、特判奄抽。

需要單獨(dú)說明的是,Python 會(huì)存儲(chǔ)所有的 -5 到 256 的整數(shù)甩鳄,其他任何變量是這些值時(shí)逞度,會(huì)被指向這個(gè)預(yù)先開好的內(nèi)存,因此任何兩個(gè)值為 5 的 int 變量都指向同?內(nèi)存地址妙啃。

盡量用小寫變量名(下劃線法)档泽,這是 Python3 的主流命名方式俊戳。

運(yùn)算符

這里列出常見的運(yùn)算符,運(yùn)算符可以重載馆匿,重載需要修改其對應(yīng)的定義函數(shù)抑胎。

算術(shù)運(yùn)算符

  • + - *【與 C 相同】
  • %35 % 4 == 3-35 % 4 == 1渐北,35 % -4 == -1阿逃,-35 % -4 == -3,【與 C 不同:負(fù)數(shù)對正數(shù)取模時(shí)返回正余數(shù)腔稀,而非像 C 那樣返回負(fù)余數(shù)】
  • /__trudiv__盆昙,真除,得到 float 結(jié)果
  • //__floordiv__焊虏,除后向下取整(不是舍棄小數(shù)),得到 int 結(jié)果
  • **__pow__秕磷,冪運(yùn)算

比較運(yùn)算符

  • < <= > >= == != 【與 C 相同】

位運(yùn)算符:

  • & | ^ ~ << >> 【與 C 相同】

賦值運(yùn)算符

  • =:賦值號(hào)诵闭,不能被重載
  • += -= *= /= %= 【與 C 相同】
  • 注意 Python 中沒有 ++ -- 的運(yùn)算符,只能通過 += 1 實(shí)現(xiàn)

邏輯運(yùn)算符

  • and or not 【類似 C 中的 && || 澎嚣!
  • 對于 andor疏尿,通常用于條件分支 bool 的判斷,如果非要連接 int 變量易桃,得到的結(jié)果不會(huì)直接轉(zhuǎn)換為 bool褥琐,而是返回能夠得出結(jié)果最后一個(gè)變量【與 C 中的短路類似】

三目運(yùn)算符

  • a if cond else b:相當(dāng)于 C 中的 cond ? a : b,注意其參數(shù)順序【與 C 不同】晤郑,但更貼近自然語言

特殊條件運(yùn)算符

  • in:被包含于敌呈,詳見下文「容器」,返回 bool
  • not inin 的否定造寝,返回 bool
  • is:判斷兩個(gè)變量的地址是否相同磕洪,不可重載,返回 bool
  • is not:判斷兩個(gè)變量地址是否不同诫龙,不可重載析显,返回 bool

字符串

Python 將字符串封裝成了基本類型并處理了多種運(yùn)算,帶來許多便利签赃,注意基本類型本身是不可修改的谷异,所謂修改其實(shí)是將重新生成另一個(gè)字符串,再將其賦值給目標(biāo)锦聊。

此外歹嘹,Python 中沒有單獨(dú)的字符類型,單個(gè)字符將被視為長度為 1 的字符串括丁≤裣拢【與 C 不同】,可以用 "" 或者 '' 括起字符串。

下面是一些常用函數(shù)尖昏,設(shè) str 是一個(gè)字符串:

  • str.title():返回單詞首字母大寫仰税,其余字母小寫(不管以前是不是大寫)的字符串
  • str.upper()str.lower():返回全大/小寫的字符串
  • str1 + str2:返回用加號(hào)拼接的字符串【與 C++ 的 string 類似】
  • str * 3:返回重復(fù)三遍拼接的字符串
  • 制表符 \t抽诉,換行符 \n【與 C 相同】
  • str.lstrip()陨簇、str.rstrip()str.strip(): 返回刪除開頭/末尾/兩端空白的字符串
  • str.replace(str1, str2):將字符串中的單詞 str1 全部替換成 str2
  • str.split():以空格為分隔符把字符串拆成一個(gè)個(gè)單詞迹淌,并返回包含這些單詞的列表

此外還有一種跨行字符串河绽,用 ’‘’”“” 括起來,由于腳本中順序執(zhí)行時(shí)不會(huì)輸出變量值唉窃,這類字符串常用于跨行注釋耙饰,特別是函數(shù)頭注釋。

輸入輸出與編碼

此處說明幾個(gè)重要函數(shù):

  • len(obj):獲取 obj 的長度纹份,常用于獲取字符串(注意是 Unicode苟跪,因此中文和英文字符都占 1 位)、字節(jié)串蔓涧、容器的長度
  • str(a): 把數(shù)字(整型或浮點(diǎn)型) a 轉(zhuǎn)換成字符串
  • chr(0x4f60):將整型變量 i 轉(zhuǎn)化成單個(gè)字符
  • ord('你'):獲取單個(gè)字符的編碼(Unicode)件已,注意在 Unicode 中,英文字母的編碼有意設(shè)置與 ASCII 碼一致

最常用的輸出語句 print元暴,本質(zhì)上是將變量轉(zhuǎn)化為字符串輸出篷扩,在末尾自動(dòng)換行。該函數(shù)可以有多個(gè)變量茉盏,變量間用 , 分隔鉴未,輸出時(shí)會(huì)用空格隔開。

如果要在一句話中插入許多變量援岩,這條 print 語句可能會(huì)很丑陋歼狼,因此 Python 中有三種格式化字符串的方法。

  • %:如 print('I am %d' % (age))享怀,【與 C 類似】
  • str.format():如 print('hello, {}'.format(name))
  • f-string:如 print(f'hello,{name}.I am {age}')

其中 f-string 是 Python3.6 的新特性羽峰,最為直觀便利。

此外添瓷,input('Press ENTER to continue') 是常見的一種輸入語句梅屉,會(huì)顯示對應(yīng)的提示內(nèi)容,讀入內(nèi)容以回車鍵結(jié)尾鳞贷。

字節(jié)串

bytes 即是 Python 中的字節(jié)串坯汤,它表示最純粹的二進(jìn)制數(shù)據(jù),【類似 C 的 unsigned char *】搀愧,但是在顯示上它僅支持 ASCII 顯示惰聂,因此用肉眼看顯得有些不倫不類疆偿,通常它只存在于數(shù)據(jù)的處理過程中。

bytes 的構(gòu)造與字符串類似搓幌,但是要加一個(gè) b 做前導(dǎo)杆故,如 print(b'\x41')

容器

Python 提供了一系列內(nèi)置容器溉愁,它們?nèi)缤?C++ 的 STL ?樣处铛,不過比 STL 的用法靈活得多。

同樣先介紹幾個(gè)重要函數(shù):

  • type(obj):可以獲取參數(shù) obj 的類型
  • isinstance(obj, class_or_tuple):可以判斷 obj 是不是類的實(shí)例
  • id(obj):獲取 obj 的地址拐揭, a is b 等價(jià)于 id(a) == id(b)

列表 | List

列表(list)是很常用的容器撤蟆,常被看作 Python 中的數(shù)組,但實(shí)際上【與 C++ 的 vector 類似】堂污。設(shè) lst 是一個(gè)列表:

基礎(chǔ)操作

  • 定義列表:lst = [a, b, c, d] 家肯,其中 a,b,c,d 等是列表的元素,類型可以不同
  • 構(gòu)造空列表:直接寫 []list()
  • 打印列表:print(lst)(會(huì)將列表中的元素列出盟猖,括在方括號(hào)里)
  • 訪問元素:lst[3] 息楔, 下標(biāo)從 0 開始。此外扒披,還支持負(fù)數(shù)索引,-1 表示倒數(shù)第一個(gè)圃泡,-2 倒數(shù)第二個(gè)【與 C 不同】

修改碟案、添加、刪除元素

  • 修改:直接訪問元素并賦值
  • lst.append(x):在列表末尾添加元素 x
  • lst.insert(idx, x):在列表索引 idx 處插入一個(gè)元素 x (插入后颇蜡,x 的索引是 idx价说,其后的元素后移一格)
  • del lst[3]:刪除指定元素(刪除后,其后元素前移一格)
  • lst.pop():彈出并返回最后一個(gè)元素
  • lst.pop(idx):彈出并返回指定元素
  • lst.remove(x):刪除第一個(gè)值為 x 的元素

組織列表

  • lst.sort()风秤、lst.sort(reverse = True):對列表排序鳖目,永久性修改順序
  • sorted(lst)sorted(lst, reverse = True):返回排序后的列表缤弦,但不改變列表原有順序
  • lst.reverse():翻轉(zhuǎn)列表领迈,永久性修改順序
  • len(lst):返回列表長度,即元素個(gè)數(shù)(不論類型)

遍歷列表

從頭到尾遍歷列表:for i in lst: 循環(huán)表達(dá)式

【與 C 不同】i 是列表元素碍沐,不是索引狸捅;循環(huán)結(jié)束后 i 停留為最后一個(gè)元素。

若要檢查列表是否為空累提,可以用 if lst: 條件表達(dá)式尘喝,返回 bool

列表切片

  • lst[l:r]:返回一個(gè)列表,元素依次是 lst 列表的索引在左閉右開區(qū)間內(nèi)的元素斋陪,省略 lr 則默認(rèn)從頭開始或到尾結(jié)束

  • lst[l:r:step]:指定步長為 step 切片朽褪,step 為 -1 時(shí)返回倒序

  • 可以用循環(huán)遍歷列表切片:for i in lst[l:r]:

  • 復(fù)制列表:在切片中同時(shí)省略 lr置吓,即返回從頭到尾的列表,如 lst2 = lst1[:]缔赠,而非 lst2=lst1衍锚,后者lst1lst2 實(shí)質(zhì)是同一個(gè)列表【類似 C 的引用】

元組 | Tuple

元組就是元素值不可修改(弱意義上的,其中元素的元素可以被修改)的列表橡淑。設(shè) tpl 是一個(gè)元組:

基礎(chǔ)操作

  • 定義元組:tpl = (a, b, c, d)构拳,把列表定義中的方括號(hào)改成圓括號(hào) () 即可
  • 定義時(shí)的小括號(hào)有時(shí)候可以省略,可以直接用 , 逗號(hào)構(gòu)造元組【與 C 不同梁棠,沒有逗號(hào)運(yùn)算符】
  • 構(gòu)造單元組:(1) 會(huì)被理解成表達(dá)式置森,要用 (1,)
  • 構(gòu)造空元組,直接寫 ()tuple()符糊,但 (,) 會(huì)報(bào)錯(cuò)
  • 訪問元素:tpl[3] 凫海, 下標(biāo)從 0 開始。

遍歷元組

for i in tpl: 和列表一樣

修改元組

元組中元素的值不能修改男娄,但是元組變量本身可以被賦值行贪,這點(diǎn)與字符串類似。此外模闲,如果元組的中的元素是可修改的建瘫,如 List,

元組解包

經(jīng)典的 Python 交換賦值代碼:a, b = b, a尸折,利用了解包和逗號(hào)構(gòu)造

集合 | Set

集合由一組無序啰脚、互不重復(fù)的元素構(gòu)成(在數(shù)學(xué)上也是如此),在內(nèi)部用哈希實(shí)現(xiàn)实夹。設(shè) st 是一個(gè)集合:

基礎(chǔ)操作

  • 定義集合:st = {1, 2, 3}橄浓,把列表定義的方括號(hào)改成花括號(hào) {} 即可
  • 構(gòu)造空集合:只能用 set(),因?yàn)?{} 的表達(dá)被空字典占用了
  • 由列表轉(zhuǎn)集合:st = set([1, 1, 1, 2, 2, 3])亮航,會(huì)自動(dòng)去重荸实,常用于去重列表的遍歷 for i in set(lst):
  • 注意集合的元素必須是可 hash 的,不能為 list 這種可變?nèi)萜髯兞?/li>

添加缴淋、刪除元素

  • st.add(4):添加一個(gè)元素
  • st.remove(2):刪除一個(gè)元素

字典 | Dictionary

字典是一系列「鍵值對」准给,用于存儲(chǔ)一組有窮映射,可將任何 Python 對象作為值宴猾,【類似于更高端版本的 C++ 的 map】圆存。

基礎(chǔ)操作

  • 定義字典:dic = {'name': '張三', 'age': 18}花括號(hào)括起一系列鍵值對仇哆,鍵與值之間冒號(hào) : 分隔沦辙,鍵值對之間逗號(hào) , 分隔。
  • 訪問元素:d['name']讹剔,用鍵訪問
  • 注意字典的鍵必須是可 hash 的油讯,不能為 list 或 set 這種可變?nèi)萜髯兞肯昝瘢梢允?tuple

添加、修改陌兑、刪除

  • 添加:直接賦值即可(即使鍵本來不存在)沈跨,如:dic['x'] = 0
  • 修改:dic['age'] = 18,直接賦值即可
  • 刪除:del dic['age']

遍歷字典

  • 遍歷所有鍵值對:for k, v in dic.items():兔综,其中 items() 返回鍵值對的列表
  • 遍歷所有鍵:for k in dic.keys():饿凛,其中 keys() 返回鍵的列表,可省略
  • 由于 keys() 的本質(zhì)是列表软驰,各種對列表的操作也適用涧窒,如:for k in sorted(dic.keys()):if 'age' in dic.keys():
  • 遍歷所有值:for v in dic.values():,其中 values() 返回值的列表

迭代器

前文提到的所有容器锭亏,包括字符串纠吴、字節(jié)串都是可迭代的,這意味著它們可以用 for 循環(huán)來遍歷慧瘤,也可以用生成式構(gòu)造(下面介紹)戴已。

但最為特殊的迭代器是 range 類型,作為數(shù)值列表锅减,與列表有相似之處糖儡,但它實(shí)際上不占用內(nèi)存(用于大循環(huán)時(shí)很節(jié)省空間)。下面是一些常用方法:

  • range(l, r):依次生成左閉右開區(qū)間中的整數(shù)【類似于 C++ 的 for(int i = l; i < r; i++)】怔匣,如果省略左端休玩,會(huì)默認(rèn)以 0 開始
  • range(l, r, step):指定步長為 step【類似于 C++ 的 for(int i = l; i < r; i += step)
  • min(range(l, r))max(range(l, r))劫狠、sum(range(l, r)):返回?cái)?shù)值列表的最小值、最大值永部、總和
  • for i in range(10): 的循環(huán)中改變了 i 的值独泞,如 i += 1, 不會(huì)影響循環(huán)的次數(shù)苔埋,因?yàn)榈髦械臄?shù)值列表是不可修改的【與 C 不同】

生成式

使用生成式構(gòu)造容器是非常常見懦砂、高效的操作,下面舉幾個(gè)例子:

  • a = list(range(10)):直接轉(zhuǎn)化數(shù)值列表為基本列表
  • lst = [i ** 2 for i in a]:列表生成式
  • st = {x % 7 for x in a}:集合生成式
  • dic = {x ** 2: x for x in a}:字典生成式组橄,保留 : 來分隔鍵與值
  • tpl = tuple(x + 1 for x in a):元組生成式荞膘,直接用 () 會(huì)被當(dāng)成表達(dá)式

綜上所述,生成式表達(dá)可以用三段式:表達(dá)式 for 循環(huán)變量 in 迭代對象 if 篩選條件玉工,其中最后的篩選條件不一定要羽资。

流程控制

Python 中不用大括號(hào)來顯式地分塊,而是用冒號(hào)配合縮進(jìn)遵班。代碼塊與代碼塊之間至少隔著一個(gè)空行表示結(jié)束屠升。當(dāng)一個(gè)代碼塊必須存在潮改,又不想寫任何語句的時(shí)候,可以寫一個(gè) pass 作為占位符腹暖。

條件分支

a = 1
if a == 1:
    print('a is 1')
elif a == 0:
    print('a is 0')
else:
    print('wtf is a?')

注意汇在,elifelse 后面也要有冒號(hào)配合縮進(jìn),如果有多個(gè)條件脏答,用 andor 邏輯運(yùn)算符連接糕殉。

for 循環(huán)

前面所列的容器、數(shù)值列表都可以用于 for 循環(huán)迭代殖告,比較特別的是字符串也可以迭代:

a = 'hello world'
for c in a:
    print(c) # 豎著打印出 hello world阿蝶,因?yàn)?print 自帶換行

此外,如果在數(shù)值列表的迭代中用不到迭代變量 i丛肮,僅作為迭代次數(shù)使用赡磅,可以用 _ 變量表達(dá)。

while 循環(huán)

a = 10
while 2 <= a < 20:    # 語法糖宝与,這種寫法是被建議使?的
    print(a)
    a -= 1            # 注意 Python 中沒有?增 1 和?減 1 運(yùn)算符

跳出循環(huán)可以用 breakcontinue【與 C 相同】

函數(shù)

基礎(chǔ)函數(shù)

def fib(n):
    """函數(shù)文檔注釋"""
    current, then = 0, 1
    for _ in range(n):
        current, then = then, current + then
    return current

fib(10) # 調(diào)用函數(shù)

函數(shù)傳參

函數(shù)傳參本質(zhì)上和賦值號(hào)是一樣的焚廊,都是淺復(fù)制(指針指向)【類似 C 的形參】。

傳入?yún)?shù)的數(shù)量可以不固定习劫,但是必須指定默認(rèn)值咆瘟;也可以調(diào)換順序,但必須指明對象诽里。

def add(a, b = 0):
    print(a + b)

add(1)              # 參數(shù) b 采用默認(rèn) 0
add(b = 2, a = 1)   # 調(diào)換順序袒餐,指明對象

當(dāng)然,也可以傳遞列表等容器谤狡,但傳遞的也是列表的地址灸眼,在函數(shù)中修改同樣會(huì)改變原列表,如果不想修改原列表可以用 [:] 傳遞切片墓懂。

傳遞任意數(shù)量的參數(shù)

  • 在形參前加星號(hào) *焰宣,Python3 會(huì)創(chuàng)建一個(gè)該形參名稱的元組
  • 在形參前加雙星號(hào) **,Python3 會(huì)創(chuàng)建一個(gè)該形參名稱的字典

返回值

作為動(dòng)態(tài)類型語言捕仔,函數(shù)返回值可以不固定匕积,可以多個(gè) return 在不同情況下返回不同值,或者沒有 return(等價(jià)于 return None)榜跌。

函數(shù)模塊調(diào)用

函數(shù)可以被存儲(chǔ)在模塊中被調(diào)用闪唆,模塊是擴(kuò)展名為 .py 的文件,包含函數(shù)的代碼【類似于 C 的頭文件】

  • 導(dǎo)入整個(gè)模塊:使用 import pizza 導(dǎo)入钓葫,調(diào)用時(shí)使用 . 句點(diǎn)悄蕾,如:pizza.make(16, 'green peppers')
  • 導(dǎo)入模塊中特定函數(shù):使用 from pizza import make, eat,調(diào)用時(shí)無需句點(diǎn)础浮,直接用函數(shù)名
  • 導(dǎo)入特定函數(shù)別名:使用 from pizza import make as mk笼吟,調(diào)用時(shí)無需句點(diǎn)库物,直接用別名
  • 導(dǎo)入模塊中所有函數(shù):使用 from pizza import *,調(diào)用時(shí)無需句點(diǎn)贷帮,但是會(huì)污染命名空間戚揭,不建議使用

所有 import 都放在程序開頭【類似于 C++ 的 #include<>】。

Lambda 匿名函數(shù)

和很多語言?樣撵枢,Python 中可以使用 Lambda 匿名函數(shù)完成一些簡單的邏輯民晒,但比較特殊的地方在于,Python 中匿名函數(shù)必須只由單個(gè)表達(dá)式構(gòu)成锄禽,這個(gè)表達(dá)式的值也就是匿名函數(shù)的返回值潜必。

lambda 關(guān)鍵字可以用來創(chuàng)建一個(gè)匿名函數(shù),緊跟其后的是參數(shù)列表和用冒號(hào) : 分割開的單個(gè)表達(dá)式沃但。如磁滚,lambda x: 2 * x 是將任何輸入的數(shù)乘 2,而 lambda x, y: x+y 是計(jì)算兩個(gè)數(shù)字的和宵晚。

使用匿名函數(shù)的經(jīng)驗(yàn)準(zhǔn)則是保持簡單以及只在本地使用一次垂攘。一種常見卻不推崇的做法是將其作為簡單函數(shù)的另一種聲明方式,賦值給變量淤刃,如:

>>> doubler = lambda x: 2 * x
>>> doubler(5)
10
>>> type(doubler)
<class 'function'>

對 lambda 函數(shù)命名的唯一作用可能是出于教學(xué)目的晒他,其問題在于這使得調(diào)試不那么直觀——錯(cuò)誤信息只會(huì)提示某個(gè) lambda 函數(shù)存在問題,但不會(huì)提示哪個(gè)函數(shù)逸贾。

正確的做法應(yīng)該是將其作為參數(shù)傳遞陨仅,如 .sort 函數(shù)、sorted 函數(shù)等铝侵,此時(shí)單個(gè)表達(dá)式會(huì)被計(jì)算為一個(gè)值并且參與后續(xù)的計(jì)算灼伤。

>>> integers = [(3, -3), (2, 3), (5, 1), (-4, 4)]
>>> sorted(integers, key=lambda x: x[-1])
[(3, -3), (5, 1), (2, 3), (-4, 4)]

>>> nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> nums.sort(key=lambda a: abs(5-a))
>>> nums
[5, 4, 6, 3, 7, 2, 8, 1, 9]

文件操作

讀取文件

一種【與 C 相似】的操作是:

file = open('temp.txt', 'r')    # 打開一個(gè)文件,返回表示文件的對象
contents = file.read()          # 讀取整個(gè)文件
print(contents)
file.close()                    # 關(guān)閉文件

此外咪鲜,還有一種更推崇的操作方式饺蔑,使用 with 上下文管理器,將打開的文件的對象存儲(chǔ)在 as 后的變量嗜诀,這樣可以避免由于忘記關(guān)閉文件導(dǎo)致丟失數(shù)據(jù):

with open('temp.txt', 'r') as file:
    contents = file.read()
    print(contents)

回到讀取本身,方法 read() 讀取整個(gè)文件的內(nèi)容并返回單個(gè)字符串孔祸,并包含每個(gè) \n 換行符隆敢。

但實(shí)際操作中讀入一個(gè)長字符串是丑陋而且難以處理的,我們更傾向于逐行讀入崔慧,用 line.rstrip() 消除行末的 \n

with open('temp.txt', 'r') as file:
    for line in file:   # file 也可作為一個(gè)迭代器
        print(line)     # 注意每一行末都會(huì)有一個(gè) \n 被打印拂蝎,而 print 本身又自帶換行

另一種逐行讀入是創(chuàng)建一個(gè)包含文件各行內(nèi)容的列表,每個(gè)元素是一行內(nèi)容的字符串惶室,包含行尾的 \n

with open('temp.txt', 'r') as file:
    line1 = file.readline()     # 讀入第一行作為字符串
    lines = file.readlines()    # 讀入第二行以后的行(文件指針被移動(dòng)了)

寫入文件

with open('temp.txt', 'w') as file:
    file.write("I love programming.\n") # wirte 不會(huì)換行温自,要手動(dòng)加

open() 函數(shù)的第二個(gè)實(shí)參 w 表示寫入(自動(dòng)創(chuàng)建或覆蓋原內(nèi)容)玄货,r 表示只讀,a 表示附加(自動(dòng)創(chuàng)建或添加到文件末尾)悼泌,r+ 表示讀寫松捉。如果不加第二個(gè)實(shí)參,則默認(rèn)為 r 只讀馆里。

方法 write() 表示將字符串寫入文件隘世。如果要寫入數(shù)值,應(yīng)先用 str() 將其轉(zhuǎn)化為字符串鸠踪。

Python 中的類基礎(chǔ)用法比 C/C++ 更簡潔一些丙者,待補(bǔ)充。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末营密,一起剝皮案震驚了整個(gè)濱河市械媒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌评汰,老刑警劉巖纷捞,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異键俱,居然都是意外死亡兰绣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門编振,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缀辩,“玉大人,你說我怎么就攤上這事踪央⊥涡” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵畅蹂,是天一觀的道長健无。 經(jīng)常有香客問我,道長液斜,這世上最難降的妖魔是什么累贤? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮少漆,結(jié)果婚禮上臼膏,老公的妹妹穿的比我還像新娘。我一直安慰自己示损,他們只是感情好渗磅,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般始鱼。 火紅的嫁衣襯著肌膚如雪仔掸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天医清,我揣著相機(jī)與錄音起暮,去河邊找鬼。 笑死状勤,一個(gè)胖子當(dāng)著我的面吹牛鞋怀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播持搜,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼密似,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了葫盼?” 一聲冷哼從身側(cè)響起残腌,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贫导,沒想到半個(gè)月后抛猫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡孩灯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年闺金,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片峰档。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡败匹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出讥巡,到底是詐尸還是另有隱情掀亩,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布欢顷,位于F島的核電站槽棍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏抬驴。R本人自食惡果不足惜炼七,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望布持。 院中可真熱鬧豌拙,春花似錦、人聲如沸鳖链。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芙委。三九已至逞敷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間灌侣,已是汗流浹背推捐。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留侧啼,地道東北人牛柒。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像痊乾,于是被迫代替她去往敵國和親皮壁。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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