相信很多朋友刚开始做算法时应该都是用matlab做理论模型的验证,后来Python又大火,很多小伙伴又争相学起来python,可过了没多久,一个更牛逼的语言又进入了我们的视野--Julia,号称是有matlab似的直观数学表达式,有C的运算速度。相信又有不少朋友蠢蠢欲动了,而小编发现在刚开始学习某种语言时或者在多个语言之间来回切换时,很容易把它的语法跟其他语言搞混,所以今天我们就整理了一份Julia/Python/Matlab三种算法工程师常用的编程语言的基本语法的比较,小伙伴们可以收藏起来,在忘记某个语法时拿出来看看。
Python:数字、字符串、列表、元组、集合、字典
Matlab:数字、字符串、逻辑值、表、结构体、元胞数组、函数句柄
Julia:数字、字符串、自定义类型(struct/Union/Tuple/Array等)
注:julia 网上很多教程都是针对0.3版本,跟最新的1.0版有很多语法不太一样,在学习时最好看julia官方文档
Python | Matlab | Julia | |
---|---|---|---|
基本操作 | |||
类型 | 动态语言,在运行期间才去做数据类型检查,因此无需指定数据类,在第一次赋值时会将数据类型记下 | 动态语言,但可以指定类型,添加类型会显著提高性能和系统稳定性 | |
值有类型,变量没有类型 | |||
整数 | 使用方法:x=1可用x.bit_length()查看x的bit数,python中int型是没有大小限制的,理论上位宽可以无限大 | 使用方法:x=1matlab中默认都是double类型,也可以用int16(x)将x转为16位有符号数 | 使用方法:x=1在64位系统中默认是Int64类型的,可用typeof(x)查看x的类型,也可以用Int32(x)将x转成Int32类型 |
浮点数 | 使用方法:x=1.0float型 | 使用方法:x=1.0默认double型 | 使用方法:x=1.0在64位系统中默认是Float64类型,也可以用Float32(x)将其转换为Float32类型 |
复数 | x = complex(1,2)x1 = x.realx2 = x.imag | x = 1 + 1i*2x1 = real(x)x2 = imag(x) | x = 1 + 2imx1 = real(x)x2 = imag(x) |
分数 | x = 0.5x.as_integer_ratio() | x = 0.5formalt rat | x = 1//2 |
不同进制间转换 | x1 = int(0b1010)x2 = int(0x10)x3 = hex(10)x4 = bin(20) | x1 = bin2dec(‘1010’)x2 = hex2dec(‘a’)x3 = dec2hex(10)x4 = dec2bin(10) | x1 = 10x2 = UInt8(x1)x3 = Int64(x2)Julia中对于整数只定义了Int和UInt两种类型,其中Int用10进制表示,UInt用16进制表示 |
字符串 | x1 = ‘a’x2 = ‘abc’x3 = “a”x3 = “abcd”单双引号没有区别 | x1 = ‘a’x2 = ‘abc’字符和字符串都用单引号 | x1 = ‘a’x2 = “abc”跟C一样,字符用单引号,字符串用双引号 |
查看数据类型函数 | a = [1,2,3]type(a)<class 'int'> | a = [1,2,3;4,5,6];class(a)double | a = rand(3,3)typeof(a)Array(Float64,2) |
矩阵操作(Julia在矩阵操作方面跟MATLAB基本类似,函数用法也基本一致) | |||
矩阵合并 | x = np.ones((2,3))y = np.zeros((2,3))np.hstack((x,y))np.vstack((x,y)) | x = ones(2,3)y = zeros(2,3)[x,y]或[x y][x;y] | x = ones(2,3)y = zeros(2,3)[x y][x;y]注:[x,y]是矩阵直接拼接,并不是将矩阵内的元素拼接 |
矩阵索引 | x的索引从0开始 | x的索引从1开始 | x的索引从1开始 |
矩阵维度 | x.shape | size(x) | size(x) |
矩阵求和 | x.sum() | sum(x) | sum(x) |
函数操作 | |||
函数定义 | def f1(x): return x,x+1 | function [y1,y2] = f1(x)y1 = x;y2 = x + 1;end | function f1(x) x,x+1end简单形式:f(x,y) = x + yjulia特殊用法:+(1,2,3)结果为6 |
匿名函数多与map/filter等联用 | f = lambda x,y:x+yf(2,3)filter(lambda x:x+3,[1,2,3,4]) | f=@(x,y)x+yf(2,3) | map(x->x+1,[1,2,3]) |
不定长参数(默认参数和关键值参数用法相同) | *表示不定长参数为list**表示不定长参数为dictdef f1(*arg1,**arg2)print(arg1)print(arg2)f1(1,2,a=[1,2,3],b=9) | 函参中varargin表示变量个数function f1(varargin)for i=1:numel(varargin) disp(varargin{i})endf1(1,’abc’,345) | function f(x...) r1 = length(x) r2 = x[r1] return r1,r2endprint(f(1,2,3,4)) |
参数类型 | 无需指定,在函数调用时才会得到参数类型 | 无需指定,在函数调用时才会得到参数类型 | 可以不指定,也可以指定function f1(x::Int64)end |
控制流 | |||
条件语句 | if flag<0: a = -1elif:a = 0else: a = 1 | if flag<=0 a = -1elseif flag==0 a = 0elsea = 1end | if flag<=0 a = -1elseif flag==0 a = 0elsea = 1end |
while语句 | while a<5: … | while a<5…end | while a<5…end |
for语句 | for i in range(10): … | for i = 0:9…end | for i = 0:9…endfor k in [1,2,3,4]println(k)end |