Python троичный условно для присоединения строки

Ответил Мартин Питерс. Спасибо.
Это потому, что утверждение против выражения. А поскольку.join() не видоизменяется (это чистая функция), его необходимо присвоить переменной.

Вопрос:
В чем причина этой странности?

Цель:

if base == 'T':
    RNA_seq += 'U'
else:
    RNA_seq += base

Этот следующий метод работает:

# += in expression1 and .join() in expression2
RNA_seq += 'U' if base == 'T' else RNA_seq.join(base)
# Edit note: RNA_seq.join(base) works because it returns `base`
#       aka. RNA_seq += 'U' if base == 'T' else base

Однако следующее НЕ работает:

# Using += on both expressions
RNA_seq += 'U' if base == 'T' else RNA_seq += base

или же

# Using .join() for both expressions
RNA_seq.join('U') if base == 'T' else RNA_seq.join(base)

Результаты одинаковы как в Python2, так и в Python3.

2 ответа

Решение

Как и все задания, += это утверждение. Вы никогда не можете помещать заявления в выражение. Правое выражение (все после +=) оценивается первым, результат которого затем используется для расширенного назначения.

Вы можете сделать:

RNA_seq += 'U' if base == 'T' else base

Теперь выражение разрешается либо 'U', или же baseв зависимости от стоимости base,

Если 'U' if base == 'T' else RNA_seq.join(base) работал, то это значит, что RNA_seq.join() возвращает новое значение и не мутирует RNA_seq на месте. RNA_seq.join('U') if base == 'T' else RNA_seq.join(base) затем также вернет новое значение, оставив исходное значение связанным RNA_seq без изменений, и вы не вернули его обратно RNA_seq,

Вот простой однострочник, который выполняет ту же транскрипцию с ДНК на РНК (T->U):

RNA = lambda x:''.join([{'A':'A','C':'C','G':'G','T':'U'}[B] for B in x])
print RNA("AGTCAGCAT") #example sequence results in AGUCAGCAU
Другие вопросы по тегам