设为首页 收藏本站
查看: 2943|回复: 0

[经验分享] python(vs. erlang)学习笔记之五 —— 数据类型 & 数据结构之二

[复制链接]

尚未签到

发表于 2017-5-8 09:48:42 | 显示全部楼层 |阅读模式
这部分主要介绍bit string/binary、reference、port identifier、pid、record。这些数据类型都是erlang的数据类型,python是没有这些数据类型的
1、bit string和binary
binary是一种用来存储大量raw type数据的数据类型,binary存储数据比lists和tuples的空间效率高。如果binary可打印字符串,就会输出为字符串,否则就输出为整数序列。参考资料
29> <<67,68,69>>.
<<"CDE">>
32> <<67,68,69,1>>.
<<67,68,69,1>>
34> list_to_binary([<<1,2,3>>,2,3,<<3,4,5>>]).
<<1,2,3,2,3,3,4,5>>
36> B = term_to_binary({abc,"are",userful}).
<<131,104,3,100,0,3,97,98,99,107,0,3,97,114,101,100,0,7,
117,115,101,114,102,117,108>>
37> binary_to_term(B).
{abc,"are",userful}
38> X = 34.
34
39> Y = 45.
45
40> Z = 78.
78
41> <<X:3,Y:7,Z:6>>.
<<"KN">>
42> <<16#123456:32/big>>. %//完整的格式Value:Size/TypeSpecifierList
<<0,18,52,86>>
2、reference
reference是一个全局唯一的erlang term,用erlang:make_ref()创建,一般创建后放在某些数据里,然后在后边用来比较相等性。比如客户端在跟服务器端通信的时候,可以把ref传到服务端,然后服务端处理完请求后再把ref传到客户端,客户端就可以确认是这次请求的响应了。或者用来生成uuid。参考资料
43> erlang:make_ref().
#Ref<0.0.0.150>
3、port identifier
当erlang要跟非erlang语言写的程序通信的时候,我们可以把这个外部程序跑到erlang运行时系统之外,作为一个操作系统进程来跟erlang通信,这时候要通信的程序叫做connected process,会创建一个port,通过port跟外部进程通信。
start_port(ClientName) -> %//这个代码是不能直接跑的,是一个完整程序的片段
process_flag(trap_exit,true),
Port = open_port({spawn,"./chat"},[{packet,4}]),
loop(ClientName,Port).
4、pid
pid即process identifier,可以理解为进程的句柄或引用
-module(area_server0). %//这些代码要放在一个文件里
-export([loop/0]).
loop() ->
receive
{rectangle, Width, Ht} ->
io:format("Area of rectangle is ~p~n" ,[Width * Ht]),
loop();
{circle, R} ->
io:format("Area of circle is ~p~n" , [3.14159 * R * R]),
loop();
Other ->
io:format("I don't know what the area of a ~p is ~n" ,[Other]),
loop()
end.
1> Pid = spawn(fun area_server0:loop/0).
<0.36.0>
2> Pid ! {rectangle, 6, 10}.
Area of rectangle is 60
{rectangle,6,10}
3> Pid ! {circle, 23}.
Area of circle is 1661.90
{circle,23}
4> Pid ! {triangle,2,4,5}.
I don't know what the area of a {triangle,2,4,5} is
{triangle,2,4,5}
5、record
record是用来存储一定数量元素的数据结构,这类似于c语言的struct结构;record不是真正的数据类型,在编译时,它会被翻译成tuple表达式
-record(person,
{
name = "yymt",
age = 26,
gender = m,
address = beijing,
home
}).%//放在record.hrl文件里
10> rr("record.hrl").
12> X = #person{}.
#person{name = "yymt",age = 26,gender = m,address = beijing,
home = undefined}
13> X1 = #person{home=henan,address=shenzhen}.
#person{name = "yymt",age = 26,gender = m,
address = shenzhen,home = henan}
14> #person{name=Who,age=Age} = X1.
#person{name = "yymt",age = 26,gender = m,
address = shenzhen,home = henan}
15> Who.
"yymt"
16> Age.
26
6、比较不同数据类型变量的大小
   6.1、erlang
number < atom < reference < fun < port < pid < tuple < list < binary
这什么意思呢?看段代码便知:
17> 2 < a.
true
19> a < {}.
true
   6.2、python
python中set是不能跨数据类型比较的
boolean < number < dictionary < tuple < fun < list < string
>>> f = lambda x: x > 2
>>> {} < []
True
>>> 2 < {}
True
>>> 2 < '2'
True
>>> 2 < []
True
>>> 's' < []
False
>>> 2 < f
True
>>> 'a' < []
False
>>> [] < {}
False
>>> {} < []
True
>>> {'a'} < ['a']
Traceback (most recent call last):
File "<stdin>", line 1, in <modul
TypeError: can only compare to a set
>>> 'a' < [9]
False
>>> {'a':3} < ['a']
True
>>> 2 < {2:3}
True
>>> 'a' < (3)
False
>>> (3) < [3]
True
>>> {1:2} < (3)
False
>>> f < 3
False
>>> f < {1:2}
False
>>> f < [2]
True
>>> f < (2)
False
>>> 2 < True
False
>>> True < 2
True

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-374504-1-1.html 上篇帖子: 【JAVA程序员必看】Ruby、Python不能威胁Java的13个理由 下篇帖子: python快速入门四(上) 之 正则表达式 异常处理 随机数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表