只需要一个关于range()的小代码改述

时间:2012-08-31 07:58:03

标签: python range

所以这是我目前正在处理的代码,但我的老板对它的最后部分并不十分满意。有人能帮我吗?以下问题已标记。提前谢谢!

#!/usr/bin/python

def codeNameDict(lst, cnDict):
    key = int(lst[0])
    value = lst[1]
    cnDict[key] = value
    return cnDict

def realNameDict(lst, rnDict):
    key = int(lst[0])
    value = lst[2].strip()
    rnDict[key] = value
    return rnDict

def getCodeKey(keys):
    import random
    index = random.choice(keys)
    return index

def searchKey(cnDict,value):
    for x in cnDict.keys():
      if(value == cnDict.get(x)):
        return x
        break;

def namegen(cnDict):
    index1 = getCodeKey(cnDict.keys())
    index2 = getCodeKey(cnDict.keys())

    if(index1 == index2):
     while(index1 == index2):
      index2 = getCodeKey(cnDict.keys())
      indexgen = [index1,index2]

    else:
      indexgen = [index1,index2]
    return indexgen

cnDict = {}
rnDict = {}

f = open("namefile.txt")
try:
    for line in f:
        words = line.split(":")
        cnDict = codeNameDict(words,cnDict)
        rnDict = realNameDict(words,rnDict)
finally:
    f.close()


# PROBLEMATIC SECTION #
for x in range(10):
    indexgen = namegen(cnDict)
    key1 = indexgen[0]
    key2 = indexgen[1]
    #print indexgen
    #print key1
    #print key2
    pokemon1 = cnDict[key1]
    pokemon2 = cnDict[key2]
    realname1 = rnDict[key1]
    realname2 = rnDict[key2]

    print "Partners-> %s:%s" % (pokemon1, pokemon2)
    print "RealNames-> %s:%s" % (realname1, realname2)

    del cnDict[key1]
    del cnDict[key2]

2 个答案:

答案 0 :(得分:0)

你可以制作行

key1 = indexgen[0]
key2 = indexgen[1]

与一个人:

key1, key2 = indexgen[0], indexgen[1].

pokemon1, pokemon2realname1, realname2相同。 我也不会使用魔法值10,而是给它命名。

答案 1 :(得分:0)

您的代码有一些改进。我们举个例子:

def getCodeKey(keys):
import random
index = random.choice(keys)
return index

这有效地返回random.choice将返回的内容。我建议将import语句移到文件的开头,然后使用random.choice代替getCodeKey(同样,它也是同样的事情)

其次,在searchKey中,返回后不需要break,因为返回已经从函数返回。但是,如果字典中的搜索值不是,则应考虑采取某些操作...

第三,

if(index1 == index2):
 while(index1 == index2):
  index2 = getCodeKey(cnDict.keys())
  indexgen = [index1,index2]

else:
  indexgen = [index1,index2]
return indexgen

if没有必要,因为如果它不成立,则while循环不会被执行。那么您也不需要else,请注意您在ifelse声明中为indexgen机器人设置了价值。此外 - 没有必要为您即将返回的值创建变量。我将其重写为

 while(index1 == index2):
  index2 = getCodeKey(cnDict.keys())

return [index1,index2]

对于range部分,我唯一看到的是 halex 建议的内容,即将所有双重语句放入一行。

key1, key2 = indexgen[0], indexgen[1]

我不认为这种变化很大,但是......

这不完全是你所要求的,但正如你所说 - 你正在学习python,所以我认为这可能至少有点用处