Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:Can';t正确地从函数范围返回变量_Python_Function_For Loop_Scope_Return - Fatal编程技术网

Python:Can';t正确地从函数范围返回变量

Python:Can';t正确地从函数范围返回变量,python,function,for-loop,scope,return,Python,Function,For Loop,Scope,Return,我试图让用户在变量中输入两个名称。这些变量将与置乱函数混合。然后我想用解译功能再次将它们分开,但我希望解译功能能够识别这两个单词中的哪一个是第一个输入,哪一个是第二个输入。但是我被范围卡住了,不知道如何正确解决这个问题 我感谢任何解决方案 a = raw_input("First word please?") b = raw_input("Second word please?") def scramble(word1, word2): if len(word1) > len(

我试图让用户在变量中输入两个名称。这些变量将与置乱函数混合。然后我想用解译功能再次将它们分开,但我希望解译功能能够识别这两个单词中的哪一个是第一个输入,哪一个是第二个输入。但是我被范围卡住了,不知道如何正确解决这个问题

我感谢任何解决方案

a = raw_input("First word please?")
b = raw_input("Second word please?")

def scramble(word1, word2):

    if len(word1) > len(word2):
        a1 = word1
        a2 = word2
    else:
        a1 = word2
        a2 = word1

    maxlength = max( len(word1),len(word2) )
    magicWord = ""

    for x in range(0,maxlength):

        magicWord += a1[x]

        if x < len(a2)-1:
            magicWord += a2[x]

        elif x == len(a1)-1:
            fin = len(a2)-1
            magicWord += a2[fin]

        else:
            magicWord += "0"

    return magicWord

magicWord = scramble(a,b)
print "\nYour magic word is: \""+magicWord+"\"\n"

magicSize = len(magicWord)



def unscramble(magicWord):

    z = 0

    if z == magicSize:
        return False

    else:
        while unscramble(magicWord):

            word1 = ""
            word2 = ""

            if z % 2 == 1:
                if magicWord[z] == "0":
                    z+= 1
                else:
                    word2 += magicWord[z]
                    z += 1
            else:
                if magicWord[z] == "0":
                    z+= 1
                else:
                    word1 += magicWord[z]
                    z += 1

            return word1

if word1 > word2:
    print "First input: " + word1
    print "Second input: " + word2
else:
    print "First input: " + word2
    print "Second input: " + word1
a=原始输入(“请输入第一个单词”)
b=原始输入(“请输入第二个单词?”)
def加扰(字1、字2):
如果len(单词1)>len(单词2):
a1=字1
a2=字2
其他:
a1=字2
a2=字1
maxlength=max(len(字1),len(字2))
magicWord=“”
对于范围内的x(0,最大长度):
magicWord+=a1[x]
如果xword2:
打印“第一次输入:”+word1
打印“第二次输入:”+word2
其他:
打印“第一次输入:”+word2
打印“第二次输入:”+word1

很抱歉,您的解译功能无法再恢复单词,更不用说告诉您是谁先输入的了。您已在扰码功能中销毁了信息

在混乱中,你的前几行破坏了秩序;因为你再也没有提到单词1和单词2(唯一的顺序指示器),所以这些信息就丢失了。也许您希望使用不同的分隔符(插入“0”)来表示哪个词是哪个词。此插入将使解读例程区分

if len(word1) > len(word2):
    a1, a2 = word1, word2
    sep = '1'
else:
    a1, a2 = word2, word1
    sep = '2'
...
   else:
        magicWord += sep
我们还可以做一些其他的编码改进,使之更“Pythonic”,但我们现在正在做功能性的改进;代码评审进入另一组。

之后

 if len(word1) > len(word2):
     a1 = word1
     a2 = word2
 else:
     a1 = word2
     a2 = word1
原来的订单丢失了。如果不这样做,就很容易重建顺序,因为
scramble
函数总是将第一个单词的第一个字母放在第一位

然后更改
unclomble
函数以返回
word1、word2
,您将按原始顺序返回单词

顺便说一下,您应该看看
itertools.zip\u longest()
。这将使您的
加扰
功能更易于阅读。
对于itertools中的char1,char2.zip_longest(word1,word2,fillvalue='0')
循环遍历两个单词中的所有字母,并使用
'0'
查找较短单词中缺少的字母。

您永远无法摆脱
a
b
,因此您可以使用它们来知道哪个单词是第一个,哪个是第二个。没有必要手动解读它们。我会在
加扰
后使用元组存储它们,因此,不要:

magicWord = scramble(a,b)
我只想:

magicWord_tuple = (a, b, scramble(a,b))
然后,当你需要的时候,你只需抽出你想要的任何一个词

firstword = magicWord_tuple[0]
secondword = magicWord_tuple[1]
magicword = magicWord_tuple[2]

也许你可以有一个额外的变量,告诉你哪个单词首先进入魔法单词,然后把这个变量传递给解译函数来分离单词。您可以这样更改加扰字:

if len(word1) > len(word2):
    flag = 1
    a1 = word1
    a2 = word2
else:
    flag = -1
    a1 = word2
    a2 = word1


解读者将使用
标志
恢复单词的正确顺序。这是唯一的解决方案,因为当您创建magicword时,您会丢失关于哪个是第一个单词,哪个是第二个单词的信息。这意味着如果没有这些信息,您的解译功能将无法工作。

目前还不清楚您当前的问题是什么。你能给出一个更精确的描述吗?除非你单独存储这些信息,否则你无法知道首先输入的是什么单词;在加扰之前,您已按长度对单词进行排序,因此此时原始输入顺序将丢失。我认为OP的意思是使用max等。。它们在dict
{a:'first',b:'second'}
中存储a和b的位置上丢失了,然后将其传递给您的函数。为了更进一步,您可以为fillvalue参数插入一个表达式:如果len(word1)>len(word2),则fillvalue='1',否则为'2'///如果word1更长,则为您提供一个'1'填充符,如果单词2较长,则为“2”。这甚至比我构建的“Pythonic”解决方案更好(但没有在我的回复中发布)。感谢反馈,我理解我在这里做错了什么。似乎我必须恢复函数的输出。只是不知道如何返回多个变量?我应该用元组吗?我应该如何应用它们?@JenniferDevelopez:你可以编写
返回word1,word2
。这将创建一个元组。然后,您可以编写
words=unclomble(magicWord)
以获取包含两个单词的元组,或者
word1,word2=unclomble(magicWord)
以将它们放入单独的变量中。谢谢!结果很好。现在我也了解了元组在这些情况下的功能。谢谢你的帮助。根据您的偏好,您可以使用任何类似列表的对象实现相同的功能。列表、元组、冻结集、字典等等。回想起来,我认为字典在组织和清晰度方面是最好的选择,但对于这样的小东西来说,它并不重要。
return magicWord, flag