0

抱歉,如果您觉得这很愚蠢,但我对 LPTH 的练习 33 有疑问

http://www.learnpythonthehardway.org/book/ex33.html

Zed 要求我们:重写该练习以改用 for 循环和范围。你还需要中间的增量器吗?如果你不摆脱它会发生什么?

我这样做了:

numbers = []


def NumbersLoop(x):
    """
   This function will loop as long as x is less than the limit,
   at the same time it will print the numbers list
   """

    limit = int(input('Limit: '))
    increment = int(input('Increment: '))

    for i in (x, limit):
        print('At the top x is : {}'.format(x))
        numbers.append(x)

        x += increment
        print('Numbers now: ', numbers)
        print('At the bottom x is {}'.format(x))

NumbersLoop(1)

print('The numbers: ')

for num in numbers:
    print(num)

但我不明白为什么它只循环到 3。还有可能摆脱中间的增量器吗?我看没有办法做到这一点...

4

6 回答 6

2

该代码有一些问题,首先:

for i in (x, limit):

您错过了range调用,x实际上是起点,范围调用不会改变它。

下一个:

print('At the top x is : {}'.format(x))
numbers.append(x)

x += increment

x不受range调用或循环的影响。您要使用的是i,这是范围当前所在的数字。

此外,该range函数采用以下参数:

range(start, stop, increment)

您也不需要 to increment x,请尝试以下各种参数:

start = 0
stop = 10
inc = 2
for i in range(start, stop, inc):
    print(i)

如果你在 python 中遇到任何问题,你应该做的第一件事就是去Python 文档,你几乎总能找到你想要的答案。

于 2013-03-28T02:43:16.343 回答
1
for i in (x, limit):

这意味着“运行循环两次:一次使用i = x,一次使用i = limit”。

再次查看分配规范。它说:

重写该练习以使用 for 循环,range而不是。

range是一个函数。您目前没有在任何地方使用它。你应该在这里使用它。

range从概念上创建一系列数字。这意味着您可以循环for i in这些数字。有关详细信息,您应该阅读该函数的文档

是否有可能摆脱中间的增量器?我看没有办法做到这一点...

先让range电话正常工作,然后再试一试

于 2013-03-28T04:07:17.937 回答
1

这是一个很好的学习实验;它使学生​​在伸手可及的同时伸长答案。在额外的信用步骤 5 之后,这就是我结束的地方:

#!/usr/bin/env python
# -*- coding: utf-8 -*-


# FUNCTIONS
def genNos(noMin, noMax, noIncrement):
    """Returns numbers 0 through i in an array"""
    numbers = []
    for myNum in range(noMin, noMax, noIncrement):
        # print "At the top noMin is %d" % noMin
        numbers.append(myNum)
        # print "Numbers now: ", numbers
        # print "At the bottom noMin is %d" % noMin
    return numbers


# MAIN PROGRAM
print "The numbers: "
myVal = genNos(7, 21, 2)
print "%r" % myVal

for num in myVal:
    print num 

额外学分:

将此 while 循环转换为您可以调用的函数:

  1. 功能:genNos
  2. 将测试中的 6 (i < 6) 替换为变量。
  3. 注意:在函数之外初始化 i 不再起作用;移动“i = 0”以发挥作用。

现在使用此函数重写脚本以尝试不同的数字:

  1. 用变量替换数字
  2. 将范围传递给函数参数。
  3. 注意:只要最小值小于最大值并且最大值大于/等于 noMin+(2*noIncrement),这将起作用。

将另一个变量添加到您可以传入的函数参数中,它可以让您更改第 8 行的 + 1,以便您可以更改它的增量

  1. 添加:(noIncrement增加计数的数字)到函数参数,将第三个值传递给函数。

再次重写脚本以使用此功能,看看有什么效果。

  1. 我这样做是为了测试上面的所有内容;它工作到这一点。

现在,将其编写为使用 for 循环和范围。你需要中间的增量器吗?如果你不摆脱它会发生什么?

  1. 好的,使用 for with range(); range函数将接受我们所有的参数 - 没问题。

注意:我从不使用 'i' 或 'x' 来表示循环中的变量,除非可能是单元测试;除非您使用唯一名称,否则您无法在 vim 中进行搜索/替换;EG: :%s/myNo/MyVal/g; 但这对于任何程序的搜索和替换都是如此。

此外,似乎 afor-loop对编译器的成本高于 a while-loop。在使学生达到的情况下,这是一个很好的实验。但是,我不会在实际程序中使用。while 循环万岁!

于 2014-06-22T17:26:31.313 回答
1
# get the input from the user for i
i = int(input("i>"))
# create an empty list and fill it later
numbers = []
# get input from user for the variable to use in while
num = int(input("num>"))

# Get the user input for increment number in while loop
incrementer = int(input("incrementer>"))
# Create a function and use while loop

def yourfunction(i):
    while i < num:
        # if user input for "i" is less than the user input for "num"
        print(f"at the top of i is {i}")
        # once i is printed, Add i to the list
        numbers.append(i)
        #once i is added to the list, print the list
        print("numbers now", numbers)
        # Then increment i by 1
        i += incrementer
        #once incremented, print i and repeat
        print(f"At the bottom of i is {i}")
# Call the function
yourfunction(i)
# print the newly created listsa
print(f"the new list is {numbers}")

for num in numbers:
    print(num)
于 2019-04-26T11:03:50.793 回答
0

我意识到这是一个老问题,但我想补充一点,因为我刚刚完成了这个问题。

OP 可能一直在想的(如果他使用范围的话)是这样的:

numbers = []


def NumbersLoop(x):
    limit = int(input('Limit: '))
    increment = int(input('Increment: '))

    for i in range(x, limit):
        numbers.append(i) #The i would be the newly incremented x on next iteration. != True

        x += increment

此代码无法正常工作。

原因是,虽然您可能期望新增加x+= increment的值会在下一次迭代中更改范围的起点,从而使i增加的量向上跳跃,但它不会

range 函数使用的x基本上从你第一次调用它时就已经确定了,所以即使你将值更改为

x = 50

下一个数字i将是朝着基于原始 x 的极限范围迈出的下一步。

也许这会为下一个人节省一些时间。你用range(start, end, increment).

于 2014-10-18T13:20:02.100 回答
0

我迟到了 6 年,但也在进行 LPTHW 练习。这就是我所说的,只需使用 for 循环和 range 而不是 while 循环:

numbers = []

for i in range(0,6):
    print "At the top i is %d" % i
    numbers.append(i)
    print "Numbers now: ", numbers
    print "At the bottom i is ", i + 1

print "The numbers: "

for num in numbers:
    print num
于 2019-09-02T16:33:01.307 回答