【问题标题】:Python Endless LoopingPython 无限循环
【发布时间】:2017-10-13 00:04:44
【问题描述】:

我有以下代码:

for i in range(N):

    # Dispersed Source
    theta = np.random.uniform(0, np.pi, 1)
    phi = np.random.uniform(0, 2 * np.pi, 1)
    R = np.random.uniform(0, Ro, 1)

    x = R * np.sin(theta) * np.cos(phi)
    y = R * np.sin(theta) * np.sin(phi)  # ?
    z = R * np.cos(theta)

    x_vec, y_vec, z_vec, nu = particle_func(x, y, z)

    particle_trace = go.Scatter3d(
                        x=x_vec,
                        y=y_vec,
                        z=z_vec,
                        mode='lines'
                    )

    data.append(particle_trace)

    for j in range(int(nu)):
        x = x_vec[-1]
        y = y_vec[-1]
        z = z_vec[-1]

        x_vec_1, y_vec_1, z_vec_1, nu1 = particle_func(x, y, z)

        particle_trace_fiss = go.Scatter3d(
            x=x_vec_1,
            y=y_vec_1,
            z=z_vec_1,
            mode='lines'
        )

        data.append(particle_trace_fiss)

问题是for循环需要继续这样下去:

for j in range(int(nu)):
        x = x_vec[-1]
        y = y_vec[-1]
        z = z_vec[-1]

        x_vec_1, y_vec_1, z_vec_1, nu1 = particle_func(x, y, z)

        particle_trace_fiss = go.Scatter3d(
            x=x_vec_1,
            y=y_vec_1,
            z=z_vec_1,
            mode='lines'
        )

        data.append(particle_trace_fiss)

 for k in range(int(nu1)):
        x = x_vec_1[-1]
        y = y_vec_1[-1]
        z = z_vec_1[-1]

        x_vec_2, y_vec_2, z_vec_2, nu2 = particle_func(x, y, z)

        particle_trace_fiss = go.Scatter3d(
            x=x_vec_2,
            y=y_vec_2,
            z=z_vec_2,
            mode='lines'
        )

        data.append(particle_trace_fiss)

 for l in range(int(nu2)):
        x = x_vec_2[-1]
        y = y_vec_2[-1]
        z = z_vec_2[-1]

        x_vec_3, y_vec_3, z_vec_3, nu3 = particle_func(x, y, z)

        particle_trace_fiss = go.Scatter3d(
            x=x_vec_3,
            y=y_vec_3,
            z=z_vec_3,
            mode='lines'
        )

        data.append(particle_trace_fiss)

...

因为 nu 的值是一个随机数或零(由particle_func 函数给出),所以我需要的循环数可能会一直持续下去。也就是说,我可以复制/粘贴

for k in range(int(nu#)):...
     data.append(particle_trace_fiss)

无限次并得到我正在寻找的东西(其中 nu# 表示前一个循环提供的 nu 的值。

请参阅下面的算法进行说明:

抱歉,如果我的问题不清楚,我很乐意回复任何要求澄清的 cmets。提前感谢所有帮助,谢谢!

【问题讨论】:

  • 我不太清楚你的意思。我不确定我是否遵循:“因为 nu 的值是一个随机数或零,这意味着循环数可能永远持续下去。”我不知道您是否尝试实现某种特定类型的行为,或者您是否遇到了一些您试图阻止的无限循环行为......
  • 如果即将进行的编辑有帮助,请告诉我
  • 我正在尝试实现某种特定类型的行为来回答您的问题
  • 我也很困惑。如果这过于简单,我深表歉意,但这是否可以像“使用 while 循环而不是 for 循环,因为您只想在满足特定条件时结束”一样简单? wiki.python.org/moin/WhileLoop 还是简单的递归——每次调用particle_func,都有特定数量的东西要追加,但每次调用都要处理。
  • 我会说后者

标签: python for-loop random while-loop infinite-loop


【解决方案1】:

您似乎只需将for 包装在while 循环中,可能带有任意截止。

这段代码:

for i in range(N):

    # Dispersed Source
    theta = np.random.uniform(0, np.pi, 1)
    phi = np.random.uniform(0, 2 * np.pi, 1)
    R = np.random.uniform(0, Ro, 1)

    x = R * np.sin(theta) * np.cos(phi)
    y = R * np.sin(theta) * np.sin(phi)  # ?
    z = R * np.cos(theta)

    x_vec, y_vec, z_vec, nu = particle_func(x, y, z)

    particle_trace = go.Scatter3d(
                        x=x_vec,
                        y=y_vec,
                        z=z_vec,
                        mode='lines'
                    )

    data.append(particle_trace)

    for j in range(int(nu)):
        x = x_vec[-1]
        y = y_vec[-1]
        z = z_vec[-1]

        x_vec_1, y_vec_1, z_vec_1, nu1 = particle_func(x, y, z)

        particle_trace_fiss = go.Scatter3d(
            x=x_vec_1,
            y=y_vec_1,
            z=z_vec_1,
            mode='lines'
        )

        data.append(particle_trace_fiss)

变成这样的代码:

for i in range(N):

    # Dispersed Source
    theta = np.random.uniform(0, np.pi, 1)
    phi = np.random.uniform(0, 2 * np.pi, 1)
    R = np.random.uniform(0, Ro, 1)

    x = R * np.sin(theta) * np.cos(phi)
    y = R * np.sin(theta) * np.sin(phi)  # ?
    z = R * np.cos(theta)


    arbitrary_limit = 10

    x_vec = [x]
    y_vec = [y]
    z_vec = [z]
    nu_vec = [1]

    nu = nu_vec[-1]    # Updated - keep a list of values of nu

    while int(nu) != 0:

        for j in range(int(nu)):
            x = x_vec[-1]
            y = y_vec[-1]
            z = z_vec[-1]

            x_vec, y_vec, z_vec, nu = particle_func(x, y, z)

            nu_vec.append(nu)

            particle_trace = go.Scatter3d(
                            x=x_vec,
                            y=y_vec,
                            z=z_vec,
                            mode='lines'
                        )

            data.append(particle_trace)

我想问题是,您将如何决定何时停止?有什么办法可以限制nu 的值吗?

更新:根据您的评论,我删除了arbitrary_limit 代码。根据您在另一个尝试回答中的解释,我还添加了一个 nu_vec 来跟踪 nu 的所有值。

【讨论】:

  • 我不想阻止循环以任意值运行,在某些情况下,如果代码从未完成运行,那么它可能是正确的。请在下面查看我尝试的答案
  • 我已经修改了代码以删除限制,并跟踪 nu 的值
  • 请看问题编辑,你的 sn-p 描述算法吗?我不觉得它会那么容易
【解决方案2】:

我认为我可以使用以下内容:

for i in range(N):

    # Central Point Source
    # z = 0
    # x = 0
    # y = 0

    # Dispersed Source
    theta = np.random.uniform(0, np.pi, 1)
    phi = np.random.uniform(0, 2 * np.pi, 1)
    R = np.random.uniform(0, Ro, 1)

    x = R * np.sin(theta) * np.cos(phi)
    y = R * np.sin(theta) * np.sin(phi)  # ?
    z = R * np.cos(theta)

    x_vec, y_vec, z_vec, nu = particle_func(x, y, z)

    particle_trace = go.Scatter3d(
                        x=x_vec,
                        y=y_vec,
                        z=z_vec,
                        mode='lines'
                    )

    data.append(particle_trace)

    while nu != 0:

        x = x_vec[-1]
        y = y_vec[-1]
        z = z_vec[-1]

        for j in range(int(nu)):

            x_vec, y_vec, z_vec, nu = particle_func(x, y, z)

            particle_trace_fiss = go.Scatter3d(
                x=x_vec,
                y=y_vec,
                z=z_vec,
                mode='lines'
            )

            data.append(particle_trace_fiss)

因为它的行为就像我想要的那样。但是,我很困惑:

for j in range(int(nu)):

            x_vec, y_vec, z_vec, nu = particle_func(x, y, z)

因为 nu 的新值与 for 循环范围内的 nu 值一样多。每个 nu 值都很重要。也就是说,我打算生成一定数量的 nu 值。上面的问题是每个 nu 值都被 for 循环中的下一个 nu 值覆盖。如果生成 5 个 nu 值,从技术上讲,我需要在每个 nu 值上独立运行另一个 for 循环,然后循环继续。我希望这是有道理的,有什么想法吗?我在想我可以将所有 nu 值附加到一个向量中并像这样得到它们吗?

【讨论】:

    猜你喜欢
    • 2017-10-12
    • 2020-11-30
    • 2015-05-22
    • 1970-01-01
    • 2021-06-03
    • 2011-10-28
    • 2013-10-12
    相关资源
    最近更新 更多