文档章节

Julia 学习心得

沙枣
 沙枣
发布于 2016/10/13 23:43
字数 813
阅读 195
收藏 0

Julia 语言简洁,而且快速。 Julia 的宏在编译期间自动变换句法,会在编译后消失痕迹。所以使用宏来进行类型检测和代码展开,不会增加运行时间的开销,是缩减有效代码的好东西。

注:宏只能检测语法层面的东西,不能检测计算后的数据类型,也就是只能检测编译期能够确

定的东西,例如 is_str(x), is_int(x), is_rstr(x).

macro assert(ex, msgs...)
    msg_body = isempty(msgs) ? ex : msgs[1]
    msg = string(msg_body)
    return :($ex ? nothing : throw(AssertionError($msg)))
end

Julia 的布尔值只有 true, false.

true == true ; false == false

将 Array 转换成 Tuple:

my_tuple = ([1,2]...)
x, y = my_tuple
x == 1; y == 2

Dict 的使用:

Dict 就是哈希,字典,是没有顺序的按照 key 索引的数据结构:

声明一个字典:

dict = Dict()

这将声明一个 Dict{Any,Any} 的字典。

Julia 会根据输入的数据来推断字典的数据类型:

dict = Dict("a" => 1, "b" => 2)

这将声明一个 Dict{String,Int32} 的字典

如果不想让 Julia 自己推断,自己设置:

dict = Dict{String,Any}()

常用的字典函数:

获取指定 key 的值:

if get(dict, "key", nothing) == nothing println("dict have not <key>") end

更新字典的值:

dict["b"] = 2

删除字典的值:

delete!(dict, "a")

符号(Symbol), 符号是个好东西,因为它写法够简单:

x = :symbol
x == :symbol
Symbol == typeof(x)

可以用这种数据类型来做 Dict 的 key:

if key == :str println("it is str") end

Julia 没有 switch/case 的条件判断结构,但有一种替代方式,这种方式很丑:

function match_rule(rule)
  name, value = (rule...)
  name == :regex  && return match_regex(value)
  name == :rules  && return match_rules(value)
  name == :branch && return match_branch(value)
  name == :look   && return match_look(value)
  return match_atom(rule)
end

函数别名, 如果感觉某个函数的名称不够顺手,可以改了:

const say println
const len length
const trim strip

如果函数定义很短,还有简洁的定义方式:

read_file(x) = readstring(x)
write_file(file, str) = write(file, str)
import JSON
to_json(x) = JSON.json(x)
from_json(x) = JSON.parse(x)
load_file(file) = JSON.parsefile(file)

数组函数中第一个参数是函数的函数:

julia> lst = [1,2,3,4]           
4-element Array{Int32,1}:        
 1                               
 2                               
 3                               
 4                               
julia> findfirst(isodd,lst)      
1                                
julia> findlast(isodd,lst)       
3                                
julia> find(isodd,lst)           
2-element Array{Int32,1}:        
 1                               
 3

嵌套数据结构定义:

type Atom
    name:String
    value::Union{String,Atom}
    pos::Int
end

这样就可以声明嵌套结构了:

atom = Atom("name", "value", 12)
Atom("name", atom, 13)

在正则匹配函数 match 中,可以设置 UInt32 格式的参数来设置 PCRE 支持的其他模式:

## ANCHORED 0x80000000
julia> m = match(r"a . b"xms, "aa\nb", 1, 0x80000000)
julia> m = match(r"a . b"xms, "aa\nb", 2, 0x80000000)
RegexMatch("a\nb")

split String 的一个办法:

julia> @b_str "abc"
3-element Array{UInt8,1}:
 0x61
 0x62
 0x63

Julia 的类型系统会捣乱:

 x = match(r"a", "ab")
typeof(x.match) == SubString{String}

本来以为返回的是 String, 但又出来一个新的类型,致使之前的类型判断函数失效:

is_str(x) = typeof(x) == String

不过现在发现这个问题了,就好解决了:

typeof(String(x.match)) == String

@b_str 这个函数用在代码中会出现莫名其妙的问题。 字符串 String, 如果按照 str[index] 索引的话,得到的是 byte, 只有迭代 for .. in 才得到 Char

© 著作权归作者所有

沙枣
粉丝 23
博文 99
码字总数 69964
作品 0
深圳
后端工程师
私信 提问
Julia 小白 Day 16 :入坑15天小结

今天是比较折腾的一天,正如过去15天学习Julia的过程: 可能有读者已经发现笔者忽左忽右,写东写西的风格比较怪异。 如暗夜前行,摸不清方向,前面感觉有些灯火而又不明确。 学习一门陌生且没...

_KevinZhang_
2018/09/04
0
0
史上最全的机器学习资料(上)

摘要: 机器学习牵涉的编程语言十分之广,包括了MATLAB、Python、Clojure、Ruby等等。为了让开发者更加广泛、深入地了解机器学习,云栖社区组织翻译了GitHub Awesome Machine Learning 资源,...

NathanJoy
2016/08/30
438
0
Julia 小白 Day 8 :目前兼容的机器学习程序包

前情提要: Julia是一门牛B、‘无耻’的语言 Julia1.0.0安装指南(含 Juno IDE) 如何进行Julia无痛体验 为了尽快方便学习和降低门槛,笔者专门对机器学习相关的程序包进行了批量安装测试,力求...

KevingZhang
2018/08/25
0
0
【活动】掘金技术征文丨给大家看的 Julia 教程

Julia 于8月8日正式发布1.0版。从 Julia 诞生到1.0版发布,历经了数十年的岁月,积攒了众多技术人的心血。 Julia 既有静态语言的运行速度,又有动态语言开发的便利性。非常适合数据科学、物理...

掘金官方
2018/08/17
0
0
优化过程 PK :Julia 能打败 Python 和 R 笑到最后吗?

编译自:Julia vs R vs Python: simple optimization 作者:ZJ,数据科学家,全栈工程师,信用风险模型团队负责人。 在这篇文章中,作者通过一个简单的似然函数优化(Maximum Likelihood Op...

王练
2018/08/31
3.4K
13

没有更多内容

加载失败,请刷新页面

加载更多

MySql双主架构原理

在企业中,一般系统架构的瓶颈会出现在数据库这一部分,mysql主从架构在很大程度上解决了这部分瓶颈,但是在mysql主从同步的架构也存在很多问题;比如:1.关于数据写入部分(也就是主库)往往很难做...

xiaomin0322
13分钟前
0
0
分布式系统中一致性哈希

问题场景 近年来B2C、O2O等商业概念的提出和移动端的发展,使得分布式系统流行了起来。分布式系统相对于单系统,解决了流量大、系统高可用和高容错等问题。功能强大也意味着实现起来需要更多...

Java领航员
15分钟前
0
0
接口限流算法:漏桶算法和令牌桶算法

漏桶算法 漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。这一点和线程池原理是很相似的。 把请求比作是水,水来了都先放进桶里,并以限定...

铁骨铮铮
22分钟前
1
0
Android 生成二维码工具类

/** * 生成条形码和二维码的工具 */public class ZXingUtils { /** * 生成二维码 要转换的地址或字符串,可以是中文 * * @param url * @param width ...

lanyu96
27分钟前
1
0
谈谈lucene的DocValues特性之SortedNumericDocValuesField

前面已经介绍过NumericDocValuesField,这里想强调一下SortedNumericDocValuesField是针对同一篇文档中一键多值的情况进行排序的,换句话说不同文档的同一字段值可以乱序。核心的写入流程与谈...

FAT_mt
35分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部