当我们使用Python时,字符串是最经常打交道的数据类型,要提升Python的编程技巧,首先从字符串的拼接开始吧
当我们编写爬虫时,经常遇到类似如下URL
http://192.168.0.1:1024
其中ip和端口都是变量,通常python的初学者会使用+
连接符进行拼接
1url = "http://" + ip + ":" + port
这样写不仅代码不好看,而且性能也不高。实际上,在Python中,字符串的拼接有多种实现方法,这里就一一介绍一下,并简单的测试其性能
这里我们各进行一百万次拼接用于测试
1import time
2
3def test1_str():
4 for i in range(1000000):
5 "start:" + str(i) + " end:" + str(i + 1)
6
7# 测试代码,这里乘以1000,将结果精确到毫秒
8start = time.time()
9test1_str()
10print((time.time() - start) * 1000)
打印结果(毫秒值):
1749.0429878234863
将字符串与元组用%
连接,使用元组中的元素替换占位符
如:greet = "hello,%s" % ("Alex",)
,等结果为"hello,Alex"
这里的占位符主要来自C语言,常用的如下
1import time
2
3def test2_str():
4 for i in range(1000000):
5 "start:%d end:%d" % (i, i + 1)
6
7
8start = time.time()
9test2_str()
10print((time.time() - start) * 1000)
打印结果(毫秒值):
1483.02769660949707
这是一种相对而言比较灵活的方式,这里使用花括号代表占位符,然后用format
方法中的参数替换掉花括号。
如:
1# 结果:Name:Alice, Age:18
2"Name:{}, Age:{}".format("Alice", 18)
除了按顺序替换,更灵活的用法是使用参数命名来替换
1# 结果:Name:Alice, Age:18
2"Name:{name}, Age:{age}".format(name="Alice", age=18)
由此,可以引出使用字典进行替换拼接
1# 定义一个字典
2girl = {"name": "Alice", "age": 18}
3
4# 结果:Name:Alice, Age:18
5"Name:{name}, Age:{age}".format(**girl)
了解了format
方法的特点,再来测试一下它的性能
1import time
2
3def test3_str():
4 for i in range(1000000):
5 "start:{} end:{}".format(i, i + 1)
6
7start = time.time()
8test3_str()
9print((time.time() - start) * 1000)
打印结果(毫秒值):
1573.0326175689697
这是python3.6.2
版本才引入的新特性,低版本不支持。但是这个特性非常强大,比上面的format
方法更加灵活,更加简洁。只有极少的编程语言,才有这种强大的类似于插值表达式的语法。
1name = "Bob"
2age = "28"
3
4# 在字符串前加f前缀,即可在花括号中直接引用变量
5print(f"Name:{name}, Age:{age}")
6
7# 打印: Name:Bob, Age:28
除了直接在花括号引用变量,还可以在花括号中调用方法、做运算
1# 对字符串'ai'调用upper方法,变大写
2print(f"Name:{'ai'.upper()}")
3
4# 打印:Name:AI
1import time
2
3# python3.6.2 F-strings
4def test4_str():
5 for i in range(1000000):
6 j = i + 1
7 f"start:{i} end:{j}"
8
9start = time.time()
10test4_str()
11print((time.time() - start) * 1000)
打印结果(毫秒值):
1404.0234088897705
这种方法,就是将需要拼接的字符串放到一个列表,最后调用join
方法,将整个列表元素合并转为一个字符串。
1import time
2
3def test5_str():
4 s = ["start:", '', " end:", '']
5 for i in range(1000000):
6 j = i + 1
7 s[1], s[3] = str(i), str(j)
8 "".join(s)
9
10start = time.time()
11test5_str()
12print((time.time() - start) * 1000)
打印结果(毫秒值):
1803.0459880828857
以上几乎是Python目前所支持的字符串拼接的全部方法了,可以很显著的发现,3.6.2的新特性是字符串拼接方面性能、灵活、简洁等方面最好的方式。在不考虑低版本兼容时,最推荐的方式。当需要考虑低版本兼容时,则推荐使用%
号进行元组拼接