Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么函数在某些条件下返回None_Python_Python 3.x - Fatal编程技术网

Python 为什么函数在某些条件下返回None

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)

我使用堆栈编写了方括号检查函数。它似乎可以工作,但当我在开始时将“[]{}”作为参数少量可重复符号时,它将返回None。我认为它与stack len有关,但仍然没有弄清楚

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如果你改变函数应该做什么的定义…我们只能猜测这应该检查嵌套括号的对称性。同样,如果堆栈非空,循环后会发生什么?函数返回什么?