Python 程序在不应该打印时打印 None

Python program prints None when it isn't supposed to

我编写了一个程序,当我在控制台中按 2 时输出最长的相等数字序列,但出于某种原因它打印出彼此相关的数字(即如果我输入 1 2 2 2 4 5 它输出222 而不是 2 2 2) 并且出于某种原因它还打印 None

我做的断言测试也因为某些原因失败了

输入:按1,输入1 2 2 2 2 4 5 6 1 4

预期输出:按 2,然后应该显示 2 2 2 2 2

实际输出:22222 None

def lista_egale(lst1):
    l = 1
    prev_one = None
    number = 0
    lmax = -1
    for current in lst1:
        if prev_one == current:
            l += 1
        elif l > lmax:
            lmax = l
            number = prev_one
            l = 1
        prev_one = current
    print(number * lmax)

def test_egale():
    assert lista_egale([1, 2, 2, 2, 4, 5, 6]) == 2 2 2
    assert lista_egale([4, 1, 2, 4, 1, 2, 3, 2]) == 1
    assert lista_egale([1, 1, 1, 1, 1, 2, 2, 2, 2]) == 1 1 1 1 1

def show_menu():
    print("lists")
    print("1. Enter the list")
    print("2. Check if the list has a max sequence of equal numbers and print it")
    print("4. exit")


def ui_read_list():
     input_list = input("Numbers go here ")
     return input_list.split()

def run():
    global lst1
    lst1 = []
    show_menu()
    while True:
        cmd = input(">>>")
        if cmd == "4":
            return
        if cmd == "1":
            lst1 = ui_read_list()
        elif cmd == "2":
            print(lista_egale(lst1))
        else:
            print("invalid command")

def main():
    run()
    test_egale()
    #test_munte()

main()

你运行

print(lista_egale(lst1))

你函数的 return 值

lista_egale(lst1)

None,它被打印出来。可能您想 运行 只是:

lista_egale(lst1)

这对我有用,除了第二个断言(对我来说)根本没有意义。为什么您希望 [1] 被 returned 而不是其他任何东西?无论如何,在那种情况下 returns [4]。

def lista_egale(lst1):
    l = 0
    prev_one = None
    number = 0
    lmax = -1
    for current in lst1:
        if prev_one == current:
            l += 1
        elif l > lmax:
            lmax = l
            number = prev_one
            l = 1
        prev_one = current
    return ([number] * lmax)

def test_egale():
    assert lista_egale([1, 2, 2, 2, 4, 5, 6]) == [2, 2, 2]
    assert lista_egale([4, 1, 2, 4, 1, 2, 3, 2]) == [1]
    assert lista_egale([1, 1, 1, 1, 1, 2, 2, 2, 2]) == [1, 1, 1, 1, 1]

def show_menu():
    print("lists")
    print("1. Enter the list")
    print("2. Check if the list has a max sequence of equal numbers and print it")
    print("4. exit")


def ui_read_list():
    input_list = input("Numbers go here ")
    return input_list.split()

def run():
    global lst1
    lst1 = []
    show_menu()
    while True:
        cmd = input(">>>")
        if cmd == "4":
            return
        if cmd == "1":
            lst1 = ui_read_list()
        elif cmd == "2":
            print(lista_egale(lst1))
        else:
            print("invalid command")

def main():
    run()
    test_egale()
    #test_munte()

main()

编辑:

你的错误是:

  1. l 被初始化为 1,尽管它应该被初始化为 0(因为如果最长的“连胜”是 1 长,那么什么都不会到达 l>lmax.
  2. lista_eagle 函数中你没有 return 任何东西而是打印了结果。
  3. 您正在打印 number * lmax,它是一个数字而不是条纹本身,您可以通过将数组本身连接 lmax 次来获得条纹本身(如此处 return [number] * lmax 所示)。

正如其他人所指出的,听起来您期望 lista_egale 到 return 一个值而不是打印它。我认为您还想使用列表的 count 函数来查找每个项目在列表中的次数,如下所示:

def lista_egale(lst1):
    lmax = -1
    number = 0
    for current in lst1:
        if lst1.count(current) > lmax:
            lmax = lst1.count(current)
            number = current
    return ' '.join([str(number)] * lmax)

然后为了让你的断言起作用,比较也应该是这样的字符串:

def test_egale():
    assert lista_egale([1, 2, 2, 2, 4, 5, 6]) == '2 2 2'
    assert lista_egale([4, 1, 2, 4, 1, 2, 3, 2]) == '1'
    assert lista_egale([1, 1, 1, 1, 1, 2, 2, 2, 2]) == '1 1 1 1 1'

lista_egale() 的打印语句中执行此操作:

print((str(number)+" ")*lmax)

这将打印 2 2 2 而不是 222