Python无休止的循环

2024-05-16 14:22:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码:

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的值)。你知道吗

请参见下面的算法进行说明: enter image description here

抱歉,如果我的问题不清楚,我将很乐意回应任何要求澄清的评论。感谢您的帮助,谢谢!!你知道吗


Tags: ingofordatamodenptracerange
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)

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

似乎你只需要把你的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的所有值,根据您在另一个尝试性回答中的解释。你知道吗

相关问题 更多 >