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