小甲鱼第十四课:字符串总结反思

2. file1 = open(‘C:\windows\temp\readme.txt’, ‘r’)表示以只读方式打开“C:\windows\temp\readme.txt”这个文本文件,但事实上这个语句会报错,知道为什么吗?你会如何修改?**
答:

会报错是因为在字符串中,我们约定“\t”和“\r”分别表示“横向制表符(TAB)”和“回车符”,因此并不会按照我们计划的路径去打开文件。 Python 为我们铺好了解决的道路,只需要使用原始字符串操作符(R或r)即可:

file1 = open(r’C:\windows\temp\readme.txt’, ‘r’)

作者:无罪的坏人
链接:https://www.jianshu.com/p/ae903027f184
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

6.据说只有智商高于150的鱼油才能解开这个字符串(还原为有意义的字符串):str1 = 'i2sl54ovvvb4e3bferi32s56h;$c43.sfc67o0cm99’
答:str1[::3]
###注意,步长为三是从首字母开始计数,间隔两个字符!

编程题
0. 请写一个密码安全性检查的脚本代码:check.py

需求:
   低级密码要求:
#   1. 密码由单纯的数字或字母组成
#   2. 密码长度小于等于8位

   中级密码要求:
#   1. 密码必须由数字、字母或特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)任意两种组合
#   2. 密码长度不能低于8位

   高级密码要求:
#   1. 密码必须由数字、字母及特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)三种组合
#   2. 密码只能由字母开头
#   3. 密码长度不能低于16位
首先放上自己的错误代码:并对其进行分析
str ='~!@#$%^&*()_=-/,.?<>;:[]{}\|'
num = 0
eng = 0
str1= 0
both = 0
while True:
#这里注意whlie Ttue 是大写T
    temp = input("请设置一个密码:")
    length = len (temp)
    while temp.isspace() or length == 0:
        print('输入不能为空,请重新输入:')
        temp = input()
        length = len (temp)
        #由于这个定义在while循环外,所以需要重新定义
    for each in temp:
        if each.isdigit():
            num = 1
        if each.isalpha():
            eng = 1
        if str.find(each):
            str1= 1
            #这里写的有点问题,正确的应该直接用检查符号in
          修改为  if each in str:
                     str1= 1
            #
        both = (num) + (eng) + (str1)
    if length <= 8 and temp.isalnum():
        print('您输入的密码安全等级为初级,不符合要求!')
    elif 8<length<16 and both == 2:
        print('您输入的密码安全等级为中级,不符合要求!')
        ##这里虽然和题目符合,但是纵观所有情况,若用户输入为16位以内且有三种情况时,会出bug,所以后面将both换成 >= 2
    elif length >= 16 and both == 3:
        print('您输入的密码安全等级为高级,可以注册!')
       **#这里漏了一个条件,开头字符不能为特殊字符,因此需要加入temp(0).isalnum,来确保第一位!!**
    if both <= 2:
        print("""请以一下方式改善您的密码:
            1.数字,字母或者特殊字符组合
            2.密码长度尽量在16位以上""")
        break
        #这里写的有问题,应该是继续循环操作,或者用户需要自主退出,因此需要把开头的whlie循环改为一个while条件,从而进行退出
    
改进后:
str ='~!@#$%^&*()_=-/,.?<>;:[]{}\|'
t = 'y'
while t == 'y':
    num = 0
    eng = 0
    str1= 0
    both = 0
    level = 0
    #这里改进进while里面,每次循环重新定义,不然可能会代入以前的值
    # 加入level的原因是,在中级且输入为三种符号时,不会print 后面的帮助条件(详情见错误中倒数第五行),因此加入level用来定义当为初中级为0,高级为1.
    temp = input("请设置一个密码:")
    length = len (temp)
    while temp.isspace() or length == 0:
        print('输入不能为空,请重新输入:')
        temp = input()
        length = len (temp)
    for each in temp:
        if each.isdigit():
            num = 1
        if each.isalpha():
            eng = 1
        if each in str:
            str1= 1
        both = (num) + (eng) + (str1)
    if length <= 8 and temp.isalnum():
        print('您输入的密码安全等级为初级,不符合要求!')
    elif 8<length<16 and both >= 2 and temp[0].isalnum():
    #temp[0].isalnum()防止开头为特殊字符!!!!!!注意!字符串中位置是用中括号[]
        print('您输入的密码安全等级为中级,不符合要求!')
    elif length >= 16 and both == 3 and temp[0].isalnum():
         print('您输入的密码安全等级为高级,符合要求!')
         level = 1
    #提示栏
    if level != 1:
        print("""请以一下方式改善您的密码:
            1.数字,字母或者特殊字符组合
            2.密码长度尽量在16位以上
            3.开头不能为特殊字符""")
     #选择是否退出栏   
        print('继续请按y,否则任意键退出',end='')
        t = input()

总结:这节课的编程题其实告诉自己一个编程思维,不要按照题目固定思维来,而是应该定义一系列的字符 ,从而将综合情况转化为分别的情况,如既要有字符又要有数字,字符串内置函数并没有这种功能,因此只有定义字符与数字,利用for in 逐字检查然后输出为0或1的情况,然后在将其综合(求和)情况作为综合情况进行判断(逻辑转化为数字的感觉)

ps:小甲鱼版答案:其实同样是用到逻辑转换数字的思维

symbols = "~!@#$%^&*()_=-/,.?<>;:[]{}\|"
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
nums = '0123456789'
t = 'y'
while t == 'y':
    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 == 2 or flag_con == 2:
            print("中")
        else:
            print("高")
            print("请继续保持")
            break
        print("""请按以下方式提升您的密码安全级别:
    1.密码必须由数字、字母及特殊字符三种组合
    2.密码只能由字母开头
    3.密码长度不能低于16位""")
        break
    t = input("还要再测试么?(”y“继续,其他退出)")
发布了17 篇原创文章 · 获赞 1 · 访问量 359

猜你喜欢

转载自blog.csdn.net/cccccccaaaaaaaaa/article/details/105249965
今日推荐