首页 > 解决方案 > 来自用 Python 自动化无聊的东西的“逗号代码”程序

问题描述

我正在通过 Al Sweigart 的“Automate the Boring Stuff with Python”一书学习 Python。我正在完成关于列表的一章,并且我有一个名为“逗号代码”的程序提示:

假设您有一个这样的列表值:

spam = ['apples', 'bananas', 'tofu', 'cats']

编写一个函数,该函数将列表值作为参数并返回一个字符串,其中所有项目由逗号和空格分隔,在最后一项之前插入和插入。例如,将前一个垃圾邮件列表传递给函数将返回'apples, bananas, tofu, and cats'. 但是您的函数应该能够处理传递给它的任何列表值。"

到目前为止,这是我的代码:

def commaCode(newList):
   print(str(newList[:-1]) + 'and' + ' ' +  str(newList[-1]))
   return

nextlist = []
anotherlist = input('Enter a value')
while anotherlist != '':
   nextlist = nextlist + list(anotherlist)

commaCode(nextlist)

我觉得这应该可行,但是每当我输入某种输入时,程序只会让我输入更多输入,但什么也没有发生。然后我尝试退出程序并询问是否要我“杀死程序”。我不确定我的代码有什么问题......我认为它可能与“while”语句有关,但我不确定如何解决它。

标签: python

解决方案


好功夫。您的功能相当接近,但您while将无限运行,因为anotherList循环块内永远不会改变。nextlist但是,将在此循环中继续扩展,用户传递的任何字符串都input()分解为字符。最终,程序将耗尽内存并崩溃。

不要相信我的话:print应该在循环块内终止循环的变量,并查看它在每次传递时所做的事情(重要的调试技能)。

有几种方法可以解决这个问题。下面的方法允许用户在每个循环通过时输入输入,break如果为空,则其结果要么是循环,要么如果不是,则附加到用户输入的累积列表中。

def comma_code(items):
   return ', '.join(items[:-1]) + ' and ' + items[-1]

items = []

while 1:
    user_input = input('Enter a value: ')
    
    if user_input == '':
        break
    
    items.append(user_input)

print(comma_code(items))

样品运行:

Enter a value: 1
Enter a value: 2
Enter a value: 3
Enter a value: 3
Enter a value: 4
Enter a value: 5
Enter a value:
1, 2, 3, 3, 4 and 5

请注意,变量名称snake_cased不是camelCased根据Python 编码标准

我还删除了printcommaCode函数中的那个。这是一个副作用,通常是不可取的,因为该功能不是多用途的:它只将内容打印到标准输出,不能提供太多其他功能。如果您返回结果,调用者可以选择如何处理它(打印、反转、放入数据库……)。

另请注意,如果用户不输入任何内容或输入一项,您将分别得到崩溃或格式错误的输出。尝试将这些边缘情况作为练习来处理!


推荐阅读