Как этот код вычисляет 4 в степени <exponent> - PullRequest
4 голосов
/ 25 сентября 2019

Я следую Биоинформатика I на Coursera.Один из моих сокурсников использовал функциональное программирование для решения проблемы pattern_to_number:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
from functools import reduce

def pattern_to_number(pattern):
    code = dict(zip("ACGT",range(4)))
    return reduce(lambda x,c: 4*x+code[c], pattern, 0)

print(pattern_to_number(sys.argv[1]))

Вот как я запускаю небольшую программу локально:

$ python3 ./pattern_to_number.py 'ATGCAA'

И вывод (правильный): 912

Я понимаю lambda и использование reduce.Я не понимаю, как приведенное выше функциональное решение может имитировать функциональность следующего традиционного подхода.Где вычисляется 4 в степени i.

for i, val in enumerate(pattern[::-1]):
        total += dict[val] * (4**i)

Так где (или как) тело лямбды вычисляет 4 в степени code[c]?

1 Ответ

3 голосов
/ 25 сентября 2019

Во-первых, давайте посмотрим на функцию уменьшения:

reduce(lambda x,c: 4*x+code[c], pattern, 0)

Это умножит текущее значение на 4 и добавит текущий элемент из шаблона.Запись этого будет выглядеть примерно так:

  1. x=0 (начальное значение) c="A", результат: 4*x+code["A"] = code["A"]
  2. x=code["A"] (предыдущий результат) c="C", результат равен `4 * x + code [" C "] = 4 * code [" A "] + code [" C "]
  3. x=4*code["A"] + code["C"], c="G", результат 4*x+code["G"] = 4*(4*code["A"] + code["C"]) + code["G"] = 4**2 * code["A"] + 4 * code["C"] + code["G"]
  4. x=4**2 * code["A"] + 4 * code["C"] + code["G"], c="T", результат равен 4*x+code["T"] = 4*(4**2 * code["A"] + 4 * code["C"] + code["G"]) + code["T"] = 4**3 * code["A"] + 4**2 * code["C"] + 4 * code["G"] + code["T"]

, который имеет правильные полномочия 4 для каждого из элементов последовательности.

Таким образом, хитрость заключается в 4*x функции reduce, которая умножает первый элемент в шаблоне на 4 ровно len-1 раз, второй элемент на 4 len-2 раз и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...