Python编程技巧 – 使用组合运算符
Python Programming Skills – Using Combined Operators
Python通过赋值过程,将声明变量与赋值和而为之,可谓讲求效率。此外,在Python赋值运算符里,也有一个强大高效的功能,即复合运算符。
在进行常规运算时,算术运算符就够用了;但是,面对复杂的运算和多行代码的较大程序,我们仍然希望写出简洁高效的代码。这时候,我们可能要使用组合运算符。
1. 组合运算符
在Windows命令行,启动Python程序,并进入交互式编程环境。来看几个例子:
>>> n = 10
>>> n = n + 1
>>> n
11
>>> n = n * 2
>>> n
22
>>> m = 10
>>> m += 1
>>> m
11
>>>
>>> m *= 2
>>> m
22
类似于n = n + 1之类的语句很普遍,类似于C/C++,在Python语言里,也可以进行简写形式。
例如,加减乘除取余,可用以下形式简写:
>>> x = 0
>>> x += 1
>>> x += 10
>>> x *= 2
>>>
>>> x -=3
>>> x /= 3
>>> x
6.333333333333333
但是,在算术运算中,存在优先级。例如,幂运算就优先于乘法、除法和余数运算,而优先级为2的运算高于加法和减法。因此,必要的时候,要按照优先级在特定位置添加括号,才能够得到所需的结果:
hypot = (a * a + b * b) ** 0.5
按照实际数字,hypot计算结果如下图所示:
>>> hypot = (3 * 3 + 4 * 4) ** 0.5
>>> hypot
5.0
2. 使用组合运算符
前面介绍过组合赋值运算符。请记住实例,即赋值符号(=)可以与以下任何运算符组合:
+、-、*、/、%、、&、|、<<\、>>**
运算符&、|和^分别进行按位“与”、“或“和”异或“, 运算符<<和>>进行按位左移和按位右移。
- 首先,任何赋值运算符的优先级都较低,通常在最后执行。
- 其次,赋值运算符是否能就地修改,取决于被操作对象的类型是否可变。就地修改,是指对内存存储的数据进行操作,而不是创建对象。这样的操作更快且更加有效。
但是 ,赋值运算符与这些对象一起使用时不能够直接就地修改,必须产生一个新的对象,并将其重新赋值给变量。看下面的例子:
>>> s1 = s2 = "The string"
>>> s1 += "...has more details"
>>> print("s1:", s1)
s1: The string...has more details
>>> print("s2:", s2)
s2: The string
我们看到,当给s1赋值新的值时,它没有改变原字符串的数据,它为s1分配了一个新的字符串,但是s2是指源字符串数据的名称。这就是为什么s1, s2会指向不同的字符串。
除掉字符串,我们来看列表。由于列表是可变的,因此可以对列表进行就地赋值。
>>> lst1 = lst2 = [10, 15, 20]
>>> lst1 += [25, 30]
>>> print("lst1:", lst1)
lst1: [10, 15, 20, 25, 30]
>>> print("lst2:", lst2)
lst2: [10, 15, 20, 25, 30]
列表进行就地修改,就无需创建新列表并将列表重新分配给变量。Lst1还是指向原来的列表,因此,lst2(引用内存中相同数据的变量)也显示更改后的结果。
实际上,就地赋值更加高效。Python保留了一下额外空间以备列表增长,故Python允许append以及+=等操作高效的增长列表,但列表有时会超出保留空间,这时候就得删除超出部分。这种内存管理难以察觉,同时对程序行为几乎没有影响。
非就地操作效率低下,因为必须创建一个新对象。所以说,这就是为什么要使用 join 方法来创建大字符串,而不是用+=运算符的缘故。这一点对于关注性能方面尤为重要。
接下来,我们使用join() 方法创建列表,并将二十六个字母连接在一起。示例代码如下:
str = []
n = ord('a')
for i in range(n, n + 26):str += chr(i)
alphabet_str = ''.join(str)
print(alphabet_str)
执行结果如下图所示:
这里的str += chr(i),就是取i对应的字符并且累加到str字符串列表中,因此,+=又充当了一次角色,即组合加法运算。
从上面的例子不难看出,列表数据被追加到现有列表上,无须创建新列表并重新对变量赋值。
3. 小结
对组合运算符,我们可以小结如下:
1) 若对象是可变的(如列表),则组合赋值运算符(例如:+=)会对数据就地修改;否则,会创建一个新对象并赋给左侧的变量;
2) 就地运算速度更快,并可以更有效利用内存空间,正是由于它们不能强制创建新对象。对于列表,Python通常会分配额外的空间,以便在程序运行时更加高效地增长列表。这时候的列表,是个了不得的数据结构!
感谢阅读本文章。
技术好文陆续推出,敬请关注。
喜欢你就点赞哈!您的认可,我的动力!😃
相关阅读:
- Python编程技巧 - 异常处理
- Python编程技巧 - 迭代器(Iterator)