Python字符串常见题目解析
发表于:2023-04-04 | 分类: Python
字数统计: 1.7k | 阅读时长: 7分钟 | 阅读量:

本次所涉及到的知识有:itertools模块、cycle函数、chr函数、ord函数、next函数、python定义函数、string模块、isinstance函数、dictionary、get()方法。

注意:此文章仅供参考和学习,并不能完全说明作者的解析是正确的,觉得有错误的欢迎在评论区里指出。

题目

题目一:python利用异或算法实现字符串加密解密

题目二:python利用string模块判断密码强度

题目一

构建异或算法实现加密和解密

创建一个名为crypt函数,并传入两个参数:source和key。

source是要加密或解密的字符串,key是密钥字符串。

1
def crypt(source,key):

注意:函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

为了达到每一个字符都能加密的效果,需要使用到迭代选择器;也就是使用itertools(循环器)中的cycle函数。

1
from itertools import cycle

需要一个变量来存放最终的结果。

1
result = ''

对密钥进行选择迭代。

1
temp = cycle(key)

通过for循环对source中的字符进行遍历。

1
for ch in source:

这时就需要使用到这道题就重要的地方“异或运算”。

首先通过next(temp)对字符进行迭代,然后获取字符串中每一个字符;之后通过ord()获取对应字符的ASCII编码;通过异或运算符的形式对两个ASCII编码进行处理(异或运算符(^):表示对于操作符两侧数字的二进制数进行异或操作。异或操作的含义为:同一位置上的数字相等则得0,同一位置上的数字相异则得1。(二进制表达中只有0,1两个数字))

最后通过chr函数对异或处理完的编码进行对应unicode字符的处理并赋值到变量result上。

1
result = result + chr(ord(ch) ^ ord(next(temp)))

返回该变量结束crypt函数。

1
return result

输入字符串并对其加密和解密

需要加密的字符串。

1
source = 'Shandong Institute of Business and Technology'

创建密钥字符串。

1
key = 'Dong Fuguo'

打印没有加密的字符串。

1
print('Before Encrypted:' + source)

对字符串进行加密。

1
encrypted = crypt(source,key)

打印加密完成的字符串。

1
print('After Encrypted:' + encrypted)

对加密的字符串进行解密。

1
decrypted = crypt(encrypted,key)

打印解密完成的字符串。

1
print('After Decrypted:' + decrypted)

完整代码加注释解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#python利用异或算法实现字符串加密解密
#source是要加密或解密的字符串,key是密钥字符串
def crypt(source,key):
#使用itertools模块并引用cycle函数
from itertools import cycle
#使用result变量用来存放最终结果
result = ''
#将函数中key的值赋值给temp
#需要让重复执行key序列的元素
temp = cycle(key)
#通过for循环来对source进行循环遍历
for ch in source:
#异或运算
#首先通过next(temp)对字符进行迭代,然后获取字符串中每一个字符
#之后通过ord()获取对应字符的ASCII编码
#通过异或运算符对两个ASCII编码进行处理
#最后通过chr函数对异或处理完的编码进行对应unicode字符的处理
#赋值到变量result上
result = result + chr(ord(ch) ^ ord(next(temp)))
#返回该变量结束crypt函数
return result
#需要加密的字符串
source = 'Shandong Institute of Business and Technology'
#密钥字符串
key = 'Dong Fuguo'
#打印没有加密的字符串
print('Before Encrypted:' + source)
#对字符串进行加密
encrypted = crypt(source,key)
#打印加密完成的字符串
print('After Encrypted:' + encrypted)
#对加密的字符串进行解密
decrypted = crypt(encrypted,key)
#打印解密完成的字符串
print('After Decrypted:' + decrypted)

题目二

判断字符条件

首先需要使用string模块,所以导入string模块。

1
import string

创建check函数并传入pwd参数。

1
def check(pwd):

使用isinstance函数和len()方法来判断其是否是字符和所需字符的长度。注意:这道题使用的是not运算符,其判断结果和判断的相反;也就是如果某一条件下判断为false时其结果为true。

1
if not isinstance(pwd,str) or len(pwd)<6:

判断如果没有符合上面所判断的条件时,就返回“没有合适的密码”。

1
return 'not suitable for password'

创建强弱密码对应关系

创建密码强度等级与包含字符种类的对应关系。(weak:弱、below middle:中间以下、above middle:中间以上、strong:强)

1
d = {1:'week',2:'below middle',3:'above middle',4:'strong'}

用变量r创建一个有4个False的列表。

1
r = [False] * 4

分别用来标记pwd是否含有数字、小写字母、大写字母和指定的标点符。

1
2
3
4
5
6
7
8
9
10
11
12
13
for ch in pwd:
#判断是否包含数字
if not r[0] and ch in string.digits:
r[0] = True
#判断是否包含小写字母
elif not r[1] and ch in string.ascii_lowercase:
r[1] = True
#判断否包含大写字母
elif not r[2] and ch in string.ascii_uppercase:
r[2] = True
#判断否包含指定的标点符号
elif not r[3] and ch in ',.!;?<>':
r[3] = True

返回密码强度

通过Dictionary中get()方法获取所对应键的值,如果对应键没有值时就输出’error‘(错误)。

统计包含的字符种类,返回密码强度,如果统计到的字符种类越多则返回的密码强度越强。

1
return d.get(r.count(True),'error')

给check()函数传值并打印。

1
print(check('a2Cd,11'))

完整代码加注释解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#python利用string模块判断密码强度
#导入string模块
import string
def check(pwd):
#密码必须至少包含6个字符
#isinstance是判断是否符合字符串、len是判断其字符串大小
if not isinstance(pwd,str) or len(pwd)<6:
#判断如果没有符合上面所判断的条件时,就返回“没有合适的密码”
return 'not suitable for password'
#密码强度等级与包含字符种类的对应关系
d = {1:'weak',2:'below middle',3:'above middle',4:'strong'}
#分别用来标记pwd是否含有数字、小写字母、大写字母和指定的标点符号
r = [False] * 4
for ch in pwd:
#是否包含数字
if not r[0] and ch in string.digits:
r[0] = True
#是否包含小写字母
elif not r[1] and ch in string.ascii_lowercase:
r[1] = True
#是否包含大写字母
elif not r[2] and ch in string.ascii_uppercase:
r[2] = True
#是否包含指定的标点符号
elif not r[3] and ch in ',.!;?<>':
r[3] = True
#统计包含的字符种类,返回密码强度
#通过Dictionary中get()方法获取所对应键的值
#如果对应键没有值时就输出’error‘(错误)
return d.get(r.count(True),'error')
#给check()函数传值并打印
print(check('a2Cd,11'))
上一篇:
Python杨辉三角题目实战
下一篇:
Python判断循环语句之基础项目实战