先編寫一個程序,用戶首次運行程序時被提示輸入自己的名字,這樣再次運行程序時就記住他了。
我們調用json.dump()將用戶名存儲到文件中,使用json.load() 將存儲在username.json中的信息讀取到變量username 中。恢復用戶名后,我們就可以歡迎用戶回來了。
# -*- coding: utf-8 -*-
import json
# 如果以前存儲了用戶名,就加載它
# 否則,就提示用戶輸入用戶名并存儲它
filename = "username.json"
try:
with open(filename) as f_obj:
username = json.load(f_obj)
except IOError:
username = raw_input("What is your name: ")
filename = "username.json"
with open(filename,'w') as f_obj:
json.dump(username,f_obj)
print("We'll remember you when you come back, " + username + "!")
else:
print("Welcome back, " + username + "!")
首次運行的結果:
What is your name: leilei
We'll remember you when you come back, leilei!
Process finished with exit code 0
第二次運行的結果:
Welcome back, leilei!
Process finished with exit code 0
重構
為了讓代碼更清晰、更易于理解、更容易擴展,使用重構的方法改良代碼,把問候用戶的代碼全部放到一個名為greet_user() 的函數中,再調用這個函數:
# -*- coding: utf-8 -*-
import json
def greet_user():
"""問候用戶,并指出其名字"""
filename = "username.json"
try:
with open(filename) as f_obj:
username = json.load(f_obj)
except IOError:
username = raw_input("What is your name: ")
filename = "username.json"
with open(filename,'w') as f_obj:
json.dump(username,f_obj)
print("We'll remember you when you come back, " + username + "!")
else:
print("Welcome back, " + username + "!")
greet_user()
結果:
Welcome back, leilei!
Process finished with exit code 0
現在是一個函數執行多項任務,為了更簡潔,將獲取存儲的用戶名的代碼移到另一個函數中:
# -*- coding: utf-8 -*-
import json
def get_stored_username():
"""如果存儲了用戶名,就獲取它"""
filename = "username.json"
try:
with open(filename) as f_obj:
username = json.load(f_obj)
except IOError:
return None
else:
return username
def greet_user():
"""問候用戶,并指出其名字"""
username = get_stored_username()
if username:
print("Welcome back, " + username + "!")
else:
username = raw_input("What is your name: ")
filename = "username.json"
with open(filename,'w') as f_obj:
json.dump(username,f_obj)
print("We'll remember you when you come back, " + username + "!")
greet_user()
新增的函數get_stored_username() 實現獲取用戶名。如果存儲了用戶名,這個函數就獲取并返回它;如果文件username.json不存在,這個函數就返回None。
這是一種不錯的做法:函數要么返回預期的值,要么返回None ;這讓我們能夠使用函數的返回值做簡單測試。
如果成功地獲取了用戶名,就打印一條歡迎用戶回來的消息,否則就提示用戶輸入用戶名。
除此之外,我們還可以將提示用戶輸入用戶名部分的代碼單獨作為一個函數使用:
# -*- coding: utf-8 -*-
import json
def get_stored_username():
"""如果存儲了用戶名,就獲取它"""
filename = "username.json"
try:
with open(filename) as f_obj:
username = json.load(f_obj)
except IOError:
return None
else:
return username
def get_new_username():
"""提示用戶輸入用戶名"""
username = raw_input("What is your name: ")
filename = "username.json"
with open(filename,'w') as f_obj:
json.dump(username,f_obj)
return username
def greet_user():
"""問候用戶,并指出其名字"""
username = get_stored_username()
if username:
print("Welcome back, " + username + "!")
else:
username = get_new_username()
print("We'll remember you when you come back, " + username + "!")
greet_user()
從上面的代碼看出每個函數都執行單一而清晰的任務。我們調用greet_user() ,它打印一條合適的消息:要么歡迎老用戶回來,要么問候新用戶。
為此,它首先調用get_stored_username() ,這個函數只負責獲取存儲的用戶名(如果存儲了的話),再在必要時調用get_new_username() ,這個函數只負責獲取并存儲新用戶的用戶名。