等效的代码行不能在不同的函数中工作

时间:2014-03-18 06:48:09

标签: python

我有以下功能随机发出技能统计数据。它按照我的预期工作。

def randstat(level): 
    from random import randint
    points = randint(10,max(20,5*level))

    # set all our minimums to zero
    stats = [0, 0, 0, 0, 0]

    for i in range(1, points):
        stat = randint(0, len(stats)-1); # pick a random stat to increment
        stats[stat] += 1

    # extract the stats back out of our array
    agility = stats[0]
    stamina = stats[1]
    strength = stats[2]
    vitality = stats[3]
    intelligence = stats[4]

但是,我想使用我已有的其他功能将stat = randint(0, len(stats)-1);简化为stat = randlist(stats)

def randlist(list):
    from random import randint
    return(list[randint(0,len(list)-1)])

这给了我一个错误: exeptions.indexError:列表索引超出范围  当我在另一个函数中几乎拥有完全相同的代码行时,为什么会这样做? 可能是一个非常简单的事情,我可以俯瞰。无论如何,提前谢谢。

2 个答案:

答案 0 :(得分:0)

  

但是我想简化stat = randint(0,len(stats)-1);到stat =   randlist(数据)

您可以使用random.choice在方法中简化它。您的代码还存在一些其他问题,这是一个改进版本,它使用字典作为统计信息:

import random

def randstat(level): 
    points = random.randint(10,max(20,5*level))
    stats = {'agility': 0,
             'stamina': 0,
             'strength': 0,
             'vitality': 0,
             'intelligence': 0}

    for i in range(1, points):
        stat = random.choice(stats.keys()) # pick a random stat to increment
        stats[stat] += 1

    return stats

答案 1 :(得分:0)

您在randlist函数中有一个额外的查找,并且您最终尝试执行以下操作:

stats[stats[stat]] += 1

通过从list[]中移除无关的randlist来解决此问题,因此您只需返回随机索引(而不是值):

def randlist(list):
    return randint(0, len(list)-1)

但是,请考虑使用与Burhan Khalid's answer中不同的数据结构。 Python最佳实践是尽可能避免索引算法 - 这样做往往会导致代码更容易阅读和维护,而且作为一个很好的奖励,它通常会更短。