简体   繁体   English

Python递归返回None但我明确设置了return

[英]Python recursion return None but i explicitly set return

I was trying to make some exercise from Stepic and almost all tests done but i 我试图从Stepic做一些练习,并且几乎完成了所有测试,但我
I far as i know when we do recursion cycle we need explicitly set return. 据我所知,当我们执行递归循环时,我们需要显式设置return。 But in this case something get wrong. 但是在这种情况下,会出错。 This blow my mind for weeklong. 整整一个星期我都为之震惊。

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

Expected Result: 预期结果:

Yes
Yes
Yes
No

Actual Result: 实际结果:

Yes
None
Yes
None
Yes
None
No
None

Make the loop: 进行循环:

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

Since heritage function contains print s, while print(print(..)) would give an extra None since print is actually None . 由于heritage函数包含print ,而print(print(..))会给出一个额外的None因为print实际上是None

If you dont specify return, its by default None. 如果不指定return,则默认为None。

There are two solutions 有两种解决方案

1) you return string and print the result: 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) or you print inside function, but you dont print result of the function, as the result is None 2)或者您在函数内部打印,但是您不打印函数结果,因为结果为None

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

Essentially the problem is this: 本质上,问题是这样的:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM