erlang基本语法学习笔记

  在shell下学习erlang的语法 1.输入十六进制: 1> 16#f. 15 输入命令需要在末尾加上一个点号,否则会认为没有输入完整。(第一次安装完成,就迫不及待的在命令行下试了,没有成功,慌了。仔细阅读文档才发现输入不完整。) 2.erlang变量名大写: 13> i=9. ** exception error: no match of right hand side value 9 14> I=9. 9 3.erlang变量的单一赋值: 当执行I=9时,值9就被绑定到I上。没绑定之前是一个自由变量,绑定后变量的值将不会再发生改变。 “=”模式匹配操作符。 17> I=5. ** exception error: no match of right hand side value 5 “Erlang 是一个函数式语言,不存在可变状态。 当多核编程来临的时候,采用不可 变状态所带来的好处是难以估量的。 如果你用 C、Java 这样的传统编程语言为多核 CPU 编写程序,就不得不应付共享内存带来的问题。要想不破坏共享内存,就必须在访问时对其加锁。程序还要保证在操纵共享内存时不会崩溃。  而Erlang没有可变状态,也就没有共享内存,更没有锁,这一切都有利于并行化程序的编写。” “定义一个变量的词法单元就是这个变量的作用域。因此,如果在一个函数语句范围 内使用 X,那么 X 的值就不能―跳出‖语句之外。在同一个函数的不同子句中,彼此之间也不存在全 局或者共享的私有变量。如果 X 出现在许多个不同的函数当中,那么这些 X 的值也都是各自独立 的。”这个在看完函数后再进行验证。 4.浮点数运算: 18> 5/3. 1.6666666666666667 19> 4/2. 2.0 20> 5 div 3. 1 21> 10 rem 3. 1 22> 4 div 2. 2 23> 4 div 2.0. ** exception error: bad argument in an arithmetic expression      in operator  div/2         called as 4 div 2.0 24> 4.0 div 2 24> . ** exception error: bad argument in an arithmetic expression      in operator  div/2         called as 4.0 div 2 25> 5/3.0. 1.6666666666666667 经过测试,div运算两边必须是整数。rem取余。 5.erlang原子: 原子是一串以小写字母开头,后跟数字字母或下划线(_)或邮件符号(@)的字符,使用单引号引起来的也是原子。 原子的值就是他自身。 做了几个测试: 37> aaa. aaa 38> 'aaa'. aaa 39> "aaa". "aaa" 40> 111. 111 41> '1111'. '1111' 42> 'a111'. a111 43> ''. '' 44> '. 44> ' 44> . '.\n' 45> a'111'. * 1: syntax error before: '111' 45> +. * 2: syntax error before: '.' 45> '+'. '+' 46> AAA. * 1: variable 'AAA' is unbound 47> 'AAA' . 'AAA' '单引号是个特殊字符,用来区分原子,"双引号是定义字符串,在后面讲。符合定义的,单引号加与没加一样,不符合的(如:大写字母开头或者数字,或者特殊字符),需要加上单引号作为区分。  6.元组: 将若干个以逗号分割的值用一对花括号括起来,就形成了一个元组。值可以是数值和原子。 从元组获取值: 48> D = {a,5,b} . {a,5,b} 49> {a,C,B} = D. {a,5,b} 50> C. 5 51> B. b 书上的一个例子: 55> Person={person,{name,{first,joe},{last,armstrong}},{footsize,42}} 55> . {person,{name,{first,joe},{last,armstrong}},{footsize,42}} 56> {_,{_,{_,Who},_},_}=Person. {person,{name,{first,joe},{last,armstrong}},{footsize,42}} 57> Who. joe 58> 注意    在前面的样例中,将_作为占位符,表示那些我们不关心的变量。符号_称为匿名变量,与常规变量不同,在同一个模式中的不同地方,各个_所绑定的值不必相同。 7.erlang列表: 用列表存储可变的东西,将若干个以逗号分割的值用一对方括号括起来,就形成了一个列表。列表的第一个元素称为列表的头(head)。除去头,剩下的东西就称为列表的尾(tail)。 例如,如果有列表[1,2,3,4,5],那么列表的头就是整数 1,它的尾为[2,3,4,5]。注意,列表的头可以是任何东西,但是列表的尾通常还是一个列表。 访问列表的头是一个非常高效的操作,因此,实际上所有的列表处理函数都是从提取列表头开始的,先对头进行处理,然后继续处理列表的尾。 erlang列表定义:如果T 是一个列表,那么[H|T]也是一个列表 ,这个列表以H 为头,以T为尾。竖线符号(|)可以将列表的头和尾分隔开来,而[]则是空列表。 58> H = [1,a,{a,b,c}]. [1,a,{a,b,c}] 59> T = [1,2,3]. [1,2,3] 60> [H|T]. [[1,a,{a,b,c}],1,2,3] 提取列表中的值: 62> [Aa|Bb]=H. [1,a,{a,b,c}] 63> Aa. 1 64> Bb. [a,{a,b,c}] 8.erlang字符串: 严格来讲,erlang没有字符串,字符串就是一个整数列表,列表中的每一个值都是字符所对应的整数值。 shell打印一串列表值时,只有列表中的所有整数都是可打印字符,它才把这个列表当作字符串来打印: 66> [3,4,5]. [3,4,5] 67> [83,84,85]. "STU" 68> [3,83,84]. [3,83,84] 69> [$a,$b,$c].    "abc" 我们无须死记硬背哪一个整数表示哪一个特定的字符(ASCII码表),可以使用$符号来表示字符的整数值。例如,$a实际上是一个整数,表示字符 a。  命令f()会让shell释放它所绑定过的所有变量。执行这个命令后,所有的变量都变成自由变量。 72> X=333. 333 73> X=111. ** exception error: no match of right hand side value 111 74> f(). ok 75> X=111. 111 终于将第二章看完了,有种眼前一亮的感觉。
Read more...

Erlang研究研究

Erlang程序设计。pdf 这几天突然又迷茫了,再看c和c++的一些注意、要点。看了本《python网络编程》,与自己想学的东西差太多,看到后面就开始蹦跶着看了。 在网上看了一篇文章,决定小小的研究一下erlang,说不定以后用得着。 找了几篇文章 http://zhys9.com/blog/?tag=erlang http://jbpm.group.iteye.com/group/topic/7938 几本erlang相关的pdf书,从sina的共享文档找的,论坛不上,qq群加了。 开始搞erlang
Read more...

今天采集某站数据经验总结

今天用python进行网站数据采集,该站主要有这么几种措施防止数据采集: 1、div标签不标准。闭合标签跑太远,导致采集不准确。 2、放置干扰字符。这种直接提示错误,没有办法采集。错误提示:'ascii' codec can't encode character u'\u3009' in position 5 解决方案: 第一种如果处理不好会带有许多原站信息,采用缩小div标签的范围,但是效果不明显。感觉用正则判断比较不错,但是又经常将标签前后放置很多空格和换行,还是很麻烦。 第二种,根据提示的字符,找到对应的字符“〉”,我到原文中搜索一看,差,震惊。竟然这么写的:“<p〉”。我是没有直接替换,采用保存到文件,然后手动修改,再读取文件处理。
Read more...

用python进行排列组合生成

在做f4ck上的游戏时,第三题需要生成字典的,就到网上搜索现成的排列组合的例子,找个一个,(链接找不到了)。那篇文章用了很多种方法,并比较了执行时间,很好。我找了一种感觉很好的,记录一下。 字典生成,共五位,已知四个字母,然后另一位是数字。这五位排列组合,共有5!*10中排列。 先上算法:
#-*-coding:utf-8-*-
str1 = 'f9ck'

def permute(seq):
    new_list = []
    seqn = [seq.pop()]
    while seq:
        newseq = []
        new = seq.pop()
        #print "seq:",seq,'seqn', seqn ,'new', new
        for i in range(len(seqn)):
            item = seqn[i]
            for j in range(len(item)+1):
                #print u'left:',item[:j],u'midle:',new,u'right:',item[j:]
                #print ''.join([item[:j],new,item[j:]])
                newseq.append(''.join([item[:j],new,item[j:]]))
        seqn = newseq
        #print 'newseq',newseq
    return  seqn

file2 = open('p00.txt','w+')
for i in range(10):
    str2 = str1 + str(i)
    seq = list(str2)
    thelist = permute(seq)

    passwdlist = []
    for passwd in thelist:
        newpasswd = passwd + '\n'
        passwdlist.append(newpasswd)
    file2.writelines(passwdlist)
    print len(passwdlist)

#file1.close()
file2.close()
分析一下, 第一步,取一位,放入seqn,这个列表用于保存过程中生成的序列。 第二步,从剩下的中再取一位,放入new。 第三步,for循环,将new中的字母插入到seqn列表元素的每一位中。生成的新序列赋值seqn。 for循环解释一下:作者当时就是举了个例子,如果想得到1,2,3这三个数的排列组合,通过下面的方法。 如图: [caption id="attachment_532" align="alignnone" width="122" caption="排列选择"]排列选择[/caption]
Read more...

Beautiful Soup初探

在抓取网页数据进行html分析的时候,以前一直使用HTMLParser,文档:http://docs.python.org/library/htmlparser.html 自从知道HTMLParser后,一直感觉他就是一个神器,分析简单快捷,几行代码搞定了。 这次在总页面抓取使用HTMLParser,没有问题,很快实现结果。但是在获取详细信息的页面时候,开始提示错误了:HTMLParseError: malformed start tag,各种google,其中有一大部分的结果是关于Beautiful Soup的,于是我了解了Beautiful Soup。HTMLParser还有一个缺点,对编码的处理也不是很友好。 开始安装的Beautiful Soup最新版本4.4.1,有问题,也是报这个错误。由于前面搜索知道换成版本3.07a就好了,直接又换了一个版本。先说官网地址:http://www.crummy.com/software/BeautifulSoup/,Beautiful Soup 3.07a下载地址:http://www.crummy.com/software/BeautifulSoup/bs3/download//3.x/。 测试通过,没有报错。能否抓取成功下面试试。正在看官方文档,版本3的文档不一样,贴地址:http://www.crummy.com/software/BeautifulSoup/bs3/documentation.zh.html 时隔二分钟,测试成功。发现Beautiful Soup更加简单,文档也不错只看了开始的例子就会用了,速度应该不会太好,不过我只是满足自己需要。很好很强大。 刚刚结合文档总结了几个用法,很多根据文档写出文档没写的例子: #基本的标签查找 asd = soup.find('div', id="productDescription") #可以这样写 soup.findAll('td', {'class':"bucket normal"})[0] #想要进行查询结果中查找 aaa = BeautifulSoup(str(asd)) #查找多个不同class,或 bbb = aaa.findAll('div', {'class':["leftImage","rightImage"]})
Read more...

Python字符串的encode与decode乱码问题解决方法

这是一篇转载文章,原文链接:http://www.jb51.net/article/17560.htm 刚写了一个汉字的图片验证码,被错误提示折腾了。看到这篇文章便分享。 报错“UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)” 字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。 decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。 encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。 因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码。 代码中字符串的默认编码与代码文件本身的编码一致。 如:s='中文' 如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。这种情况下,要进行编码转换,都需要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。通常,在没有指定特定的编码方式时,都是使用的系统默认编码创建的代码文件。 如果字符串是这样定义:s=u'中文' 则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。因此,对于这种情况做编码转换,只需要直接使用encode方法将其转换成指定编码即可。 如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断: isinstance(s, unicode) #用来判断是否为unicode 用非unicode编码形式的str来encode会报错 如何获得系统的默认编码? #!/usr/bin/env python #coding=utf-8 import sys print sys.getdefaultencoding() 该段程序在英文WindowsXP上输出为:ascii 在某些IDE中,字符串的输出总是出现乱码,甚至错误,其实是由于IDE的结果输出控制台自身不能显示字符串的编码,而不是程序本身的问题。 如在UliPad中运行如下代码: s=u"中文" print s 会提示:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)。这是因为UliPad在英文WindowsXP上的控制台信息输出窗口是按照ascii编码输出的(英文系统的默认编码是ascii),而上面代码中的字符串是Unicode编码的,所以输出时产生了错误。 将最后一句改为:print s.encode('gb2312') 则能正确输出“中文”两个字。 若最后一句改为:print s.encode('utf8') 则输出:\xe4\xb8\xad\xe6\x96\x87,这是控制台信息输出窗口按照ascii编码输出utf8编码的字符串的结果。 unicode(str,'gb2312')与str.decode('gb2312')是一样的,都是将gb2312编码的str转为unicode编码 使用str.__class__可以查看str的编码形式 原理说了半天,最后来个包治百病的吧:)
#!/usr/bin/env python
#coding=utf-8
s="中文"

if isinstance(s, unicode):
#s=u"中文"
print s.encode('gb2312')
else:
#s="中文"
print s.decode('utf-8').encode('gb2312')
Read more...

通过IP获取用户经纬度

maxmind.com提供了一个服务,通过引入一个js文件(http://j.maxmind.com/app/geoip.js),可以把他判断到的用户的国家、城市、经纬度等信息加入到页面中来。


其他功能函数 function geoip_country_code() { return 'CN'; } function geoip_country_name() { return 'China'; } function geoip_city() { return 'Shanghai'; } function geoip_region() { return '23'; } function geoip_region_name() { return 'Shanghai'; } function geoip_latitude() { return '31.0050'; } function geoip_longitude() { return '121.4086'; } function geoip_postal_code() { return ''; } function geoip_area_code() { return ''; } function geoip_metro_code() { return ''; }
Read more...

bae上添加django应用数据库配置

配置文件settings.py:
if 'SERVER_SOFTWARE' in os.environ:
    from bae.core import const
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql', 
            'NAME': 'XXX',
            'USER': const.MYSQL_USER, 
            'PASSWORD': const.MYSQL_PASS,  
            'HOST': const.MYSQL_HOST,   
            'PORT': const.MYSQL_PORT, 
        }
    }
else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql', 
            'NAME': 'baidu', 
            'USER': 'root',
            'PASSWORD': '',    
            'HOST': 'localhost',                   
            'PORT': '3306',                      
        }
    }
这里是django应用数据库的配置,具体可以参考官网:http://developer.baidu.com/wiki/index.php?title=%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3%E9%A6%96%E9%A1%B5/%E4%BA%91%E7%8E%AF%E5%A2%83/WEB%E5%BC%80%E5%8F%91%E6%A1%86%E6%9E%B6 数据库需要先在本地导出来,然后用官网提供的phpmyadmin导入到bae数据库中。这里我只用到session表,直接执行sql语句简历一个django_session表就搞定了。
Read more...

django写用户设置时,初始化form数据

先记录一个无意在官网看到的有用的知识,不过没有测试,官网介绍很清楚。 先写地址:https://docs.djangoproject.com/en/1.4/ref/forms/widgets/#selectdatewidget 前面记录文章《django 前端时间控件移植记录》是将后台的功能移植到前台,现在可以直接创建SelectDateWidget forms进行设计了。 具体的效果我也没有试过,先记录。 说正题: 先上官网链接:https://docs.djangoproject.com/en/1.4/ref/forms/api/#django.forms.Form.initial f = ContactForm(initial={'subject': 'Hi there!'}) 后面再补充初始化form数据的代码。
Read more...

窗外的雨,一直下

自己总想记录一些东西,特别是坐车的时候,那时思绪只会跟着窗外飘逸的景物飞向远方。那时会有很多感悟,有人生的,太多太多,我就通过手机用文字记录下来。 现在我坐在二楼网吧窗旁,透过我微开得窗户向外望去,看到水滴不时滴落窗台溅起水花。雨下的不大,窗外的树叶随风摇曳,被雨水洗涮地绿得吓人,叶尖的水滴是那么动人,你不会知道他什么时候会滴落。向远处望去可以看到笼罩着雾气中的主楼,依然的高大。当思绪被拉回来的时候,突然发现耳边的音乐很适合现在的环境,哦,是《Kiss The Rain》,突然间有种想笑的冲动。 今年的雨下得不多,就像群里的说的:这是个好天气。只觉得凌云壮志,斗志昂扬。路还很长,一直走下去。另外今天知道了c#的设计者Anders Hejlsberg。 只有拒绝再试一次的人才会被打败。
Read more...

Previous Page 1 2 3 4 5 6 7 8 9 10 Next Page 最后一页