这是个随机生成200个激活码的程序
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Created by xixijun
# Date: 15-5-13
import random
import string
def dictField():
"""
字典域 由数字和字母(包括大小写)组成
"""
field = string.digits + string.letters
return field
def getCode(n):
"""
得到n位激活码
"""
code = "".join(random.sample(dictField(), n))
return code
def generate(n, many):
"""
生成many组随机码
"""
gene = [getCode(n) for i in range(many)]
return gene
def writeIn(n, many, where):
"""
写入文件 并按顺序排列
"""
count = 1
for i in generate(n, many):
with open(where, "a") as boom:
boom.write(str(count).rjust(3)+" "+i+"\n")
count += 1
if __name__ == '__main__':
writeIn(20, 200, "coupon.txt")
dictField -> getCode -> generate -> writeIn
前者方法被后者调用 越往后需要的变量越多,而且与前者重复了
请问有什么办法可以优化一下啊
1
phithon 2015-05-14 03:11:06 +08:00 1
```
def generate(n, many): """ 生成many组随机码 """ gene = [getCode(n) for i in range(many)] return gene ``` 这个函数可以改用生成器。 另外,方法就是一层一层调用的呀,不存在什么变量越调用越多就不好了。理论上只要main函数效率最高,但完全没有可读性了。 |
2
Valyrian 2015-05-14 03:16:25 +08:00 1
没什么不好,代码尽量不要重复。
假如你的generate不用getCode而是直接用dictField,那么以后如果你想改getCode的实现方法(比如改一下如何sample之类的),你要同时改generate和getCode。很热闹容易出错。 |
4
firldlove 2015-05-14 05:05:10 +08:00 1
那就用个class,把一些值固定下来呀
|
5
jiang42 2015-05-14 06:15:15 +08:00 1
@xixijun 其实前三个函数我觉得你unnecessary wrap了。。。可以直接return,不需要一个中间变量。
其实这样的代码风格挺好的。两点建议: 1)可以把getCode放进generate的scope里。 2)dictField函数我觉得换成一个常量会更好,FIELD = string.digits + string.letters |
6
est 2015-05-14 10:30:14 +08:00 1
dictField 可以用 lambda inline 一个,然后一个函数搞定:
def generate(n, many=1, where=None): 可选参数是你的朋友。 |
7
whilgeek 2015-05-14 17:44:19 +08:00 1
1. 风格不错,不过是不是有点太碎了?
2. 另纠正一下,这些应该叫函数,不是方法。 |
8
xixijun OP |