Python 三元条件用于连接字符串
由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中,结果是一样的。
2 个回答
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
8
像所有的赋值操作一样,+=
也是一个语句。你不能把语句放在一个表达式里。右边的表达式(也就是+=
后面的部分)会先被计算,计算的结果会被用来进行增强赋值。
你可以这样做:
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
。