Python 如何使用已定义的参数构建一系列位置?

Python 如何使用已定义的参数构建一系列位置?,python,Python,我有一个非常基本的编程背景,但是我得到了一个快速的任务,要有一个程序,它可以获取源位置和目标位置,并且基本上可以吐出源位置和目标位置之间所有位置的范围 我构建了输入GUI,并将所有变量传递到一个函数中,现在我只需要弄清楚如何正确地循环 位置在此表格中(不带空格):xxxxxxxxxx 001 X 01 Xs是基于我传入的值硬编码的。最后一个条目应首先缩放。最后两个字段中的每个字段都有一个最大值的条目 示例来源:xxxxxxxxxx 003x0102 目的地示例:xxxxxxxxxx 004x02

我有一个非常基本的编程背景,但是我得到了一个快速的任务,要有一个程序,它可以获取源位置和目标位置,并且基本上可以吐出源位置和目标位置之间所有位置的范围

我构建了输入GUI,并将所有变量传递到一个函数中,现在我只需要弄清楚如何正确地循环

位置在此表格中(不带空格):
xxxxxxxxxx 001 X 01

Xs是基于我传入的值硬编码的。最后一个条目应首先缩放。最后两个字段中的每个字段都有一个最大值的条目

示例来源:
xxxxxxxxxx 003x0102

目的地示例:
xxxxxxxxxx 004x0201

在这种情况下,程序将根据003和004之间的范围,最后2个位置的最大范围为03和02,吐出以下内容(将添加空格以便于阅读):

[使用输入和最大值的范围是
“xxxxxxxxxx 003->004 X 01->03 01->02”
]

xxxxxxxxxx 003 X 01 02
XXXXXXXXXX 003 X 02 01
XXXXXXXXXX 003 X 02 02
XXXXXXXXXX 003 X 03 01
XXXXXXXXXX 003 X 03 02
XXXXXXXXXX 004 X 01 01
XXXXXXXXXX 004 X 01 02
XXXXXXXXXX 004 X 02 01
现在我能够创建一个GUI来输入所有这些值并将它们传递给函数

我认为这将最好使用输入的范围为循环嵌套3次,但我真的不知道如何在嵌套到循环中时,使用前导0加上条件最大值来递增

伪未完成代码->

def addressGenerator(bMax, cMax, X, sourceA, sourceB, sourceC, destinationA, destinationB, destinationC):
    for x in range(sourceA, destinationA):
        for y in range(01, bMax):
            for z in range(01, cMax):
                # content

现在,不要担心前导零。相反,请使用整数来维护计数,然后使用格式化的打印语句为您插入零:

for x in range(3,5):
    for y in range(1,4):
       for z in range(2,5):
          print("XXXX{:03d}XX{:02d}{:02d}".format(x, y, z))

我认为你的思路是对的,但是你的
addressGenerator
函数对我来说参数太多了。假设您可以将源字符串和目标字符串拆分为元组,如
(xxxxxxxxxx,003,X,01,02)
。然后你有一个函数,它只接受源元组和目标元组

这些是元组中的索引:

 0            1    2  3   4
(XXXXXXXXXXX, 003, X, 01, 02)
我认为您想要的是在索引
source[1]->destination[1]
之间循环<代码>源[3]->目标[3];和
源[4]->目标[4]
。这大体上就是你已经拥有的。然后可以使用填充设置不同内容的格式

def get_addresses(source, destination):
    for a in range(int(source[1]), int(destination[1]):
        for b in range(int(source[3]), int(destination[3])):
            for c in range(int(source[4]), int(destination[4])):
                yield '{}{:03d}{}{:02d}{:02d}'.format(source[0], a, source[2], b, c)

我想这就行了。这三个范围作为元组传递,每个元组包含所需的起始值和结束值(包括)。我还添加了一个
分隔符
参数,因为在您的问题中显示的输出中似乎有一个无法解释的“X”

更新:修改为根据您下面关于“来源”和“目的地”含义的评论施加限制,并删除先前的警告

在我看来,这段代码几乎不可读,而且可能会被重构,但正如我所说的,我相信它(现在)实现了你的目标

对其可用性的一个改进可能是使其能够解析
src
dst
字符串参数,并自动确定间隔

def addressGenerator(prefix, separator, src, dst, interval1, interval2, interval3):
    minval, maxval = int(src), int(dst)

    for x in range(interval1[0], interval1[1]+1):
        for y in range(interval2[0], interval2[1]+1):
            for z in range(interval3[0], interval3[1]+1):
                v = x * 10000 + y * 100 + z
                if minval <= v <= maxval:
                    pieces = prefix, '%03d' % x, separator, '%02d' % y, '%02d' % z
                    yield ''.join(pieces)

# Sample usage.
for address in addressGenerator('XXXXXXXXXXX', 'Y',
                                '0030102', '0040201', (3, 4), (1, 3), (1, 2)):
    print(address)

这是柜台吗?你增加1直到达到该位置的最大值?我不太明白…为什么
addressGenerator()
有两个
destinationB
参数?请添加一个调用它的示例,它显示了所有传递参数的格式。这是一个输入错误。所有这些参数都映射到问题了吗?它们是如何形成输出的?X-XXXXXXXXXXX A->003×B-> 01 C>02,最大B和最大C值使B和C的范围从01到最大,输出将按顺序写入所有这些文本文件。但当它们分别增加x或y时,它们从01开始,直到达到其范围(并最终到达最终位置)。问题是它们不是独立的,使用示例索引,当4达到最大可能值时,它增加3并重新开始,当3达到最大可能值时,它递增1并且开始,并且源地址可能不在01开始,并且目的地不可能在MAX处结束(即使中间的所有位置都需要考虑在01开始并在最大结束)。谢谢其中一个问题是你如何开始和结束在中间Val2和InVal3范围内。例如,源可能是您的第二个输出“XXXXXXXXXX 003Y0102”,目标可能是您的第二个到最后一个输出“XXXXXXXXXX 004Y0301”。所以总范围是关键,但是开始和结束可能不确定整个范围。齐拉斯:对不起,我不太明白。你一直使用“来源”和“目的地”这两个我不清楚的术语。在我的代码中,传递了三个“间隔”,每个间隔都有起始值和结束值。如果可能的话,试着用这些术语解释一下你想要什么。基本上,我输入了两个唯一的位置(来源和目的地),我需要这个来输出这两个位置之间的所有位置。因此,如果源是XXXXXXXXXX 003Y0102,目标是XXXXXXXXXX 004Y0201,那么输出将是:XXXXXXXXXX 003Y0102 XXXXXXXXXXXXXX 003Y0201 XXXXXXXXXX 003Y0202 XXXXXXXXXX 003Y0301 XXXXXXXXXXXXXX 003Y0302 XXXXXXXXXXXXXX 004Y0101 XXXXXXXXXX 004Y0102 XXXXXXXXXX 004Y0201TSYRAS:OK,Tsyras:
x*10000+y*100+z
x
y
z、
的当前值转换为单个数值,用于以下条件语句中。
minval