鱼C论坛

 找回密码
 立即注册
查看: 2950|回复: 15

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

[复制链接]
发表于 2021-5-21 20:00:55 | 显示全部楼层 |阅读模式
7鱼币
print ('请输入需要检查的密码组合:',end='')
password = input()
symbol1 = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
symbol2 = '0123456789'
symbol3 = r'''~!@#$%^&*()_=-/,.?<>;:[]{}|\'''#这一行自己写的,选择这一行就报错
#symbol3 = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''#选择这一行不会报错

time1 = 0#这里报错,syntaxerror  invaild 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位')
最佳答案
2021-5-21 20:00:56

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

你的代码最后多加个 \ 即可,参考代码:
symbol3 = r'''~!@#$%^&*()_=-/,.?<>;:[]{}|\\'''

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



最佳答案

查看完整内容

因为你自己些的将 \ 转义符放在了最后一个字符中,导致字符串的 ' 一个单引号被转义,导致右引号少了一个而报错 你的代码最后多加个 \ 即可,参考代码: 使用三引号是因为字符串中需要有 单引号或者 双引号,否则 Python 会将字符串字符中的引号当成结束的右引号
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-21 20:00:56 | 显示全部楼层    本楼为最佳答案   

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

你的代码最后多加个 \ 即可,参考代码:
symbol3 = r'''~!@#$%^&*()_=-/,.?<>;:[]{}|\\'''

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



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

使用道具 举报

 楼主| 发表于 2021-5-21 20:02:32 | 显示全部楼层
感觉注释那一行和自己写的也没哪不一样。。不知道为啥报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-21 20:03:47 | 显示全部楼层
symbol3 = r'''~!@#$%^&*()_=-/,.?<>;:[]{}|\'''
最后面的\把'给转义了,长字符串不完整了。6个单引号或双引号包裹的字符串可以多行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

前面不是有个r吗?这里三引号不是多行的意思吧,我改成单引号报错EOL while scanning string literal,改成双引号invaild syntax
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

第五行代码最后的\挪到中间就没报错了,没懂为啥?不是说文本符前面r或者R可以使得\失去转义的作用吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

但是三引号里面包括的没有单引号或者双引号的嘛。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


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

若你将 \ 放在最后,就会导致生成字符串失败而报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-21 20:18:31 | 显示全部楼层
杨东明 发表于 2021-5-21 20:16
但是三引号里面包括的没有单引号或者双引号的嘛。。


三个连续引号在一起就相当于属于一种组合,不会再次导致和单引号产生歧义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-21 20:21:13 | 显示全部楼层
Twilight6 发表于 2021-5-21 20:16
这和数据生成顺序有关,因为 r'123456' 是先生成 '123456' 在进行 r 转义

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

这个没太懂。。意思是先转义符\必须正常发挥作用是吗?然后再由r转义,放在最后的\,没办法发挥正常作用,所以报错?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-21 20:23:09 | 显示全部楼层
Twilight6 发表于 2021-5-21 20:16
这和数据生成顺序有关,因为 r'123456' 是先生成 '123456' 在进行 r 转义

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

r'123\t456'先生成'123    456',再生成'123456'?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-21 20:26:36 | 显示全部楼层
杨东明 发表于 2021-5-21 20:23
r'123\t456'先生成'123    456',再生成'123456'?


刚刚错了,是先 '123    456' 再r 后得到 '123\t456'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-21 20:28:21 | 显示全部楼层
Twilight6 发表于 2021-5-21 20:26
刚刚错了,是先 '123    456' 再r 后得到 '123\t456'

懂了,谢谢谢谢

点评

不客气~  发表于 2021-5-21 20:51
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-15 17:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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