一、实验目的
(1)掌握序列的基本操作
(2)掌握集合、字典的基本操作
二、实验环境
联网计算机一台/每人,内装Windows 7以上操作系统和安装Python 3.7集成开发环境IDLE。
三、实验内容
Sy5-1
列表实现。编写一个函数,生成随机密码,要求: (1)密码长度不小于8位,不大于16位 (2)字符包括大小写字母和数字
Sy5-2
集合实例。删除5-1中生成的密码字符串中的重复字符,不改变原来的字符串顺序。
Sy5-3
字典实例。输入一段中英文字符串,统计每个字符出现的次数。
拓展1
数字重复统计。
(1)随机生成1000个整数
(2)数字范围[20,100]
(3)升序输出所有不同的数字及每个数字重复的次数。
拓展2
输入一段英文字符串,将其按照手机上的9键输入规则转换位相应的数字,即abc-2,def-3,ghi-4,jkl-5,mno-6,pqrs-7,tuv-8,wxyz-9
四、实验步骤与结果
1. 新建文件夹并命名为学号-姓名-实验五。
2. 安装 Python 解释器Python 3.7 集成开发环境IDLE,并进入IDLE。
3. 依次输入自己编好的程序实验内容1-7的源程序,分别命名为sy5_1.py - sy5_5.py 并保存至已建好的文件夹中。
4. 检查已输入的程序是否有错(包括输入时输错的和编程中的错误),如发现有错,及时改正。
5. 运行程序并分析运行结果是否合理。在运行时要注意当输入不同的数据时所得结果是否正确,应测试两组以上数据,分别检查在不同情况下结果是否正确。
列出1-5题源程序清单并记录上机运行结果。
Sy5-1
列表实现。编写一个函数,生成随机密码,要求: (1)密码长度不小于8位,不大于16位 (2)字符包括大小写字母和数字
def passwordstr():
import random
#产生数字字符的ascii码列表
numbers=list(range(48,58)) #48是字符'0'的ascii码
#产生小写字符的ascii码列表
letters_low=list(range(65,65+26)) #65是字符'A'的ascii码
#产生大写字符的ascii码列表
letters_upper=list(range(97,97+26)) #97是字符'a'的ascii码
digits=random.randint(8,16) #随机产生密码的位数
print("位数:"+str(digits))
s=''
s1=0 #保存随机的ascii码
for i in range(1,digits+1):
type=random.randint(1,4)
if(type==1):
s1=numbers[random.randint(0,9)]
elif (type==2):
s1=letters_low[random.randint(0,25)]
elif (type==3):
s1=letters_upper[random.randint(0,25)]
#print("ascii:"+str(s1))
s=s+chr(s1)
print(s)
passwordstr()
Sy5-2
集合实例。删除5-1中生成的密码字符串中的重复字符,不改变原来的字符串顺序。
def passwordstr():
import random
#产生数字字符的ascii码列表
numbers=list(range(48,58)) #48是字符'0'的ascii码
#产生小写字符的ascii码列表
letters_low=list(range(65,65+26)) #65是字符'A'的ascii码
#产生大写字符的ascii码列表
letters_upper=list(range(97,97+26)) #97是字符'a'的ascii码
digits=random.randint(8,16) #随机产生密码的位数
print("位数:"+str(digits))
s=''
s1=0 #保存随机的ascii码
for i in range(1,digits+1):
type=random.randint(1,4)
if(type==1):
s1=numbers[random.randint(0,9)]
elif (type==2):
s1=letters_low[random.randint(0,25)]
elif (type==3):
s1=letters_upper[random.randint(0,25)]
#print("ascii:"+str(s1))
s=s+chr(s1)
print(s)
return s
psStr=passwordstr()
print(psStr)
L1=list(psStr) #转换为列表
L2=list(set(L1)) #使用集合去重之后重新生成列表
L2.sort(key=L1.index) #按照原来字符串顺序排序
a=''.join(L2)
print(a)
Sy5-3
字典实例。输入一段中英文字符串,统计每个字符出现的次数。
dict={}
name = input() #输入英文字符串
for letter in name:
dict[letter]=dict.get(letter,0)+1
for i in dict:
print("{0}({1}),".format(i,dict.get(i)),end='')
五、总结
1. 实验过程中的问题及解决方法:
- 在生成随机密码时,可能遇到随机字符生成的范围和数量控制问题。通过使用随机数生成函数结合字符范围的设定,以及循环控制密码长度,解决了密码长度和字符类型的问题。
- 在处理集合删除重复字符时,可能对集合的特性和操作不够熟悉。通过深入理解集合的元素唯一性特点,正确运用集合的操作方法,成功去除重复字符。
- 在统计字符出现次数时,可能在字典的更新和数据处理上出现逻辑错误。通过仔细设计字典的键值对应关系和循环逻辑,确保了统计结果的准确性。
2. 实验收获
- 熟练掌握了列表的操作和应用,能够灵活运用列表生成满足特定条件的数据。
- 深入理解了集合的特性和用途,学会利用集合的唯一性来处理数据。
- 掌握了字典的数据结构和使用方法,能够有效地进行数据的统计和分析。
- 提升了对高级数据结构的综合运用能力,能够根据不同的需求选择合适的数据结构来解决问题。
- 增强了问题解决的能力,在遇到数据处理和逻辑实现上的困难时,能够通过调试和查阅资料找到解决方案。