1

我在网上做一些教程,我坚持做一个练习:编写一个不带参数的函数 getBASIC(),并执行以下操作:它应该使用 while 循环从输入中读取行;当它到达末尾时,它应该以字符串列表的形式返回整个程序。字符串列表示例:

5 GOTO 30
10 GOTO 20
20 GOTO 10
30 GOTO 40
40 END

我写了一个程序,但它不起作用,但是我也会发布它:

def getBASIC():
    L=[]
    while "END" not in L:
        L.append(str(input()))
        if str(input()).endswith("END"):
            break
    return L

另外我注意到你不允许我使用 IS 或 RECURSION 。

4

5 回答 5

4

有几个错误:

  • 您调用input()了两次而没有第二次将其附加到列表中
  • 'END' in L确定列表中是否有'END'(整)行L(没有)

注意:input()已经返回了一个str对象;你不需要调用str()它的返回值。

要读取输入直到你有空行,你可以:

def getBASIC():
    return list(iter(input, ''))

或者读取直到END在行尾遇到:

def getBASIC():
    L = []
    while True:
        line = input()
        L.append(line)
        if line.endswith("END"):
           break #NOTE: it doesn't break even if `line` is empty
    return L
于 2012-08-09T14:54:23.487 回答
2

回到我学习 Pascal 的时候,我们对至少需要一次迭代的循环使用了启动读取。这在 Python 中仍然很有效(我更喜欢它而不是while True / break循环)。

通过简单地测试列表中的最后一行(而不是读取的最后一行),我们无需使用变量来存储输入,并且可以结合读取和附加操作。

def getBASIC():
    lines = [input("]")]    # use Applesoft BASIC prompt  :-)
    while not lines[-1].upper().rstrip().endswith("END"):
        lines.append(input("]"))
    return lines
于 2012-08-09T14:55:24.470 回答
1
  1. 使用raw_input()而不是input(). input() 函数从标准输入中获取字符串,并尝试将其作为 python 源代码执行。raw_input() 将按预期返回一个字符串。
  2. input()您在循环中使用2 次。这意味着您等待在一个循环迭代中输入两个字符串。您的 while 循环中不需要最后一个条件(if 语句)。当在L中遇到“END”时,它将结束。

下一个代码应该可以完成这项工作:

def getBASIC():
    L=[]
    while True:
        inp = raw_input()
        L.append(inp)
        if inp.endswith('END'):
            break
    return L
于 2012-08-09T14:39:23.937 回答
1

试试这个:

def get_basic():
    L = []
    while True:
        line = str( input() )
        L.append( line )
        if "END" in line:
            break
    return L
于 2012-08-09T14:39:36.367 回答
1

您的代码存在以下问题。

  1. 如果您的输入是“40 END”, “ while "END" not in L”将不起作用
  2. 在 Python 2.7 中,“ input()”等价于“ eval(raw_input()))”。因此,Python 正在尝试评估“GOTO”语句。
  3. " if str(input()).endswith("END"):" 不将输入附加到 L

因此,这是您的函数的更新版本:

def getBASIC():
    L = []
    while True:
        # Grab input
        L.append(str(raw_input()))

        # Check if last input ends with "END"
        if L[-1].endswith("END"):
            break
    return L
于 2012-08-09T14:52:26.297 回答