str和repr內置函數
在介紹Python的輸入輸出之前,我們先來介紹兩個內置函數,str()
和repr()
,它們都用來輸出對象的字符串形式。不過它們之間有一個重要區別,repr()
主要輸出解釋器可以讀取的字符串形式,而str()
輸出人類易讀的字符串形式。
當然雖然它們之間有區別,但是很多類型的str()
和repr()
形式完全相同。
print('--------------str函數--------------')
a_list = [1, 2, 3, 4, 5]
print(f'str():{str(a_list)}')
print('--------------repr函數--------------')
print(f'repr():{repr(a_list)}')
字符串格式化
format函數
介紹了內置函數之后,下面我們來介紹一下Python字符串格式化的方法。首先是位置參數的方式。我們需要調用字符串上面的format()
函數,然后按照{0}
這樣的順序將參數傳入。
print('--------------字符串格式化--------------')
name = 'yitian'
age = 24
sentence = '{0} is {1} years old'.format(name, age)
print(sentence)
當然也可以使用命名參數方式。這樣字符串中需要修改為{name}
這樣的形式,format
函數中也需要使用關鍵字參數方式傳值。
sentence = '{name} is {age} years old'.format(name=name, age=age)
print(sentence)
數字格式化
如果需要格式化數字,需要在字符串的占位符中添加冒號和格式化符號。要格式化的是浮點數,就用:.3f
這樣的符號,小數點后面的數字代表要精確到的小數點后數位;要格式化的是正數,就是用:5d
這樣的,d前面的數字表示前面要空的位數。如果使用命名參數的話把占位符數字改為參數名即可。
import math
print('PI is {0:.3f}'.format(math.pi))
print('100 is {integer:5d}'.format(integer=100))
結果如下。
PI is 3.142
100 is 100
格式化字符串
以前我也學了一點Python,不過就小小的入了個門。這次重新學習的時候,我第一件要了解的事情就是格式化字符串(formatted string),這個特性在C#、Kotlin等很多語言中都有,使用非常方便。
格式化字符串需要在字符串前面添加一個f
,表示這是格式化字符串,這樣,字符串中就不需要占位符并調用format()
方法了。我們可以將字符串和要插入的值寫在一起。Python會幫我們執行實際的字符串格式化操作。如果需要格式化符,只要在花括號中插入冒號并在后面跟上即可。
print('--------------格式化字符串--------------')
print(f'PI is {math.pi:.4f}')
這種方式最方便。所以我在需要格式化字符串的地方都使用了這種方式。
舊式格式化
如果你學習過Python2.7 之類的舊Python版本,應該對下面的格式化方式很熟悉。
>>> import math
>>> print('The value of PI is approximately %5.3f.' % math.pi)
The value of PI is approximately 3.142.
不過由于這是一種舊的方式,可能在Python3中被移除。所以我們最好還是使用前面幾種。
終端輸入和輸出
終端輸入
終端輸入很簡單,使用input()
函數即可。input()
函數還可以接受一個提示字符串,在接受用戶輸入前會打印提示字符串,為用戶做一些提示。input()
函數返回的是輸入的字符串形式,即使輸入的是數字。所以如果輸入的是數字之類的信息,我們需要進行轉換才能使用。
print('--------------終端輸入--------------')
input_string = input('Please input some words:')
print(input_string)
終端輸出
終端輸出其實不用介紹了,用的使我們到目前為止非常熟悉的一個函數print()
。print()
函數可以接受多個參數來輸出。如果需要對輸出形式進行控制,可以設置print()
函數的sep
和end
參數。sep
是多個輸出之間的分隔符,默認是一個空格。而end
是輸出的結尾,默認是換行。
print('--------------終端輸出--------------')
print('這是一段輸出', '下一段輸出', sep=',', end='\n')
再舉一個例子,輸出九九乘法表。{i*j:<5}
的作用是數據寬度為5,左邊不足的用空格補充。
print('--------------九九乘法表--------------')
for i in range(1, 10):
for j in range(1, i + 1):
print(f'{j}X{i}={i*j:<5}', end='')
print()
結果是非常漂亮的三角形。
--------------九九乘法表--------------
1X1=1
1X2=2 2X2=4
1X3=3 2X3=6 3X3=9
1X4=4 2X4=8 3X4=12 4X4=16
1X5=5 2X5=10 3X5=15 4X5=20 5X5=25
1X6=6 2X6=12 3X6=18 4X6=24 5X6=30 6X6=36
1X7=7 2X7=14 3X7=21 4X7=28 5X7=35 6X7=42 7X7=49
1X8=8 2X8=16 3X8=24 4X8=32 5X8=40 6X8=48 7X8=56 8X8=64
1X9=9 2X9=18 3X9=27 4X9=36 5X9=45 6X9=54 7X9=63 8X9=72 9X9=81
文件讀寫
open內置函數
文件讀取
最簡單的文件讀寫方式就是open(filename, mode)
內置函數了,filename
參數指定要讀寫的文件名,mode
指定了文件模式,模式可以是w
(只寫)、r
(只讀)、a
(追加)、r+
(讀寫)、b
(二進制),默認是r
。
下面的例子讀取了Windows操作系統下的hosts文件。
print('--------------open內置函數--------------')
hosts_file=open(r'C:\Windows\System32\drivers\etc\hosts')
print(hosts_file.read())
f.read(size)
函數會返回指定大小的文件內容,如果文件是文本模式(默認的),返回的就是字符串;如果文件是二進制模式(使用了模式b
),那么返回的就是二進制對象。如果size
未指定,就會返回整個文件內容。如果文件比較大,使用該方法就需要格外注意了。
f.readline()
函數返回文件的一行,再次調用返回下一行。如果返回空行代表文件已到末尾了。
還可以直接遍歷文件內容。這種方式很高效,因為每次只讀了一行,所以即使是大文件也可以順利讀取完畢。如果需要將文件讀取為列表,可以使用f.readlines()
函數。
>>> for line in f:
... print(line, end='')
文件用完之后需要調用close()
方法關閉,也可以使用with
語句自動關閉文件。
with open('test.txt', 'w') as output:
.........
.........
文件寫入
文件寫入使用write
函數即可。需要注意如果需要寫入一個新文件,記得把模式修改為w
,如果使用r+
的話會提示文件不存在。
下面這個例子將上面的hosts文件內容保存到另一個文件中。
import os
with open('test.txt', 'w') as output:
output.write('# This is a test file' + os.linesep)
output.writelines(hosts_content)
下面是文件寫入函數的簡單總結。
函數名 | 作用 |
---|---|
write | 寫入內容到文件 |
writelines | 寫入所有行到內容 |
seek | 將游標移動到指定字節 |
json讀寫
json處理是一項非常常見的任務。說實話動態語言更適合處理json,因為json本來就是動態語言JavaScript的格式。相對來說,靜態語言處理json要麻煩一點,比如Java要處理json,首先需要編寫一個實體類,然后用類庫提供的注解將json的值與類的屬性對應起來。而動態語言就沒這么麻煩,直接讀到對象中,然后使用就行了。
python標準庫中提供了json庫,可以非常方便的在python對象和json字符串之間進行轉換。json庫的使用也非常簡單,主要就4個函數:dump
(輸出json到文件)、dumps
(輸出json到字符串)、load
(從文件加載對象)、loads
(從字符串加載對象)。
print('--------------json--------------')
import json
string1 = json.dumps([1, 2, 3, 'fuck'])
print(f'string1:{string1}')
personal_info = {'name': 'yitian', 'age': 24, 'gender': 'male'}
string2 = json.dumps(personal_info)
print(f'string2:{string2 }')
json1 = json.loads('[1,2,3,4,"5"]')
print(f'json1:{json1}')
json2 = json.loads('[{"name":"yitian","age":24},{"name":"zhang3","age":25}]')
print(f'json2:{json2}')