学习内容:《python编程:从入门到实践》第二版
知识点:
如何验证用户、try-except-else处理异常
if判断、def方法及拆解方法
json引入、存储、读取
return none和return变量返回值很重要
answer ==1 和answer ==“1”在使用后的区别
练习内容:
练习10-13:验证用户 最后一个remember_me.py版本假设用户要么已输入用户名,要么是首次运行该程序。我们应该修改这个程序,以防当前用户并非上次运行该程序的用户。为此,在greet_user()中打印欢迎用户回来的消息前,询问他用户名是否正确。如果不对,就调用get_new_username()让用户输入正确的用户名。
我的代码&运行结果:
第一种方法,直接在原程序中,增加判断:
import json
#引入
def get_stored_username():
filename = "username.json"
try:
with open(filename) as file_object:
username = json.load(file_object)
except FileNotFoundError:
return None#这里为什么不直接调用新的函数,new_username()
else:
return username
def new_username():
username = input('请输入您的名字:')
filename = 'username.json'
with open(filename,'w') as file_object:
json.dump(username,file_object)
return username#这里也有return
def identify_user():
username =get_stored_username()
def greet_user():
username = get_stored_username()
if username:
answer = input(f'hello, are you {username}?if right,enter 1,if wrong, enter 0')
if answer == '1':
print(f"hello,welcome back,{username}")
else:
username = new_username()
print(f"we'll remember you when you come back,{username}")
else:
username = new_username()
print(f"we'll remember you when you come back,{username}")
greet_user()
第一次运行时,是请输入名字,后续可以继续:
第二种写法:把其中对用户是新用户还是老用户的判断单独提出来作为一个函数def identify_user(),如下
import json
#引入
def get_stored_username():
filename = "username.json"
try:
with open(filename) as file_object:
username = json.load(file_object)
except FileNotFoundError:
return None#这里为什么不直接调用新的函数,new_username()
else:
return username
def new_username():
username = input('请输入您的名字:')
filename = 'username.json'
with open(filename,'w') as file_object:
json.dump(username,file_object)
print(f"we'll remember you when you come back,{username}")
return username#这里也有return
def identify_user():#主要变化就是加了这个
username =get_stored_username()
answer = input(f'hello, are you {username}?if right,enter 1,if wrong, enter 0')
if answer == '1':
print(f"hello,welcome back,{username}")
else:
username = new_username()
def greet_user():
username = get_stored_username()
if username:
identify_user()
else:
username = new_username()
greet_user()
第三种写法:这个写法,初次运行不对,还没有解决,这就是换了一个主架构的问题,主要的程序是识别是否为老用户,这个是以identify()为主要程序的。
但是这种拆分我自己认为有点乱,包括上一种,greet里面并不都是greet的内容,而是调用别的函数,真正打招呼的内容都嵌入不同的函数中,修改的时候,可能需要索引找回去修改,似乎有点麻烦,所以怎么分感觉很重要,也比较难判断。
import json
#引入
def get_stored_username():
filename = "username.json"
try:
with open(filename,encoding='utf-8') as file_object:
username = json.load(file_object)
except FileNotFoundError:
#return None#这里为什么不直接调用新的函数,new_username()
return None
else:
return username
def new_username():
username = input('请输入您的名字:')
filename = 'username.json'
with open(filename,'w') as file_object:
json.dump(username,file_object)
return username#不返回的话,最后username不会打印,会显示none
def identify_user():
username = get_stored_username()
if username:
answer = input(f'hello, are you {username}?if right,enter 1,if wrong, enter 0')
if answer == "1":
greet_user()
else:
username = new_username()
print(f"We'll remember you,{username}")
else:
username = new_username()
print(f"We'll remember you,{username}")#这里不能直接使用greet_user
def greet_user():
username = get_stored_username()
print(f"welcome back, {username}")
identify_user()
注意点:
1.练习出现很多问题,有很多是看书以为理解,但是实际上没有理解的部分,比如为什么要加上return username,目前为什么要加return none我还是不理解
2.在如何拆分程序,拆分程序之后,方法应该放在哪里这部分我不是很理解
目前看,最后调用的方法应该放在所有方法最后,根据函数顺序调整,先遇到的放前面
关于怎么拆分,感觉只要遇到判断的都可以拆分,比如招呼新人和招呼老人,还可以继续拆分
3.文件一次只能存一个名字,重新输入会覆盖前面的名字
4.关于return,下面的函数中,最后如果不加return运行
def new_username():
username = input('请输入您的名字:')
filename = 'username.json'
with open(filename,'w') as file_object:
json.dump(username,file_object)
return username#不返回的话,最后username不会打印,会显示none
如果不加返回return的话,运行结果↓
↓就是加了return,return的存在很重要很重要
5.def identify_user():中,if username的用法很重要:用来进行判断,这个用法需要注意,前面没有遇到过,或者掌握不好。
这里还涉及到与get_stored_username()关联的return的用法,在报错时,return none,就会判断为else,而不是走if username的路径。
如果不设置为none,就会继续走if username后续的程序,会直接问对方是不是谁,
return None这个部分也不能设置成 调用函数new_username(),如果设置,将会两次询问,请输入您的名字,原因是:这里直接调用后,在identify中,属于else:又会再调用一次,会产生重复。两次名字输入不同,又将会只引用第二次的调用得到的名字。
6.json的存储和读取
username = json.load(file_object)读取下载
json.dump(username,file_object)储存
注意这两个用法的写法差异,且username是需要存入的内容,file_object是文件
明确username是文件内的信息,username和filename也是需要注意不能混淆的。
7.判断用户名是否正确,用了
if answer == "1"
没有用if answer == 1,这也是一个漏点,answer ==“1”字符串是文本,如果是answer ==1 就会默认是数值,实际上==1 是不可比的,因为answer 输入的内容必须要int()之后,才会是具有可比性的数值。
8.input里面,如果有变量{},也需要用f“”,不然显示的内容就是{username},而不是变量实际那个数。
answer = input(f'hello, are you {username}?if right,enter 1,if wrong, enter 0')