2012-02-12 154 views
0

我是python的新手,并且正在阅读一些预先编写的代码以更好地掌握它。 此代码尝试获取每个非终止周期在数字分母为1时的数字位数。例如, 1/3 = 0(3)有否1. 与之相似7一个周期具有6为1/7 = 0。(142856)python代码解释reqd

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. 上一个打印语句中的下标[2]和[1]。

  2. memory.index(num)这个里面的get_decimals函数在第4行到最后一行。

回答

0

除非你很新,否则上面的解释会有意义。如果没有,我尝试以更简单的方式解释:

的列表a = [1, 2, 3]你将访问第一个元素为:a[0] 同样的2 get_decimals(1, num)[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文档。恕我直言。

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]从表单(get_decimals(1, num)[2], num)的元组挑出num下标。请注意,max函数在[1]下标之前应用。在这种情况下,max正在对一对元组对进行操作,并使用字典顺序来比较项目。

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