我尝试将元组('a',1), ('b',2),('c',3)
中的值输入到函数dostuff
中,但我总是返回None
或False
。如果这个问题是基本的,我很抱歉。我将不胜感激任何帮助。
我希望结果如下:
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))
答案 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)
正如@ n1c9所说,每个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"
是一个代表行尾的特殊字符