如何在一两行中使用.split和.upper?
这有效。
print('Hello, World.'.split())
怎么可能这样?
print('Hello, World.'.split().upper())
为什么一次调用.split后不能调用多个字符串方法?
答案 0 :(得分:3)
详细说明Max的观点,您可以使用dis.dis
检查这些呼叫:
>>> import dis
>>> dis.dis("'Hello, world.'.upper().split()")
1 0 LOAD_CONST 0 ('Hello, world.')
2 LOAD_ATTR 0 (upper)
4 CALL_FUNCTION 0
6 LOAD_ATTR 1 (split)
8 CALL_FUNCTION 0
10 RETURN_VALUE
>>> dis.dis("[x.lower() for x in 'Hello, world.'.split()]")
1 0 LOAD_CONST 0 (<code object <listcomp> at 0x1090e1420, file "<dis>", line 1>)
2 LOAD_CONST 1 ('<listcomp>')
4 MAKE_FUNCTION 0
6 LOAD_CONST 2 ('Hello, world.')
8 LOAD_ATTR 0 (split)
10 CALL_FUNCTION 0
12 GET_ITER
14 CALL_FUNCTION 1
16 RETURN_VALUE
如您所见,第一种方法-将所有内容转换为大写的然后拆分-步骤更少,效率更高。一些时间测试将进一步证明这一点...
_-Air:~ _$ cat test.py
import time
s = 'Hello, world.'
n = 10000000
t0 = time.time()
for _ in range(n):
s.upper().split()
t1 = time.time()
print(t1-t0)
t0 = time.time()
for _ in range(n):
[x.upper() for x in s.split()]
t1 = time.time()
print(t1-t0)
_-Air:~ _$ python3 test.py
4.7296531200408936
8.44889211654663
我们还可以断言两种方法的等效性:
_-Air:~ _$ python3 -c 'assert "Hello, World.".upper().split() == [x.upper() for x in "Hello, World.".split()]'
由于没有引发AssertionError
,因此我们知道它们是相等的对象。