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}')