訪問博客查看 本文 最新內(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 中的&&
||
澎嚣!
】 - 對于
and
和or
疏尿,通常用于條件分支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 in
:in
的否定造寝,返回 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)的元素斋陪,省略l
或r
則默認(rèn)從頭開始或到尾結(jié)束lst[l:r:step]
:指定步長為step
切片朽褪,step
為 -1 時(shí)返回倒序可以用循環(huán)遍歷列表切片:
for i in lst[l:r]:
復(fù)制列表:在切片中同時(shí)省略
l
和r
置吓,即返回從頭到尾的列表,如lst2 = lst1[:]
缔赠,而非lst2=lst1
衍锚,后者lst1
和lst2
實(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?')
注意汇在,elif
和 else
后面也要有冒號(hào)配合縮進(jìn),如果有多個(gè)條件脏答,用 and
和 or
邏輯運(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)可以用 break
和 continue
【與 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ǔ)充。