鱼C论坛

 找回密码
 立即注册
查看: 2037|回复: 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. #
  3. # 低级密码要求:
  4. #   1. 密码由单纯的数字或字母组成
  5. #   2. 密码长度小于等于8位
  6. #
  7. # 中级密码要求:
  8. #   1. 密码必须由数字、字母或特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)任意两种组合
  9. #   2. 密码长度不能低于8位
  10. #
  11. # 高级密码要求:
  12. #   1. 密码必须由数字、字母及特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)三种组合
  13. #   2. 密码只能由字母开头
  14. #   3. 密码长度不能低于16位

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

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

  19. # 判断长度
  20. length = len(passwd)

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

  24. if length <= 8:
  25.     flag_len = 1
  26. elif 8 < length < 16:
  27.     flag_len = 2
  28. else:
  29.     flag_len = 3

  30. flag_con = 0

  31. # 判断是否包含特殊字符
  32. for each in passwd:
  33.     if each in symbols:
  34.         flag_con += 1
  35.         break
  36.    
  37. # 判断是否包含字母
  38. for each in passwd:
  39.     if each in chars:
  40.         flag_con += 1
  41.         break

  42. # 判断是否包含数字
  43. for each in passwd:
  44.     if each in nums:
  45.         flag_con += 1
  46.         break   

  47. # 打印结果
  48. while 1 :
  49.     print("您的密码安全级别评定为:", end='')
  50.     if flag_len == 1 or flag_con == 1 :
  51.         print("低")
  52.     elif flag_len == 3 and flag_con == 3 and (passwd[0] in chars):
  53.         print("高")
  54.         print("请继续保持")
  55.         break
  56.     else:
  57.         print("中")

  58.     print("请按以下方式提升您的密码安全级别:\n\
  59.     \t1. 密码必须由数字、字母及特殊字符三种组合\n\
  60.     \t2. 密码只能由字母开头\n\
  61.     \t3. 密码长度不能低于16位")
  62.     break
复制代码

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

之后是我自己做题时写的代码
  1. a=b=c=d=0
  2. symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
  3. level = '您的密码安全级别评定为:'
  4. remind = '''请按以下方式提升你的密码安全级别:
  5.                  1、密码必须由数字、字母以及特殊字符三字组成
  6.                  2、密码只能由字母开头
  7.                  3、密码长度不能低于16位'''
  8. temp = input('请输入需要检查的密码组合:')
  9. length = len(temp)
  10. for i in range(length):
  11.         if temp[i].isdigit():
  12.             a = 1
  13.         elif temp[i].isalpha():
  14.             b = 1
  15.         elif not temp[i].isalnum():
  16.             c = 1
  17.             if not (temp[i] in symbols):
  18.                 d = 1
  19. if d == 1:
  20.     print('输入不合法,只可输入以下特殊字符:');print(symbols)
  21. elif (a!=b) and (c==0) or (length <= 8):
  22.         print(level + '低');print(remind)
  23. elif (a==b==c==1) and (length >=16) and temp[0].isalpha():
  24.         print(level + '高');print('请继续保持')
  25. else:
  26.         print(level + '中');print(remind)
复制代码

说一下不同点
(0)我强制规定了可以使用的特殊字符,否则显示输入错误。而参考答案不是这样的???所以这又是题目的一个争议点
(1)for循环的结构稍有不同,而且我只用一个for来具体判断含有哪些种类信息。与参考答案用了3个for循环,判断所含信息量不同
(2)判断中我规定了纯特殊字符不是低,而参考答案则不是。又是一个争议点
(3)一些别的方面稍有不同就不再多做赘述了

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

各位一起加油啦!耶!

评分

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

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 05:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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