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

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

[复制链接]

尚未签到

发表于 2017-5-6 13:25:15 | 显示全部楼层 |阅读模式
erlang中的任何类型的数据都叫一个term。
1、number(byte/short/int/long/float/double)
erlang中只有两种数值类型,integer和float,integer长度都不受限制,而float的精度最长是15位;python有四种数值类型,plain integers(也叫integers),long integers,floating point numbers,imaginary numbers
   1.1、erlang:
   1.1.1、integer,可以直接用数值表示,也可以用$char和base#value表示;$char表示字符char的ASCII值,base#value表示value是base进制,其中2 =< base <= 36
1> X = 3.
3
2> Y = $A.
65
3> Z = $&.
38
8> 2#1.
1
9> 4#13.
7
10> 8#17.
15
11> 36#ZDBCABDESSDFFFDDFAWTGHYHRT2343553.
2240337205207617077098035105820684337245238765751495
12> 36#Z.
35
13> 32457892340972398573249087523458239086723945.
32457892340972398573249087523458239086723945
   1.1.2、float,可以直接用XX.XX表示或者用X.XXeYYY
27> 532534563.34564356547567098350968473906.
532534563.3456436
28> 527893456345.324098798720349 * 40892435098234905932485.
2.158684890238407e34
40> 3.83e5.
3.83e5
41> 3.83342e5.
383342.0
   1.2、python:
   1.2.1、plain integers 从-2147483648到2147483647,有符号位32位长
>>> a = 423452
>>> a
423452
>>> a = -43252
>>> a
-43252
   1.2.2、long integers 任意长度,最大和最小值由可用内存定,数字后边一般加L或l(小写L)
>>> a = 42350892374598237593287592384#//我这里没有加L,python会自动加上
>>> a
42350892374598237593287592384L
>>> a = -345235L
>>> a
-345235L
   1.2.3、floating point numbers 支持十进制和浮点型小数,浮点值按照双精度处理
>>> f = 4.2345235
>>> f
4.2345235
>>> f = 3.23452345e1222
>>> f
inf #//无限了?
>>> f = 3.23452345e100
>>> f
3.23452345e+100
   1.2.4、imaginary numbers虚数 实虚部分由+号分开,虚数部分后边加j
>>> n = 3 + 4j
>>> n
(3+4j)
>>> m = 4 + 5j
>>> m
(4+5j)
>>> m + n
(7+9j)
>>> m * n
(-8+31j)
   1.2.5、参考资料
2、boolean
erlang中没有boolean数据类型,用true和false这两个atom表示boolean值;python中有单独的boolean数据类型,True和False表示,0、''、[]、{},()、None在boolean环境都为false,其他任何东西都为真
   2.1、erlang:
1> 2 =:= 3.
false
2> a =:= a.
true
34> true or false.%//虽然官方文档上说没有这种数据类型但是这里却看起来像是有一样
true
37> a or b.
** exception error: bad argument
in operator  or/2
called as a or b
   2.2、python:
>>> 2 == 2
True
>>> 2 == 3
False
>>> type(True)
<type 'bool'>
>>> [] or 3
3
>>> '' or 3
3
>>> () or 3
3
>>> {} or 3
3
>>> None or 3
3
>>> 0 or 3
3
3、char
python和erlang都没有char类型
4、void
python和erlang都没有void类型
5、string
在erlang中,并无string这种数据类型,其本质上是一个list;而python中有,为str类型
   5.1、erlang:
   5.1.1、声明,输出。erlang的字符串只能放在双引号内,放在单引号内表示是atom
1> X='xx'.
xx
2> is_atom(X).
true
3> Y="yy".
"yy"
4> is_list(Y).
true
5> Z = "zz".
"zz"
   5.1.2、字符串用++相连
6>  Y ++ Z.
"yyzz"
12> io:format("Y:~s\tZ:~p\n",[Y,Z]).
Y:yy    Z:"zz"
   5.1.3、string模块,erlang有单独的string模块来操纵string
20> A="abcdef".
"abcdef"
21> string:sub_string(A,1,2).
"ab"
22> string:len(A).
6
   5.1.4、string的本质是一个list;如果list内的数字表示的是可打印字符,则list会打印成string,否则还是list;"AB"代表[$A,$B],也为[65,66]
3> Y="yy".
"yy"
4> is_list(Y).
true
25> [65,66,67].
"ABC"
26> [65,66,267].
[65,66,267]
   5.1.5、编译时,两个相邻的string会被连接在一起,两个list就会报错了
28> "contact" "me".
"contactme"
29> [65,66] [67].
* 1: syntax error before: '['
   5.2、python:
   5.2.1、声明,输出。python的字符串可以放在单引号或者双引号内
>>> k="key"
>>> k
'key'
>>> v = 'value'
>>> v
'value'
>>> '%s=%s' %(k,v)
'key=value'
>>> len(k)
3
   5.2.2、字符串用++相连
>>> k+v
'keyvalue'
   5.2.3、string对象,因为python是面向对象的,所以它不像erlang提供单独的模块,而是像java一样,每个字符串就是一个对象,直接调用相关的方法就好了
>>> k.replace('k','a')
'aey'
>>> k.upper()
'KEY'
   5.2.4、string的类型还是string,但是却可以像操纵list一样操纵
>>> type(k)
<type 'str'>
>>> k[:]
'key'
>>> k[:3]
'key'
>>> k[:2]
'ke'
   5.2.5、参考资料
6、list
   从以下的对比,可以清晰的感受到python是一门面向对象的语言,因为我们调用的都是list对象的方法;而erlang是一门函数型语言,因为变量都是不可变的
   6.1、erlang:
   6.1.1、创建List
1> L=[1,2,3,4,5,6].
[1,2,3,4,5,6]
   6.1.2、访问第一个元素
3> [H|T] = L.
[1,2,3,4,5,6]
4> H.
1
   6.1.3、访问第m到第n个元素
7> [_,E1,E2,E3|_] = L.
[1,2,3,4,5,6]
8> [E1,E2,E3].
[2,3,4]
或者直接调用lists的方法:
9> lists:sublist(L,2,3).
[2,3,4]
   6.1.4、增加元素,这里虽然是增加,但是已经不是在原有List上添加,而是新建了一个List,在erlang里边变量的值是不能改变的
24> NewL = [new|L].
[new,1,2,3,4,5,6]
这里只能把新加的元素放到开始的位置,如果是放在了后边就成了如下的效果:
27> [L|7].
[[1,2,3,4,5,6]|7]
当然可以通过调用lists的方法实现(注意append进去的元素必须是只有一个元素的List):
28> lists:append(L,[7]).
[1,2,3,4,5,6,7]
   6.1.5、扩展/合并list
45> lists:append(L,[7,8,9]).
[1,2,3,4,5,6,7,8,9]
46> lists:merge(L,[7,8,9]).
[1,2,3,4,5,6,7,8,9]
   6.1.6、list运算符
59> L ++ ['a',b].
[1,2,3,4,5,6,a,b]
   6.1.7、其他
55> lists:nth(3,L).
3
56> lists:delete(3,L).
[1,2,4,5,6]

   6.2、python:
   6.2.1、创建List
>>> li=[1,2,3,4,5,6]
>>> li
[1, 2, 3, 4, 5, 6]
   6.2.2、访问第一个元素
>>> li[0]
1
   6.2.3、访问第m到第n个元素,可以通过索引访问。索引从前边往后数是0到len(li) - 1,从后边往前边数是-1到-len(li)。list[start:end]是返回从start开始,并包含start,到end结束,且不包含end的元素列表
>>> li[1:4]
[2, 3, 4]
>>> li[:2]%//如果start处为空,则表示从第一个元素开始访问
[1, 2]
>>> li[-6:-1]
[1, 2, 3, 4, 5]
>>> li[-5:]%//如果end处为空,则表示访问到最后一个元素
[2, 3, 4, 5, 6]
>>> li[-4:5]
[3, 4, 5]
>>> li[:]%//复制List
[1, 2, 3, 4, 5, 6]
   6.2.4、增加元素
>>> li.append('a')
>>> li
[1, 2, 3, 4, 5, 6, 'a']
>>> li.insert(0,0)
>>> li
[0, 1, 2, 3, 4, 5, 6, 'a']
   6.2.5、扩展list
>>> li.extend([7,8,9])
>>> li
[1, 2, 3, 4, 5, 6, 7, 8, 9]
   6.2.6、list运算符
>>> li += ['a','b']
>>> li
[1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b']
>>> li *= 2
>>> li
[1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9]
   6.2.7、其他
>>> li.index(3)
2
7、tuple
erlang中,tuple是由一定数量的terms组成的复合数据类型;python则,tuple是一种序列类型(string和list也是序列类型),由数个逗号分隔的任意类型值组成,一旦创建了一个tuple就不能以任何方式改变它
   7.1、erlang:
   7.1.1、定义,注意这里是大括号
1> T={'a',adm,34,4.2,[2,4,d],{2,3,f}}.
{a,adm,34,4.2,[2,4,d],{2,3,f}}
2> T={'a',adm,34,4.2,[2,4,d],{2,3,f}}.
{a,adm,34,4.2,[2,4,d],{2,3,f}}
3> is_tuple(T).
true
4> tuple_size(T).
6
   7.1.2、从tuple提取值
13> Person={person,
{name,yymt},
{height,174},
{footsize,41},
{age,26},
{eyecolor,black}}.
{person,{name,yymt},
{height,174},
{footsize,41},
{age,26},
{eyecolor,black}}
14> {_,{_,Who},{_,_},{_,_},{_,Age},{_,_}} = Person.
{person,{name,yymt},
{height,174},
{footsize,41},
{age,26},
{eyecolor,black}}
15> io:format("~p is ~p years old\n",[Who,Age]).
yymt is 26 years old
ok
   7.2、python:
7.2.1、定义,注意这里是小括号
>>> tt=(,) #//这样定义已经不行了
File "<stdin>", line 1
tt=(,)
^
SyntaxError: invalid syntax
>>> tt=()
>>> tt
()
>>> tuple = (1,2,'tuple',[1,2,3.44,"list"],{3,"set"},{"key":"dictionary"})
>>> tuple
(1, 2, 'tuple', [1, 2, 3.44, 'list'], set([3, 'set']), {'key': 'dictionary'})
>>> type(tuple)
<type 'tuple'>
   7.2.2、像操纵list一样操纵tuple,但是tuple没有方法
>>> tuple[1]
2
>>> tuple[:3]
(1, 2, 'tuple')
>>> tuple[-5:]
(2, 'tuple', [1, 2, 3.44, 'list'], set([3, 'set']), {'key': 'dictionary'})
>>> tuple.append(3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'append'
8、set
set是一个无序不重复的元素的集合,python中可以求set的并集、交集、差和对称差,erlang中无直接求对称差的接口,只能自己实现
   8.1、erlang:
1> S = sets:new().
{set,0,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
{{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}}
2> sets:add_element(3,S).
{set,1,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
{{[],[3],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}}
3> S.
{set,0,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
{{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}}
4> S2 = sets:add_element(3,S).
{set,1,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
{{[],[3],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}}
6> S3 = sets:from_list([1,2,a,b,"ele",{a,b,c},[23,2]]).
{set,7,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
{{[],
[a],
,
[],[],
["ele"],
[2],
[],[],
[{a,b,c}],
[],
[1],
[[23,2]],
[],[],[]}}}
7> sets:intersection([S2,S3]).
{set,0,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
{{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}}
8> sets:is_element(a,S3).
true
10> sets:is_set(S3).
true
11> sets:to_list(S2).
[3]
12> sets:union(S2,S3).
{set,8,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
{{[],
[3,a],
,
[],[],
["ele"],
[2],
[],[],
[{a,b,c}],
[],
[1],
[[23,2]],
[],[],[]}}}

   8.2、python:
>>> s = {"fisr",1,2,'abc',3.44}
>>> s
set(['fisr', 3.44, 2, 'abc', 1])
>>> type(s)
<type 'set'>
>>> list = [1,2,3,'a']
>>> s2 = set(list)
>>> s2
set(['a', 1, 2, 3])
>>> type(s2)
<type 'set'>
>>> s - s2 #//element in s but not in s2 - difference
set(['fisr', 3.44, 'abc'])
>>> s & s2 #//element in s and s2 - intersection
set([1, 2])
>>> s | s2 #//element in s or s2 - union
set(['a', 3.44, 2, 'abc', 1, 'fisr', 3])
>>> s ^ s2 #//element in s or s2 but not both - sysmmetric difference
set(['a', 3, 3.44, 'fisr', 'abc'])
>>> a=set('abcdeabjf')
>>> a
set(['a', 'c', 'b', 'e', 'd', 'f', 'j'])
>>> 'a' in a
True
>>> 2 in a
False
9、dictionary
   9.1、erlang:
   9.1.1、创建Dictionary
1> Dict = dict:new().
{dict,0,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
{{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}}
   9.1.2、新增、修改、删除dictionary的元素;多种数据类型。这里dictionary实际是不可修改的,每次是新创建了一个新的dictionary
2> Dict2 = dict:store(1,1,Dict).
{dict,1,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
{{[],[],[],[],[],[],[],[],[],[],[],[[1|1]],[],[],[],[]}}}
4> Dict3 = dict:store(2,1,Dict2).
{dict,2,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
{{[],[],[],[],[],[],
[[2|1]],
[],[],[],[],
[[1|1]],
[],[],[],[]}}}
13> Dict4 = dict:append(3,1,Dict3).
{dict,3,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
{{[],
[[3,1]],
[],[],[],[],
[[2|1]],
[],[],[],[],
[[1|1]],
[],[],[],[]}}}
15> Dict5 = dict:erase(1,Dict4).
{dict,2,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
{{[],
[[3,1]],
[],[],[],[],
[[2|1]],
[],[],[],[],[],[],[],[],[]}}}
19> Dict6 = dict:store(3,'4',Dict4).
{dict,3,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
{{[],
[[3|'4']],
[],[],[],[],
[[2|1]],
[],[],[],[],
[[1|1]],
[],[],[],[]}}}
   9.1.3、通过key访问Dictionary的元素
18> dict:find(3,Dict5).
{ok,[1]}
20> dict:fetch(3,Dict5).
[1]
   9.1.4、其他
8> dict:to_list(Dict3).
[{2,1},{1,1}]
21> dict:fetch_keys(Dict5).
[3,2]
   9.2、python:
   9.2.1、创建Dictionary
>>> dict={1:1,"key":"value",'name':'lily','from':5}
>>> dict
{1: 1, 'from': 5, 'name': 'lily', 'key': 'value'}
   9.2.2、新增、修改、删除dictionary的元素;多种数据类型
>>> dict['from'] = 'china'
>>> dict
{1: 1, 'from': 'china', 'name': 'lily', 'key': 'value'}
>>> dict['from'] = 'usa'
>>> dict
{1: 1, 'from': 'usa', 'name': 'lily', 'key': 'value'}
>>> del dict['from']
>>> dict
{1: 1, 'name': 'lily', 'key': 'value'}
   9.2.3、通过key访问Dictionary的元素
>>> dict[1]
1
>>> dict['key']
'value'
   9.2.4、其他
>>> dict.keys()
[1, 'name', 'key']
>>> dict.items()
[(1, 1), ('name', 'lily'), ('key', 'value')]
>>> dict.clear()
>>> dict
{}
10、function
可以创建匿名函数,然后把函数作为参数传给其他函数
   10.1、erlang:
26> Fun = fun(X) ->  X > 2 end.
#Fun<erl_eval.6.13229925>
27> is_function(Fun).
true
28> lists:filter(Fun,[1,2,3,4,5]).
[3,4,5]
   10.2、python:
>>> import string
>>> type(string.join)
<type 'function'>
>>> f = lambda x: x > 2
>>> filter(f,[1,2,3,4,5])
[3, 4, 5]
>>> type(f)
<type 'function'>

运维网声明 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-373866-1-1.html 上篇帖子: 线程安全的纯python-memcached客户端 下篇帖子: (二)selenium+python选择编译器写第一个自动化脚本
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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