鱼C论坛

 找回密码
 立即注册
查看: 2605|回复: 12

第14课练习题看不懂,球懂的高手给解释下。

[复制链接]
发表于 2014-8-1 16:43:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

# 密码安全性检查代码
#
# 低级密码要求:
#   1. 密码由单纯的数字或字母组成
#   2. 密码长度小于等于8位
#
# 中级密码要求:
#   1. 密码必须由数字、字母或特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)任意两种组合
#   2. 密码长度不能低于8位
#
# 高级密码要求:
#   1. 密码必须由数字、字母及特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)三种组合
#   2. 密码只能由字母开头
#   3. 密码长度不能低于16位

symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
nums = '0123456789'

passwd = input('请输入需要检查的密码组合:')

# 判断长度
length = len(passwd)

while (passwd.isspace() or length == 0) :
    passwd = input("您输入的密码为空(或空格),请重新输入:")

if length <= 8:
    flag_len = 1
elif 8 < length < 16:
    flag_len = 2
else:
    flag_len = 3

flag_con = 0

# 判断是否包含特殊字符
for each in passwd:
    if each in symbols:
        flag_con += 1
        break
   
# 判断是否包含字母
for each in passwd:
    if each in chars:
        flag_con += 1
        break

# 判断是否包含数字
for each in passwd:
    if each in nums:
        flag_con += 1
        break   

# 打印结果
while 1 :
    print("您的密码安全级别评定为:", end='')
    if flag_len == 1 or flag_con == 1 :
        print("低")
    elif flag_len == 2 or flag_con == 2 :
        print("中")
    else :
        print("高")
        print("请继续保持")
        break

    print("请按以下方式提升您的密码安全级别:\n\
    \t1. 密码必须由数字、字母及特殊字符三种组合\n\
    \t2. 密码只能由字母开头\n\
    \t3. 密码长度不能低于16位'")
    break
从for循环开始不太明白了,谁能把那三个for循环结合题意尽可能详细的讲讲,我是零基础的菜鸟,怕太简单了还是不明白。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-8-1 16:45:59 | 显示全部楼层
从for循环开始不太明白了,谁能把那三个for循环结合题意尽可能详细的讲讲,我是零基础的菜鸟,怕太简单了还是不明白。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-1 19:31:08 | 显示全部楼层
哇 确实好牛逼啊 楼主好厉害哦{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-1 19:50:35 | 显示全部楼层
本帖最后由 mumudontcry 于 2014-8-1 19:52 编辑

三个for的结构是一样的,代表的含义也差不多,我就拿一个做例子,另外两个你自己试着理解一下
for each in passwd:
    if each in symbols:
        flag_con += 1
        break
从英文的角度来理解(python就是为了让程序变得跟读英文似的)
for each in passwd::让each 在passwd里(循环),就是把passwd里的字符从头到尾赋值给each
    if each in symbols::如果each在symbols里,symbols是已经定义好的一个特殊字符的字符串,也就是说,对于每一个从那个passwd里取出来的字符,如果在特殊字符串里出现,那么就
        flag_con += 1:flag_con,程序命名都是有规则的,一般是会把具有含义的英文作为名字,flaga,标志,con可以认为是count的缩写,也就是计数,也就是说代表某种标志的计数器,这里是指代“安全密码级别”的标志,从后面while里的if判断可以看得出来。接上if each in symbols:就是如果从passwd里取出来的字符是特殊字符,那么就让安全密码级别加1
        break:退出循环。只要符合了可以提升安全密码级别的一次条件,就没有必要再循环下去
三个for循环结合来看就是,判断是否包含:特殊字符,字母,数字。包含一种就提升一级安全级别

其实注释已经说明的很清楚了,要是不明白,就回去补基础,比如,for,if的概念什么的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-1 20:11:36 | 显示全部楼层
mumudontcry 发表于 2014-8-1 19:50
三个for的结构是一样的,代表的含义也差不多,我就拿一个做例子,另外两个你自己试着理解一下
for each in ...

谢谢木木大帅哥哈哈,竟然手打这么多,无以感谢啊,,,,,你竟然可以理解的这么透彻,,,菜鸟好无奈,不过看了你的解释,我基本也明白了,还有我把每个for程序的break去掉了,貌似也可以啊,能不能去掉呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-1 20:21:19 | 显示全部楼层
mumudontcry 发表于 2014-8-1 19:50
三个for的结构是一样的,代表的含义也差不多,我就拿一个做例子,另外两个你自己试着理解一下
for each in ...

for each in passwd:
    if each in symbols:
        flag_con += 1
        break
我是这样理解的,如果不带break,passwd中的字符一个个赋值给each,每个被赋值的each只要在symbols众出现,flag_con就会执行一次一次flag_con+=1,
如果带break的话,passwd中的字符一个个赋值给each,然后each中只要第一次有一个值在symbols出现,flag_con加1后程序就停止了,这样理解对吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-1 20:21:54 | 显示全部楼层
mumudontcry 发表于 2014-8-1 19:50
三个for的结构是一样的,代表的含义也差不多,我就拿一个做例子,另外两个你自己试着理解一下
for each in ...

for each in passwd:
    if each in symbols:
        flag_con += 1
        break
我是这样理解的,如果不带break,passwd中的字符一个个赋值给each,每个被赋值的each只要在symbols众出现,flag_con就会执行一次一次flag_con+=1,
如果带break的话,passwd中的字符一个个赋值给each,然后each中只要第一次有一个值在symbols出现,flag_con加1后程序就停止了,这样理解对吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-1 20:22:30 | 显示全部楼层
mumudontcry 发表于 2014-8-1 19:50
三个for的结构是一样的,代表的含义也差不多,我就拿一个做例子,另外两个你自己试着理解一下
for each in ...

for each in passwd:
    if each in symbols:
        flag_con += 1
        break
我是这样理解的,如果不带break,passwd中的字符一个个赋值给each,每个被赋值的each只要在symbols众出现,flag_con就会执行一次一次flag_con+=1,
如果带break的话,passwd中的字符一个个赋值给each,然后each中只要第一次有一个值在symbols出现,flag_con加1后程序就停止了,这样理解对吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-1 20:26:34 | 显示全部楼层
cable5881 发表于 2014-8-1 19:31
哇 确实好牛逼啊 楼主好厉害哦

不要讽刺我好不好。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-2 01:58:05 | 显示全部楼层
sunny989129 发表于 2014-8-1 20:11
谢谢木木大帅哥哈哈,竟然手打这么多,无以感谢啊,,,,,你竟然可以理解的这么透彻,,,菜鸟好无奈, ...

去掉你还是没有理解我说的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-2 02:04:53 | 显示全部楼层
sunny989129 发表于 2014-8-1 20:22
for each in passwd:
    if each in symbols:
        flag_con += 1

你解释的虽然没有错,但是,为什么要去掉break,所谓标志,就是达到某个条件的时候,就会触发另一种情况,像这里的break,比如whie t =True:…………………………if OOXX t =False这个时候,t就是一种标志,提醒你,因为到达了条件OOXX,所以,t就要变化成False,此时就会结束循环。啊……刚才有只像小甲鱼一样的臭虫飞我脖子上(喵的,我房间为毛有臭虫!),我捏死了,然后手好臭
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-2 08:41:47 | 显示全部楼层
mumudontcry 发表于 2014-8-2 02:04
你解释的虽然没有错,但是,为什么要去掉break,所谓标志,就是达到某个条件的时候,就会触发另一种情况 ...

我说后,就发现错了,哈哈哈,还有你的程序我也仔细看了,你中间有个
for i in passwd:
if a==0 and i in  number
num+=1
a=1
这里a==0 后最后变为 a=1 是不是相当于小甲鱼程序的break的作用啊

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-2 08:48:33 | 显示全部楼层
mumudontcry 发表于 2014-8-2 02:04
你解释的虽然没有错,但是,为什么要去掉break,所谓标志,就是达到某个条件的时候,就会触发另一种情况 ...

我们办公室尼玛的还有老鼠,竟然跑到办公室抽屉里面了,最后几个人把它抓到了,放到一个装有一半水的桶里让它一直游泳,它游啊游,最后嘿嘿,累死了。


话说你是几点睡的啊,半夜了还回复。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 19:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表