Erlang中的函数与流程控制介绍
【简介】感谢网友“给你我最亲爱的”参与投稿,以下是小编整理的Erlang中的函数与流程控制介绍(共14篇),欢迎阅读分享。
篇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:Erlang中的模块与模式匹配介绍
这篇文章主要介绍了Erlang中的模块与模式匹配介绍,本文分别对模块与模式匹配做了讲解,需要的朋友可以参考下
模块是Erlang的基本代码单元,erl文件编译后以.beam作为扩展名,采用UTF8字符集,.erl文件示意如下:
-module(模块名,与存放模块的文件名相同)
-export([方法名/输入参数的个数])
代码如下:
Method1( {a,b,c})->a*b*c;
Mehtod2({d,e})->d-e.
模块属性有两种类型:预定义型和用户定义型,
Erlang中用于代表函数的数据类型被称为fun,相当于python中的lambda,一般用于
1) 对列表里的每个元素执行相同的操作
2) 创建自己的控制
3) 实现可重入解析代码,解析组合器或者lazy evaluator
模式匹配是Erlang的根基,case和if表达式使Erlang小而一致。
代码如下:
case Expression of
Pattern1[ when Guard1] ->Expr-seq1;
Pattern2[when Guard2]->Expr-seq2;
…
end
if
Guard1->Expr_seq1;
Guard2->Expr_seq2;
…
end
Erlang有两种方法来捕捉异常错误,一种是把抛出异常的调用函数封装在一个try_catch 表达式里,提供了概括信息,另一种是把调用封装在一个catch表达式里,提供了详细的栈跟踪信息,
在捕捉到一个异常后,可以调erlang:get_stacktrace来找到最近的栈信息。
把二进制型,位串,和位级模式匹配引入Erlang是为了简化网络编程。二进制型是置于双小于号和双大于号之间的一列整数或字符串。
例如: 1>Mybin1 = << “ILOVE YOU”>>
代码如下:
Term_to_bingary(Term) ->Bin 转换为二进制型
Binary_to_Term(Bin) ->Term 二进制型转换为Erlang的数据类型
精心选择宏的名称和Erlang代码布局,能最大限度地缩小C和Erlang的语义鸿沟。在Erlang里,最小的寻址单元是1位,位串里的位序列可直接访问。
篇3:C语言输入输出函数及控制流程语句
控制流程语句主要包括: 条件语句、循环语句和开关语句,
1.1 标准输入输出函数
1.1.1 格式化输入输出函数
Turbo C2.0 标准库提供了两个控制台格式化输入、输出函数printf( ) 和 scanf(), 这两个函数可以在标准输入输出设备上以各种不同的格式读写数据。 printf()函数用来向标准输出设备(屏 幕)写数据; scanf() 函数用来从标准输入 设备(键盘)上读数据。下面详细介绍这两个函数的用法。
一、printf()函数
printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出 信息。在编写程序 时经常会用到此函数。printf()函数的调用格式为:
printf(“<格式化字符串>”, <参量表>);参量表>格式化字符串>
其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原 样输出; 另一部分是格式化规定字符, 以“%”开始, 后跟一个或几个规定字符, 用来确定输出内容格式。
参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出 参数个数一样多, 各参数之间用“,”分开, 且顺序一一对应, 否则将会出现意想 不到的错误。
1. 格式化规定符
Turbo C2.0提供的格式化规定符如下:
━━━━━━━━━━━━━━━━━━━━━━━━━━
符号 作用
──────────────────────────
%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 单个字符
%p 指针的值
%e 指数形式的浮点数
%x, %X 无符号以十六进制表示的整数
%0 无符号以八进制表示的整数
%g 自动选择合适的表示法
━━━━━━━━━━━━━━━━━━━━━━━━━━
说明:
(1). 可以在“%”和字母之间插进数字表示最大场宽,
例如: %3d 表示输出3位整型数, 不够3位右对齐。
%9.2f 表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6,
小数点占一位, 不够9位右对齐。
%8s 表示输出8个字符的字符串, 不够8个字符右对齐。
如果字符串的长度、或整型数位数超过说明的场宽, 将按其实际长度输出。
但对浮点数, 若整数部分位数超过了说明的整数位宽度, 将按实际整数位输出;
若小数部分位数超过了说明的小数位宽度, 则按说明的宽度以四舍五入输出。
另外, 若想在输出值前加一些0, 就应在场宽项前加个0。
例如: %04d 表示在输出一个小于4位的数值时, 将在前面补0使其总宽度
为4位。
如果用浮点数表示字符或整型量的输出格式, 小数点后的数字代表最大宽度,
小数点 前的数字代表最小宽度。
例如: %6.9s 表示显示一个长度不小于6且不大于9的字符串。若大于9, 则
第9个字符以后 的内容将被删除。
(2). 可以在“%”和字母之间加小写字母l, 表示输出的是长型数。
例如: %ld 表示输出long整数
%lf 表示输出double浮点数
(3). 可以控制输出左对齐或右对齐, 即在“%”和字母之间加入一个“-” 号可
说明输出为左对齐, 否则为右对齐。
例如: %-7d 表示输出7位整数左对齐
%-10s 表示输出10个字符左对齐
2. 一些特殊规定字符
━━━━━━━━━━━━━━━━━━━━━━━━━━
字符 作用
──────────────────────────
篇4:Excel中CONCATENATE函数介绍
在使用excel时,我们常常会使用一些函数,本文中为大家介绍CONCATENATE函数的使用方法,
语法
CONCATENATE (text1,text2,...)
Text1, text2, ... 为 1 到 30 个将要合并成单个文本项的文本项,
这些文本项可以为文本字符串、数字或对单个单元格的引用。
说明
也可以用 &(和号)运算符代替函数 CONCATENATE 实现文本项的合并。
用&运算符可以代替CONCATENATE函数实现文本项的合并。如公式=“张”&“军”的结果为“张军”。
篇5:考试报名与考试流程相关介绍
考试报名与考试流程相关介绍
1、不管是参加tef考试还是tcf考试,你都需要去法国教育服务中心网站进行注册,注册后,你就拥有了一个个人页面。
2、要想参加法语考试,你就需要按照个人页面上给出的帐号汇到法国教育服务中心的户头上,当法国教育服务中心收到你的考试费用,你的个人页面上会有显示,通常这个过程应该是七八天的样子。
3、你的个人页面显示考试费已经确认收到以后,你就应该在法国教育服务中心个人页面上选择你的'考试。需要注意的是,选择考试的时候,会有三个选项供你选择,一个是选择去了参加语言学校,一个是选择去了不参加语言学校,第三个是不确定去了是不是参加语言学校。如果你想选择机会相对较多的tef考试,那么你一定要选择第一项去了还要参加语言学校,不然会给你默认为tcf考试,并且一旦你的考试类型已经确认,就没有办法进行更改了。
4、选定了考试类型后,系统会给你一个可选的时间表,你可以根据自己的需要选择考试日期,通常在考试前三个周会将准考证公布于你的个人页面上,你自行打印后,带去参加考试。tcf考试的准考证上还要注意用笔填上六位数的一个考试号码。考试的时候带好身份证,贴有个人二寸近照的准考证。
5、在北京参加考试的地点是工体西路法盟的三楼,考试之前你可以在三楼大厅里等待,考官在考试之前会来大厅里招呼大家去考试。
6、进入考场以后,需要把你的书包等所有无关考试的东西放到前边,关掉手机等通讯设备。考官会逐一对每个人进行数码拍照,核查准考证。按照考官的安排坐在相应的电脑跟前,准备考试。
7、考试开始后,只要根据电脑上的提示一步一步做就好了。需要注意的就是每个听力题的时间都是有限的,在系统的右下角会有显示,时间用完了以后,如果还没有选择,就没法再选了,就相当放弃了答题。所以一定要在时间用完之前把题答上。
8、听力(25 min)、语法结构和阅读理解(65 min)三个部分都做完后,系统右下角的时间显示为00:00时。就是你知道自己成绩的时候了(在这之前语法结构和阅读理解部分都是可以进行更改的)。系统会显示你考了多少分,然后你不要着急撤退,再去三楼的大厅里等着考官发给你一张打印的考试成绩单就行了。
篇6:WinCE Eboot中的OEM控制函数
在EBOOT中有很多以OEM开头的函数,这些函数都会直接或间接的被BLCOMMON模块调用,来完成相应的功能,这些OEM函数就是我们需要根据自己的平台来实现的。可以说,实现了这些OEM函数,EBOOT的功能就完成了。
在EBOOT中有很多OEM函数,有些是必须实现的,有些是不必实现的,而有些是根据你的EBOOT的功能需求来决定是否要实现的。下面会介绍一下直接由BLCOMMON调用的OEM控制函数:
1. void OEMDebugInit(void)
这应该是第一个被调用的OEM函数,用来初始化串口来打印调试信息。这里要提一下另一个函数叫OEMInitDebugSerial,是OAL中用于初始化串口的函数。所以一般会实现OEMInitDebugSerial函数,然后在OEMDebugInit中调用它就可以了。实际上这只是一个初始化函数,如果想实现串口调试,还需要实现另外几个函数,如下;
OEMWriteDebugString
OEMWriteDebugByte
OEMReadDebugByte
上述三个函数在我以前的博客“WinCE BSP中打印信息的实现介绍”中有介绍,这里不再重复了。
2. BOOL OEMPlatformInit(void)
这个函数用于初始化硬件平台,就是说出实话硬件板子的相关外设。一般会先初始化RTC,然后初始化Nandflash控制器,初始化硬件中断,初始化网卡,如果需要,还可以在这个时候初始化Display,然后显示一个Logo。下面是微软提供的该函数的模板:
1.BOOL OEMPlatformInit(void)
2.{
3. BOOL fRet = FALSE;
4. BOOT_ARGS *pBootArgs;
5. ETH_HARDWARE_SETTINGS *pEdbgSettings;
6. EDBG_ADDR *pMyAddr;
7.
8.
9. //打印版本号和时间日期信息
10. EdbgOutputDebugString(”Microsoft Windows Embedded CE Ethernet Bootloader %d.%d for Platform. Example (%s %s)\\n\\n“, EBOOT_VERSION_MAJOR,EBOOT_VERSION_MINOR, __DATE__, __TIME__);
11.
12.
13. //初始化Driver Globals区域中的Boot引导参数信息
14. pBootArgs = (BOOT_ARGS*)BOOT_ARGS_PHYSICAL_MEMORY_START;
15. memset(pBootArgs, 0, sizeof(BOOT_ARGS));
16.
17. pBootArgs->dwSig= BOOTARG_SIG;
18. pBootArgs->dwLen= sizeof(BOOT_ARGS);
19. pBootArgs->dwEdbgDebugZone = EdbgDebugZone;
20.
21. //添加按键输入判断,允许用户进入Shell
22. if (WaitForKeyPress)
23. {
24. //允许用户设置网络相关的信息,比如IP地址等
25. LoaderMainMenu();
26. }
27.
28. //初始化以太网控制器
29. pEdbgSettings = &pBootArgs->Edbg;
30. fRet = InitEthernet(pEdbgSettings);
31.
32. if (!fRet)
33. {
34. EdbgOutputDebugString(”ERROR: Ethernet initialization failed\\r\\n“);
35. SpinForever();
36. }
37.
38. pMyAddr = &pEdbgSettings->Adapter.Addr;
39. EdbgOutputDebugString(”INFO: Debug Ethernet MAC Address: %B:%B:%B:%B:%B:%B\\r\\n“, pMyAddr->wMAC[0] & 0x00FF, pMyAddr->wMAC[0] >>8,
40. pMyAddr->wMAC[1] & 0x00FF, pMyAddr->wMAC[1] >>8,
41. pMyAddr->wMAC[2] & 0x00FF, pMyAddr->wMAC[2] >>8);
42.
43. return(TRUE);
44.}
45.
46.
47.
3. DWORD OEMPreDownload(void)
该函数一般用于初始化网络,初始化用于下载WinCE image的TFTP。首先调用OALKitlCreateName函数根据MAC地址创建设备名称。然后判断是否是DHCP,并分配IP地址。调用EbootInitEtherTransport函数初始化TFTP,该函数属于eboot模块代码,在”\\WINCE600\\PUBLIC\\COMMON\\OAK\\DRIVERS\\ETHDBG\\EBOOT”下面可以找到,该函数返回pfJumpImg,返回值作为OEMPreDownload的返回值,决定是下载WinCE image还是直接跳转执行。
4. void OEMLaunch(DWORD dwImageStart, DWORD dwImageLength, DWORD dwLaunchAddr, const ROMHDR* pRomHdr)
该函数用于运行WinCE,首先会根据需要将EBOOT的引导参数进行更新,并写入存储设备,然后会判断变量g_DownloadImage的值,有时候可能是g_bWaitForConnect的值,但是意思都是一样的。如果该值为0,则表示不是下载的WinCE image,是从Flash中load出来的,就会直接调用Launch函数运行WinCE,Launch函数一般是汇编写的,就是直接把PC指针指到WinCE image加载的地址开始运行;如果值为1,则调用EbootWaitForHostConnect函数等待Platform. Builder发送信息,把该函数的返回值更新到Driver Globals内存中,这样WinCE启动后,OAL模块的代码可以访问到,然后调用Launch函数运行WinCE image,
微软提供了该函数的模板:
1.void OEMLaunch(DWORD dwImageStart, DWORD dwImageLength, DWORD dwLaunchAddr, const ROMHDR *pRomHdr)
2.{
3. DWORD dwPhysLaunchAddr;
4. EDBG_OS_CONFIG_DATA *pCfgData;
5. EDBG_ADDR EshellHostAddr;
6. EBOOT_CFG EbootCfg;
7.
8. memset(&EshellHostAddr, 0, sizeof(EDBG_ADDR));
9. memset(&EbootCfg, 0, sizeof(EBOOT_CFG));
10.
11.
12. //从Flash中读取Eboot的参数信息
13. ReadEbootConfig(&EbootCfg);
14.
15. if (g_bWaitForConnect)
16. {//等待Platform. Builder发送信息
17. if (!(pCfgData = EbootWaitForHostConnect(&pDriverGlobals->eth.TargetAddr, &EshellHostAddr)))
18. {
19.EdbgOutputDebugString(”ERROR: OEMLaunch: EbootWaitForHostConenct failed.\\r\\n“);
20.SpinForever();
21. }
22.
23. if (pCfgData->Flags & EDBG_FL_DBGMSG)
24. {//支持基于Ethernet的Debug信息,更新Driver Globals中的IP和端口号 25.memcpy(&pDriverGlobals->eth.DbgHostAddr.wMAC,& EshellHostAddr.wMAC, 6);
26.pDriverGlobals->eth.DbgHostAddr.dwIP = pCfgData->DbgMsgIPAddr;
27.pDriverGlobals->eth.DbgHostAddr.wPort = pCfgData->DbgMsgPort;
28. }
29. if (pCfgData->Flags & EDBG_FL_PPSH)
30. {//支持基于Ethernet的Target Control,更新Driver Globals中的IP和端口号 31.memcpy(&pDriverGlobals->eth.PpshHostAddr.wMAC, &EshellHostAddr.wMAC, 6);
32.pDriverGlobals->eth.PpshHostAddr.dwIP = pCfgData->PpshIPAddr;
33.pDriverGlobals->eth.PpshHostAddr.wPort = pCfgData->PpshPort;
34. }
35. if (pCfgData->Flags & EDBG_FL_KDBG)
36. {//支持基于Ethernet的kernel debugger,更新Driver Globals中的IP和端口号 37.memcpy(&pDriverGlobals->eth.KdbgHostAddr.wMAC, &EshellHostAddr.wMAC, 6);
38.pDriverGlobals->eth.KdbgHostAddr.dwIP = pCfgData->KdbgIPAddr;
39.pDriverGlobals->eth.KdbgHostAddr.wPort = pCfgData->KdbgPort;
40. }
41.
42. memcpy(&pDriverGlobals->eth.DownloadHostAddr, &EshellHostAddr, sizeof(EDBG_ADDR));
43. pDriverGlobals->eth.etherFlags = pCfgData->Flags;
44. pDriverGlobals->eth.KitlTransport = pCfgData->KitlTransport;
45. }
46.
47. //保存WinCE kernel的launch地址
48. if (dwLaunchAddr && (EbootCfg.NKRegion.LaunchAddress != dwLaunchAddr))
49. {
50. EbootCfg.NKRegion.LaunchAddress = dwLaunchAddr;
51. WriteEbootConfig(&EbootCfg);
52. }
53. else
54. {
55. dwLaunchAddr= EbootCfg.NKRegion.LaunchAddress;
56. }
57.
58. // 跳转到WinCE Image的地址开始执行
59. Launch(dwPhysLaunchAddr);
60.
61. //死循环
62. SpinForever();
63.}
64.
篇7:Excel中Evaluate函数的用法介绍
Excel表格中函数众多,你即使对此一窍不通,也必须掌握几个常用的函数,否则工作量将是很大的,利用函数能够减轻工作压力,省时,大大提高工作效率。下面,来介绍一下Evaluate函数的用法,,大家感受一下。
①首先我们选中D1单元格,单击菜单栏--插入--名称--定义。
②在名称栏里面输入x,在下面的引用位置输入=EVALUATE(Sheet1!$A1),单击添加按钮,
③确定之后,在A1单元格输入2个数字,如下图所示。
④在D1单元格输入=x,回车立即得到A1的计算结果。
注意:
使用EVALUATE类似于在编辑栏的公式内选定一个表达式并按下了“重新计算”键“在Microsoft Excel for Windows 中是F9”。EVALUATE用一个值来替换一个表达式。
篇8: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。
篇9: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
篇10:Flash的流程控制与循环控制语句
控制|循环|语句
众所周知,flash中动画依靠的是时间轴,在没有脚本的情况下,动画会依照时间轴从第一帧不停的播放到最后一帧,然后始重复播放或者干脆停止,Flash的流程控制与循环控制语句
。为了能更好的控制动画,就必须使用脚本语句。而要想使动画具有逻辑判断的功能,就要使用流程控制和循环控制语句了!下面通过几个简单的小例子来学习流程与循环控制语句。一、流程控制语句
所谓流程控制,无非就是我们想控制动画程序的执行顺序而已。我们可以让flash根据一些特定的条件,来决定要执行哪个程序。这样就好象给了程序一些判断的机制。
if...else控制语句
根据英文的意思,大家可以简单的理解上面的控制语句:如果...就...否则...就... 下面来看看这个流程控制语句的书写格式。
if(条件){
//条件成立的话,就执行这里的程序。
}else{
//条件不成立的话就执行这里的程序。
}
下面重点说一下if后面括号内的条件。这个条件可以是一个固定的值,也可以是一个变量或表达式。如果条件成立的话,也就是条件为真(true),就会执行if后面的程序,如果条件不成立,也就是条件为假(false),就会执行else里的程序。例如:有这么一个条件,A>B 将这个表达式代入if后面的括号内,这个流程语句的意思就变成:如果A>B的话,就执行第一个大括号内的程序,如果A不大于B,就将执行else后面大括号内的程序。
实例讲解:
1、新建一个flash文档,在舞台上绘制一个圆,选中圆并按F8转换成影片剪辑,起名为:圆 这样就在舞台上创建一个圆的实例。
2、选中舞台上的实例,按F9打开动作面板,输入如下脚本:
onClipEvent (enterFrame) {
if (this._x<400) {//流程条件控制语句,如果这个圆的实例的X轴坐标小于400,就执行后面的程序。
this._x += 5;//让这个圆的坐标向右移动5个象素
} else {
this._x = 0;//控制语句,如果刚才的条件不成立。也就是圆实例的X坐标不小于400,就让它的X坐标为0
}
}
脚本最终编写效果如图:
最终效果演示:(下载源文件点击这里)
上面的脚本是一个非常简单的流程控制语句,根据实例的坐标来进行判断。因为我们使用了enterFrame事件,所以flash会不停的执行下面if...else语句。
3、测试影片。会看到圆不停的向右移动,当它的X坐标大于或等于400的时候,程序会把它的X坐标重新更改为0。
二、循环控制语句
所谓的循环语句,其实也是用条件来控制的,只要条件成立,那么,程序就会不停的执行下去,一直执行到条件不成立为止!常用的循环语句包括while循环、for循环等。因为篇幅有限,下面只重点讲解for循环的使用方法。
FOR循环命令格式:
for(初始变量;条件语句;迭加命令语句){
//用户自己编写的脚本,
}
首先强调一点,for语句的括号内有三个项目,必须要用分号间隔开!
初始变量:循环语句也是用条件是否成立来控制的,通常我们用一个变量来控制程序执行的次数。那么,这个初始变量就要先定义一个值。要注意的是,初始变量这个项目只执行一次!
条件语句:这个项目就是我们的判断语句了。如果这个项目判断为真(true),也就是条件成立了。它就直接跳进大括号{}内执行里面的程序!反之,如果条件为假(false),它就直接跳出这个for语句了。
迭加命令语句:接上面的条件语句,如果条件语句成立,会执行{}内的程序,那么执行完程序之后,就要回来执行迭加命令语句了。通常它就用来增加或减少刚开始时的初始变量的值。
实例讲解:
1、新建一个flash文档,在舞台上绘制一个圆,选中圆并按F8转换成影片剪辑,起名为:圆 这样就在舞台上创建一个圆的实例。
2、为这个实例起名为:yuan 如图:
3、添加一个新的层,并选中新层的第一帧,按F9打开动作面板,输入如下脚本:
for (i=1; i<5; i++) { //我们定义一个变量i来控制程序的循环次数。条件语句为判断i是否小于5,迭加命令就让每次程序执行之后,让i自己增加一,使程序循环4次!
duplicateMovieClip(”yuan“, ”yuan“+i, i);//duplicateMovieClip是复制命令,用来复制舞台上名字叫yuan的实例,每次复制出来一个,就把新复制出来的实例改名为”yuan“+i。影片的深度也改为i
_root[”yuan“+i]._x = random(400);
_root[”yuan“+i]._y = random(300);//设置每次复制出来的新实例的X、Y坐标,具体数值随机产生。
_root[”yuan\"+i]._alpha = random(100);//设置每次复制出来的新实例的透明度,具体数值从100里随机产生。
}
如果大家实在觉得for语言很难读懂的话,你可以按照for语言执行的顺序把i=1代入程序走一遍,可以帮助你理解程序。例如:当i等于1的时候,程序开始判断它是否小于5,那么1肯定小于5了,条件为真,就执行{}内的复制程序,同时复制出来的新实例的名字就变成了yuan1 ,接着就是设置yuan1的坐标和透明度。之后,for语句开始回去执行i++,此时,i的值就变为2了。然后又开始循环判断执行下去......(你可以算一下,这个for循环总共循环了几次呢?答案是4次。)
脚本如图:
4、选中时间轴的第6帧,按F6插入一关键帧,打开动作面板输入以下脚本:
gotoAndPlay(1);
让flash播放到第6帧的时候返回第1帧再来执行for循环语句。
如图:
5、测试效果吧,你会看到舞台上会循环4次复制出4个圆。
最终效果演示:(下载源文件点击这里)
希望大家能通过这两个简单的例子掌握流程控制语句和循环控制语句
篇11:材料与控制技术面试求职介绍
,
在校期间,认真学习文化课程,较熟悉地掌握专业知识,与此同时,我还学会了许多做人做事的.道理。四年来的学习生话磨练出一个自信和上进心强的我。
篇12:对数函数中与二次函数的问题
对数函数中与二次函数有关的问题
教学目的:通过一些例题的讲解 , 对对数函数的性质、图象及二次函数的一些问题进行复习,使学生加深对函数的认识 , 能够对一些有难度的题进行分析。教学难点:复合函数中定义域及值域的求解。 换元后新变量的定义域的确定。教学过程:在前段时间中我们学习了对数函数和它们的一些性质 , 下面我们就先来复习一下有关知识 ( 点击性质 , 见幻灯片 2) 。 下面我们来做两道复习巩固题。 1. 求 的定义域。 (要求一个比较复杂的函数的定义域,首先要看清这个复杂函数是由哪几个简单函数构成的.在此是三个以十为底的对数函数,所以我们只要考虑其真数部分要大于0即可.由此可列出三个不等式.习惯上用大括号括起来,表示要同时满足.) 分析: x>0 0可以写成 lg1 ,而该函数为单调递增函数,由此可解出. 综上所述 x>10 。 2. 试比较 与 的大小。 对于一般的比较大小问题,我们可以通过函数的增减性来解决.这道题目显然也是通过此途径来解决.但是其给出的条件不是很明确,那么我们就只能先从对数函数本身的条件作为着手点. 解: 由这个条件,可以知道这个函数是单调递增的,即真数大的函数值就大. (请学生口述,屏幕显示.第三条可能不会考虑) 则有:当 x-1>3 即 x>4 时, > 当 0
篇13:对数函数中与二次函数的问题
对数函数中与二次函数有关的问题
教学目的:通过一些例题的讲解 , 对对数函数的性质、图象及二次函数的一些问题进行复习,使学生加深对函数的认识 , 能够对一些有难度的题进行分析。教学难点:复合函数中定义域及值域的求解。 换元后新变量的定义域的确定。教学过程:在前段时间中我们学习了对数函数和它们的一些性质 , 下面我们就先来复习一下有关知识 ( 点击性质 , 见幻灯片 2) 。 下面我们来做两道复习巩固题。 1. 求 的定义域。 (要求一个比较复杂的函数的定义域,首先要看清这个复杂函数是由哪几个简单函数构成的.在此是三个以十为底的对数函数,所以我们只要考虑其真数部分要大于0即可.由此可列出三个不等式.习惯上用大括号括起来,表示要同时满足.) 分析: x>0 0可以写成 lg1 ,而该函数为单调递增函数,由此可解出. 综上所述 x>10 。 2. 试比较 与 的大小。 对于一般的比较大小问题,我们可以通过函数的增减性来解决.这道题目显然也是通过此途径来解决.但是其给出的条件不是很明确,那么我们就只能先从对数函数本身的条件作为着手点. 解: 由这个条件,可以知道这个函数是单调递增的,即真数大的函数值就大. (请学生口述,屏幕显示.第三条可能不会考虑) 则有:当 x-1>3 即 x>4 时, > 当 0
[1] [2]
篇14:法务部合同审查流程与要点介绍
一、对合同法律问题的审查——合同的内在质量
(一)审查合同主体资格的合格性
1、审查合同主体资格的有效性(企业登记管理制度、经营范围管理制度)
2、审查许可、资质的合格性(经营资质管理制度、许可证管理制度)
3、审查从业人员资格的合格性(从业资格管理制度)
4、审查来自法律或相对方的主体资格限制(招投标)
5、审查对方代表是否法定代表人,或审查对方委托代理人的资格及权限(或调阅工商档案确认所用公章是否备案的公章)
(二)审查合同条款内容的合法性
1、审查合同名称的合法性(合同名称与实际内容是否相符)
2、审查交易内容的合法性(是否属于禁止性的交易、标的物本身是否拥有合法的权属证明、质量标准是否合法)
3、审查交易程序的合法性(法律另有规定的,合同必须按规定)
4、审查表述的合法性(各类术语必须符合法律规范、技术规范等方面的权威解释,如果存在不同则需要注明)
5、审查生效程序的合法性(某些合同的生效条件、审批程序,以及某些经营行为必须经过审批和登记之后方可生效)
6、审查合同中引用的法律或技术标准是否已经失效(除非是比较生僻的、需要引起双方注意的法律,否则在合同中没有必要引用
(三)审查合同条款的实用性
1、审查交易标的与条款的实用性(交易标的不同涉及的法律环境也会不同,合同中需要特别约定的内容也随之不同)
2、审查行业特点与条款的实用性(这些共性化的特点给交易带来特定化的风险)
3、审查违约风险与条款的实用性(应针对履行中可能出现的违约进行前瞻性的
预见并设置应对措施,以避免违约成本低于履行成本)
4、审查争议管辖与条款的实用性(不同的管辖约定有不同的特点和区别)
5、审查合同目的与条款的实用性(对于有特定交易目的的合同,合同中体现合同目的比没有体现更为实用)
(四)审查合同权利义务的明确性
1、审查约定不明引起的权利义务不明确(条款之间缺乏配合、条款内容表述不当、条款缺乏可操作性)
2、审查无法识别引起的权利义务不明确(交易内容的可识别性、交易方式的可识别性、时间界限的可识别性、违约责任的可识别性、“合理”的可识别性)
(五)审查合同交易需求的满足性
1、审查标的能否满足需求(产品的质量标准、产品的使用说明、服务等)
2、审查约定能否满足需求(履行时间、履行方式等)
3、审查其他影响交易需求实现的情况(审查合同条款有无体现委托人的交易目的与交易条件)
二、对合同表述问题的审查——合同的外在质量
(一)审查合同结构体系的清晰度
1、审查是否将合同内容分成了若干主题,标题是否名副其实
2、审查各主题之间是否条理清晰,分割合理,内容相互分开
3、审查各主题之间是否存在合同履行中的时间顺序或先后顺序
(二)审查合同功能模块的完备度
模块无关性原则,是指为了避免模块之间的界限交叉或模糊不清,在划分模块时,每个模块都有确定的主题及功能,不同模块的主题及功能互不重复或交叉。
1、审查模块之间是否存在功能缺失或重叠
2、审查在模块顺序安排上是否存上下层级、前后顺序等合理的秩序
3、审查各模块是否具备了应有的功能
4、审查各模块中的内部模块或条款是否功能齐全
(三)审查合同整体思维的严谨度
1、审查逻辑推理结果与严谨程度(充分运用逻辑手段分析各种可能性并设置处置条款)
2、审查内涵、外延范围与严谨程度(通过增加义务的内涵可以确保义务的确定性,通过减少权利的内涵可以确保权利行使的广泛性)
3、审查措辞间的专有程度(审查前后条款的对应关系)
4、审查条款间的关联配合(对于哪些是违约、违约如何处理的约定必须严谨而且要相互对应)
5、审查条款间的冲突(可通过合理划分模块功能、提高表述精确度、贯彻条款无关性原则等方式加以避免)
6、审查其他的严谨性问题(往往是由于表述太随意而引起)
(四)审查合同语言表达的精确度
1、审查合同用句(是否单句简单罗列、动作主体不明、句间关系不顺)
省略以避免读为准,引述以无须核对为准,复句以同一主语为主,措辞以前后一致为准。
2、审查合同用词(审查术语、措辞、指代关系、副词、数量词、文言用法的精确度)
3、审查合同的语体问题(书面口语、广告语体、商业信函语言、刻意模范外来合同)
4、审查标点符号问题(参见国家颁布的《标点符号用法》)
(五)审查合同版面安排的美观度
1、审查排版要素的安排(字体与字号、字间距与行间距、排版的中文版式、条款中的段落规模)
2、审查合同序号问题(第一条、1.1、1.1.1)
参见《国家行政机关公文格式》、《国家行政机关公文处理办法》等标准或法规。