杨东明 发表于 2021-5-21 20:00:55

求助14讲课后作业,为啥自己写的这一行一选就报错。。还有就是这一行为啥用三引号?

print ('请输入需要检查的密码组合:',end='')
password = input()
symbol1 = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
symbol2 = '0123456789'
symbol3 = r'''~!@#$%^&*()_=-/,.?<>;:[]{}|\'''#这一行自己写的,选择这一行就报错
#symbol3 = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''#选择这一行不会报错

time1 = 0#这里报错,syntaxerrorinvaild syntax
time2 = 0
time3 = 0
number = 0

if len(password) ==0 or password.isspace():
    print ('您未输入密码或者全是空格,请重新输入:',end='')
    password = input()

while 1:
    for each in password:
      number +=1
      if time1 == 0:
            if each in symbol1:
                time1 +=1
      if time2 == 0:
            if each in symbol2:
                time2 +=1
      if time3 == 0:
            if each in symbol3:
                time3 +=1
      if each not in symbol1 and each not in symbol2 and each not in symbol3:
            print ('密码中还有偏僻字符,请重新输入:',end='')
            password =input()
            break
    if number == len(password):
      break
length = len(password)
piece = password[:1]

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

print('您输入的密码等级:',end='')
if temp ==3 and piece.isalpha() and time1 ==1 and time2 ==1 and time3 ==1:
    print('高')
elif time1 ==1 and time2 ==1 and time3 ==1:
    print('中')
elif temp ==2 and (time1+time2+time3 ==2):
    print('中')
elif (time1+time2+time3 ==2):
    print('低')
else:
    print('低')
print ('请按以下方式提升您的密码安全等级:')
print ('\t1.密码必须有数字、字母及特殊字符组成\n\t2.密码只能由字母开头\n\t3.密码长度不能低于16位')

Twilight6 发表于 2021-5-21 20:00:56


因为你自己些的将 \ 转义符放在了最后一个字符中,导致字符串的 ' 一个单引号被转义,导致右引号少了一个而报错

你的代码最后多加个 \ 即可,参考代码:

symbol3 = r'''~!@#$%^&*()_=-/,.?<>;:[]{}|\\'''

使用三引号是因为字符串中需要有 单引号或者 双引号,否则 Python 会将字符串字符中的引号当成结束的右引号



杨东明 发表于 2021-5-21 20:02:32

感觉注释那一行和自己写的也没哪不一样。。不知道为啥报错{:9_220:}

suchocolate 发表于 2021-5-21 20:03:47

symbol3 = r'''~!@#$%^&*()_=-/,.?<>;:[]{}|\'''
最后面的\把'给转义了,长字符串不完整了。6个单引号或双引号包裹的字符串可以多行。

杨东明 发表于 2021-5-21 20:11:35

suchocolate 发表于 2021-5-21 20:03
最后面的\把'给转义了,长字符串不完整了。6个单引号或双引号包裹的字符串可以多行。

前面不是有个r吗?这里三引号不是多行的意思吧,我改成单引号报错EOL while scanning string literal,改成双引号invaild syntax

杨东明 发表于 2021-5-21 20:14:50

suchocolate 发表于 2021-5-21 20:03
最后面的\把'给转义了,长字符串不完整了。6个单引号或双引号包裹的字符串可以多行。

第五行代码最后的\挪到中间就没报错了,没懂为啥?不是说文本符前面r或者R可以使得\失去转义的作用吗?

杨东明 发表于 2021-5-21 20:16:05

Twilight6 发表于 2021-5-21 20:14
因为你自己些的将 \ 转义符放在了最后一个字符中,导致字符串的 ' 一个单引号被转义,导致右引号少了一个 ...

但是三引号里面包括的没有单引号或者双引号的嘛。。

Twilight6 发表于 2021-5-21 20:16:43

杨东明 发表于 2021-5-21 20:14
第五行代码最后的\挪到中间就没报错了,没懂为啥?不是说文本符前面r或者R可以使得\失去转义的作用吗?


这和数据生成顺序有关,因为 r'123456' 是先生成 '123456' 在进行 r 转义

若你将 \ 放在最后,就会导致生成字符串失败而报错

Twilight6 发表于 2021-5-21 20:18:31

杨东明 发表于 2021-5-21 20:16
但是三引号里面包括的没有单引号或者双引号的嘛。。


三个连续引号在一起就相当于属于一种组合,不会再次导致和单引号产生歧义

杨东明 发表于 2021-5-21 20:21:13

Twilight6 发表于 2021-5-21 20:16
这和数据生成顺序有关,因为 r'123456' 是先生成 '123456' 在进行 r 转义

若你将 \ 放在最后,就会 ...

这个没太懂。。意思是先转义符\必须正常发挥作用是吗?然后再由r转义,放在最后的\,没办法发挥正常作用,所以报错?

杨东明 发表于 2021-5-21 20:23:09

Twilight6 发表于 2021-5-21 20:16
这和数据生成顺序有关,因为 r'123456' 是先生成 '123456' 在进行 r 转义

若你将 \ 放在最后,就会 ...

r'123\t456'先生成'123    456',再生成'123456'?

Twilight6 发表于 2021-5-21 20:26:36

杨东明 发表于 2021-5-21 20:23
r'123\t456'先生成'123    456',再生成'123456'?


刚刚错了,是先 '123    456' 再r 后得到 '123\t456'

杨东明 发表于 2021-5-21 20:28:21

Twilight6 发表于 2021-5-21 20:26
刚刚错了,是先 '123    456' 再r 后得到 '123\t456'

懂了,谢谢谢谢{:9_228:}

杨东明 发表于 2021-5-21 20:30:10

suchocolate 发表于 2021-5-21 20:03
最后面的\把'给转义了,长字符串不完整了。6个单引号或双引号包裹的字符串可以多行。

谢谢解答{:10_254:}
页: [1]
查看完整版本: 求助14讲课后作业,为啥自己写的这一行一选就报错。。还有就是这一行为啥用三引号?