鱼C论坛

 找回密码
 立即注册
查看: 1875|回复: 1

[学习笔记] 新手鱼的大神梦(python笔记014)

[复制链接]
发表于 2018-7-28 21:07:25 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 圣剑三刀。abx 于 2018-7-28 21:07 编辑

因为神奇的原因,所以。。。我之前写好的那个完整版笔记,爆了。。。
写了30min的
啊锕锕锕锕锕锕锕锕
我xxxxxx

原因详见:
http://bbs.fishc.org/forum.php?m ... peid%26typeid%3D256

好了我们缓一下
重新再写一遍。。。

014
0、分片和索引列表的形式同样适用于字符串
      如:  
          >>> str1 = 'I love fishc.com'
          >>> str1[:6]
          'I love'
          >>> str1[5]
          'e'
1、字符串的不可改变性(类似元组,目前只能用分片法修改标签所指向的字符串)
2、常用操作符也都适用于字符串(因为字符串了、列表、元组都属于序列啦!)
3、字符串方法整理归类:
        零、改变类:
                (0)改变大小写:
                                capitalize()               upper()               swapcase()
                                casefold()                lower()                title()
                (1)对齐:(width指整个字符串长度)
                                center()                    ljust()
                                zfill()                        rjust()
                (2)去除空格:
                                lstrip()                     rstrip()
                                strip()        #可定制去除的字符
                (3)改变选定的字符串:
                                replace()                translate(str.maketrans())
                (4)分割:
                                expandtabs()         partition()                split()
                                join()                   rpartition()                splitlines()
                   注意:只是返回一个改变的字符串,原字符串并不改变

        一、判断类:
                startswith()                  isalnum()                        isalpha()
                endswith()                   isnumeric()                      isdigit()
               
                isupper()                     isspace()                         isdecimal()
                islower()                      istitle()

        二、查找类:
                find()                           rfind()
                index()                        rindex()

4、网站答疑                       
        (0)http://bbs.fishc.org/forum.php?m ... peid%26typeid%3D256
        (1)http://bbs.fishc.org/forum.php?m ... peid%26typeid%3D259

课后习题
0、定义一个跨越多行的字符串的三种方法(‘’ / ’’’ ’’’)
1、三引号的作用(不赋值时,经常用作跨行注释)
2、转义符号及原始字符串的复习
3~5、字符串的索引以及分片的使用
6、分片中步进的运用(做出来了,嘻嘻,保留和第一次写时一样的语气hhh,贼高兴)

动动手
这道题呢综合的运用了字符串的许多知识(判断字符串所含内容之类),还有其他一些比如for循环的知识。
但这道题因为其复杂和丰富性导致了题目意思方面会有些争议的点(下面会具体说明的),我和参考答案给出的代码是不一样的,下面会做具体分析。
以下分析部分主要从答案的结构入手,关注于如何实现,而不是如何想到
先放参考答案:(辛苦小甲鱼老师了!可长了)
# 密码安全性检查代码
#
# 低级密码要求:
#   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("您输入的密码为空(或空格),请重新输入:")
    length = len(passwd)

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 == 3 and flag_con == 3 and (passwd[0] in chars):
        print("高")
        print("请继续保持")
        break
    else:
        print("中")

    print("请按以下方式提升您的密码安全级别:\n\
    \t1. 密码必须由数字、字母及特殊字符三种组合\n\
    \t2. 密码只能由字母开头\n\
    \t3. 密码长度不能低于16位")
    break
废话不多说,我们来一部分一部分分析:
第一部分:这一部分特别亮眼有没有,也特别高明。因为这部分代码写在下一部分接受用户输入的代码前,而它的一部分作用就是规定了密码的范围,还有一部分作用是为下面判断字符串的所含信息做准备。
第二部分:接受用户的输入
第三部分:运用len函数判断字符串长度,并使用条件分支(根据低中高的要求)规定了三个范围,判断出用户输入的密码所属的长度范围。(事实上也可以在后面给低中高级别时一起判断,但这个比较清楚???个人喜好吧)
第四部分:利用三个for循环来检验字符串所含的信息量。其实仔细读这段代码发现,它巧妙地只判断字符串中含有  (1)字母(2)数字(3)特殊字符  中的几种,而不是判断出具体含有这三种中的那种。这样也使后面很好的判断出低中高,所以说它巧妙。但有个问题,见靠下的网站答疑,所以说这道题是有些争议的,这也是参考答案与我自己写的代码的不同之处。
第五部分:利用之前准备好的长度范围和字符所含信息量,综合起来判断密码的低中高。然后先判断低,因为它最容易满足,为什么用or逻辑操作符呢,而不是and。这就在于如果密码只要符合了低的任何一个要求,就不符合中与高的要求了,所以只要一个True,就是低,所以用or。然后为什么之后是高呢,不应该低中高吗?因为高的要求最严苛,但因此范围也就小,目标明确,所以这样只要搞定高,中自然就判断出来了。另外也是因为中的两两组合的判断实在麻烦,正好就回避掉啦。很棒棒不是吗!最后为什么这部分代码整个在一个while循环里,因为这样配合break就能有选择的,打印最后那段话。没错~

之后是我自己做题时写的代码
a=b=c=d=0
symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
level = '您的密码安全级别评定为:'
remind = '''请按以下方式提升你的密码安全级别:
                 1、密码必须由数字、字母以及特殊字符三字组成
                 2、密码只能由字母开头
                 3、密码长度不能低于16位'''
temp = input('请输入需要检查的密码组合:')
length = len(temp)
for i in range(length):
        if temp[i].isdigit():
            a = 1
        elif temp[i].isalpha():
            b = 1
        elif not temp[i].isalnum():
            c = 1
            if not (temp[i] in symbols):
                d = 1
if d == 1:
    print('输入不合法,只可输入以下特殊字符:');print(symbols)
elif (a!=b) and (c==0) or (length <= 8):
        print(level + '低');print(remind)
elif (a==b==c==1) and (length >=16) and temp[0].isalpha():
        print(level + '高');print('请继续保持')
else:
        print(level + '中');print(remind)
说一下不同点
(0)我强制规定了可以使用的特殊字符,否则显示输入错误。而参考答案不是这样的???所以这又是题目的一个争议点
(1)for循环的结构稍有不同,而且我只用一个for来具体判断含有哪些种类信息。与参考答案用了3个for循环,判断所含信息量不同
(2)判断中我规定了纯特殊字符不是低,而参考答案则不是。又是一个争议点
(3)一些别的方面稍有不同就不再多做赘述了

那么。。。
差不多就这些了。。。
对于那些争议
就最后应用贴吧大佬给我的一句话:
就当练练手啦!

各位一起加油啦!耶!

评分

参与人数 2荣誉 +1 鱼币 +6 收起 理由
morningmao + 1 + 1 无条件支持楼主!
青春奋斗 + 5

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2018-8-1 09:05:38 | 显示全部楼层
参考答案也只是参考,只要达到一样的目的,如果你的命令行更少,运行速度更快,那应该就是更好的方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 22:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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