⑴ 怎样用python实现这样一个简单程序
defnumberInputer(prompt,quitflat):
"""prompt:输入时的提示信息,
quitflag:退出标识字
"""
whileTrue:
gotter=rawinput(prompt+',"%s"forquit'%quitflag)
ifgotter==quitflag:
break
try:
yieldint(gotter)
except:
continue
degrees=[]
fordegreeinnumberInputer(prompt="请输入考试分数",quitflag="Q"):
degrees.append(degreee)
print"分数中大于60的分数之和",sum(filter(lambdax:x>=60,degrees))
⑵ 用Python如何实现呢
start_i = 5
result = 1
while(start_i<=500):
if start_i != 99:
result = result * start_i
start_i = start_i + 1
print(result)
⑶ python 哈夫曼编码 有没有库实现
认识哈夫曼树之前首先我们简单的来了解一下二叉树,不难理解,二叉树就是每个节点都只有2个子节点的树状结构,也就分为父节点(parent node)、左子树(left child)和右子树(right child)。
每个节点最多只能有2个节点,当然也可以更少,比如只有左节点没有右节点或者相反,没有子节点的节点我们称之为叶节点,有子树的称之为根节点。
⑷ 使用python语言实现
如果说是输入-1时结束,并且-1也算在内的话,那么:
a = []
b = 1
while True:
c = int(input('请输入第'+str(b)+'个数:'))#输入的数必须是可以转换成整数的字符串
a.append(c)
if c == -1:
break
b += 1
print('一共输入了'+str(len(a))+'个数')#len是求出一个序列的总元素个数的内置函数
#相关的资料可以在网络上查
print('最大值是'+str(max(a)))
print('最小值是'+str(min(a)))
print('和是'+str(sum(a)))
print('平均数是'+str(sum(a) / len(a)))
⑸ 如何实现Python自增运算
在语法上出现自增自减运算符可能是不够优雅的。作为一门注重效率的语言,C语言中出现自增自减操作可能是为了生成高效的机器码,因为这些操作可以直接映射成CPU的指令 而Python、Ruty等现代语言的设计哲学是“优雅”、“明确”、“简单”。其设计目标之一是让代码具备高度的可阅读性。像javaScript等语言也不推荐使用++、--运算符。
⑹ 用python写一个程序实现求x的y次方,采用while或者for 来写,急啊,求求你们了!
其实有很多方法可以求次方的:
defpower(x,y):
v=x
foriinrange(2,y+1):
x*=v
returnx
x=2
y=10
printpower(x,y)
printx**y
printpow(x,y)
⑺ 编程实现建立一棵哈夫曼树,采用链表存储方式,并进行哈夫曼编码。
#include<iostream.h>#include<stdio.h>#include<stdlib.h> struct node{ int data; int k; node *rchild,*lchild; }; node* create(node a[],int n){ int min,min2; node *p=(node *)malloc(sizeof(node)); for(int i=0;i<2*n;i++) { a[i].k=0; a[i].lchild=a[i].rchild=NULL; } for(i=0;i<n;i++) cin>>a[i].data; int j=n; while(j!=(2*n-1)) { min=299; min2=299; for(i=0;i<j;i++) { if(a[i].k!=1) { if(a[i].data<min) { min=a[i].data; a[i].k=1; a[j].lchild=&a[i]; } } } for(i=0;i<j;i++) { if(a[i].k!=1) { if(a[i].data<min2) { min2=a[i].data; a[i].k=1; a[j].rchild=&a[i]; } } } a[j].data=min+min2; j++; } p=&a[2*n-2]; return p;} void bianliye(node *b){ if(b!=NULL) { bianliye(b->lchild); if((b->lchild==NULL)&&(b->rchild==NULL)) cout<<b->data<<" "; bianliye(b->rchild); }} void main(){ node a[10]={0}; node *root=NULL; cout<<"请输入节点的权值:"; root=create(a,5); cout<<"叶子节点为:"; bianliye(root);}
⑻ 请描述哈夫曼算法,并用图描述构造哈夫曼树的过程。
这个讲的相当清楚。
首先介绍什么是哈夫曼树。哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的带权路径长度记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)。可以证明哈夫曼树的WPL是最小的。
哈夫曼在上世纪五十年代初就提出这种编码时,根据字符出现的概率来构造平均长度最短的编码。它是一种变长的编码。在编码中,若各码字长度严格按照码字所对应符号出现概率的大小的逆序排列,则编码的平均长度是最小的。(注:码字即为符号经哈夫曼编码后得到的编码,其长度是因符号出现的概率而不同,所以说哈夫曼编码是变长的编码。)
然而怎样构造一棵哈夫曼树呢?最具有一般规律的构造方法就是哈夫曼算法。一般的数据结构的书中都可以找到其描述:
一、对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合F={T1,T2,T3,...,Ti,...,Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。(为方便在计算机上实现算法,一般还要求以Ti的权值Wi的升序排列。)
二、在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其左右子树的根结点的权值之和。
三、从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F中。
四、重复二和三两步,直到集合F中只有一棵二叉树为止。
用C语言实现上述算法,可用静态的二叉树或动态的二叉树。若用动态的二叉树可用以下数据结构: struct tree{
float weight; /*权值*/
union{
char leaf; /*叶结点信息字符*/
struct tree *left; /*树的左结点*/
};
struct tree *right; /*树的右结点*/
};
struct forest{ /*F集合,以链表形式表示*/
struct tree *ti; /* F中的树*/
struct forest *next; /* 下一个结点*/
};
例:若字母A,B,Z,C出现的概率为:0.75,0.54,0.28,0.43;则相应的权值为:75,54,28,43。
构造好哈夫曼树后,就可根据哈夫曼树进行编码。例如:上面的字符根据其出现的概率作为权值构造一棵哈夫曼树后,经哈夫曼编码得到的对应的码值。只要使用同一棵哈夫曼树,就可把编码还原成原来那组字符。显然哈夫曼编码是前缀编码,即任一个字符的编码都不是另一个字符的编码的前缀,否则,编码就不能进行翻译。例如:a,b,c,d的编码为:0,10,101,11,对于编码串:1010就可翻译为bb或ca,因为b的编码是c的编码的前缀。刚才进行哈夫曼编码的规则是从根结点到叶结点(包含原信息)的路径,向左孩子前进编码为0,向右孩子前进编码为1,当然你也可以反过来规定。
这种编码方法是静态的哈夫曼编码,它对需要编码的数据进行两遍扫描:第一遍统计原数据中各字符出现的频率,利用得到的频率值创建哈夫曼树,并必须把树的信息保存起来,即把字符0-255(2^8=256)的频率值以2-4BYTES的长度顺序存储起来,(用4Bytes的长度存储频率值,频率值的表示范围为0--2^32-1,这已足够表示大文件中字符出现的频率了)以便解压时创建同样的哈夫曼树进行解压;第二遍则根据第一遍扫描得到的哈夫曼树进行编码,并把编码后得到的码字存储起来。 静态哈夫曼编码方法有一些缺点:一、对于过短的文件进行编码的意义不大,因为光以4BYTES的长度存储哈夫曼树的信息就需1024Bytes的存储空间;二、进行哈夫曼编码,存储编码信息时,若用与通讯网络,就会引起较大的延时;三、对较大的文件进行编码时,频繁的磁盘读写访问会降低数据编码的速度。
因此,后来有人提出了一种动态的哈夫曼编码方法。动态哈夫曼编码使用一棵动态变化的哈夫曼树,对第t+1个字符的编码是根据原始数据中前t个字符得到的哈夫曼树来进行的,编码和解码使用相同的初始哈夫曼树,每处理完一个字符,编码和解码使用相同的方法修改哈夫曼树,所以没有必要为解码而保存哈夫曼树的信息。编码和解码一个字符所需的时间与该字符的编码长度成正比,所以动态哈夫曼编码可实时进行。动态哈夫曼编码比静态哈夫曼编码复杂的多,有兴趣的读者可参考有关数据结构与算法的书籍。
前面提到的JPEG中用到了哈夫曼编码,并不是说JPEG就只用哈夫曼编码就可以了,而是一幅图片经过多个步骤后得到它的一列数值,对这些数值进行哈夫曼编码,以便存储或传输。哈夫曼编码方法比较易懂,大家可以根据它的编码方法,自己编写哈夫曼编码和解码的程序。
⑼ Python的几种实现
Python自身作为一门编程语言,它有多种实现。这里的实现指的是符合Python语言规范的Python解释程序以及标准库等。这些实现虽然实现的是同一种语言,但是彼此之间,特别是与CPython之间还是有些差别的。
下面分别列出几个主要的实现。
1.CPython:这是Python的官方版本,使用C语言实现,使用最为广泛,新的语言特性一般也最先出现在这里。
CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上。
2.J
ython:这是Python的Java实现,相比于CPython,它与Java语言之间的互操作性要远远高于CPython和C语言之间的互操作性。
在Python中可以直接使用Java代码库,这使得使用Python可以方便地为Java程序写测试代码,更进一步,可以在Python中使用Swing等图形库编写GUI程序。
Jython会将Python代码动态编译成Java字节码,然后在JVM上运行转换后的程序,这意味着此时Python程序与Java程序没有区别,只是源代码不一样。
在Python 中写一个类,像使用Java 类一样使用这个类是很容易的事情。
你甚至可以把Jython 脚本静态地编译为Java 字节码。
示例代码:fromjava.langimportSystemSystem.out.write('Hello World!
')
3.Python for .NET:它实质上是CPython实现的
.NET托管版本,它与.NET库和程序代码有很好的互操作性。4.
IronPython:不同于Python for .NET,它是Python的C#实现,并且它将Python代码编译成C#中间代码(与Jython类似),然后运行,它与.NET语言的互操作性也非常好。5.
PyPy:Python的Python实现版本,原理是这样的,PyPy运行在CPython(或者其它实现)之上,用户程序运行在PyPy之上。它的一个目标是成为Python语言自身的试验场,因为可以很容易地修改PyPy解释器的实现(因为它是使用Python写的)。6.
Stackless:CPython的一个局限就是每个Python函数调用都会产生一个C函数调用。这意味着同时产生的函数调用是有限制的,因此Python难以实现用户级的线程库和复杂递归应用。一旦超越这个限制,程序就会崩溃。Stackless的Python实现突破了这个限制,一个C栈帧可以拥有任意数量的Python栈帧。这样你就能够拥有几乎无穷的函数调用,并能支持巨大数量的线程。Stackless唯一的问题就是它要对现有的CPython解释器做重大修改。所以它几乎是一个独立的分支。另一个名为Greenlets的项目也支持微线程。它是一个标准的C扩展,因此不需要对标准Python解释器做任何修改。
下面的这篇文章对Stackless做了比较多的介绍,但是也比较难以读懂:
可爱的 Python:Python实现内幕