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