Martijn Pieters回答。谢谢。
这是因为声明与表达。
并且因为.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中的结果相同。
答案 0 :(得分:5)
与所有作业一样,+=
是声明。你不能把语句放在表达式中。右手表达式(+=
之后的所有内容)将首先评估 ,其结果随后将用于扩充分配。
你可以做:
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
。
答案 1 :(得分:0)
这是一个简单的单行程序,从DNA到RNA(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