对于循环,如何在循环外使用循环变量

2024-09-29 01:25:23 发布

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

LR = int(raw_input()) 
RPL = []
c1 = []
c2 = []
L1a = [8, 9, 14, 13, 12]
L2a =[9, 12, 14, 10, 8]
OM = [9, 10]
L3a = [26]
L1b = [27, 32, 26]
L2b = [30, 27, 32, 28, 31]
L3b = [31, 30, 26]

def I():
    for i in L1b:
        for j in L2b:
            for k in L3b:
                n = i * j * k
                c1.append(n)
    for i in OM:
        for j in L1a:
            for k in L2a:
                n = i * j * k
                c2.append(n)
def II():
    for i in c1:
        for j in c2:
            x = (i / j) * LR
            RPL.append(x)

在我的程序中,我需要循环变量I,j,k从'I'函数打印到我的'II'函数中,以显示用于创建x的组合。我尝试了二维数组,但效果不佳。那么有没有什么简单的选择来解决这个问题呢?在


Tags: infordefiic2c1appendlr
3条回答

我认为下面的脚本实现了您要做的:

import operator, itertools

LR = int(raw_input())

L1a = [8, 9, 14, 13, 12]
L2a = [9, 12, 14, 10, 8]
L3a = [26]
L1b = [27, 32, 26]
L2b = [30, 27, 32, 28, 31]
L3b = [31, 30, 26]
OM = [9, 10]

c1 = [(reduce(operator.mul, p), p) for p in itertools.product(L1b, L2b, L3b)]
c2 = [(reduce(operator.mul, p), p) for p in itertools.product(OM, L1a, L2a)]

RPL = [(((p[0][0]) / p[1][0]) * LR, p[0][1], p[1][1])  for p in itertools.product(c1, c2)]

print RPL

这将显示LRLR的以下类型的结果:

^{pr2}$

每个置换都存储为一个元组,其结果是乘法。然后在计算RPL值时使用该值。在

您还可以按如下格式格式化RPL,以显示哪些排列产生了每个结果:

for rpl, p1, p2 in RPL:
    print "%8d  %15s  %15s" % (rpl, str(p1), str(p2))

以以下形式给出输出:

 380     (27, 30, 31)        (9, 8, 9)
 290     (27, 30, 31)       (9, 8, 12)
 240     (27, 30, 31)       (9, 8, 14)
 340     (27, 30, 31)       (9, 8, 10)
 430     (27, 30, 31)        (9, 8, 8)
 340     (27, 30, 31)        (9, 9, 9)

该脚本使用Pythonitertools模块。这提供了一个product函数,其效果与具有多个嵌套的for循环相同。每次迭代的结果给出ij和{}的值,但作为一个元组,例如(27, 30, 31)。在

通过对每个条目应用相同的函数,reduce命令可用于乘以返回的列表中的所有数字。由于您不能编写reduce( * , p),所以可以使用Python的operator模块为*提供函数名版本,即operator.mul。在

它的结果被包装在()中,形成一个由两部分组成的元组,第一部分是乘法的结果,第二部分是产生它的置换。e、 g.(25110, (27, 30, 31))。在

c1是一个包含所有这些值的列表。这叫做列表理解。它相当于一个for循环,其中有c1.append()。在

一旦创建了c1和{}(我建议您尝试打印它们的值以查看它们的样子),然后脚本使用类似的方法来计算所有的RPL值。每次迭代给出p,如下所示:

((25110, (27, 30, 31)), (648, (9, 8, 9)))

这是一个包含两个条目(25110, (27, 30, 31))和{}的元组。Python可以使用索引访问每个值。所以为了得到25110,您可以使用p[0][0]作为第一个元组,第一部分。或者p[0][1]得到{}。在

解决方案脚本可以转换为不使用列表理解,如下所示:

c1 = []

for p in itertools.product(L1b, L2b, L3b):
    multiply_all = reduce(operator.mul, p)
    c1.append((multiply_all, p))

c2 = []

for p in itertools.product(OM, L1a, L2a):
    multiply_all = reduce(operator.mul, p)
    c2.append((multiply_all, p))

RPL = []

for p in itertools.product(c1, c2):
    calculation = (p[0][0] / p[1][0]) * LR
    RPL.append((calculation, p[0][1], p[1][1]))

如果你想要i,j和k,那就把它们储存起来,而不是它们的产品。使用c1.append((i, j, k)),而不是c1.append(n)。在

那么,在II中会是这样的:

for (i1, j1, k1) in c1:
    for (i2, j2, k2) in c2:
        i = i1 * j1 * k1
        j = i2 * j2 * k2

        x = (i / j) * LR
        RPL.append(x)

您应该考虑的是,您可以从I返回两个列表,而不是使用两个全局列表。被修改的全局变量通常是一件坏事。在

不能在循环之外使用循环变量。从未。即使语言允许这一点-这是完全令人困惑的,也是错误代码结构的标志。在

关于你的问题-有很多方法可以做到。最少涉及的是在I的最后一次迭代中使用元组而不是数字(您有更好的名称吗?)。在

def I():
    # snip
    n = i * j * k
    c2.append((i, j, k, n))  # double braces is important

def II():
    # snip
    for c1_loop_var in c1:  # note loop variable name changed
        for i, j, k, n in c2:
            x = (c1_loop_var / n) * LR
            # and whatever you need to do with i,j,k

顺便说一句,您提供的代码片段不包含一个具有好名称的变量,因此任何人都不清楚。如果你想成为这段代码的唯一用户-由你决定,但我会试着给他们起更合理的名字-无论如何,这是一个很好的实践。在

相关问题 更多 >