Julia 语言初学笔记
Julia 与 Python 的主要差异
Julia | Python | |
if, for, while 代码块 |
以 end 关键字结束,缩进不重要 无 pass 关键字 |
由缩进决定 有 pass 关键字 |
字符串引号 | 单引号用于字符;双引号用于字符串 | 不区分单双引号 |
字符串连接 |
字符串连接:* 字符串重复:^ 字符串插值:$ |
字符串连接:+ 字符串重复:* 字符串插值:% 或 format 函数 |
数组索引 |
从 1 开始(类似 R) 不支持负索引,末尾元素的索引为 end |
从 0 开始 支持负索引,末尾元素的索引为 -1 |
切片 |
包含冒号后的终点元素 例:(Julia)a[2: 3] a[1: 3](Python) 冒号后的终点元素不能为空,如需直至末尾的切片,须用 end 例:(Julia)a[2: end] a[1: ](Python) |
不含冒号后的终点元素 冒号后的终点元素可以为空,此时表示切片直至末尾 |
有步长的切片 |
a[起点: 步长: 终点] 例:(Julia)a[end: -1: 1] a[: : -1](Python) |
a[起点: 终点: 步长] |
矩阵索引 |
子矩阵: X[[1,2], [1,3]] 表示矩阵 X 的第 1、2 行和第 1、3 列的交点构成的子矩阵 元素索引: (Julia)X[[CartesianIndex(1,1), CartesianIndex(2,3)]] X[[0,1], [0,2]](Python) |
子矩阵: (Julia)X[[1,2], [1,3]] X[np.ix_([0,1],[0,2])](Python) 元素索引: X[[1,2], [1,3]] 表示矩阵 X 中索引为 [1, 1] 和 [1, 3] 所对应元素组成的向量 |
行连接 | 括号 | 反斜杠或括号 |
数组 | 列优先(Fortran 模式) | NumPy: 行优先(C 模式) |
默认参数 |
每次函数调用时重新加载 例: f(x=rand()) = x 每次调用时,返回一个新的随机值 g(x=[1,2]) = push!(x,3) 每次调用时,均返回[1,2,3] |
不要使用可变对象作为默认值 |
关键字参数 | 函数调用时,须输入关键字 | 函数调用时,可不输入关键字,按位置顺序传参即可 |
% 运算符 |
取余运算 例: 7 % 3 = 1 (-7) % 3 = -1 |
取模运算 例: 7 % 3 = 1 (-7) % 3 = 2 |
溢出 |
Int 类型对应 Int32 或 Int64,数值过大时可能溢出 如需表示更大的数值,可使用 Int128, BigInt, Float64 等数据类型 例:2 ^ 64 == 0 |
int 可表示任意长度的整数,不会溢出 |
虚数单位 | im | j |
幂运算 | ^ | ** |
空值 | nothing | None |
矩阵乘法 |
矩阵乘法:* 按元素相乘:.* |
矩阵乘法:@ 按元素相乘:* |
转置 | ' | NumPy: .T |
多态 |
支持多态,同一个函数名可对应多种方法 |
不支持多态,函数有唯一表达 |
类 | 无类,只有结构体 struct,包含数据但无方法 | 有类 |
调用 | 包与模块的调用与文件结构无关 | 代码结构取决于路径(包)和文件(模块) |
条件表达式(三目运算符) |
可用于变量赋值 例:(Julia)x > 0 ? 1 : -1 x = 1 if x > 0 else x = -1(Python) |
不可用于变量赋值 |
@ 运算符 | 宏 | 装饰器 |
异常 |
try - catch - finally 结构 常规工作流中不建议使用异常处理结构,可能会影响代码性能 |
try - except - finally 结构 |
条件判断 | 须使用显式布尔值(类似 Java) |
允许使用隐式布尔值(类似 C) 注:Python 语言规范中,建议尽可能使用隐式 False |
局部作用域 | 除 if 外的代码块,包括 try - catch - finally,均有局部作用域 | (此条同 Julia) |
命名规则 |
变量名使用小写; 除非难于理解,否则单词之间不加下划线; 类型(Type)或模块(Module)使用双驼峰形式命名,不使用下划线形式; 函数(Function)或宏(Macro)使用小写,且不加下划线; 能够修改自变量的函数(mutating / in-place)以叹号结尾。 |
除类之外,均使用下划线形式命名; 类使用双驼峰形式命名; 全局变量所有字母全部大写。 |
参考资料:
Noteworthy differences from Python
Julia 的一些有趣用法
UTF-8
变量与函数,均可以使用 UTF-8 编码下的字符命名:
支持 markdown 方式输入特殊字符:
机械极小值(Machine Epsilon)
只有浮点数才有机械极小值,含义为,与下一个可表示的浮点数之间的距离
eps(T):T 为浮点数类型(Float32 / Float64),返回 1.0 与下一个可表示的浮点数之间的距离
eps(x):x 为浮点数,返回 x 与下一个可表示的浮点数之间的距离;该数值随 x 的增大而增大
上/下一个浮点数可由 prevfloat / nextfloat 函数获得
变量系数
系数乘法的运算优先级:低于一元运算符,高于二元运算符
不可以将括号形式的变量作为系数,乘于括号形式的变量前,否则会报函数调用的错误:
冲突解决:
- 0x11 表示十六进制下的 11,不表示以 0 为系数乘以 x11 变量;
- 1.5e10 或 1.5E10 表示浮点数,不表示以 1.5 为系数乘以 e11 或 E10 变量;
- 1.5f22 表示 Float32 类型的浮点数,不表示以 1.5 为系数乘以 f11 变量,但由于大写的 F 没有该功能,故 1.5F22 正常表示以 1.5 为系数乘以 F11 变量
Inf 和 NaN
有关 Inf 和 NaN 的大小比较:
- Inf 与自身相等,比除 NaN 之外的任何数都大;
- -Inf 与自身相等,比除 NaN 之外的任何数都小;
- NaN 不等于、不小于、不大于任何数,包括其自身
数组运算时需注意:
Unicode
有效的 Unicode 数值范围为:[0x0000, 0xD7FF] 和 [0xE000, 0x10FFFF],但并非所有数值均被分配字符。
单引号内使用 \u 可以表示四位十六进制数对应的 Unicode 字符;使用 \U 则表示八位十六进制数对应的 Unicode 字符,但由 Unicode 的数值范围可知,最大有效长度仅为六位十六进制数。
含有 Unicode 字符串,由于字符的长度可能超过 1 byte,某些索引可能不合法,此时可使用 firstindex, lastindex, nextind, prevind 方法:
也可用于字符遍历:
length(str, i, j) 函数用于获取位置 i 到 j 之间(闭区间)有效字符的数量:
三引号字符串
有关三引号字符串的缩进:
每一行的缩进程度取决于缩进最小的一行。如下所示,示例中的最后一行决定了缩进程度:
起始三引号的所在行和由空格组成的行,不决定缩进程度;起始三引号的所在行,不受缩进程度的影响:
复合函数、向量化函数
复合函数:
函数链:
向量化函数:点运算符
宏 @. 用于所有函数均为向量化调用时,可以简化点运算符过多的情况:
点运算符与函数链一同使用:
短路计算(short-circuit evaluation)
- a && b:当且仅当表达式 a 为 true 时,计算表达式 b;
- a || b:当且仅当表达式 a 为 false 时,计算表达式 b
不使用短路计算的布尔运算,可使用位布尔运算符:
循环
for 循环内定义的计数变量 i,只在循环内可见(作用域只在循环内):
for 循环可在任何容器内迭代,此时使用关键字 in 或运算符 ∈:
多层循环可组合在同一行,按照笛卡尔积迭代,如遇 break 语句,直接跳出所有循环;而多行 for 的循环遇 break 语句时,只跳出当前循环:
变量作用域
词法作用域(lexical scoping):
模块内定义的变量,不能在模块外重新赋值:
函数内定义的变量,作用域只在函数内:
如前所述,循环内定义的变量,作用域只在循环内:
如需在外部使用循环内迭代后的计数变量,可使用 outer 关键词:
可以使用宏 @isdefined() 来确定变量是否定义:
let 代码块:let 内定义的变量,只在内部有效,如与外部变量重名,两个变量对应的是不同的存储空间
常量
若对常量进行重新赋值,当赋值类型不同时,会报错;类型相同时,会报警告:
而当重新赋值不会导致数值改变时,则不会给出警告信息:
然而,若重新赋值的常量为可变对象时,会报警告:
虽然可以对常量进行重新赋值,但是这强烈不建议这种做法,改变常量的值可能导致各种以外的问题发生。
例如,当某方法引用了一个常量,且在常量值被改变前被编译时,就会一直保持使用旧的数值:
复合类型(结构体)
filednames 函数可用于获得其所有字段名
除其中可变对象外,各字段的值均不可变。
声明复合类型时在前面加上 mutable 关键字,即变为可变类型:
参数复合类型:
不同参数的复合类型之间不互为子类型,但可以在参数内加入 <: 或 >: 运算符获得几种类型的并集,此时父子类型关系成立:
元组
长度为1时,要加逗号:
可变元组:元组中的最后一个元素可为特殊类型 Vararg,即长度可变
命名元组:
方法
方法指的是,一个函数的一种可能行为的定义,体现了语言的多态性。
方法歧义:
NTuple 参数:
上例中另一种消除歧义的方式:
构造器
外部构造器:
内部构造器:(注:new 函数仅在 struct 内有定义)
new 函数可以无参:
内部构造器会抑制默认构造器:
自更新运算符
如在数组中使用自更新运算符,而所用数组来自其他数组的直接赋值,则原赋值数组的值不会改变;
而当自更新运算符配合向量化运算符(.)使用时,原赋值数组的值会一同改变。
参考资料:
Julia Documentation
Julia 语言初学笔记相关推荐
- Verilog语言初学1
Verilog语言初学1 Verilog初学 Verilog的一些常用标识符 入门笔记 Verilog初学 本人初学Verilog,自己做一点笔记 Verilog的一些常用标识符 入门笔记 veril ...
- Julia教程:Julia语言入门
正如我在" 朱莉娅是什么? ", Julia是一种用于数值计算的免费开源高级,高性能动态编程语言,它将动态语言的开发便利性与已编译的静态类型语言的性能相结合. 它设计用于科学计算, ...
- r语言c函数怎么用,R语言学习笔记——C#中如何使用R语言setwd()函数
在R语言编译器中,设置当前工作文件夹可以用setwd()函数. > setwd("e://桌面//") > setwd("e:\桌面\") > ...
- Python初学笔记(第一学期学完c后和栗子一起学python)
Python初学笔记 一.基本数据类型 1.整数 2.浮点数 3.字符串 4.布尔值(即"对"与"错"): 5.空值 二.变量的定义 1.变量名 2.变量的定义 ...
- C语言学习笔记10-指针(动态内存分配malloc/calloc、realloc、释放free,可变数组实现;Tips:返回指针的函数使用本地变量有风险!;最后:函数指针)
C语言:指针 1. 指针:保存地址的变量 *p (pointer) ,这种变量的值是内存的地址. 取地址符& 只用于获取变量(有地址的东西)的地址:scanf函数-取地址符 地址的大小 ...
- ASP.NET MVC 初学笔记.3 MVC5、EF、RDLC实现报表操作
在ASP.NET的研究学习中又要用到报表,比如在OA系统里实现凭证.文件等,报表是一个必不可少的东西,但百度了一圈,发现讲得最多的还是水晶报表等第三方报表,好像微软原装的RDLC报表随着MVC的升级渐 ...
- CMake初学笔记(一)
CMake初学笔记(一) CMake是什么 CMake怎么实现跨平台 CMake具体实践过程 CMakeLists.txt编写快速入门 常见函数 例子 CMake是什么 跨平台编译工具,为了实现&qu ...
- C语言学习笔记Day3——持续更新中... ...
上一篇文章C语言学习笔记Day2--持续更新中- - 八. 容器 1. 一维数组 1.1 什么是一维数组 当数组中每个元素都只带有一个下标(第一个元素的下标为0, 第二个元素的下标为1, 以此类推)时 ...
- 赖春林Python初学笔记 Day0.1
python初学笔记 Day0.1 在Shell里输入: dir(__builtins__) #可查看python中所有的关键词 在Shell里面输入: help(int) #可查看int关键 ...
最新文章
- c语言学习题,C语言学习题目
- 初探react,用react实现一个todoList功能
- mysql 2008 日_SQL2008 的 日期数据类型
- 创建office一直转圈_Windows写字板出现广告条幅:推荐用户使用在线版Office
- qtabbar设置不同宽度_透水地坪需要设置伸缩缝吗?
- WEB框架研究笔记七(Spring2+struts2)
- 93.复原IP地址(力扣leetcode) 博主可答疑该问题
- 一条龙教程:Matlab下使用yalmip(工具箱)+cplex(求解器)
- android流行ui设计,30款美丽的App UI设计作品
- 《宽带与接入网技术》接入网的基本概念
- 99.9%解决谷歌商店(Google Play)下载应用卡在等待中问题
- DOM Scripting 学习六 - Image Gallery
- 微信打不开文件怎么办
- buuctf web入门]常见的搜集
- 图片转word表格在线教学,想知道图片转word表格怎么转吗?
- 计算机音乐简单好听,电脑上好听的歌怎么录制,教你2分钟,截取你爱听的声音...
- Python中几个冷门但非常好用的内置函数
- matlab中示波器如何使用,[原创]Matlab上位机示波器(中) · 立羽博客
- JavaWeb:Servlet生命周期
- linux 下 adb 安装apk
热门文章
- CloudComparePCL 泊松曲面重建算法
- Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/account
- RecycleBank:回收垃圾的生意模式
- 硬件大熊原创合集(2023/02更新)
- Vector 删除元素
- 系统分析师和信息系统项目管理师哪个好考?
- Python_缴纳党费,按收入不同缴纳不同的百分比计算
- 联发科MT6731 4G智能功能手机处理器芯片介绍
- kubectl get pod -A 报错
- Phython新手做网页操作自动化