python代码说明reqd

时间:2012-02-12 19:22:06

标签: python

我是python的新手,并且正在编写一些预编写的代码以更好地掌握它。 当一个数字在分母处为1时,该代码试图获得每个非终止周期所具有的位数。例如。 1/3 = 0.(3)它的周期为1。 类似7的周期为6,即1/7 = 0.(142856)

def get_decimals(num, div, current=([], [])):
    """Return a tuple (integer_part, decimal_part, cycle_length) for num/div"""
    headtail = lambda lst: (lst[0], lst[1:])
    memory, values = current
    if values and num == 0:
        integer, decimals = headtail(values)
        return integer, decimals, 0
    elif num in memory:
        integer, decimals = headtail(values)
        print integer, decimals
        lencycle = len(memory) - memory.index(num)
        return integer, decimals, lencycle
    a, b = divmod(num, div)
    return get_decimals(10*b, div, (memory+[num], values+[a]))

print max((get_decimals(1, num)[2], num) for num in xrange(2, 10))[1]

任何人都可以在上面粘贴的代码的上下文中解释我。我无法理解以下内容:

  1. 最后一个print语句中的下标[2]和[1]。

  2. memory.index(num)这个位于第4行到最后一行的get_decimals函数中。

2 个答案:

答案 0 :(得分:1)

get_decimals(1, num)[2]

get_decimals会返回一个包含3个项目的元组,名为integerdecimalslencycle。因此,下标[2]会选出lencycle

max((get_decimals(1, num)[2], num) for num in xrange(2, 10))[1]

下标[1]num格式的元组中选择(get_decimals(1, num)[2], num)。请注意,max下标之前应用了[1]函数。在这种情况下,max正在对可迭代的元组对进行操作,并使用词典排序来比较项目。

memory.index(num)调用对象index上的方法memory作为参数传递num。由于memory是一个列表,因此这只是查找该列表中第一次出现值num的索引。

答案 1 :(得分:0)

除非你是新手,否则上述解释是有道理的。如果没有,我尝试以更简单的方式解释:

对于列表a = [1, 2, 3],您将访问第一个元素:a[0] 类似地,get_decimals(1, num)[2]之后的2的下标表示函数是否返回元组/字典访问第三个元素,在您的情况下是非终止序列的循环长度。对于输入数字7,输出将为6,因为它具有142856的非终止周期。

同样适用于行:max((get_decimals(1, num)[2], num) for num in xrange(2, 10))[1] 如果没有下标[1],你会看到两个值打印,但编码器只关注返回的第二个值。显然代码说:

调用函数get_decimals获取值2到10。

找到返回的元组的最大值,并打印已经过滤为最大值的元组的第二项。

指数的解释非常清楚,无需进一步解释。只是另一种简化: [1,2,3]列表中2的索引是1.这将澄清内容。

在阅读代码之前,请参阅官方python文档。恕我直言。