.split之后如何使用多个字符串方法(如.upper)?

时间:2018-12-02 17:19:13

标签: python python-3.x python-2.7

如何在一两行中使用.split和.upper?

这有效。

print('Hello, World.'.split())

怎么可能这样?

print('Hello, World.'.split().upper())

为什么一次调用.split后不能调用多个字符串方法?

1 个答案:

答案 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,因此我们知道它们是相等的对象。