2012-02-12 149 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的索引。