正文
包含python函数式求值的词条
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
python内置函数有哪些
python常见的内置函数有:
1. abs()函数返回数字的绝对值。
2. all() 函数用于判断给定的参数中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。元素除了是 0、空、None、False 外都算 True;空元组、空列表返回值为True。
3. any() 函数用于判断给定的参数是否全部为False,是则返回False,如果有一个为True,则返回True。 元素除了是 0、空、False外都算 TRUE。
4. bin()函数返回一个整数int或者长整数long int的二进制表示。
5. bool() 函数用于将给定参数转换为布尔类型,如果参数不为空或不为0,返回True;参数为0或没有参数,返回False。
6. bytearray()方法返回一个新字节数组。这个数组里的元素是可变的,并且每个元素的值范围: 0 = x 256(即0-255)。即bytearray()是可修改的二进制字节格式。
7. callable()函数用于检查一个对象是否可调用的。对于函数、方法、lambda函式、类以及实现了 __call__ 方法的类实例, 它都返回 True。(可以加括号的都可以调用)
8. chr()函数用一个范围在range(256)内(即0~255)的整数作参数,返回一个对应的ASCII数值。
9. dict()函数用来将元组/列表转换为字典格式。
10. dir()函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。
扩展资料:
如何查看python3.6的内置函数?
1、首先先打开python自带的集成开发环境IDLE;
2、然后我们直接输入"dir(__builtins__)",需要注意的是builtins左右的下划线都是两个;
3、回车之后我们就可以看到python所有的内置函数;
4、接下来我们学习第二种查看python内置函数的方法,我们直接在IDLE中输入"import builtins",然后输入"dir(builtins)";
5、然后回车,同样的这个方法也可以得到所有的python内置的函数;
6、这里我们可以使用python内置函数len()来查看python内置函数的个数,这里我们直接输入"len(dir(builtins))";
7、回车之后我们可以看到系统返回值153,说明我们现在这个版本中有153个内置函数;
8、最后我们介绍一个比较有用的内置函数"help",python内置函数有一百多个,我们当然不能记住所有的函数,这里python提供了一个"help"函数,我们来看一个例子一起来体会一下help函数的用法,这里我们直接输入"help(len)",然后回车,会看到系统给我们对于内置函数"len"的解释,当然对于其他函数可能会有更加详细的解释以及用法提示。
python惰性求值有哪些函数
Copyright © 1999-2020, CSDN.NET, All Rights Reserved
惰性计算的序列
打开APP
Python 的惰性求值与惰性序列 翻译
2018-07-23 14:57:48
2点赞
东师小镇
码龄5年
关注
惰性求值
在编程语言理论中,惰性求值(英语:Lazy Evaluation),又译为惰性计算、懒惰求值,也称为传需求调用(call-by-need),是一个计算机编程中的一个概念,它的目的是要最小化计算机要做的工作。它有两个相关而又有区别的含意,可以表示为“延迟求值”和“最小化求值”。
避免不必要的计算,带来性能的提升(最小化求值)。
对于Python中的条件表达式 if x and y,在x为false的情况下y表达式的值将不再计算。而对于if x or y,当x的值为true的时候将直接返回,不再计算y的值。因此编程中可以利用该特性,在 and逻辑中,将小概率发生的条件放在前面或者在or逻辑中,将大概率发生的时间放在前面,有助于性能的提升。
2. 节省空间,使得无线循环的数据结构成为可能(延迟求值)。
延迟求值特别用于函数式编程语言中。在使用延迟求值的时候,表达式不在它被绑定到变量之后就立即求值,而是在该值被取用的时候求值。延迟求值的一个好处是能够建立可计算的无限列表而没有妨碍计算的无限循环或大小问题。例如,可以建立生成无限斐波那契数列表的函数(经常叫做“流”)。第n个斐波那契数的计算仅是从这个无限列表上提取出这个元素,它只要求计算这个列表的前n个成员。
惰性序列
Python的惰性序列多数指 iterator,其特点正如同上文所述,具有惰性计算特点的序列称为惰性序列。
Python的iterator是一个惰性序列,意思是表达式和变量绑定后不会立即进行求值,而是当你用到其中某些元素的时候才去求某元素对的值。 惰性是指,你不主动去遍历它,就不会计算其中元素的值。
一句话理解:
迭代器的一个优点就是它不要求你事先准备好整个迭代过程中所有的元素。
迭代器仅仅在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。
这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件,或是斐波那契数列等等。
python中eval函数的作用是什么?
python当中的eval()函数是将字符串当成有效Python表达式来求值,并返回计算结果。
x = 1
eval('x+1')
eval('x==1')
与之对应的repr函数,它能够将Python的变量和表达式转换为字符串表示
repr(x+1)
repr(x+‘1’-1)('x=+=1')
《Python编程》:
是2006年东南大学出版社出版的图书,作者是(美)MarkLutz,其中第三版已经成为python用户的行业标准。它教给读者编写代码的正确途径,而且以清晰而简练的方式解释了python语言的语法以及编程技巧,并辅以大量例子阐明正确的使用方法和通用特性。
它以清晰而简练的方式解释了python语言的语法以及编程技巧,并辅以大量例子阐明正确的使用方法和通用特性。通过阅读这本全面的指南,你将学习到如何将python运用到实际问题中。
Python和lisp在函数式编程上有哪些异同
Python内在的函数式功能
自Python 1.0起,Python就已具有了以上所列中的绝大多数特点。但是就象Python所具有的大多数特性一样,这些特点出现在了一种混合了各种特性的语言 中。 和Python的OOP(面向对象编程) 特性非常象,你想用多少就用多少,剩下的都可以不管(直到你随后需要用到它们为止)。在Python 2.0中,加入了列表解析(list comprehensions)这个非常好用的”语法糖“。 尽管列表解析没有添加什么新功能,但它让很多旧功能看起来好了不少。
Python中函数式编程的基本要素包括functionsmap()、reduce()、filter()和lambda算子(operator)。 在Python 1.x中,apply()函数也可以非常方便地拿来将一个函数的列表返回值直接用于另外一个函数。Python 2.0为此提供了一个改进后的语法。可能有点让人惊奇,使用如此之少的函数(以及基本的算子)几乎就足以写出任何Python程序了;更加特别的是,几乎 用不着什么执行流程控制语句。
所有(if,elif,else,assert,try,except,finally,for,break,continue,while,def)这 些都都能通过仅仅使用函数式编程中的函数和算子就能以函数式编程的风格处理好。尽管真正地在程序中完全排除使用所有流程控制命令可能只在想参 加”Python混乱编程“大赛(可将Python代码写得跟Lisp代码非常象)时才有意义,但这对理解函数式编程如何通过函数和递归表达流程控制很有 价值。
剔除流程控制语句
剔除练习首先要考虑的第一件事是,实际上,Python会对布尔表达式求值进行“短路”处理。这就为我们提供了一个if/elif/else分支语句的表达式版(假设每个分支只调用一个函数,不是这种情况时也很容易组织成重新安排成这种情况)。 这里给出怎么做:
对Python中的条件调用进行短路处理
Python
# Normal statement-based flow control
if cond1: func1()
elif cond2: func2()
else: func3()
# Equivalent "short circuit" expression
(cond1 and func1()) or (cond2 and func2()) or (func3())
# Example "short circuit" expression
x = 3
def pr(s): return s
(x==1 and pr('one')) or (x==2 and pr('two')) or (pr('other'))
'other'
x = 2
(x==1 and pr('one')) or (x==2 and pr('two')) or (pr('other'))
'two'
我们的表达式版本的条件调用看上去可能不算什么,更象是个小把戏;然而,如果我们注意到lambda算子必须返回一个表达式,这就更值得关注了。既然如我 们所示,表达式能够通过短路包含一个条件判断,那么,lambda表达式就是个完全通用的表达条件判断返回值的手段了。我们来一个例子:
Python中短路的Lambda
Python
pr = lambda s:s
namenum = lambda x: (x==1 and pr("one")) \
.... or (x==2 and pr("two")) \
.... or (pr("other"))
namenum(1)
'one'
namenum(2)
'two'
namenum(3)
'other'
将函数作为具有首要地位的对象
前面的例子已经表明了Python中函数具有首要地位,但有点委婉。当我们用lambda操作创建一个函数对象时, 我们所得到的东西是完全通用的。就其本质而言,我们可以将我们的对象同名字”pr”和”namenum”绑定到一起, 以完全相同的方式,我们也也完全可以将数字23或者字符串”spam” 同这些名字绑定到一起。但是,就象我们可以无需将其绑定到任何名字之上就能直接使用数字23(也就是说,它可以用作函数的参数)一样,我们也可以直接使用 我们使用lambda创建的函数对象,而无需将其绑定到任何名字之上。在Python中,函数就是另外一种我们能够就像某种处理的值。
我们对具有首要地位的对象做的比较多的事情就是,将它们作为参数传递给函数式编程固有的函数map()、reduce()和filter()。这三个函数接受的第一个参数都是一个函数对象。
map()针对指定给它的一个或多个列表中每一项对应的内容,执行一次作为参数传递给它的那个函数 ,最后返回一个结果列表。
reduce()针对每个后继项以及最后结果的累积结果,执行一次作为参数传递给它的那个函数;例如,reduce(lambda n,m:n*m, range(1,10))是求”10的阶乘”的意思(换言之,将每一项和前面所得的乘积进行相乘)
filter()使用那个作为参数传递给它的函数,对一个列表中的所有项进行”求值“,返回一个由所有能够通过那个函数测试的项组成的经过遴选后的列表。
我们经常也会把函数对象传递给我们自己定义的函数,不过一般情况下这些自定义的函数就是前文提及的内建函数的某种形式的组合。
通过组合使用这三种函数式编程内建的函数, 能够实现范围惊人的“执行流程”操作(全都不用语句,仅仅使用表达式实现)。
用Python3实现表达式求值
include malloc.h #include stdio.h #include ctype.h//判断是否为字符的函数的头文件 #define maxsize 100 typedef int elemtype; typedef struct sqstack sqstack;//由于sqstack不是一个类型 而struct sqstack才是 char ch[7]=;//把符号转换成一个字符数组 int f1[7]=;//栈内元素优先级 int f2[7]=;//栈外的元素优先级 struct sqstack { elemtype stack[maxsize]; int top; }; void Initstack(sqstack *s) { s-top=0; } void Push(sqstack *s,elemtype x) { if(s-top==maxsize-1) printf("Overflow\n"); else { s-top++; s-stack[s-top]=x; } } void Pop(sqstack *s,elemtype *x) { if(s-top==0) printf("underflow\n"); else { *x=s-stack[s-top]; s-top--; } } elemtype Gettop(sqstack s) { if(s.top==0) { printf("underflow\n"); return 0; } else return s.stack[s.top]; } elemtype f(char c) { switch(c) { case '+': return 0; case '-': return 1; case '*': return 2; case '/': return 3; case '(': return 4; case ')': return 5; default: return 6; } } char precede(char c1,char c2) { int i1=f(c1); int i2=f(c2);//把字符变成数字 if(f1[i1]f2[i2])//通过原来设定找到优先级 return ''; else if(f1[i1]f2[i2]) return ''; else return '='; } int Operate(elemtype a,elemtype theta,elemtype b) { int sum; switch(theta) { case 0: sum=a+b; break; case 1: sum=a-b; break; case 2: sum=a*b; break; default: sum=a/b; } return sum; } EvaluateExpression() { char c; int i=0,sum=0; int k=1,j=1;//设置了开关变量 elemtype x,theta,a,b; sqstack OPTR,OPND; Initstack(OPTR); Push(OPTR,f('#'));//0压入栈 Initstack(OPND); c=getchar(); if(c==ch[2]||c==ch[3]||c==ch[5]||c==ch[6])//先对+和-的情况忽略和左括号的情况 { printf("错误1 \n"); k=0; return 0; } if(c==ch[0]) c=getchar();//如果是+,把它覆盖 if(c==ch[1]) { j=0; c=getchar();//也把-号覆盖 } while(c!='#'||ch[Gettop(OPTR)]!='#') { if(isdigit(c)) { sum=0; while(isdigit(c)) { if(!j) { sum=sum*10-(c-'0');//实现了数字串前面有负号(之前是:sum=-(sum*10)-(c-'0')结果是-12+13=21) } else sum=sum*10+(c-'0'); c=getchar(); } Push(OPND,sum);//如果还是数字先不压栈,把数字串转化成十进制数字再压栈 j=1; } else if(k) { switch(precede(ch[Gettop(OPTR)],c)) { case'': Push(OPTR,f(c));//把它们整型化 c=getchar(); if(c==ch[0]||c==ch[1]||c==ch[2]||c==ch[3]||c==ch[5]||c=='\n')//要除去下个是‘(’的情况 也把以运算符归到这里来 { printf("出错2\n"); k=0; return 0;//加了开关变量和返回0的值使程序更以操作 } break; case'=': Pop(OPTR,x); c=getchar(); if(c==ch[0]||c==ch[1]||c==ch[2]||c==ch[3]||c==ch[5]||c=='\n')//把ch[6]的情况也忽略了但此时并没有注意到右括号后面右运算符的情况 { printf("出错2\n"); k=0; return 0; } break; case'': Pop(OPTR,theta); Pop(OPND,b); Pop(OPND,a);//注意这里是谁先出栈 Push(OPND,Operate(a,theta,b)); break; } } }//在这里判断是否以运算符结束是不对的 return(Gettop(OPND)); } main() { int result; printf("输入你的算术表达式:\n"); result=EvaluateExpression(); printf("结果是 :%d\n",result); return 0; } : 本计算器利用堆栈来实现。 1、定义后缀式计算器的堆栈结构 因为需要存储的单元不多,这里使用顺序栈,即用一维数组来模拟堆栈: #define MAX 100 int stack[MAX]; int top=0; 因此程序中定义了长度为MAX的一维数组,这里MAX用宏定义为常数100,我们可以修改宏定义而重新定义堆栈的大小。 整型数据top为栈顶指示,由于程序开始时堆栈中并无任何数据元素,因此top被初始化为0。 2、存储后缀式计算器的运算数 我们定义了堆栈stack[MAX]后,就可以利用入栈操作存储先后输入的两个运算数。 下面看一下是如何实现的: int push(int i) /*存储运算数,入栈操作*/ { if(topMAX) { stack[++top]=i; /*堆栈仍有空间,栈顶指示上移一个位置*/ return 0; } else /*堆栈已满,给出错误信息,返回出错指示*/ { printf("The stack is full"); return ERR; } } 我们在调用函数push时,如果它的返回值为0,说明入栈操作成功;否则,若返回值为ERR(在程序中说明为-1),说明入栈操作失败。 3、从堆栈中取出运算数 当程序中读完了四则运算符后,我们就可以从堆栈中取出已经存入的两个运算数,构成表达式,计算出结果。取出运算数的函数采用的正是出栈算法。在本例中,实现该算法的函数 为pop(): int pop(); /*取出运算数,出栈操作*/ { int var; /*定义待返回的栈顶元素*/ if(top!=NULL) /*堆栈中仍有数据元素*/ { var=stack[top--]; /*堆栈指示下移一个位置*/ return var; } else /*堆栈为空,给出错误信息,并返回出错返回值*/ printf("The stack is cmpty!\n"); return ERR; } 同样,如果堆栈不为空,pop()函数返回堆栈顶端的数据元素,否则,给出栈空提示,并返回错误返回值ERR。 4、设计完整的后缀式计算器 有了堆栈存储运算数,后缀式计算器的设计就很简单了。程序首先提示用户输入第一个运算数,调用push()函数存入堆栈中;而后提示用户输入第二个运算数,同样调用push()函数存入堆栈中。接下来,程序提示用户输入+,-,*,/四种运算符的一种,程序通过switch_case结构判断输入运算符的种类,转而执行不同的处理代码。以除法为例,说明程序的执行流程: case '/': b=pop(); a=pop(); c=a/b; printf("\n\nThe result is %d\n",c); printf("\n"); break; 程序判断用户输入的是除号后,就执行上述代码。首先接连两次调用pop()函数从堆栈中读出先前输入的运算数,存入整型数a和b中;然后执行除法运算,结果存入单元c中。这时需要考虑究竟谁是被除数,谁是除数。由于开始我们先将被除数入栈,根据堆栈“先进后出”的原则,被除数应该是第二次调用pop()函数得到的返回值。而除数则是第一次调用pop()函数得到的返回值。 最后程序打印出运算结果,并示提示用户是否继续运行程序: printf("\t Continue?(y/n):"); l=getche(); if(l=='n') exit(0); 如果用户回答是"n",那么结束程序,否则继续循环。 完整的程序代码如下: #includestdio.h #includeconio.h #includestdlib.h #define ERR -1 #define MAX 100 /*定义堆栈的大小*/ int stack[MAX]; /*用一维数组定义堆栈*/ int top=0; /*定义堆栈指示*/ int push(int i) /*存储运算数,入栈操作*/ { if(topMAX) { stack[++top]=i; /*堆栈仍有空间,栈顶指示上移一个位置*/ return 0; } else { printf("The stack is full"); return ERR; } } int pop() /*取出运算数,出栈操作*/ { int var; /*定义待返回的栈顶元素*/ if(top!=NULL) /*堆栈中仍有元素*/ { var=stack[top--]; /*堆栈指示下移一个位置*/ return var; /*返回栈顶元素*/ } else printf("The stack is empty!\n"); return ERR; } void main() { int m,n; char l; int a,b,c; int k; do{ printf("\tAriothmatic Operate simulator\n"); /*给出提示信息*/ printf("\n\tPlease input first number:"); /*输入第一个运算数*/ scanf("%d",m); push(m); /*第一个运算数入栈*/ printf("\n\tPlease input second number:"); /*输入第二个运算数*/ scanf("%d",n); push(n); /*第二个运算数入栈*/ printf("\n\tChoose operator(+/-/*//):"); l=getche(); /*输入运算符*/ switch(l) /*判断运算符,转而执行相应代码*/ { case '+': b=pop(); a=pop(); c=a+b; printf("\n\n\tThe result is %d\n",c); printf("\n"); break; case '-': b=pop(); a=pop(); c=a-b; printf("\n\n\tThe result is %d\n",c); printf("\n"); break; case '*': b=pop(); a=pop(); c=a*b; printf("\n\n\tThe result is %d\n",c); printf("\n"); break; case '/': b=pop(); a=pop(); c=a/b; printf("\n\n\tThe result is %d\n",c); printf("\n"); break; } printf("\tContinue?(y/n):"); /*提示用户是否结束程序*/ l=getche(); if(l=='n') exit(0); }while(1); } : #include stdio.h #include conio.h #include malloc.h #include stdlib.h #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; #define STACK_INIT_SIZE 100 //初始分配量 #define STACKINCREMENT 10 //存储空间的分配增量 typedef char ElemType; typedef ElemType OperandType; //操作数 typedef char OperatorType; typedef struct { ElemType *base; ElemType *top; int stacksize; }SqStack; Status InitStack(SqStack S) { //构造一个空栈S S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); if(!S.base) exit (OVERFLOW); S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK; } Status GetTop(SqStack S){ ElemType e; if (S.top == S.base) return ERROR; e = *(S.top-1); return e; } Status Push (SqStack S,ElemType e) { //插入元素e为新的栈顶元素 if (S.top - S.base = S.stacksize){ S.base = (ElemType *) realloc ( S.base, (S.stacksize + STACKINCREMENT) * sizeof(ElemType)); if(!S.base) exit (OVERFLOW); S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } *S.top++ = e; return OK; } Status Pop (SqStack S,ElemType e){ //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR if(S.top == S.base) return ERROR; e = * --S.top; return OK; } char In(char c,char OP[]) { if(c=35 c=47) return 1; else return 0; } char OP[8]=; int m[7][7]={1,1,2,2,2,1,1, 1,1,2,2,2,1,1, 1,1,1,1,2,1,1, 1,1,1,1,2,1,1, 2,2,2,2,2,0,-1, 1,1,1,1,-1,1,1, 2,2,2,2,2,-1,0};//1 2 0 = -1 不存在 char Precede(char i,char j) { int a,b; char *p; for(p=OP,a=0;*p!='\0';p++,a++) if(*p==i) break; for(p=OP,b=0;*p!='\0';p++,b++) if(*p==j) break; if(m[a][b]==1) return ''; else if(m[a][b]==2) return ''; else if(m[a][b]==0) return '='; else return 'O'; } char Operate(char a,char theta,char b) { if(a47) a=atoi(a); if(b47) b=atoi(b); switch(theta) { case '+': return a+b; break; case '-': return a-b; break; case '*': return a*b; break; case '/': return a/b; break; } } OperandType EvaluateExpression() { SqStack OPTR,OPND; OperandType a,b,c; OperatorType theta; InitStack(OPTR); Push(OPTR,'#'); InitStack(OPND); c=getchar(); while (c!='#' || GetTop(OPTR)!='#') { if (!In(c,OP)) else switch(Precede(GetTop(OPTR),c)) { case '' : Push(OPTR,c); c = getchar(); break; case '=' : Pop(OPTR,c); c = getchar(); break; case '' : Pop(OPTR,theta); Pop(OPND,b); Pop(OPND,a); Push(OPND,Operate(a,theta,b)); break; } } return GetTop(OPND); } void main() { printf("(以#为结束符)\n"); printf("请输入:\n"); int a; a=(int)EvaluateExpression(); printf("%d",a); getch(); } : ls都正确 : C++ In Action这本书里面有表达式求值的详细项目分析. : 数据结构的书里面都有的,仔细看一下 : studyall123的只能对0到9的数字运算才有效,对于10以上的数字就不行!不知道有没有更好的方法! : 现在的人,连google一下都懒啊 : 实际上是按照逆波兰式的顺序让输入的表达式入栈,再根据运算符优先级来计算。 : lenrning!
Python里如何调用Arcsin函数求值
import math
a=math.asin(0.5)
print a #默认用弧度表示
0.52359877559829893
math.degrees(a) #转换为角度
30.00000000000004
#其他命令可以参考help(math)
关于python函数式求值和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。