python 有什么办法可以让第二个方法引用第一个方法的返回值

2015-05-14 03:02:00 +08:00
 xixijun

这是个随机生成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

前者方法被后者调用 越往后需要的变量越多,而且与前者重复了

请问有什么办法可以优化一下啊

3004 次点击
所在节点    Python
8 条回复
phithon
2015-05-14 03:11:06 +08:00
```
def generate(n, many):
"""
生成many组随机码
"""
gene = [getCode(n) for i in range(many)]
return gene
```
这个函数可以改用生成器。
另外,方法就是一层一层调用的呀,不存在什么变量越调用越多就不好了。理论上只要main函数效率最高,但完全没有可读性了。
Valyrian
2015-05-14 03:16:25 +08:00
没什么不好,代码尽量不要重复。
假如你的generate不用getCode而是直接用dictField,那么以后如果你想改getCode的实现方法(比如改一下如何sample之类的),你要同时改generate和getCode。很热闹容易出错。
xixijun
2015-05-14 03:39:08 +08:00
@phithon
@Valyrian
谢谢~我再改改 (⌒▽⌒)
firldlove
2015-05-14 05:05:10 +08:00
那就用个class,把一些值固定下来呀
jiang42
2015-05-14 06:15:15 +08:00
@xixijun 其实前三个函数我觉得你unnecessary wrap了。。。可以直接return,不需要一个中间变量。

其实这样的代码风格挺好的。两点建议:

1)可以把getCode放进generate的scope里。
2)dictField函数我觉得换成一个常量会更好,FIELD = string.digits + string.letters
est
2015-05-14 10:30:14 +08:00
dictField 可以用 lambda inline 一个,然后一个函数搞定:

def generate(n, many=1, where=None):

可选参数是你的朋友。
whilgeek
2015-05-14 17:44:19 +08:00
1. 风格不错,不过是不是有点太碎了?
2. 另纠正一下,这些应该叫函数,不是方法。
xixijun
2015-05-15 00:35:06 +08:00
@jiang42 谢谢~已经改好了~瞬间感觉又简化了很多

@est 用lambda感觉还是有点不美观,第二个先定义参数值是个不错的建议 总之谢谢啦。

@whilgeek 我个人认为把方法分细一点,更有利于阅读。另外还是喜欢吧函数叫做方法啦,这样更便于理解一点,反正函数也是一种方法啦(≧∇≦)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/190925

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX