从上次任务后两星期了,第二个任务终于完成了(个人习惯:一个任务完成后总结)
这次的任务相对于上一个任务难度加大了,能学到的东西也更多了。不多说,先上我自己琢磨出来的代码
import string import random #将随机数生成并创建TXT文件 with open("test_str.txt", "w") as f: for i in range(1, 10001): oneStr = ‘‘.join(random.sample(string.ascii_lowercase + string.digits, 12)) oneStr = oneStr + ‘\n‘ f.write(oneStr) #刷选出重复字符串并生成新的字符串取代 f=open("test_str.txt","r+") i=0 n=1 for line in f.readlines(): hang = f.readlines() for i in hang: for n in hang: if i==n: n=n+1 if i.hang==n.hang: for k in range(1,2): newStr=‘‘.join(random.sample(string.ascii_lowercase + string.digits, 12)) oldStr=n.hang oldStr.replace(oldStr,newStr); f.close() #给每行随机数前面加上编号 file=open("test_str.txt","r") lines=file.readlines() file.close() file=open("test_str.txt",‘w‘) for k,v in enumerate(lines): k+=1 file.write("【%d】 %s"%(k,v)) file.close()
自己琢磨出来的代码,我觉得这一题的难点在于怎样去除重复,要保证10000个代码肯定没有重复。
我的思路是:先生成,然后筛选出重复,最后将新生成的字符替换掉重复字符
作为一个初学者,只能想到以这种最死板的方法
下面上大佬代码
# -&- coding: utf-8 -*- import random def func(): str = "abcdefghijklmnopqistuvwxyz0123456789" randstr = random.randint(1,36) return str[randstr-1:randstr] def funcrand(list): a = "" for numtwo in range(1, 12): a += func() if(a in list): funcrand(list) return a linkrand = [] while (len(linkrand) != 10000): linkrand.append(funcrand(linkrand)) txtName = "test_str.txt" file = open(txtName,‘w‘,encoding=‘utf-8‘) for i in range(0,10000): x = str(i) result = "【"+x+"】"+linkrand[i]+‘\n‘ file.write(result)
两个一对比,能很明显的看出来孰高孰低。
下面记录下这次任务的收获:
一、函数
1、def函数
2、digits生成0到9数字(str)
ascii_letters生成所有字母(A到Z和a到z)
3、语法: ‘sep‘.join(seq)
参数说明
sep:分隔符。可以为空
seq:要连接的元素序列、字符串、元组、字典
上面的语法即:以sep作为分隔符,将seq所有的元素合并成一个新的字符串
返回值:返回一个以分隔符sep连接各个元素后生成的字符串
>>> seq1 = [‘hello‘,‘good‘,‘boy‘,‘doiido‘]
>>> print ‘ ‘.join(seq1)
hello good boy doiido
>>> print ‘:‘.join(seq1)
hello:good:boy:doiido
4、random.sample()可以从指定的序列中,随机的截取指定长度的片断,不作原地修改。
andom.sample的函数原型为:random.sample(sequence, k),从指定序列中随机获取指定长度的片断。sample函数不会修改原有序列。
list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
slice = random.sample(list, 5) #从list中随机获取5个元素,作为一个片断返回
print slice
print list #原有序列并没有改变。
print( random.randint(1,10) ) # 产生 1 到 10 的一个整数型随机数
print( random.random() ) # 产生 0 到 1 之间的随机浮点数
print( random.uniform(1.1,5.4) ) # 产生 1.1 到 5.4 之间的随机浮点数,区间可以不是整数
print( random.choice(‘tomorrow‘) ) # 从序列中随机选取一个元素
print( random.randrange(1,100,2) ) # 生成从1到100的间隔为2的随机整数
a=[1,3,5,6,7] # 将序列a中的元素顺序打乱
random.shuffle(a)
5、with open("名字.txt", "w") as f:
f.write(oneStr+‘\n‘)
创建文本并打印
f=open("aa.txt","r")
lines=f.readline() #按行读取文件中的内容
for line in lines: #循环输出读取的内容
6、enumerate()是python的内置函数
enumerate在字典上是枚举、列举的意思
对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值
enumerate多用于在for循环中得到计数
list1 = ["这", "是", "一个", "测试"]
for index, item in enumerate(list1):
print index, item
>>>
0 这
1 是
2 一个
3 测试
print line
w:写打开
a:追加打开(从eof开始,必要时创建新文件)
r:读打开,如果open(“this.txt”)这种写法,默认就是r
r+:读写打开
w+:读写打开
a+:读写打开
rb、wb、ab:二进制打开
rb+、wb+、ab+:二进制读写模式打开
7、def:定义一个模块的变量,或者说是类的变量。def命令定义一个函数。后接函数名称由字幕数字或下划线组成。括号中为函数变量,变量之间以逗号隔开。最后以:收 尾。此为一个完整的函数定义。引用函数时,函数名称 + 参数名称即可
接着是思路方面的问题,作为初学者,在编程思维方面还没有完全适应,所以我使用的还是最传统的先输出字符串,在筛选替换出重复字符串,最后整理完成任务。而用老程序员的思维来看(上串代码),应该是运用算法在写入的同时进行对比,直接避免了重复。相比来看,我自己写的代码占用资源太多,在写入的不多的情况下可以使用,但是如果数据量加大,我的代码就不在适合。所以,编程不光要实现目的,还要运用最优的算法,期求资源最大化的得到利用。这也是自身的不足点,同时对于任务完成的效率也有待提高。
第二次任务:随机从26个小写字母和0到10中生成10000个12位随机码,并编号写入txt文件中
原文:https://www.cnblogs.com/zxbhzh/p/9871724.html