Python while循环,它从循环2中减去循环1的值,并在循环2中打印差异

时间:2017-03-03 02:07:29

标签: python-3.x while-loop

我正在尝试进行python任务,而且我被困住了。 对于以下代码:

import math
# adds math module

# User input

xn = float(input('Enter x (-1 to 1):  '))
if -1 < xn <= 1:
    xLn = math.log1p(xn)
    print('Python ln function: ln(1+x) =', xLn)
    print('')
print("# Terms", '   ', 'Approx', '   ', 'Error')

def L(x, y):
    x = xn
    s = 0
    s += abs((-1)**(f+1)*(x**f)/f)
    return s

f = 0
while f <= 19:
    f = f + 1
    print(f, (abs(L(f, xn))))

我想得到这个输出:

Enter x (-1 to 1): .5
Python ln function: ln(1+x) = 0.405465
# Terms Approx Error
1 0.500000 0.094535
2 0.375000 0.030465
3 0.416667 0.011202 
until 20

我可以在第一个循环中使用它,但是我需要从2中减去循环1的答案,然后将差异打印到近似值(大约下) 我知道我只需要从我的第一个if语句中减去每个值来得到&#34;错误&#34;,但对于循环之后的大约部分,我丢失了。

这是我的代码给我的输出:

Enter x (-1 to 1):  0.5
Python ln function: ln(1+x) = 0.4054651081081644

# Terms     Approx     Error
1 0.5
2 0.125
3 0.041666666666666664
until 20

如果您需要更多信息,请与我们联系。 我是python和编码的新手,所以如果这看起来令人困惑,我会提前道歉。

编辑: 好了,今天稍微玩了一下代码后,我已经清理了def L(xn,y),使其更容易阅读。 现在我需要做的就是让第二个循环获取第一个循环的值并将其添加到第二个循环的值。然后它必须为第三个执行此操作并添加第二个,依此类推,直到运行20个循环。 我要做的关闭是使用以下代码:

import math
# adds math module

# User input

xn = float(input('Enter x (-1 to 1):  '))
if -1 < xn <= 1:
    xLn = math.log1p(xn)
    print('Python ln function: ln(1+x) =', xLn)
    print('')
print("# Terms", '   ', 'Approx', '   ', 'Error')

def L(xn, y):

    while y <= 19:
        return (-1)**(y + 1)*(xn ** y)/y


y = 0
while y <= 19:
    y = y + 1
    x = L(xn, y)      # makes it easier to call in the second loop
    print(y, (L(xn, y)))
    if y <= 2:
        y = 2
        print(y, L(xn, y) + x) # bring the answer for the first loop and add it to the second

这适用于第一个和第二个循环(参见上面的注释),但不会继续其余的循环。 有什么建议? 我觉得我很亲密哈哈!

1 个答案:

答案 0 :(得分:0)

以下是几个选项。以下是由于缺乏明确性而无法完全匹配您的问题的示例,但应指向正确的方向。

# Format templates to print data nicely
HEADING_FORMAT = "{0:<5} {1:<12} {2:<12} {3:<12}"
DATA_FORMAT = "{0:<5} {1:<12.6f} {2:<12.6f} {3:<12}"

# Function that performs a calculation
def func(x, y):
    return x + y

示例1:

def main():
    print(HEADING_FORMAT.format('#', 'Terms', 'Approx', 'Error'))

    # variable to hold previous value
    prev = None 
    for i in range(0, 21):
        value = func(i, 10)
        # if there is no previous then set it and
        # continue to next iteration of loop
        if prev is None:  
            prev = value
            continue

        # Error is left as empty string
        print(DATA_FORMAT.format(i, prev, value, '')) 
        prev = value

示例2:创建生成器

def main():
    print(HEADING_FORMAT.format('#', 'Terms', 'Approx', 'Error'))

    # create an iterator
    values = iter(func(i, 10) for i in range(0, 21))
    # get the first value
    prev = next(values, 0)

    # iterate through the remaining values
    for i, value in enumerate(values, 1):
        print(DATA_FORMAT.format(i, prev, value, '')) 
        prev = value

示例3:列表理解和压缩

def main():
    print(HEADING_FORMAT.format('#', 'Terms', 'Approx', 'Error'))
    # use list comprehension
    values = [func(i, 10) for i in range(0, 21)]
    # zip the list with a slice of same list skipping the first
    # to form pairs of each value | (0, 1), (1, 2), (2, 3), ...
    for i, (v1, v2) in enumerate(zip(values, values[1:]), 1):
        print(DATA_FORMAT.format(i, v1, v2, ''))

额外:

如果您需要在生成值时执行其他操作,那么您可以定义自己的生成器以随时生成值。

def ifunc(_from, _to, x):
    for i in range(_from, _to + 1):
        # maybe something extra here
        yield func(i, x)

然后,对于列表组合示例,将替换range(0, 21)

values = [value for value in ifunc(0, 20, 10)]

每个主要方法的输出

>>> main()
#     Terms        Approx       Error       
1     10.000000    11.000000                
2     11.000000    12.000000                
3     12.000000    13.000000                
4     13.000000    14.000000                
5     14.000000    15.000000                
6     15.000000    16.000000                
7     16.000000    17.000000                
8     17.000000    18.000000                
9     18.000000    19.000000                
10    19.000000    20.000000                
11    20.000000    21.000000                
12    21.000000    22.000000                
13    22.000000    23.000000                
14    23.000000    24.000000                
15    24.000000    25.000000                
16    25.000000    26.000000                
17    26.000000    27.000000                
18    27.000000    28.000000                
19    28.000000    29.000000                
20    29.000000    30.000000