函数调用Python基础

时间:2016-10-14 14:38:40

标签: python

我尝试将元组('a',1), ('b',2),('c',3)中的值输入到函数dostuff中,但我总是返回NoneFalse。如果这个问题是基本的,我很抱歉。我将不胜感激任何帮助。

我希望结果如下:

a1---8
b2---8 
c3---8

代码:

def dostuff(stri,numb,char):
        cal = stri+str(numb)+'---'+str(char)
        return cal

def callit (tups,char):
    for x in range(len(tups)):
        dostuff(tups[x][0],tups[x][1],char)

print(callit([('a',1), ('b',2),('c',3)],8))

4 个答案:

答案 0 :(得分:4)

我认为你误解了函数的return值:除非另有说明,否则所有函数都会在完成时返回None。你的代码:

print(callit([('a',1), ('b',2),('c',3)],8))`

告诉Python解释器“打印此函数调用的返回值”。这不会打印您期望的内容,因为callit函数没有指定返回值。您可以更改return函数中的dostuff,如下所示:

 def dostuff(stri,numb,char):
    cal = stri+str(numb)+'---'+str(char)
    print cal

def callit (tups,char):
    for x in range(len(tups)):
        dostuff(tups[x][0],tups[x][1],char)

callit([('a',1), ('b',2),('c',3)],8)

这会将第三行的返回更改为打印命令,并从callit调用中删除打印命令。 另一种选择是:

 def dostuff(stri,numb,char):
    cal = stri+str(numb)+'---'+str(char)
    return cal

def callit (tups,char):
    for x in range(len(tups)):
        cal = dostuff(tups[x][0],tups[x][1],char)
        print(cal)


callit([('a',1), ('b',2),('c',3)],8)

这将获取dostuff函数的返回值,并将其存储在名为cal的变量中,然后可以将其打印或写入磁盘上的文件。

答案 1 :(得分:1)

正如@ n​​1c9所说,每个Python函数都必须返回一些对象,如果在函数定义中没有写出return语句,函数将隐式返回{{ 1}}对象。 (隐含意味着在幕后,Python会看到那里没有返回语句并返回None

然而,虽然在这种情况下在函数中打印值而不是返回它没有任何问题,但它通常被认为是不好的做法。这是因为如果您想要测试函数以帮助调试,则必须在函数定义中编写测试。如果你返回了值,你可以测试调用函数的返回值。

因此,当您调试此代码时,您可能会编写如下内容:

None

如果您不熟悉断言声明,可以阅读here

现在您有了测试功能,您可以返回并修改您的代码。 Callit需要一个返回值,在这种情况下应该是一个字符串。因此,对于函数def test_callit(): tups = [('a', 1), ('b', 2), ('c', 3)] expected = 'a1---8\nb2---8\nc3---8' result = callit(tups, 8) assert result == expected, (str(result) + " != " + expected) ,您可以编写

callit

当你运行test_callit时,如果你得到任何断言错误,你可以看到它与你在回溯中的预期有什么不同。

我即将谈论的内容与您的问题并不相关,但我想说会提高代码的可读性。

Python语句与大多数其他编程语言非常不同,因为它实际上就像foreach循环一样。目前,代码忽略该功能并强制执行常规的for循环功能。写这样的东西实际上更简单,更快:

def callit(tups, char):
    result = ''
    for x in range(len(tups)):
        result += dostuff(tups[x][0], tups[x][1], char) + '\n'
    result = result[:result.rfind('\n')] # trim off the last \n
    return result

答案 2 :(得分:0)

对于在python中返回值的函数,它必须有return语句。在callit功能中,您缺少return的值。一个更Pythonic的方法将同时使用这样的值来迭代元组:

def callit(tups, char):
    x = [dostuff(a, b, char) for a, b in tups]
    return x

由于tups是元组列表,我们可以使用for a, b in tups迭代它 - 这会抓取成对中的两个元素。接下来dostuff(a, b, char)在每对元素和指定的dostuff上调用char函数。将括号括在括号中会使结果成为一个列表,然后我们使用return语句返回该列表。

请注意,您不需要这样做:

x = ...
return x

您可以使用return [dostuff(a, b, char) for a, b in tups]但我使用前者是为了清晰。

答案 3 :(得分:-1)

您可以使用列表推导在一行中执行此操作:

char = 8
point_list = [('a', 1), ('b', 2),('c', 3)]
print("\n".join(["{}{}---{}".format(s, n, char) for s, n in point_list]))

"{}{}---{}".format(s, n, char)通过将{}替换为format中的每个输入来创建字符串,因此"{}{}---{}".format("a", 1, 8)将返回"a1---8"

for s, n in point_list将在point_list列表上创建一个隐式循环,对于列表中的每个元素(每个元组)将第一个元素存储在s中,第二个元素存储在{{1}中}}

因此,

n是通过将我们想要的格式应用于每个元组而创建的列表:它将返回["{}{}---{}".format(s, n, char) for s, n in point_list]

最后["a1---8","b2---8","c3---8"]通过将列表的每个元素连接到" \ n"来从字符串列表中创建单个字符串。到下一个:"\n".join(["a1---8","b2---8","c3---8"])"a1---8\nb2---8\nc3---8"是一个代表行尾的特殊字符