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