[关闭]
@myles 2018-04-23T16:49:55.000000Z 字数 2546 阅读 693

第一次作业问题笔记

老男孩基础


1、if流控制

在进行“编写登陆认证程序”基本版本作业时发现自己对if控制流的理解,特别是那种if...eslif...else并列控制流与if嵌套控制流的理解有点胡乱和模糊,这里做下学习小结。

我这里基于自己的与理解将他分为以下2中控制流,即:“if并列控制流”,“if嵌套控制流”

1.1 if 并列控制

if并列控制结构:

  1. if...:
  2. if-block
  3. elif...:
  4. elif-block
  5. else...:
  6. else-block

使用场景:条件关系

注意:这里的并列 if...elif...elif...else 中任何一个else 被执行了整个

1.2 if 嵌套控制

if嵌套控制结构:

  1. if 条件1:
  2. if 条件2: #block体
  3. if 条件3:
  4. do sth
  5. else:
  6. else-block

1.3 作业代码

if 并列控制流作业实例

2、换行符的切片

在进行锁定账号信息判读时,其中遇到一个需要逐行读取“文件”中锁定的用户名信息并进行比对的问题。

问题描述:在将提取出来的用户信息与用户输出进行比对时候发现每一行用户名结尾都会多一个换行符‘\n’,无法匹配。

(1)lock_user.txt 存储文档
首先分析了locl_user.txt文档中用户账号信息的存储,发现其特点是逐行存储的。

  1. admin
  2. test

(2)逐行读取锁定账号存入列表lst;

  1. lst = []
  2. with open('d:/tmp/lock_user.txt') as f:
  3. for line in f:
  4. lst.append(line)

(3)被锁的账号信息读取
但是通过测试打印输出发现每个从lock_user.txt中读取的账号信息结尾都多了一个'\n'换行符,我们无法直接逐行读取:

  1. print(lst)
  2. ['test\n', 'admin\n']

(4) 如何进行将锁定账号读取出来,并去除'\n'换行符。这里最后通过本组组长的提示使用字符串列表切片,将账号结尾的‘\n’换行符统一过滤掉即可。

  1. lst = []
  2. with open('d:/tmp/lock_user.txt') as f:
  3. for line in f:
  4. lst.append(line[:-1])

知识点小结:

3、for 循环中的break 使用

当我读取lock_user.txt文件中的信息后并逐条存入lst列表后,我想使用for 循环读取lock_user信息配合if判断存当前用户输入的账户名username是否已经存在与列表中来进行break中循环时,发现存在一个bug。

(1)bug代码

  1. # 使用for 循环读取lock_user 配合if判断存在bug --- break 不能放到for循环里面使用
  2. for lock_user in lst: #
  3. if username == lock_user:
  4. print("当前用户%s已经被锁定,如需解锁请联系系统管理员!!!")
  5. break # break 为什么没有执行??? ---> 其实已经执行了,只是结束了当前这个for循环,while循环并不受此影响,故while循环仍然在继续执行。
  6. print("break 测试...")
  7. print(lock_user)

Bug 分析:仔细阅读上面的代码发现break是存在与for循环中的,而列表中当前存在多个元素,当我们判断出现if条件成立时,for循环其实已经停止,但是这里的break与for循环是一体的,它仅停止了for的循环,并没能结束外围的while循环。

(2)bug运行输出结果

图片.png

学习小结while循环中的 break 如果放到for循环中,那这个break与for就构成了一体,它仅能停止当前的for循环,并不能停止外围的while循环。 所以在以后的break使用中要了解以下几点。

break一句话总结:如果您使用嵌套循环,break语句将停止执行最深层的循环,并开始执行下一行代码。

(3) 修正后的代码

直接使用if 配合 in 判读 用户输入username 是否存在与列表中,条件符合直接执行 break中终止while循环。

  1. if username in lst:
  2. print("当前用户%s已经被锁定,如需解锁请联系系统管理员!!!")
  3. break

4、账号密码验证逻辑不严谨

个人作业代码中存在账号与密码验证不严谨的问题,在辅导老师的辅导下进行了代码逻辑的优化。

(1)个人代码账号逻辑不严谨问题

  1. # 判断当前账号与密码是否匹配
  2. if username in user and password in passwd:
  3. print("欢迎登陆本系统!!!")

问题分析:我这里原代码直接使用in进行账号与密码各自是否存在于userpasswd列表中。这里有一个验证的逻辑问题,就是无那个账号被验证存在后,其密码对应可以是passwd列表中的任意一个密码。也就是说我当前的账号与密码验证产生的效果是:

每一个存在与`user`列表中的账号,都可以有3个密码来登录系统,严重的bug问题。

(2)优化后的账号密码验证逻辑

优化思路:是通过提取user用户列表中的用户账号对于的index索引,然后使用这个index所以对应去查找其唯一的密码。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注