| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
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)一些别的方面稍有不同就不再多做赘述了 
 
那么。。。 
差不多就这些了。。。 
对于那些争议 
就最后应用贴吧大佬给我的一句话: 
就当练练手啦! 
 
各位一起加油啦!耶! 
 |   
 
评分
- 
查看全部评分
 
 
 
 
 
 |