2012-02-12 3 views
0

Я новичок в python и проходил через некоторый предварительно написанный код, чтобы получить лучшее сцепление с ним. Этот код пытается получить количество цифр, которые каждый цикл без прерывания имеет, когда число находится в знаменателе до 1. Например. 1/3 = 0. (3) он имеет цикл 1. Similary 7 имеет цикл 6, как 1/7 = 0. (142856)python code explain 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.

Аналогичным образом для линии: Если вы идете без индекса [1], вы увидите два значения, но кодер был связан только со вторым возвращаемым значением. Видимо код говорит:

вызова функция get_decimals для значений от 2 до 10.

Найти максимальное из кортежа возвращается и печати второй элемент кортежа, который был отфильтрован как макс.

Указатель был разъяснен довольно четко и не нуждается в дальнейших объяснениях. Еще одно упрощение: [1, 2, 3] индекс 2 в списке равен 1. Это прояснит материал.

Перед считыванием кодов обратитесь к официальной документации на python. ИМХО.

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 в этом списке.