Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.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 3.3:获取多行输入,然后分别计算它们_Python_Python 3.3_Multiline - Fatal编程技术网

Python 3.3:获取多行输入,然后分别计算它们

Python 3.3:获取多行输入,然后分别计算它们,python,python-3.3,multiline,Python,Python 3.3,Multiline,我对Python非常陌生,我正在尝试创建一个程序来计算用户给定的两个X和Y坐标之间的距离,用空格分隔。我可以对一行进行此操作,但我希望用户能够输入多行不同坐标,然后在输入0时停止。然后我想计算每个距离,并告诉用户距离是否小于100 样本输入: x1 y1 x2 y2 124.45 445.35 65.34 530.45 124.45 445.35 74.34 530.45 0 0 0 0 样本输出: Greater than 100 Less than 100 以下是我目前的代码: #O

我对Python非常陌生,我正在尝试创建一个程序来计算用户给定的两个X和Y坐标之间的距离,用空格分隔。我可以对一行进行此操作,但我希望用户能够输入多行不同坐标,然后在输入0时停止。然后我想计算每个距离,并告诉用户距离是否小于100

样本输入: x1 y1 x2 y2

124.45 445.35 65.34 530.45
124.45 445.35 74.34 530.45  
0 0 0 0
样本输出:

Greater than 100
Less than 100
以下是我目前的代码:

#Obtain input from user
text = input()
while True:
    x1 y1, x2, y2=input().split()
    x1, y1, x2, y2 = [float(x1), float(y1), float(x2), float(y2)]
    if text == "0 0 0 0":
        break
    else:
        #Calculate distance
        import math
        distance = math.sqrt((y1 - y2)**2 + (x1- x2)**2)
        if distance >= 100:
            print("Greater than 100")
        else:
            print("Less than 100")

我的问题是,经过两行输入后,它会给我一个答案。直到我输入0,它才会继续。它也只给我第一次输入的答案,不是全部。

试试这样的方法

虽然正确:创建一个无止境的循环 文本=输入 如果text==0:从无止境循环中退出策略 打破 printtext输入、计算并给出反馈,您可以随心所欲
打印完毕

现在请小心。。。您正在从用户处读取数据两次

一次将输入分配给文本变量,但这在循环之外,因此它只发生一次,并且永远不会被拆分或以其他方式操纵

在循环中再重复一次,它在运行中被拆分,但从未检查其退出命令


您应该将赋值移动到循环中的文本变量,并对其进行拆分:

当您已经有了答案时,有另一种方法可以从用户处接收未知数量的输入行。您接受的答案不允许您使用以前的输入,因为它会覆盖数据例如:计算未知数量输入坐标所包围的区域面积,可以是三角形,也可以是正方形等。这样做会有编写意大利面代码的风险

为此,请在开始请求输入之前创建一个列表,然后将每个输入附加到列表中。迭代列表并处理数据:

inputs = []
get_input = True
while get_input:
    text = input("Enter data")  # or whatever you use
    if text != "0 0 0 0":  # exit condition
        inputs.append(text)  # add to list
    else:
        get_input = False  # break loop

for input in inputs:
    process_inputs()  # do stuff with each input

我强烈建议您不要使用sentinel值,因为它打破了Unix哲学的第二部分,请与使用文本流的其他人友好相处。相反,在获得文件结束条件之前读取。在Python中,试图读取超过文件末尾的内容将引发EOR。不过,在这种情况下,您只需在文件上迭代,每次迭代都会得到一行,后面有一个换行符,并且它会在文件末尾自动停止:

import math
import sys

for line in sys.stdin:
    x1, y1, x2, y2 = (float(token) for token in line.split())
    distance = math.sqrt((y1 - y2) ** 2 + (x1 - x2) ** 2)
    if distance >= 100:
        print("Greater than or equal to 100")
    else:
        print("Less than 100")

您还应该将所有导入放在文件的顶部,用空行与其他内容隔开,并像我一样在中缀运算符周围留下空白。这些和其他指导原则可以在中找到,我也强烈建议您阅读。

您正在检查变量文本,但分配给行。我不鼓励您使用类似于“所有零值”或“字符串退出”的内容作为哨兵。相反,在Python3中读取直到获得文件结束条件,EOFError将被提升。谢谢!这解决了我允许0停止输入行的问题,但现在我遇到了另一个问题!啊,对不起!我在条件上犯了一个小错误,循环应该是在获取输入时进行的。我不知道我怎么会错过,谢谢你指出!我刚刚在Python3.4中测试了它,现在应该可以工作了!这似乎是一个完全不同的问题。在这里,我们知道每套数据总是有四个坐标;把所有的输入都列出来对我来说是浪费。你没有错,这只是一种不同的方法。我个人保存输入等等,因为内存很便宜,而且我经常发现我以后需要它,所以我只需要多放两行。因此我的建议。不,在这种情况下这不是完全必要的,但我想帮忙。