V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
xixijun
V2EX  ›  Python

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

  •  
  •   xixijun ·
    chen2aaron · 2015-05-14 03:02:00 +08:00 · 3087 次点击
    这是一个创建于 3485 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    8 条回复    2015-05-15 00:35:06 +08:00
    phithon
        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函数效率最高,但完全没有可读性了。
    Valyrian
        2
    Valyrian  
       2015-05-14 03:16:25 +08:00   ❤️ 1
    没什么不好,代码尽量不要重复。
    假如你的generate不用getCode而是直接用dictField,那么以后如果你想改getCode的实现方法(比如改一下如何sample之类的),你要同时改generate和getCode。很热闹容易出错。
    xixijun
        3
    xixijun  
    OP
       2015-05-14 03:39:08 +08:00
    @phithon
    @Valyrian
    谢谢~我再改改 (⌒▽⌒)
    firldlove
        4
    firldlove  
       2015-05-14 05:05:10 +08:00   ❤️ 1
    那就用个class,把一些值固定下来呀
    jiang42
        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
    est
        6
    est  
       2015-05-14 10:30:14 +08:00   ❤️ 1
    dictField 可以用 lambda inline 一个,然后一个函数搞定:

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

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

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

    @whilgeek 我个人认为把方法分细一点,更有利于阅读。另外还是喜欢吧函数叫做方法啦,这样更便于理解一点,反正函数也是一种方法啦(≧∇≦)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5418 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 05:49 · PVG 13:49 · LAX 21:49 · JFK 00:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.