Erlang中的函数与流程控制介绍
“shylockandy”通过精心收集,向本站投稿了3篇Erlang中的函数与流程控制介绍,下面是小编为大家推荐的Erlang中的函数与流程控制介绍,欢迎大家分享。
篇1:Erlang中的函数与流程控制介绍
这篇文章主要介绍了Erlang中的函数与流程控制介绍,本文先是讲解了函数的一些知识,然后讲解了case语句和if语句及算术表达式等内容,需要的朋友可以参考下
一:函数
1:在Erlang中,【名字相同但参数数目不同】的两个函数是完全不同的函数,
2:其他模块内的函数用完全限定名称 被调用:
代码如下:
-module(sort1).
-export([reverse_sort/1, sort/1]).
reverse_sort(L) ->
lists1:reverse(sort(L)).
sort(L) ->
lists:sort(L).
3:子句间以分号【;】分隔,在最后的结尾处以【.】结尾。
4:每个函数都由一组子句组成。子句间以分号“;”分隔。每个子句都包含一个子句头部、一个可选的保护式和子句主体。子句的头部包含一个函数名和一组以逗号分隔的参数当函数调用发生时,将会按顺序对函数定义中的子句头部依次进行匹配。对保护式求值时所有的断言都将被求值。若所有断言都为真,则保护式成立,否则就失败。保护式中各个断言的求值顺序是不确定的。
如果保护式成立,则会对子句的主体进行求值。如果保护式失败,则尝试下一个候选子句。一旦子句的头部和保护式都匹配成功,系统将指定这条子句并对其主体求值。子句首部模式与保护式的组合可以唯一确定一个正确的子句。
保护式断言的完整集合如下:
保护式成立条件atom(X)X 是一个原子式constant(X)X 不是列表或元组float(X)X 是一个浮点数integer(X)X 是一个整数list(X)X 是一个列表或 []numberX 是一个整数或浮点数pid(X)X 是一个进程标识符port(X)X 是一个端口reference(X)X 是一个引用tuple(X)X 是一个元组binary(X)X 是一段二进制数据
另外,一些BIF和算术表达式的组合也可以作为保护式。它们是:
代码如下:
element/2, float/1, hd/1, length/1, round/1, self/0, ze/1
trunc/1, tl/1, abs/1, node/1, node/0, nodes/0
可以出现在保护式中的项式比较运算符如下:
运算符描述类型X > YX 大于YcoerceX < YX 小于YcoerceX =< YX 小于或等于YcoerceX >= YX 大于或等于YcoerceX == YX 等于YcoerceX /= YX 不等于YcoerceX =:= YX 等于YexactX =/= YX 不等于Yexact
比较运算符工作机制如下:首先对运算符两边求值(如,在表达式两边存在算术表达式或包含BIF保护式函数时);然后再进行比较。
为了进行比较,定义如下的偏序关系:
代码如下:
number < atom < reference < port < pid < tuple < list
元组首先按大小排序,然后再按元素排序。列表的比较顺序是先头部,后尾部。
如果比较运算符的两个参数都是数值类型且运算符为coerce型,则如果一个参数是integer另一个是float,那么integer将被转换为float再进行比较。
exact类型的运算符则不做这样的转换。
因此5.0 == 1 + 4为真,而5.0 =:= 4 + 1为假。
保护函数子句示例:
代码如下:
foo(X, Y, Z) when integer(X), integer(Y), integer(Z), X == Y + Z ->
foo(X, Y, Z) when list(X), hd(X) == {Y, length(Z)} ->
foo(X, Y, Z) when {X, Y, size(Z)} == {a, 12, X} ->
foo(X) when list(X), hd(X) == c1, hd(tl(X)) == c2 ->
注意在保护式中不可引入新的变量。
二、流程控制
case语句
case表达式允许在子句主体内部于多个选项中进行选择,语法如下:
代码如下:
case Expr of
Pattern1 [when Guard1] ->Seq1;
Pattern2 [when Guard2] ->Seq2;
...
PatternN [when GuardN] ->SeqN
end
首先,对Expr求值,然后,Expr的值将依次与模式Pattern1、Pattern2……PatternN进行匹配,直到匹配成功,
如果找到一个匹配并且(可选的)的保护式成立,则对应的调用序列将被求值。注意case保护式与函数保护式形式相同。case原语的值就是被选中的序列的值。
至少得有一个模式必须得以匹配――否则就会产生一个运行时错误并引发第??章中的错误处理机制。
举个例子,比方说我们我有个函数allocate(Resource)用于分配某种资源Resource。假设这个函数只返回{yes, Address}或no。这样,这个函数便可以放在一个case结构里:
代码如下:
...
case allocate(Resource) of
{yes,Address} when Address >0, Address =< Max ->
Sequence 1 ... ;
no ->
Sequence 2 ...
end
...
在Sequence 1 ...中,变量Address已经被绑定在了allocate/1的返回结果上。
为了避免匹配错误的发生,我们常常追加一个必会匹配的模式作为case原语的最后一个分支:
代码如下:
case Fn of
...
_ ->
true
end
IF
if表达式的语法如下:
代码如下:
if
Guard1 ->
Sequence1 ;
Guard2 ->
Sequence2 ;
...
end
在这种情况下,保护式Guard1,...将被依次求值。如果一个保护式成立则对与之关联的序列求值。该序列的求值结果便是if结构的结果。if保护式与函数保护式形式相同。与case相同,一个保护式都不成立的话将引发一个错误。如果需要,可以增加保护式断言true作为垃圾箱:
代码如下:
if
...
true ->
true
end
算术表达式
算术表达式由以下运算符构成:
运算符描述类型操作数类型优先级+ X+ X单目混合1- X- X单目混合1X * YX * Y双目混合2X / YX / Y (浮点除法)双目混合2X div YX 整除Y双目整数2X rem YX 除以Y 的余数双目整数2X band YX 与Y 的位与双目整数2X + YX + Y双目混合3X - YX - Y双目混合3X bor YX 与Y 位或双目整数3X bxor YX 与Y 的位算数异或双目整数3X bsl NX 算数左移N 位双目整数3X bsr NX 右移N 位双目整数3
单目 运算符有一个参数,双目 运算符有两个参数。混合 意味着参数即可以是integer 也可以是float 。单目运算符的返回值与其参数类型相同。
双目混合运算符(即* 、- 、+ )在参数都是integer 时返回类型为integer 的对象,在参数至少包含一个float 时返回一个float 。浮点除法运算符/ 总是返回一个float 。
双目整数运算符(即band 、div 、rem 、bor 、bxor 、bsl 、bsr )的参数必须是整数,其返回值也是整数。
求值顺序取决于运算符的优先级:首先计算第1优先级的运算符,然后是第2优先级,以此类推。括号内的表达式优先求值。
优先级相同的运算符从左到右进行求值。
篇2:Python中函数的参数传递与可变长参数介绍
这篇文章主要介绍了Python中函数的参数传递与可变长参数介绍,本文分别给出多个代码实例来讲解多种多样的函数参数,需要的朋友可以参考下
1.Python中也有像C++一样的默认缺省函数
代码如下:
def foo(text,num=0):
print text,num
foo(“asd”) #asd 0
foo(“def”,100) #def 100
定义有默认参数的函数时,这些默认值参数 位置必须都在非默认值参数后面,
调用时提供默认值参数值时,使用提供的值,否则使用默认值。
2.Python可以根据参数名传参数
代码如下:
def foo(ip,port):
print “%s:%d” % (ip,port)
foo(“192.168.1.0”,3306) #192.168.1.0:3306
foo(port=8080,ip=“127.0.0.1”) #127.0.0.1:8080
第4行,没有指定参数名,按照顺序传参数。
第5行,指定参数名,可以按照参数名称传参数。
3.可变长度参数
代码如下:
#coding:utf-8 #设置python文件的编码为utf-8,这样就可以写入中文注释
def foo(arg1,*tupleArg,**dictArg):
print “arg1=”,arg1 #formal_args
print “tupleArg=”,tupleArg #
print “dictArg=”,dictArg #[]
foo(“formal_args”)
上面函数中的参数,tupleArg前面“*”表示这个参数是一个元组参数,从程序的输出可以看出,默认值为();dicrtArg前面有“**”表示这个字典参数(键值对参数),
可以把tupleArg、dictArg看成两个默认参数。多余的非关键字参数,函数调用时被放在元组参数tupleArg中;多余的关键字参数,函数调用时被放字典参数dictArg中。
下面是可变长参数的一些用法:
代码如下:
#coding:utf-8 #设置python文件的编码为utf-8,这样就可以写入中文注释
def foo(arg1,arg2=“OK”,*tupleArg,**dictArg):
print “arg1=”,arg1
print “arg2=”,arg2
for i,element in enumerate(tupleArg):
print “tupleArg %d-->%s” % (i,str(element))
for key in dictArg:
print “dictArg %s-->%s” %(key,dictArg[key])
myList=[“my1”,“my2”]
myDict={“name”:“Tom”,“age”:22}
foo(“formal_args”,arg2=“argSecond”,a=1)
print “*”*40
foo(123,myList,myDict)
print “*”*40
foo(123,rt=123,*myList,**myDict)
输出为:
从上面的程序可以看出:
(1)如代码第16行。
参数中如果使用“*”元组参数或者“**”字典参数,这两种参数应该放在参数列表最后。并且“*”元组参数位于“**”字典参数之前。
关键字参数rt=123,因为函数foo(arg1,arg2=“OK”,*tupleArg,**dictArg)中没有rt参数,所以最后也归到字典参数中。
(2)如代码第14行。
元组对象前面如果不带“*”、字典对象如果前面不带“**”,则作为普通的对象传递参数。
多余的普通参数,在foo(123,myList,myDict)中,123赋给参数arg1,myList赋给参数arg2,多余的参数myDict默认为元组赋给myList。
篇3:perl中的字符串操作函数chomp与chop介绍
这篇文章主要介绍了perl中的字符串操作函数chomp与chop介绍,chomp与chop都是用于去除字符串变量尾部的字符,但它们有各自的区别,需要的朋友可以参考下
chomp与chop都是用于去除字符串变量尾部的字符,但它们有各自的区别,
chomp函数对变量起作用,而此变量含有字符串。如果字符串结尾有换行符,chomp可以去掉它。这基本上就是它能完成的所有功能,如下例:
代码如下:
$text=“alineoftext\n ”; #也可以由
chomp($text); #去掉换行符(\n)。
它非常有用,基本上你的每一个程序都会用到它。如你将知道,这是将字符串末尾换行符去掉的最好方法。基于 Perl 中的一条基本原则:在需要使用变量的地方,可以使用赋值表达式来代替。我们有更简单的使用 chomp 的方法。Perl 首先做赋值运算,再使用这个变量。因此使用 chomp 的最常用方法是:
代码如下:
chomp($text=
$text=
chomp($text);
#同上,但用两步完成
第一眼见到时,第一种组合的方法看起来复杂些。如果把上述其看成两步操作,读一行再 chomp,那写成两个语句的方法看起来自然些。如果将其看作一个操作,读入一行但不包括换行符,那写成一个语句的方法更恰当。由于绝大多数 Perl 程序员使用第一种写法,你也应该使用它。
chomp 是一个函数。作为一个函数,它有一个返回值,为移除的字符的个数。这个数字基本上没什么用:
代码如下:
$food=
$betty=chomp($food); #得到值 1
如上,在使用 chomp 时,可以使用或不使用括号()。这又是 Perl 中的一条通用规则:除非移除它们时含义会变,否则括号是可以省略的。如果结尾有两个或两个以上的换行符,chomp 仅去掉一个。如果没有,那什么也不做,返回 0。这种情况在一次读入一行时不会发生,但使用了输入分隔符(input separator)($/)(其不为换行符(\n)),read 函数,或者将一些字符串结合起来就有可能发生,
在编写Perl程序代码的时候,也许你会有时会用chop() 函数来去掉输入的换行符“\n”,有时候使用chomp() 函数。其实上面的用法都可以达到预期的效果,但它们也有细微的差别。
chop()函数,只是去除最后一个字符。
chomp()函数,就要首先判断最后一个字符是不是为“\n”,它才去除。
chop函数会砍掉字符串变量的最后一个字符,并返回砍掉的字符,chop函数不管字符串里是什么都会剪短它,而chomp函数则更有选择性一些。不能chop直接量,只能chop变量。
用法:
代码如下:
chop VARIABLE
chop LIST
chop
例子:
如果chop一列LIST变量,那么列表中的每个字符串都会被剪短:
代码如下:
@lines=`cat myfile`;
chop @lines;
在最常见的情况下,chop可以用substr来表示:
代码如下:
$last_char = chop($var);
$last_char = substr($var, -1, 1, “”); # 同上
再来看下面的完整的例子:
代码如下:
#!/usr/bin/perl
$string1 = “This is test”;
$retval = chop( $string1 );
print “ Choped String is : $string1\n”;
print “ Character removed : $retval\n”;
结果:
代码如下:
Choped String is : This is tes
Number of characters removed : t
【Erlang中的函数与流程控制介绍】相关文章:
2.Unix Shell 中的流程控制语句Windows系统
4.生产计划与控制
10.会计监督与会计控制






文档为doc格式