写数据处理程序的时候,有时需要看一些数学公式,有时需要写python代码,有时需要写一些C代码。
我发现,有一些数学计算的符号,在数学、C和Python等语言中有些反直觉,或者不那么一致的地方,需要在经常使用的过程中熟悉并注意辨别。Python中的星号符号*
在常见的语言中,星号都主要用于表示乘法。
a = 2, b = 3
c = a*b
上面c等于6。
如果是一个列表类型,它乘以某个数,却表示列表的重复。
比如一个列表
a = [1,2,3]
b = a * 2
# b = [1,2,3, 1,2,3]
一个tuple,
a = (1,2)*2
# a = (1,2,1,2)
一个字符类型的:
name = "Tom"
names = name * 2
# names = "TomTom"
一个字节类型的:
rawdata = b'Nancy'
rawdata_dup = rawdata * 2
# rawdata_dup = b'NancyNancy'
而两个星号一起时,作为binary operator,则表示指数运算
a = 3**2
# a = 9
此外,星号在Python中还表示可变列表, 而两个星号在一起则表示可变命令参数,或字典。
def func(a,b, *args, **kwargs):
pass
在上面的函数中,args是list类型的变量,kwargs是dict类型的变量。
Python数学库numpy中的*
而在最重要的Python数学库numpy中,星号乘法运算的含义,初学时容易误以为会与列表运算的语义相同。但其实不是。
import numpy as np
a = np.array([1,2])
b = a * 2
# b = ndarray([2,4])
在numpy中,默认是向量运算,在运算前,会按需要进行变量的broadcast处理。因此,上面的运算等价于:
import numpy as np
a = np.array([1,2])
b = a * [2,2]
# b = ndarray([2,4])
C中的星号*
在C语言中,我们第一反应,星号也是表示乘法,然后也很容易想到它用于指针。
乘法:
int a = 2;
int b = 3;
int c = a * b;
// c = 6.
指针
int age = 18, *p_age = NULL;
p_age = & age;
// *p_age 等于 18.
C中的指数运算, **还是^?
我们很容易误以为可以用两个星号表示指数运算,但是C语言中是没有为指数运算定义操作符的。这时,我们可以使用的是<ma;中定义的pow函数.
#include <ma;
int a = 2, b = 3;
int c = pow(a,b);
//c = 8
此外,由于我们在数学(LaTex等)中常常用^表示指数,而^运算在C中是有意义的,如果误以为它是指数运算,程序编译不会出错,但运算结果是错的。
在C语言中,^表示按位进行XOR运算。
int a = 0x001;
int b = 0x001;
int c = 0x100;
int d = a ^ b;
// c = 0x000
int e = a ^ c;
// e = 0x101
总结
为了完成应用功能,我们会学习使用多种相似又有区别的语言。尤其是对于数据工程师而言,Python和C的搭配是很常见的组合。初学时,要注意读文档,做测试,不可以简单类比。