我是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]
任何人都可以在上面粘贴的代码的上下文中解释我。我无法理解以下内容:
最后一个print语句中的下标[2]和[1]。
memory.index(num)
这个位于第4行到最后一行的get_decimals函数中。
答案 0 :(得分:1)
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]
从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文档。恕我直言。