任何人都可以解释我的Python for循环(或迭代)算法

时间:2014-10-23 06:31:08

标签: python python-2.7

我正在从Coursera学习python。我写了一个程序,据说当我点击屏幕时,它会绘制圆圈。请参阅以下计划 -

# Dots

# importing
import simplegui
import math

width = 600
height = 600
ball_list = []
radius = 20
colour = "Yellow"

# position ditector
def distance(p,q) :
    return math.sqrt((p[0]-q[0])**2 + (p[1]-q[1])**2)



# Mouse click -- Change the position
def click(pos) :
    ball_list.append(pos)
#    global position
#   global colour
#    if  distance(pos, position) < radius :
#        colour = "Blue"
#    else :
#        position = list(pos)
#        colour = "Yellow"


# Drawing the ball
def draw(canvas) :
    for position in ball_list :
        canvas.draw_circle(position , radius , 2, "Black" , colour)

# Creating the frame
frame = simplegui.create_frame("Dots" , 600,600)
frame.set_canvas_background("White")

frame.set_draw_handler(draw)

# mouse click 
frame.set_mouseclick_handler(click)


# Start
frame.start()

但我的怀疑是在def draw(画布),for position in ball_list,我没有定义任何位置。我将position = list(pos)作为评论。那么position in ball_list中的位置值是什么,循环如何工作而没有任何价值?什么是迭代?循环和迭代之间有什么区别?

如果以上代码在您的IDE中无效,请转到http://www.codeskulptor.org/#user38_VSZ0jZ0uTh_0.py 并运行它。

4 个答案:

答案 0 :(得分:1)

与其他语言相比,python中的

for循环略有不同。我会尝试使用您编写的代码进行解释。每次调用click函数时,您都会将pos附加到名为ball_list的列表中,您需要绘制圆圈。< / p>

def click(pos) :
    ball_list.append(pos) ## appends the pos to ball_list

现在,在您拥有pos列表之后,您将调用以下函数。

def draw(canvas) :
    for position in ball_list :
        canvas.draw_circle(position , radius , 2, "Black" , colour)

此处变量position遍历从第一个到最后一个值开始附加到列表pos的所有ball_list。 如果您想知道position变量的价值和价值是多少,那么请打印它的值并自行查看,如下所示:

def draw(canvas) :
        for position in ball_list :
            print position  ## prints one pos value in the ball_list for each iteration.
            canvas.draw_circle(position , radius , 2, "Black" , colour)

答案 1 :(得分:0)

在python中,for x in y:遍历y中的每个项目,并将当前迭代的值分配给变量x,以便您可以在该变量的主体内引用该值。 for循环。 Here's an eval.in可能会帮助您了解其工作原理。

Screenshot of the eval.in

这里是与Java的简要比较,假设变量&#34; arrayList&#34;是一个ArrayList(Java)或list(Python)的东西,你想对列表中的每个值调用方法do_something_with()

的Python:

for x in arrayList:
    do_something_with(x)

爪哇:

for (int i = 0; i < arrayList.size(); i++) {
    do_something_with(arrayList.get(i));
}

从根本上说,你可以编写看起来更像Java的Python:

for x in range(0, len(arrayList)):
    do_something_with(arrayList[x])

这段代码会做同样的事情。但是,Python意识到这是一个足够普遍的任务,它为它提供一定程度的抽象是有价值的(在编程语言中通常称为"syntactic sugar")。您可以在python documentation中阅读有关Python迭代器的更多信息,以及如何迭代不同类型的数据。

答案 2 :(得分:0)

a_list = [1, 2, 3, 4, 5, 6, 7]

for x in [10, 20, 30, 40, 50]:
    print x

10 20 三十 40 50

for x in a_list:
   print x

1 2 3 4 五 6 7

for i in range(10):
    print i

1 2 3 4 五 6 7 8 9 10

答案 3 :(得分:0)

假设您有自己的类,希望它可以迭代:

 class MyRange(object):
     def __init__(self, low, high):
         self.low = low
         self.high = high

     def __iter__(self):
         low = self.low
         while self.high >= low:
             yield low
             low += 1

现在你可以:

r = MyRange(1, 10)
for number in r:
    print number,

number现在具有每次迭代中从__iter__返回的值。这就是Python的工作原理,在你的情况下,你有一个list,它有自己的__iter__并以类似的方式使用。