首页 > 技术文章 > 5.1.3 案例精选

avention 2018-04-07 11:27 原文

  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支持汉字到拼音的转换,并且可以和分词扩展库配合使用。

 

推荐阅读