Python递归返回None,但我显式地设置了return

2024-04-26 13:18:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着从Stepic做一些练习,几乎所有的测试都完成了,但是我
据我所知,当我们进行递归循环时,我们需要显式地设置return。 但在这种情况下,出了点问题。 这让我震惊了一周。你知道吗

initialDict = {}

def add(child, parent):
    if child not in (initialDict):     
        initialDict.update({child: parent})
    else:
        initialDict[child].append(parent)

def heritage(parent, child):
    if parent == child:
        print('Yes')
    elif child in initialDict and parent in initialDict[child]:
        print('Yes')
    elif child not in initialDict or parent not in initialDict[child]:
        print('No')
    else:
        for i in range(len(initialDict[child])):
            return heritage(initialDict[child][i], initialDict[child])


n = int(input())
for _ in range(n):
    class_description = input().split()
    class_name = class_description[0]
    class_parents = class_description[2:]
    add(class_name, class_parents)

q = int(input())
for _ in range(q):
    question = input().split()
    parent = question[0]
    child = question[1]
    print(heritage(parent, child))

We set:
4
A
B : A
C : A
D : B C
4
A B
B D
C D
D A

预期结果:

Yes
Yes
Yes
No

实际结果:

Yes
None
Yes
None
Yes
None
No
None

Tags: noinnonechildforinputnotrange
2条回答

如果不指定return,则默认为None。你知道吗

有两种解决方案

1)返回字符串并打印结果:

def heritage(parent, child):
    if parent == child:
        return 'Yes'
    elif child in initialDict and parent in initialDict[child]:
        return 'Yes'
    elif child not in initialDict or parent not in initialDict[child]:
        return 'No'
    else:
        for i in range(len(initialDict[child])):
            return heritage(initialDict[child][i], initialDict[child])

...
for _ in range(q):
    question = input().split()
    parent = question[0]
    child = question[1]
    print(heritage(parent, child))
...

2)或者打印函数内部,但不打印函数的结果,因为结果为“无”

for _ in range(q):
    question = input().split()
    parent = question[0]
    child = question[1]
    heritage(parent, child) # You return None, but you dont print it

本质上,问题在于:

def func_None():
    print('yes')

print(func_None())

>>> 
yes # this is printed inside function
None # this is printed result, because by default every function returns None if not specified

def func_not_None():
    return 'yes'

print(func_not_None())
>>>
yes

做循环:

for _ in range(q):
    question = input().split()
    parent = question[0]
    child = question[1]
    heritage(parent, child)

因为heritage函数包含print,而print(print(..))会给出一个额外的None,因为print实际上是None。你知道吗

相关问题 更多 >