我对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]有人能解释一下上面贴的代码吗?我不明白以下几点:
memory.index(num)这个在第4行到最后一行的get_decimals函数中。发布于 2012-02-12 19:50:58
除非你是新来的,否则以上的解释是有道理的。如果没有,我试着用一种简单的方式解释:
对于列表a = [1, 2, 3],您将访问第一个元素为:a[0],类似地,在get_decimals(1, num)[2]之后的下标意味着如果函数返回一个元组/字典访问第三个元素,在您的例子中是不终止序列的周期长度。对于输入号7,输出将是6,因为它具有142856的非终止周期。
对于行:max((get_decimals(1, num)[2], num) for num in xrange(2, 10))[1],如果没有下标1,您将看到两个值打印,但是编码器只关心返回的第二个值。很明显,守则上说:
为值2至10调用函数get_decimals。
查找返回的元组的最大值,并打印已筛选为最大值的元组的第二项。
索引解释得很清楚,不需要进一步解释。只是另一个简化: 1,2,3列表中2的索引是1,这将澄清内容。
在阅读代码之前,请参阅正式的python文档。国际水文学组织。
发布于 2012-02-12 19:28:53
get_decimals(1, num)[2]get_decimals返回一个包含3个项的元组,名为integer、decimals和lencycle。因此,下标[2]选择了lencycle。
max((get_decimals(1, num)[2], num) for num in xrange(2, 10))[1]下标[1]从表单(get_decimals(1, num)[2], num)的元组中提取num。注意,max函数是在[1]下标之前应用的。在这种情况下,max是在可迭代的元组对上操作,并使用字典排序来比较项。
memory.index(num)调用对象memory上的方法index,将num作为参数传递。因为memory是一个列表,所以这只是查找该列表中num值第一次出现的索引。
https://stackoverflow.com/questions/9251874
复制相似问题