5.1.3 案例精选
5-1 编写函数实现字符串加密和解密,循环使用指定秘钥,采用简单的异或算法。
1 def crypt(source,key):
2 from itertools import cycle
3 result = ''
4 temp=cycle(key)
5
6 for ch in source:
7 result = result + chr( ord(ch)^ord(next(temp)) )
8
9 return result
10
11 source = 'Shandong Institute of Business and Technology'
12 key = 'Dong Fuguo'
13
14 print('Before Encrypted:',source)
15 encrypted = crypt(source,key)
16 print('After Encrypted:',encrypted)
17 decrypted=crypt(encrypted,key)
18 print('After Decrypted:',decrypted)
19
20 #Before Encrypted: Shandong Institute of Business and Technology
21 #After Encrypted: D) U&*T3U "O,S/d + Y
22 #After Decrypted: Shandong Institute of Business and Technology
5-2 编写程序,生成大量随机信息
本例代码演示了如何使用Python标准库random来生成随机数据,这在需要获取大量数据来测试或演示软件的时候非常有用,不仅能真实展示软件功能或算法,还可以避免泄露真实数据或者引起不必要的争议。
1 import random
2 import string
3 import codecs
4
5 #常用汉字 Unicode 编码表(部分),完整列表详见配套源代码
6 stringBase = '\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba'
7
8 #转换为汉字
9 stringBase = ''.join(stringBase.split('\\u'))
10 #print(stringBase) #的一了是我不在人
11
12 #获取邮箱
13 def getEmail():
14
15 #常见域名后缀,可以随意扩展该列表
16 suffix = ['.com','.org','.net','.cn']
17 characters = string.ascii_letters + string.digits+'_'
18
19 #获取邮箱用户名
20 username = ''.join((random.choice(characters) for i in range(random.randint(6,12))))
21
22 #获取邮箱域名
23 domain = ''.join((random.choice(characters) for i in range(random.randint(3,6))))
24
25 return username + '@' + domain + random.choice(suffix)
26
27 #获取手机号码
28 def getTelNo():
29 return ''.join((str(random.randint(0,9)) for i in range(11)))
30
31 #获取用户名或地址
32 def getNameOrAddress(flag):
33 '''flag=1 表示返回随机姓名,flag = 0表示返回随机地址'''
34 result = ''
35 if flag == 1:
36 #大部分中国人的姓名为2-4个汉字
37 rangestart,rangeend = 2 , 5
38 elif flag ==0:
39 #假设地址在10-31个汉字之间
40 rangestart,rangeend = 10,31
41 else:
42 print('flag must be 1 or 0')
43 return ''
44
45 for i in range(rangestart,rangeend):
46 result += random.choice(stringBase)
47
48 return result
49
50 def getSex():
51 return random.choice(('男','女'))
52
53 def getAge():
54 return str(random.randint(18,100))
55
56 def main(filename):
57 with codecs.open(filename,'w','utf-8') as fp:
58 fp.write('Name,-Sex,Age,---TelNo--,-------------------Address----------------,-----Email----- \n')
59
60 #随机生成200个人的信息
61 for i in range(10):
62 name = getNameOrAddress(1)
63 sex = getSex()
64 age = getAge()
65 tel = getTelNo()
66 address = getNameOrAddress(0)
67 email = getEmail()
68 line = ','.join([name,sex,age,tel,address,email]) + '\n'
69 fp.write(line)
70
71
72 def output(filename):
73 with codecs.open(filename,'r','utf-8') as fp:
74 while True:
75 line = fp.readline()
76 if not line:
77 return
78 line = line.split()
79 for i in line:
80 print(i,end=',')
81 print()
82
83 if __name__ == '__main__':
84 filename = 'infomation.txt'
85 main(filename)
86 output(filename)
87
88 '''
89 Name,-Sex,Age,---TelNo--,-------------------Address----------------,-----Email-----,
90 是的在,男,35,40020447105,一我了了我是是人了的了我在我的不了的人了我,UkLalG@QXPumc.org,
91 一是我,女,44,28056977003,了我人不在的人不不是的在不人我是我不人一的,uC3g_aobRjYW@VTj0K.org,
92 了在在,女,20,08361670393,人一了了是是在一是的人一在不在是不的了了是,3_rhRc@5zlTNw.com,
93 一一是,女,68,99960031767,了的一我我人的在我的一一不了是了了我在人不,149JD3ypI@qZ0N.net,
94 一人了,男,55,33382346683,人的我在不人了了是我是是了了在我人在我一我,x3QOnGKTi3i@qPp.cn,
95 的了不,男,95,90126113931,一我人了的不人我在了的了了人人是不了的一的,cvwHge2fi5@Eh2RE.org,
96 一是是,女,26,78260102051,的人人我了是的的了是了我人不的一不人我是我,SNxGHWNBcId@3dTR.net,
97 的的人,男,30,73940532426,的一在人是了的不了是不的在在人不人是在我了,XsbeyCjIilmk@5ob.com,
98 不在的,女,61,10389727006,了人我了的了的不了在一一我是是我了人在是在,HwzAnt18plb@ejMtG.org,
99 是不了,男,90,59993303692,人是了在了了一人人是我是是的我一我了了是一,Qa2ovqR9i@qfMwX.com,
100 '''
拓展知识:Python扩展库jieba和snownlp很好地支持了中文分词,可以使用pip命令进行安装。在自然语言处理领域经常需要对文字进行分词,分词的准确度直接影响了后续文本处理和挖掘算法的最终效果。
拓展知识:Python扩展库pypinyin支持汉字到拼音的转换,并且可以和分词扩展库配合使用。