Python 为什么函数在某些条件下返回None
我使用堆栈编写了方括号检查函数。它似乎可以工作,但当我在开始时将“[]{}”作为参数少量可重复符号时,它将返回None。我认为它与stack len有关,但仍然没有弄清楚Python 为什么函数在某些条件下返回None,python,python-3.x,Python,Python 3.x,我使用堆栈编写了方括号检查函数。它似乎可以工作,但当我在开始时将“[]{}”作为参数少量可重复符号时,它将返回None。我认为它与stack len有关,但仍然没有弄清楚 def func(brakets): stack = [] for char in brakets: if char in '([{': stack.append(char) # print(stack) if len(stack)
def func(brakets):
stack = []
for char in brakets:
if char in '([{':
stack.append(char)
# print(stack)
if len(stack) == 0:
return False
opener = stack.pop()
if opener == '(' and char != ')':
return False
if opener == '[' and char != ']':
return False
if opener == '{' and char != '}':
return False
if not stack:
return True
经过一些重构后,我做到了:
def func(pattern):
stack = []
for bracket in pattern:
if bracket in dct.keys():
stack.append(bracket)
print(stack)
elif bracket in dct.values():
if len(stack) == 0:
return False
opened_bracket = stack.pop()
if dct[opened_bracket] != bracket:
return False
if not stack:
return True
但还是一样的问题
def func(pattern):
stack = []
for bracket in pattern:
if bracket in dct.keys():
stack.append(bracket)
print(stack)
elif bracket in dct.values():
if len(stack) == 0:
return False
opened_bracket = stack.pop()
if dct[opened_bracket] != bracket:
return False
else:
return False
if not stack:
return True
但仍然没有。但在循环结束时,所有条件均未完成,我将else语句放入后,您可能会遇到三种不同类型的不匹配: 我们看到一个结束字符']'或'}',所以我们想 从堆栈中弹出,但堆栈为空。这意味着你有 一个不匹配的结束字符。 我们看到一个结束字符,因此希望从堆栈中弹出。 堆栈不是空的,但是我们弹出的开头字符不是空的 匹配当前结束字符,例如最后一个开始字符 我们推到了堆栈上,但是当前的关闭 字符为']' 在查看循环后的每个字符后,堆栈 对于我们推到的每个开头字符都应该为空 堆栈,我们应该有一个匹配的结束字符来弹出它 从堆栈中删除。如果循环后堆栈不是空的,这意味着 我们有一个或多个开头字符,但没有匹配的结尾 性格 在我下面发布的代码中,堆栈更像是一堆字典,我在代码中称它们为成对类型,而不是将单个字符推到堆栈上。给定的对类型告诉您,给定一个开始字符,弹出时希望看到哪个结束字符。这样做的好处是简化了循环中的事情——当检查最近的开始字符是否与当前结束字符匹配时,而不是一系列if语句时,我们可以只查找预期的结束字符应该是什么。这还有一个额外的优点,即如果您想添加新类型的对,可以在以后扩展is_balanced函数
def is_balanced(string):
pair_types = [
{"open": "(", "close": ")"},
{"open": "[", "close": "]"},
{"open": "{", "close": "}"}]
def get_pair_type_from_open_char(open_char):
try:
return next(pair_type for pair_type in pair_types if pair_type["open"] == open_char)
except StopIteration:
# No such pair exists
return None
all_close_chars = "".join([pair_type["close"] for pair_type in pair_types])
stack = []
for char in string:
pair_type = get_pair_type_from_open_char(char)
if pair_type is not None:
stack.append(pair_type)
elif char in all_close_chars:
# We would like to pop
try:
top = stack.pop()
except IndexError:
# The stack was empty
return False
else:
# The stack was not empty
# However, the current open char (top of the stack)...
# ...needs to match the current close char
if top["close"] != char:
# The current pair of chars are mismatched (e.g. "(" and "]")
return False
# If there are things left over in the stack after the loop...
# ...this means we have open chars with no matching close chars
return not stack
def main():
string = "(())[({})]"
print("The string is" + [" not", ""][is_balanced(string)] + " balanced")
return 0
if __name__ == "__main__":
import sys
sys.exit(main())
如果函数结束时堆栈不是空的,会发生什么?所有返回语句都在if条件内。如果这些都不匹配,就没有显式的返回值……提示:您总是附加到堆栈中,然后立即再次弹出相同的值。这不可能是对的…@Blue如果你改变函数应该做什么的定义…我们只能猜测这应该检查嵌套括号的对称性。同样,如果堆栈非空,循环后会发生什么?函数返回什么?