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

news2024/11/15 11:12:20

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1927261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA创建项目模块右边缺少Maven的解决

一、问题描述 我们在创建项目模块时,创建为Maven工程,创建后只是普通工程,idea右边缺少Mavenue标识管理 如图 二、问题的解决方法 在模块的pom.xml文件,点击选项,添加为Maven工程 如图 至此,创建maven工程…

2-34 小波神经网络采用传统 BP 算法

小波神经网络采用传统 BP 算法,存在收敛速度慢和易陷入局部极小值两个突出弱点。建立了基于遗传算法的小波神经网络股票预测模型 GA-WNN。该模型结合了遗传算法的全局优化搜索能力以及小波神经网络良好的时频局部特性。运用 MATLAB 对拟合和预测过程进行仿真。结果表…

COLING 2024 | AlphaFin:基于LLM的股票预测大模型,显著提高预测能力

COLING 2024 | AlphaFin:基于LLM的股票预测大模型,显著提高预测能力 发布于 2024-06-13 18:31:49 目前,机器学习和深度学习算法(ML&DL)已被广泛应用于股票趋势预测,并取得了显著进展。然而&#xff0c…

CSS在页面中使用的三种方式:行内样式、内嵌式样式表、链接式样式表

CSS样式如何在页面中使用,包含三种方式:行内样式、内嵌式样式表、链接式样式表。 CSS样式的使用系列博文: 《CSS在页面中使用的三种方式:行内样式、内嵌式样式表、链接式样式表》 《CSS选择器:基本选择器、复合选择器、…

Android TabLayout+ViewPager2如何优雅的实现联动详解

一、介绍 Android开发过程中,我们经常会遇到滑动导航栏的做法,之前的做法就是我们通过ViewGroup来转动,然后通过大量的自定义来完成,将导航栏item与viewpage 滑动,达到业务需求 二、现实方案 通过介绍,我…

Springboot 校园安全通事件报告小程序-计算机毕业设计源码02445

Springboot 校园安全通事件报告小程序系统 摘 要 随着中国经济的飞速增长,消费者的智能化水平不断提高,许多智能手机和相关的软件正在得到更多的关注和支持。其中,校园安全通事件报告小程序系统更是深得消费者的喜爱,它的出现极大…

揭秘|SSL证书年度费用:网络安全预算规划指南

在数字化时代,网络安全已成为企业不可或缺的一部分。对于任何在线业务而言,保护客户数据和维护网站安全至关重要。其中,SSL(Secure Sockets Layer)证书扮演着关键角色,它通过加密网站与用户之间的通信来确保…

[JS]Generator

介绍 Generator函数是 ES6 提供的一种异步编程解决方案, async是该方案的语法糖 核心语法 Generator对象由生成器函数返回, 并且它符合可迭代协议和迭代器协议 生成器函数在执行时能暂停, 后面又从暂停处继续执行 <script>// 1.定义生成器函数function* testGenerato…

前端实现一键复制功能

1、下载插件 npm i vue-clipboard32.0.0 2、在需要复制的文件中引入插件并使用&#xff1a; JS: import useClipboard from "vue-clipboard3"; const { toClipboard } useClipboard(); HTML: <el-tooltip content"复制内容" placement"top&…

继承和多态(上)

目录 继承 继承方式 切片&#xff08;切割&#xff09; 重定义&#xff08;隐藏&#xff09; 继承的6个默认成员函数 继承与友元&#xff0c;静态成员 菱形继承 菱形继承的冗余和二义性 继承和组合 继承 什么是继承&#xff1f; 是代码复用的一种手段。 语法&#xff…

生物科技食品公司企业网站模板带手机端:完整源代码包及搭建教程

系统概述 本模板设计秉承“科技引领健康&#xff0c;绿色塑造未来”的理念&#xff0c;融合生物科技的先进性与食品行业的健康属性&#xff0c;通过简洁大气的界面布局、清新自然的色彩搭配以及流畅的用户体验&#xff0c;展现企业的专业实力与品牌形象。无论是产品展示、企业…

Java 实验四:类和对象的应用

一、实验目的 1、掌握类的声明、对象的创建、方法的定义和调用、构造函数的使用。 二、实验环境 1、windows11; 2、JDK1.8,集成开发环境Eclipse。 三、实验内容 &#xff08;一&#xff09;定义一个表示学生信息的类Student ①类Student的成员变量&#xff1a; sNo …

Java 客户端操作 Redis 命令(端口号映射方法,命令演示,注意事项)

文章目录 开放端口号问题引入依赖验证连接通用命令使用set 和 get 命令的使用exists 和 del 命令的使用keys 命令的使用expire 和 ttl 命令type 命令的使用 String 类型命令使用mset 和 mget 命令getrange 和 setrange 命令append 命令incr 和 decr 命令 list 类型命令使用lpus…

AI会不会让更多人失业?

最近网上热议的内容&#xff1a;武汉市萝卜快跑无人驾驶的网约车与出租车抢生意&#xff0c;惹来了很多人的非议。 有的人说AI科技应该是帮助人们去做一些高危险的事情&#xff0c;或者是一些比较脏&#xff0c;累的工作&#xff0c;比如救灾&#xff0c;排爆&#xff0c;航天探…

docker emqx 配置密码和禁用匿名连接

mqtt版本emqx/emqx:4.4.3 1.首先把镜像内目录/opt/emqx/etc拷贝到本地 2.做映射 3.allow_anonymous&#xff0c; false改成true 4. 5.MQTTX连不上的话看看下图的有没有打开

电商数据分析在品牌控价中的关键作用

品牌在进行控价操作时&#xff0c;会运用电商价格监测系统来监测线上数据&#xff0c;这些数据可能涵盖本品牌以及竞品的数据&#xff0c;其数据量无疑是巨大的。倘若只是单纯地进行品牌数据监测&#xff0c;并输出所监测到的低价数据&#xff0c;对于数据的价值挖掘而言&#…

【线程安全】关于死锁问题

文章目录 死锁的基本概念死锁的四个必要条件避免死锁避免死锁的算法死锁检测算法 死锁的基本概念 死锁是指在一组进程中的各个进程均占有不会释放的资源&#xff0c;但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。当然&#xff0c;线程之间同样也有死…

Chrome浏览器的Profile数据内容简介

前文简介了Chrome存储的账密/Cookie数据&#xff1a;一段代码读取Chrome存储的所有账号密码和Cookie 本文再扩展介绍一下Chrome存储的其它一些隐私数据。 注&#xff1a;因为业务需要&#xff0c;简单调研了一些基本内容和存储路径&#xff0c;没有深入去研究&#xff0c;有啥…

C 语言指针进阶

1.0 指针的定义 指针是内存中一个最小单元的编号&#xff08;内存单元的编号称之为地址【地址就是指针指针就是地址】&#xff09;指针通常是用来存放内存地址的一个变量。本质上指针就是地址&#xff1a;口语上说的指针起始是指针变量&#xff0c;指针变量就是一个变量&#…

本地部署,Flash Diffusion: 加速条件扩散模型实现快速图像生成

目录 引言 技术背景 Flash Diffusion 的架构与原理 Flash Diffusion 的主要特点 本地部署 运行结果 实验结果与分析 应用实例 结论 GitHub - gojasper/flash-diffusion: Official implementation of ⚡ Flash Diffusion ⚡: Accelerating Any Conditional Diffusion M…