如何在Python中返回多个值?

时间:2014-04-03 14:01:13

标签: python function return

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

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)

如果我按原样调用该功能,它将打印所有内容。但我不想让它打印出来。我尝试通过返回替换所有打印,但它只打印第一行(这不是意料之外的,因为返回只会在第1行终止该函数)。

4 个答案:

答案 0 :(得分:4)

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

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))
****
*  *
*  *
*  *
****

答案 1 :(得分:1)

有意义的名字也非常有用!

编辑:还:捕获意外情况(如宽度< 2 * border)和代码重用(将重复代码委托给子函数)。

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="."))

给出

####
#  #
####

********
********
**....**
**....**
********
********

答案 2 :(得分:0)

以下是无关的示例,说明如何实现这一目标:

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]

答案 3 :(得分:0)

您可以将所有字符串收集到列表中,然后打印该列表的内容。但是我认为这是编写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

DEMO:

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

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

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