【问题标题】:How to return multiple values in Python?如何在 Python 中返回多个值?
【发布时间】:2014-05-15 10:14:27
【问题描述】:

所以我想知道这是否可能。所以,我需要做的是让我的函数返回一个字符串。现在棘手的部分是我的函数打印出一个花哨的模式,我不确定如何将我的模式作为字符串返回?在我使用该函数之前,我不希望它实际打印任何内容:

my_function(c,r)  
x = 4
y = 5  
a = my_function(x,y)
print(a)

输出:

*nothing here blank space*
*pattern printed*

这是我的函数 my_function 的代码:

def my_function(c, r):  
    if(c > 0 and r > 0):

        print("*" * c)

        for i in range(r - 2):
            if(c == 1):
                print("*")
            elif(c > 1):
                print("*" + " " * (c - 2) + "*")

        if(r > 1):
            print("*" * c)

如果我按原样调用该函数,它将打印所有内容。但我不希望它打印出来。我尝试用 return 替换所有打印,但它只打印第一行(这并不意外,因为 return 只会在第 1 行终止函数)。

【问题讨论】:

  • 从程序逻辑中分离输入/输出是用任何语言编写好的程序的基本步骤。根据经验,如果一个函数包含 print,那么它应该计算任何在其他地方有用的东西。
  • @Bakuriu 您能否在解释中更明确一点?一般来说,我对编程比较陌生。
  • 您的函数的问题在于将与用户的交互与程序的内部逻辑混合在一起。查看您收到的解决方案。您可以清楚地看到所描述的功能根本与用户交互。我正是这个意思。一段代码要么处理与用户的交互,要么计算一些东西,但它不应该两者兼而有之。进一步描述这一点将花费太多时间和空间来发表评论。
  • @Bakuriu 所以,基本上你的意思是我应该避免在函数中使用 print?
  • 没有。我的意思是,如果一个函数包含print,那么它应该只包含与输出或输入相关的代码。

标签: python function return


【解决方案1】:

下面是一个不相关的示例,说明您如何做到这一点:

def foo(bar):
    barz = bar
    a = 2
    c = 'c'
    d = 5.0
    return (barz,a,c,d)

>>> result = foo(5)
>>> print result[0]
5
>>> print result[2]
c
>>> print result
[5,2,'c',5.0]

【讨论】:

    【解决方案2】:

    将要返回的值收集到一个列表中,在函数末尾构建一个字符串以返回:

    def my_function(c, r):  
        lines = []
        if c and r:
            lines.append("*" * c)
    
            for i in range(r - 2):
                if c == 1:
                    lines.append("*")
                else:
                    lines.append("*" + " " * (c - 2) + "*")
    
            if r > 1:
                lines.append("*" * c)
    
        return '\n'.join(lines)
    

    这包括print() 函数将在每行之间写入的相同换行符。

    演示:

    >>> print(my_function(4, 5))
    ****
    *  *
    *  *
    *  *
    ****
    

    【讨论】:

    • 除了lines.append还有其他方法吗?
    • @Sab:您可以将lines 设为字符串,然后使用lines += "*" * c + '\n',但随后您需要手动添加换行符,而且效率不高(您正在重新创建字符串每次连接时)。 str.join()一次更高效。
    • 问题是我还没有了解数组,所以我想知道是否可以使用其他东西。
    【解决方案3】:

    您可以将所有字符串收集到一个列表中,然后打印该列表的内容。但我觉得这是编写generator 函数的一个很好的练习:

    def get_rectangle(c, r):  
        if(c > 0 and r > 0):
    
            yield "*" * c
    
            for i in range(r - 2):
                if(c == 1):
                    yield "*"
                elif(c > 1):
                    yield "*" + " " * (c - 2) + "*"
    
            if(r > 1):
                yield "*" * c
    
    for c in get_rectangle(c, r):
        print c
    

    演示:

    In [5]: for i in get_rectangle(4, 5):
       ...:     print i
       ...:     
    ****
    *  *
    *  *
    *  *
    ****
    

    使用生成器打印盒子的另一种更简洁的方法..

    In [9]: print("\n".join(get_rectangle(4, 5)))
    ****
    *  *
    *  *
    *  *
    ****
    

    【讨论】:

      【解决方案4】:

      有意义的名字也很有帮助!

      编辑:还有:捕捉意外情况(如宽度

      def _box_section(width, border, outside, inside):
          if width <= 2 * border:
              # inside is occluded
              return outside * width
          else:
              return (
                  outside * border
                + inside * (width - 2 * border)
                + outside * border
              )
      
      def make_box(width, height, border=1, outside="*", inside=" "):
          top_row  = outside * width
          mid_row  = _box_section(width,  border, outside,   inside)
          box_rows = _box_section(height, border, [top_row], [mid_row])
          return "\n".join(box_rows)
      
      print(make_box(4, 3, outside="#"))
      print("")
      print(make_box(8, 6, border=2, inside="."))
      

      给予

      ####
      #  #
      ####
      
      ********
      ********
      **....**
      **....**
      ********
      ********
      

      【讨论】:

        猜你喜欢
        • 2019-05-10
        • 1970-01-01
        • 1970-01-01
        • 2014-02-03
        • 1970-01-01
        • 2021-07-01
        • 2013-08-18
        • 2017-12-23
        • 2017-03-09
        相关资源
        最近更新 更多