python-29-零基础自学python-json、函数等存取用户数据+验证用户信息

学习内容:《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()

第一次运行时,是请输入名字,后续可以继续:

 c9b85081dd884c92af71412c41462822.png

ec06b54f48204eb9ac32ad959045981c.png

 add1b9a9f0fe4c0eac2b3a6d9da2102c.png

第二种写法:把其中对用户是新用户还是老用户的判断单独提出来作为一个函数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的话,运行结果↓

aee16885ba024233a46cdbe88aba5e70.png

↓就是加了return,return的存在很重要很重要

198efb9a610849738cfabba3de22b257.png

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

 

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 08:00:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 08:00:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 08:00:01       58 阅读
  4. Python语言-面向对象

    2024-07-15 08:00:01       69 阅读

热门阅读

  1. 简单理解Lua 协程(coroutine)

    2024-07-15 08:00:01       19 阅读
  2. DangerWind-RPC-framework---七、序列化算法

    2024-07-15 08:00:01       22 阅读
  3. Android RecyclerView

    2024-07-15 08:00:01       18 阅读
  4. 在Ubuntu 14.04上安装和保护phpMyAdmin的方法

    2024-07-15 08:00:01       23 阅读
  5. [NeetCode 150] Redundant Connection

    2024-07-15 08:00:01       26 阅读
  6. PyTorch使用细节

    2024-07-15 08:00:01       23 阅读
  7. Matplotlib库学习之figure.add_subplot函数

    2024-07-15 08:00:01       25 阅读
  8. uniapp 初始学习1

    2024-07-15 08:00:01       31 阅读
  9. 在 YAML 中的变量(使用 &和 * 定义及引用变量)

    2024-07-15 08:00:01       25 阅读
  10. Julia 交互式命令

    2024-07-15 08:00:01       25 阅读
  11. uniapp颜色选择器

    2024-07-15 08:00:01       22 阅读