走路要向前看,但也不要忘了脚下的路.

发布新日志

  • 测试理论知识总结

    2010-04-14 13:26:32

        马上要离开公司了,最近除了忙着考试外,也没别的事情。就是找工作了,闲睱时间在论坛上看到有些人在问一些测试基础理论方面的知识,其实也是在面试时会遇到的一些问题。现在在网上搜集整理了一下。基本上都差不多,少部份是自己写的。一是自己也可以学习温习一遍,二是,以供一些新手参考阅读。还有一些不完善的地方,需要慢慢改进。
        这次主要是针对以下问题给出的解答:
     
        

        1.写一个交易的流程 和测试用例

        2.一个测试人员具备的素质

        3.黑白盒测试的区别

        4.黑盒测试的方法是什么

        5.白盒测试的方法?

        6.什么是集成 系统 单元测试

        7.什么叫等价类划分 什么叫因果法

     

     1.写一个交易的流程 和测试用例

    基本流  

     

          开端是ATM   处于准备就绪状态。  

         1.准备提款-   客户将银行卡插入ATM   机的读卡机。  

         2.验证银行卡-   ATM   机从银行卡的磁条中读取帐户代码,并检查它是否属  

      于可以接收的银行卡。  

         3.输入PIN   -   ATM   要求客户输入PIN   码(6   位)  

         4.验证帐户代码和PIN   -   验证帐户代码和PIN   以确定该帐户是否有效以及  

      所输入的PIN   对该帐户来说是否正确。对于此事件流,帐户是有效的而且  

      PIN   对此帐户来说正确无误。  

         5.ATM   选项-   ATM   显示在本机上可用的各种选项。在此事件流中,银行  

      客户通常选择“提款”。  

         6.输入金额-   要从ATM   中提取的金额。对于此事件流,客户需选择预设  

      的金额(10   美元、20   美元、50   美元或100   美元)。  

         7.授权-   ATM   通过将卡IDPIN、金额以及帐户信息作为一笔交易发送给  

      银行系统来启动验证过程。对于此事件流,银行系统处于联机状态,而且  

      对授权请求给予答复,批准完成提款过程,并且据此更新帐户余额。  

         8.出钞-   提供现金。  

         9.返回银行卡-   银行卡被返还。  

         10.收据-   打印收据并提供给客户。ATM   还相应地更新内部记录。  

          用例结束时ATM   又回到准备就绪状态。  

     备注流:

    2a)银行卡无效在基本流步骤2   -   验证银行卡,如果卡是无效的,则卡被退回,同时会通知相关消息。  

      5aATM   内没有现金在基本流步骤5   -   ATM   选项,如果ATM   内没有现金,则“提款”选项将无法使用。  

      6aATM   内现金不足在基本流步骤6   -   输入金额,如果ATM   机内金额少于请求提取的金额,则将显示一则适当的消息,并且在步骤6   -   输入金额处重新加入基本流。  

      4a)在基本流步骤4   -   验证帐户和PIN,客户有三次机会输入PIN. 如果PIN输入有误,ATM   将显示适当的消息;如果还存在输入机会,则此事件流在步骤3   -  输入PIN   处重新加入基本流。如果最后一次尝试输入的PIN 码仍然错误,则该卡将被ATM 机保留,同时ATM返回到准备就绪状态,本用例终止。  

      4b)帐户不存在在基本流步骤4   -   验证帐户和PIN,如果银行系统返回的代码表明找不到该帐户或禁止从  

      (9a)该帐户中提款,则ATM   显示适当的消息并且在步骤9   -   返回银行卡处重新加入基本流。  

      (7a)帐面金额不足在基本流步骤7   -   授权中,银行系统返回代码表明帐户余额少于在基本流步骤6   -   输入金额内输入的金额,则ATM   显示适当的消息并且在步骤6   -   输入金额处重新加入基本流。

      (7c)达到每日最大的提款金额在基本流步骤7   -   授权中,银行系统返回的代码表明包括本提款请求在内,客户已经或将超过在24小时内允许提取的最多金额,则ATM   显示适当的消息并在步骤6   -   输入金额上重新加入基本流。  

      (10)记录错误如果在基本流步骤10   -   收据中,记录无法更新,则ATM   进入“安全模式”,在此模式下所有功能都将暂停使用。同时向银行系统发送一条适当的警报信息表明ATM   已经暂停工作. 退出客户可随时决定终止交易(退出)。交易终止,银行卡随之退出。  

      “翘起”   ATM   包含大量的传感器,用以监控各种功能,如电源检测器、不同的门和出入口处的测压器以及动作检测器等。在任一时刻,如果某个传感器被激活,则警报信号将发送给警方而且ATM   进入“安全模式”,在此模式下所有功能都暂停使用,直到采取适当的重启/重新初始化的措施。  

      PIN   有误  

      基础数据  

          PIN:4987  

          账号:809498  

          账户余额:自由假设  

          ATM内现金:自由假设  

    样式TC

    (测试用例)ID

    场景/条件PIN

    帐号输入的金额/选择的金额

    帐面金额ATM内的金额

    预期结果

    CW1

    498786

    5000

    50000

    成功提款,帐户余额被更新为450.00

     

    2.一个测试人员具备的素质

    测试人员应该具有的素质包括:

    一、踏实细心和积极主动

             我觉得作为一名测试人员首先要踏实细心。测试人员每天都要面对着枯燥的程序,从事着大量的重复工作,还要尽量发现产品中的bug。如果不踏实,你就坐不住,总想干别的,就无法净下心来想用户有可能怎么用,需求对产品是怎么要求的,现在产品中是怎么做的,哪里可能存在问题。不细心,就特别容易一些产品中微笑的错误,而恰恰就是这些错误是最影响产品形象的问题。至于积极主动就不多说了。这是每个人都应该具有的素质。

    二、怀疑的精神

             不抱着怀疑一切的态度就不是一名合格的测试人员。经过你手测试的产品面对的是直接用户。你不认真负责,不抱着怀疑一切的态度。总想着这个功能本版没动应该没什么问题,这个功能没什么用户用不用认真测了。这样发出的产品,我是不敢让用户用。因为用户用起产品来是千奇百怪,有些用户的水平和对产品的理解比咱们还要深。所以一定要抱着怀疑一切的态度,认为产品每个功能都可能有问题,认真地测试产品的每一个测试点。

    三、协作和团队感

             协作和团队感也是十分重要的。要意识到测试、开发、需求是一个团队,一个整体。离了谁,产品的质量都无法保证。诚然有个别开发人员责任心不强,经常将未经任何验证的代码编译后发给测试进行验证。耽误了测试人员不少的时间。但越这样,测试人员越应该负责,否则产品发出去影响的是公司的形象。

             还有个别开发人员开不起测试。此时就需要你通过各种方法去证明你自己的能力。比如测试出他根本就没考虑过的问题等等。以实际行动证明你离不开我,咱们是一个水平的。只有这样加强协作和团队建设,加强整个团队的质量意识,才能提高开发效率,保证产品质量。

    四、自我提高和总结的能力

             测试人员经常很迷茫,不知道自己的发展方向在哪里。测试技术还是专业知识。领导们所谓的个人发展方向考虑也经常是画一个饼在那里。这时就只能靠我们自己了。看你想今后从事哪方面的工作。一般情况下,如果升不到管理层就只有两条路可选了。一是业务精通,将来可以向需求或是售前、实施方向发展。一是技术精通,多掌握几种测试工具,有能力可以学习一些编程方面的知识。将来还继续从事测试方面的工作。随着中国软件开发的规范化,这条路也是很有发展的。

             另外,我觉得作为一名合格的测试人员,一定要注意进行总结。通过总结可以对自己的工作进行一个回顾分析,看看那些做得不错,下次还继续这么做。那些工作还有改进的余地。对自己能力的提高是一个很好的帮助。

    五、洞察力   思维要灵活。

    六、沟通的能力和技巧

    3.黑白盒测试的区别

             首先纠正 这个问题不属于“硬件”类的

             什么是黑盒测试和白盒测试?

             任何工程产品(注意是任何工程产品)都可以使用以下两种方法之一进行测试。

             黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。

             白盒测试:已知产品的内部工作过程,可以通过测试证明每种内部操作是否符合设计规格要求,所有内部成分是否以经过检查。

             软件的黑盒测试意味着测试要在软件的接口处进行。这种方法是把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。因此黑盒测试又叫功能测试或数据驱动测试。黑盒     测试主要是为了发现以下几类错误:

     

             1、是否有不正确或遗漏的功能?

             2、在接口上,输入是否能正确的接受?能否输出正确的结果?

             3、是否有数据结构错误或外部信息(例如数据文件)访问错误?

             4、性能上是否能够满足要求?

             5、是否有初始化或终止性错误?

             软件的白盒测试是对软件的过程性细节做细致的检查。这种方法是把测试对象看做一个打开的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序状态,确定实际状态是否与预期的状态一致。因此白盒测试又称为结构测试或逻辑驱动测试。白盒测试主要是想对程序模块进行如下检查:

             1、对程序模块的所有独立的执行路径至少测试一遍。

             2、对所有的逻辑判定,取“真”与取“假”的两种情况都能至少测一遍。

             3、在循环的边界和运行的界限内执行循环体。

             4、测试内部数据结构的有效性,等等。

            

             以上事实说明,软件测试有一个致命的缺陷,即测试的不完全、不彻底性。由于任何程序只能进行少量(相对于穷举的巨大数量而言)的有限的测试,在未发现错误时,不能说明程序中没有错误。

     

    4.黑盒测试方法是什么?

             黑盒测试方法主要有等价类划分边值分析因—果图错误推测等,主要用于软件确认测试。

    5、白盒测试的方法?

             白盒测试的测试方法有代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法、域测试、符号测试、Z路径覆盖、程序变异。

    6.什么是集成 系统 单元测试

             集成测试,也叫组装测试或联合测试。在单元测试的基础上,将所有模块按照设计要求(如根据结构图〕组装成为子系统或系统,进行集成测试。实践表明,一些模块虽然能够单独地工作,但并不能保证连接起来也能正常的工作。程序在某些局部反映不出来的问题,在全局上很可能暴露出来,影响功能的实现

     

             系统测试是将已经确认的软件、计算机硬件、外设、网络等其他元素结合在一起,进行信息系统的各种组装测试和确认测试,其目的是通过与系统的需求相比较,发现所开发的系统与用户需求不符或矛盾的地方,从而提出更加完善的方案.。它的任务是尽可能彻底地检查出程序中的错误,提高软件系统的可靠性,其目的是检验系统"做得怎样?"。这阶段又可分为三个步骤:模块测试,测试每个模块的程序是否有错误;组装测试,测试模块之间的接口是否正确;确认测试,测试整个软件系统是否满足用户功能和性能的要求。该阶段结束应交付测试报告,说明测试数据的选择,测试用例以及测试结果是否符合预期结果。测试发现问题之后要经过调试找出错误原因和位置,然后进行改正。是基于系统整体需求说明书的黑盒类测试,应覆盖系统所有联合的部件。系统测试是针对整个产品系统进行的测试,目的是验证系统是否满足了需求规格的定义,找出与需求规格不相符合或与之矛盾的地方。

    系统测试的对象不仅仅包括需要测试的产品系统的软件,还要包含软件所依赖的硬件、外设甚至包括某些数据、某些支持软件及其接口等。因此,必须将系统中的软件与各种依赖的资源结合起来,在系统实际运行环境下来进行测试

    单元测试是在软件开发过程中要进行的最低级别的测试活动,在单元测试活动中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。

     

    7.什么叫等价类划分 边界值、错误推测、因果法

    等价类划分

      是把所有可能的输入数据,即程序的输入域划分成若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例.该方法是一种重要的,常用的黑盒测试用例设计方法.

      1) 划分等价类: 等价类是指某个输入域的子集合.在该子集合中,各个输入数据对于揭露程序中的错误都是等效的.并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试.因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件,就可以用少量代表性的测试数据.取得较好的测试结果.<SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-

  • QTP录制脚本时注意事项

    2009-12-12 14:54:10

        这个是以前在总结的,今天在家翻看记录时无意中看到的,就写在这里做个网络记录,以备以后容易查找。
        QTP录制脚本时注意事项:
    (1)必须认真录制每一次,在录制的时候最发用鼠标不要用TAB键。
    (2)录制后回放,查看脚本是否回放成功。
    (3)参数化时要注意每一项输入,没有值时不要移到空的Data Table,否则运行循环也会把最后输入值的下行当做有值,但实际为空,回放时就会报错。解决办法是去除下一行空值。选中空单无格——>右键Edit——> Delet既可。
  • 影响软件测试有效执行的因素

    2009-12-09 17:38:45

    影响软件测试有效执行的因素

    (主要是对50人以下的小公司来说)

    伴随着春节的到来,又一个冬天将要过去了。工作又一年了,在此简单总结一下影响软件测试有效执行的主要因素有以下几种:

    1公司的规模和制度。公司规模小各项制度还在完善中。因此人员的职务定义不够

    很明确,也就会出现相应职责的不明,这样就很容易导致在任务分工会有时出现不够具体明确。表现积极点会出现越职现象;消极点会处于被动变得无所事实,一旦出现问题就会相互推脱责任,无法查明问题出现的根源。

    2软件开发模型。也许是由(2)的原因,综合了在工作当中遇到的情况和自己对软件工程中开发模型的理解,很多小公司的软件开发模型可以归类为软件开发模型中的“边做边改模型”。在这种模型中,既没有规格说明,也没有经过设计,软件随着需求一次又一次地不断被修改.

      在这种模型中,开发人员拿到项目立即根据需求编写程序,调试通过后生成软件的第一个版本。在提供给用户使用后,如果程序出现错误,或者用户提出新的要求,开发人员重新修改代码,直到用户满意为止。

      这是一种类似作坊的开发方式,对编写几百行的小程序来说还不错,但这种方法对任何规模的开发来说都是不能令人满意的,其主要问题在于:

      a. 缺少规划和设计环节,软件的结构随着不断的修改越来越糟,可能会导致无法继续修改;

      b. 忽略需求环节,给软件开发带来很大的风险;

       c. 没有考虑测试和程序的可维护性,也没有任何文档,软件的维护十分困难。

    3)还有大部份人对软件测试的理解存在狭隘性。软件测试在我国来说本来就是一个新兴的行业,也是在最近的几年中才从开发中独立出来成为一个独立的部门,对软件测试的理解不够也是在所难免的。特别是不到50人的小公司,尤其是以前还不存在测试小组或是测试部门,有些测试工作都是开发人员做的简单的单元测试或用户进行的验证测试,许多东西都是自己做的,对测试输入文件需求不大,也就很少再去花费时间去整理相应的测试输入文件。另外,不愿意与外人分享,人是自然界中的高级动物,普通动物还存在把自己得到的东西找个地方藏起来,更何况是人了,有些东西认为是自己辛辛苦苦的成果,当然也就不愿意与外人分享。(开发是自己人,测试是外人。)

    这样就会出现“巧妇难为无米之炊。”测试小组得不到测试输入文件,很难做出确切的测试目标、合理的测试计划等。测试工作就很难有效的进行。测试人员在公司也会处于很尴尬的角色——可有可无。

    4满足于现状。记得在一本书看过这样一句话“把跨栏定多高你就能跳多高。”公司在技术和管理方面就是缺少那个栏杆的高度,换句话说也就是缺少长远的目标和当前的明确的目标。认为能跳多高就是多高,只要比上次高就是成功。

    5)当然这与测试人员自身的不足也是密不可分的。在很多人眼里,测试是一件很简单的事,所以进入测试队伍中的人员也参差不齐,甚至存在有些人对测试基本知识都缺少。有些即使对测试概念有着深刻的理解,熟悉测试的基本流程,但对实际情况认识不够深入,换句话说经验不够,工作思想有时也过于理想化,有效的知识不能很好的运用到实际的工作当中;另外对高级测试技术也欠缺深刻的理解、掌握程度还不够熟练。心态有时也不够端正,心情不好、感觉不被重视或是得不到想要的测试结果时,会失去工作信心和理念,更甚至不想工作;也许是人有惰性的通病吧,有时也会有偷懒的心理——什么时候分任务就什么开始去做,你不管不问我也就不做。

    6得不到最有力人员的支持认可。特别是出现一人掌权时,得不到这个人的认可和支持,测试工作是很难有效进行。

     

     

    发现问题不是目的,解决问题才是根本的目的。下面就来简单的说说如何去做能消除或是减少影响测试有效执行的不利因素。

    人常说“失败是成功之母”、“从那里跌倒就从那里站起来”。吸取经验教训。做为测试人员,其他的我不做过多的叙述,只提出与测试有关方面的建议。

    首先,让相关人员对软件测试有个全面的正确的认识。(只有正确的认识,才能做出正确的决定;只有正确的决定,才会有正确的过程;只有正确的过程,才能得到正确的结果。)这是一个长期而又艰巨的工作。一个人对新事物的思想认识形成不是一朝一夕的,那么要改变一个人的对此事物片面的狭隘的思想认识也不可能是一朝一夕的事情。总来对相应人员进行测试培训。划阶段进行培训不同的内容。第一阶段:了解测试的基本常识(主要是理论方面),包括测试基本概念,常用的测试术语,测试基本流程等;第二阶段:根据测试各个阶段的流程所需要的测试技术,测试方法等。第三阶段:高级自动化测试技术的学习。这三个阶段是层层递进,层层深入的关系。在不同的阶段参加培训的人员也会不同。

    培训可以是本公司内部有经验人员进行相关课程的准备讲解;也可以外请比较有经验的、知识技术都比较丰富的人员进行讲解;还有就是公司中在某方面相对有经验的人担当讲解。这几种培训各有优点和不足,根据公司现状,没有很适合的人,只有相对来说来可以说的过去的,比如说第一、二阶段可以由专职测试人员对其他相关测试人员进行培训,同时也可以在培训中总结自己的不足。第三个阶段课程是由中级向高级进化的过程。需要有广阔强硬的知识和丰富的工作经验的人来担当,现在一般还很难找到合适的人员。可以说整个国内都缺乏这样的人才。只能根据情况来学习总结再学习再总结,在不断总结中摸索前进。

    在此我特别提出一点,要想展开培训这一工作,首先必做的是让公司重量级人物得到认可和支持,否则以上工作思想只能是空想,很难实施。

    其次,要不断的充实自己,做到“生命不息,学习不止” 关于如何提高自己,怎么去学习,可以参看“如何精通性能测试?http://www.7dtest.com/bbs/thread-3630-1-1.html”只不过那是针对性能测试的学习来说的,但里面学习方法,学习技巧是通用的,很值得去学习。

     

    以上是也算是我又工作一年,根据现状对测试进一步的认识总结吧。如有不合理之处或你有更好的建议或意见敬请提出。以待改进。

     

     

  • Python相关网上资料

    2009-07-22 17:00:15

  • Python模块

    2009-07-22 15:43:49

    1.1. 安装
    1.1.1. 下载相关软件
    http://www.pythonware.com/products/pil/index.htm下载最新版的PIL安装程序。这里介绍的是在linux下的安装方法。windows平台的安装方法较简单,只要双击安装程序,就可一步步安装好了。

    如果要PIL支持jpeg格式文件,还需安装jpeg库文件,可到
    http://www.ijg.org下载,现时最新的版本是jpegsrc.v6b.tar.gz。

    如果要PIL支持压缩功能,还要下载Zlib库,可到
    http://www.gzip.org/zlib/下载zlib-1.1.4.tar.gz。

    1.1.2. 开始安装
    先安装jpeg库,输入以下命令进行安装:

    tar xfz jpegsrc.v6b.tar.gz
    cd jpeg-6b
    ./configure
    make
    make test
    make install
    make install-lib


    接着安装Zlib库,输入以下命令进行安装:

    tar xfz zlib-1.1.4.tar.gz
    cd zlib-1.1.4
    ./configure
    make
    make install


    最后安装PIL,输入以下命令进行安装:

    tar xfz Imaging-1.1.4.tar.gz
    cd Imaging-1.1.4
    cd libImaging
    ./configure
    make
    cd ..
    python setup.py build
    python setup.py install


    测试安装是否成功,可以在Python的命令行界面输入以下代码:

    >>>import Image
    >>>im = Image.open("test.jpg")
    >>>im.show()

    如果成功打开test.jpg图片则安装成功。注意,在linux中,需要用xv程序来显示图片,所以如果没装xv,python会提示找不到xv。可到
    http://www.trilon.com/xv/downloads.html下载xv。

    Chapter 2. Pmw(Python megawidgets)Python超级GUI组件集
    Table of Contents

    2.1. 安装
    2.2. 模块功能演示
    2.2.1. ScrolledListBox(滚动列表框)
    2.2.2. ScrolledText(滚动文本框)
    Pmw是一个在python中利用Tkinter模块构建的高级GUI组件,每个Pmw都合并了一个或多个Tkinter组件,以实现更有用和更复杂的功能。如,Pmw中的一个ScrolledListBox(滚动列表框)实现了Tkinter的Scrollbar(滚动条)和ListBox(列表框)功能,使我们编程更方便。如果你在Python中开发GUI程序,Pmw是将是你的一个好帮手。

    2.1. 安装
    现在最新的Pmw是1.2版,Pmw的安装比较简单,只要到
    http://pmw.sourceforge.net/下载软件,然后用tar -zxvf命令解压文件,把解压出来的Pmw目录拷到python的模块目录下就可以了,如site-packages 目录。windows平台使用同一压缩包,安装方法也一样。安装完成后可登录进python的命令行界面运行“import Pmw”测试是否安装成功,如果没有出错信息,则安装成功,可以使用了。

    2.2. 模块功能演示
    2.2.1. ScrolledListBox(滚动列表框)

    #ScrolledListBox used to select image.

    from Tkinter import *
    import Pmw

    class ImageSelection( Frame. ):
        """List of available images and an area to display them"""

        def __init__( self, images ):
            """Create list of PhotoImages and Label to display them"""

            Frame.__init__( self )
            Pmw.initialise()
            self.pack( expand = YES, fill = BOTH )
            self.master.title( "Select an image" )

            self.photos = []

            #add PhotoImage object to list photos
            for item in images:
                self.photos.append( PhotoImage( file = item ) )

            #create scrolled list box with vertical scrollbar
            self.listBox = Pmw.ScrolledListBox( self, items = images,
                                                listbox_height = 3,
                                                vscrollmode = "static",
                                                selectioncommand = self.switchImage )
            self.listBox.pack( side = LEFT, expand = YES, fill = BOTH, padx = 5, pady = 5 )

            self.display = Label( self, image = self.photos[0] )
            self.display.pack( padx = 5, pady = 5 )

        def switchImage ( self ):
            """Change image in Label to current selection"""

            #get tuple containing index of selected list item
            chosenPicture = self.listBox.curselection()

            #configure label to display selected image
            if chosenPicture:
                choice = int( chosenPicture[0] )
                self.display.config( image = self.photos[ choice ] )

    def main():
        images = [ "c:\python23\logo.gif", "c:\python23\china.gif", "c:\python23\canada.gif", "c:\python23\logo.gif" ]
        ImageSelection(images).mainloop()

    if __name__ == "__main__":
        main()
           


    2.2.2. ScrolledText(滚动文本框)

    #Copying selected text from one text area to another.

    from Tkinter import *
    import Pmw

    class CopyTextWindow( Frame. ):
        """Demonatrate ScrolledText"""

        def __init__( self ):
            """Create two ScrolledText and a Button"""

            Frame.__init__( self )
            Pmw.initialise()
            self.pack( expand = YES, fill = BOTH )
            self.master.title( "ScrolledText Demo" )

            #create scrolled text box with word wrap enable
            self.text1 = Pmw.ScrolledText( self, text_width = 25, text_height = 12,
                                           text_wrap = WORD, hscrollmode = "static",
                                           vscrollmode = "static" )
            self.text1.pack( side = LEFT, expand = YES, fill = BOTH, padx = 5, pady = 5 )

            self.copyButton = Button( self, text = "Copy >>>", command = self.copyText )
            self.copyButton.pack( side = LEFT, padx = 5, pady = 5 )

            #create uneditable scrolled text box
            self.text2 = Pmw.ScrolledText( self, text_state = DISABLED, text_width = 25,
                                           text_height = 12, text_wrap = WORD,
                                           hscrollmode = "static", vscrollmode = "static" )
            self.text2.pack( side = LEFT, expand = YES, fill = BOTH, padx = 5, pady = 5 )

        def copyText( self ):
            """set the text in the second ScrolledText"""

            self.text2.settext( self.text1.get( SEL_FIRST,SEL_LAST ) )

    def main():
        CopyTextWindow().mainloop()

    if __name__ == "__main__":
        main()
           

    Chapter 3. PyXML
    Table of Contents

    3.1. 安装
    3.2. 使用
    PyXML是一套用Python解析和处理XML文档的工具包,包中的4DOM是完全相容于W3C DOM规范的。它包含以下内容:

    xmlproc: 一个符合规范的XML解析器。

    Expat: 一个快速的,非验证的XML解析器。

    sgmlop: a C helper module that can speed-up xmllib.py and sgmllib.py by a factor of 5.

    PySAX: SAX 1 and SAX2 libraries with drivers for most of the parsers.

    4DOM: A fully compliant DOM Level 2 implementation

    javadom: An adapter from Java DOM implementations to the standard Python DOM binding.

    pulldom: a DOM implementation that supports lazy instantiation of nodes.

    marshal: a module with several options for serializing Python objects to XML, including WDDX and XML-RPC.


    3.1. 安装
    http://sourceforge.net/project/showfiles.php?group_id=6473下载最新版的模块,现在是PyXML-0.8.3。安装PyXML需要有python2.0以上及以上的版本。下载完成后用tar解压缩生成PyXML-0.8.3目录,进入该目录并运行python setup.py build和python setup.py install完成安装。测试方法是进入命令行交互界面运行“import xml.dom.ext"命令,如果没提示模块出错则说明安装成功。PyXML提供windows平台的安装包,下载后双击运行就可以了。

    3.2. 使用
    由于该模块的内容较多,所以该模块的详细使用将我在“PyXML学习笔记”中单独讨论。

    Chapter 4. PyGame
    PyGame是一组用于多媒体开发和游戏软件开发的模块。

    Chapter 5. PyOpenGL
    PyOpenGL模块封装了“OpenGL应用程序编程接口”,通过该模块python程序员可在程序中集成2D和3D的图形。

    Chapter 6. NumPy和Numarray
    NumPy是Python的一个扩展库,主要用于处理任意维数的固定类型数组,它的低层代码使用C来编写,所以速度的优势很明显。Numarray是NumPy的一个改进版,用于取代NumPy。

    Chapter 7. MySQLdb
    Table of Contents

    7.1. 安装
    7.2. 模块功能
    7.3. 模块功能演示
    MySQLdb模块用于连接MySQL数据库。源码位于
    http://sourceforge.net/projects/mysql-python,这里还有用于zope的ZMySQLDA模块,通过它就可在zope中连接mysql数据库。

    7.1. 安装
    安装的方法在解压目录的README文件中有详细说明。不难,这里就不详细讲了。要注意的一点是,如果你的mysql不是安装在默认的路径,而是安装在/usr/local/mysql这样的路径的话,libmysqlclient.so.12这个动态库python可能会找不到,造成import出错,解决方法是在/usr/lib下做一个符号连接,ln -s /usr/local/mysql/lib/mysql/libmysqlclient.so.12 libmysqlclient.so.12。最后在python中用import MySQLdb测试,如果没有出错信息就说明安装成功,可以连接mysql数据库了。

    7.2. 模块功能
    connect()方法用于连接数据库,返回一个数据库连接对象。如果要连接一个位于host.remote.com服务器上名为fourm的MySQL数据库,连接串可以这样写:

    db = MySQLdb.connect(host="remote.com",user="user",passwd="xxx",db="fourm" )

    connect()的参数列表如下:

    host,连接的数据库服务器主机名,默认为本地主机(localhost)。

    user,连接数据库的用户名,默认为当前用户。

    passwd,连接密码,没有默认值。

    db,连接的数据库名,没有默认值。

    conv,将文字映射到Python类型的字典。默认为MySQLdb.converters.conversions

    cursorclass,cursor()使用的种类,默认值为MySQLdb.cursors.Cursor。

    compress,启用协议压缩功能。

    named_pipe,在windows中,与一个命名管道相连接。

    init_command,一旦连接建立,就为数据库服务器指定一条语句来运行。

    read_default_file,使用指定的MySQL配置文件。

    read_default_group,读取的默认组。

    unix_socket,在unix中,连接使用的套接字,默认使用TCP。

    port,指定数据库服务器的连接端口,默认是3306。

    连接对象的db.close()方法可关闭数据库连接,并释放相关资源。

    连接对象的db.cursor([cursorClass])方法返回一个指针对象,用于访问和操作数据库中的数据。

    连接对象的db.begin()方法用于开始一个事务,如果数据库的AUTOCOMMIT已经开启就关闭它,直到事务调用commit()和rollback()结束。

    连接对象的db.commit()和db.rollback()方法分别表示事务提交和回退。

    指针对象的cursor.close()方法关闭指针并释放相关资源。

    指针对象的cursor.execute(query[,parameters])方法执行数据库查询。

    指针对象的cursor.fetchall()可取出指针结果集中的所有行,返回的结果集一个元组(tuples)。

    指针对象的cursor.fetchmany([size=cursor.arraysize])从查询结果集中取出多行,我们可利用可选的参数指定取出的行数。

    指针对象的cursor.fetchone()从查询结果集中返回下一行。

    指针对象的cursor.arraysize属性指定由cursor.fetchmany()方法返回行的数目,影响fetchall()的性能,默认值为1。

    指针对象的cursor.rowcount属性指出上次查询或更新所发生行数。-1表示还没开始查询或没有查询到数据。

    7.3. 模块功能演示
    #!/usr/bin/python
    import MySQLdb

    try:
       connection = MySQLdb.connect(user="user",passwd="password",host="xxx",db="test")
    except:
       print "Could not connect to MySQL server."
       exit( 0 )

    try:
       cursor = connection.cursor()
       cursor.execute( "SELECT note_id,note_detail FROM note where note_id = 1" )
       print "Rows selected:", cursor.rowcount
       
       for row in cursor.fetchall():
           print "note : ", row[0], row[1]
       cursor.close()


    Chapter 8. Tkinter模块
    Table of Contents

    8.1. Tkinter简介
    8.1. Tkinter简介
    Tkinter是Python默认的图形界面接口,Tkinter是一个和Tk接口的Python模块,Tkinter库提供了对Tk API的接口,它属于Tcl/Tk的GUI工具组。Tcl/Tk是由John Ousterhout发展的书写和图形设备。Tcl(工具命令语言)是个宏语言,用于简化shell下复杂程序的开发,Tk工具包是和Tcl一起开发的,目的是为了简化用户接口的设计过程。Tk工具包由许多不同的小部件,如一个按钮、一个滚动条等。通过Tk提供的这些小部件,我们就可快速地进行GUI开发。Perl、Scheme等语言也利用Tk库进行GUI开发。Tkinter是跨平台,在各种平台下都能使用。

    Chapter 9. PyGTK
    Table of Contents

    9.1. 安装
    9.2. 示例
    PyGTK是一个用于python GUI程序开发的GTK+库,当前版本的PyGTK需要GTK+ 2.0以上版本支持和Python 2.2以上版本支持才能运行。

    9.1. 安装
    如果是在Debian系统中,则安装python2.3-gtk2软件包即可。如果要从源码安装,可到
    http://www.pygtk.org下载最新的软件包。安装方法也很简单,和其它开源软件差不多,通过configure、make和make install三步操作就可完成。具体操作你可参考源码目录下的README和INSTALL文档,里面有详细的安装说明。注意,要成功安装PyGTK,要有相应版本的GTK+和Python支持。在源码目录下有一个examples目录,这是一个宝贵的资源,里面有很多有用的PyGTK示例代码,对我们学习PyGTK很有帮助。

    9.2. 示例
    下面是一个PyGTK的示例,演示了PyGTK的基本概念。

    #!/usr/bin/env python
    #-*- encoding:utf-8 -*-

    import pygtk
    pygtk.require('2.0')
    import gtk

    class base:
    #destroy信号的回调函数
            def destroy(self,widget,data=None):
                    gtk.main_quit()

    #clicked信号的回调函数
            def hello(self,widget,data):
                    print 'hello ' + data + ' this is a button clicked() test'

    #delete_event事件的回调函数
            def delete_event(self, widget, event, data=None):
                    print "delete event occurred"
    #如果delete_event事件返回假,则会触发destroy信号,从而关闭窗口。
    #如果返回真,则不会关闭窗口。这个特性在当我们需要一个确认是否退出的选择对话框时是很有用。
                    return gtk.FALSE

            def __init__(self):
                    self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
    #设置窗口的delete_event信号触发delete_event函数
                    self.window.connect("delete_event", self.delete_event)
    #设置窗口的destroy信号触发destroy函数
                    handler1 = self.window.connect("destroy",self.destroy)
                    print "handler1 is:%d" % handler1
                    self.window.set_title('PyGTK 测试 window')
                    self.window.set_default_size(200,200)
                    self.window.set_border_width(100)
    #控制窗口出现的位置
                    self.window.set_position(gtk.WIN_POS_CENTER)
    #生成按钮实例
                    self.button1 = gtk.Button()
                    self.button2 = gtk.Button()
                    self.button1.set_label('label1')
                    self.button2.set_label('label2')
    #设置按钮的clicked信号触发hello函数,并传递‘pyGTK’字符串参数给hello函数
                    handler2 = self.button1.connect("clicked",self.hello,"pyGTK")
                    print "handler2 is:%d" % handler2
    #设置按钮的clicked信号触发self..window对象的gtk.Widget.destroy方法
                    self.button1.connect_object("clicked", gtk.Widget.destroy, self.window)
    #取消handler2的功能
    #               self.button.disconnect(handler2)
    #设置一个不可见的横向的栏位self.box1
                    self.box1 = gtk.HBox(gtk.FALSE, 0)
    #把box1放到窗口中
                    self.window.add(self.box1)
    #把button1部件放到box1中
                    self.box1.pack_start(self.button1,gtk.TRUE,gtk.TRUE,0)
                    self.button1.show()
    #把button2部件放到button1部件之后
                    self.box1.pack_start(self.button2,gtk.TRUE,gtk.TRUE,0)
                    self.button2.show()
                    self.box1.show()
                    self.window.show()

            def main(self):
                    gtk.main()

    print __name__
    if __name__ == "__main__":
            base = base()
            base.main()

    有关PyGTK的详细介绍请参考我整理的“PyGTK学习笔记”。

    Chapter 10. PyQt
    Table of Contents

    10.1. 安装
    PyQt是一套用于python的Qt开发库,由一系列的模块组成,有qt, qtcanvas, qtgl, qtnetwork, qtsql, qttable, qtui and qtxml,包含有300个类和超过5750个的函数和方法。

    PyQt还支持一个叫qtext的模块,它包含一个QScintilla库。该库是Scintillar编辑器类的Qt接口。

    10.1. 安装
    http://www.riverbankcomputing.co.uk/pyqt/download.php下载最新的版本。安装PyQt需要先安装SIP,到以这里下载。SIP是一个把C\C++库转换成Python模块的工具。

    安装SIP

    % tar -zxvf sip-4.1.1.tar.gz
    % cd sip-4.1.1
    % python configure.py -l qt          # -l qt 选项指定qt版本
    % make
    % make install

    安装PyQt

    % tar -zxvf PyQt-x11-gpl-3.13.tar.gz
    % cd PyQt-x11-gpl-3.13
    % python configure.py
    % make
    % make install

    Chapter 11. PyMedia
    PyMedia模块是一个用于多媒体操作的python模块。它提供了丰富而简单的接口用于多媒体处理(wav, mp3, ogg, avi, divx, dvd, cdda etc)。可在Windows和Linux平台下使用。

    Chapter 12. Python-ldap
    Table of Contents

    12.1. 示例
    Python-ldap模块提供一组面向对象的API,可方便地在python中访问ldap目录服务,它基于OpenLDAP2.x。

    12.1. 示例
    以下示例在python-ldap网站上有列出,这里作一下简要说明:

    #!/usr/bin/python
    #-*- coding:utf-8 -*-                          #设置源码文件编码为utf-8

    import ldap                        

    try:
       conn = ldap.open("server_name")             #server_name为ldap服务器名
       conn.protocol_version = ldap.VERSION3       #设置ldap协议版本
       username = "cn=admin,dc=company,dc=com"     #用户名
       password = "123"                            #访问密码
       conn.simple_bind(username,password)         #连接

    except ldap.LDAPError, e:                      #捕获出错信息
       print e

    baseDN = "dc=employees,dc=company,dc=com"      #设置目录的搜索路径起点
    searchScope = ldap.SCOPE_SUBTREE               #设置可搜索子路径

    retrieveAttributes = None                      #None表示搜索所有属性,['cn']表示只搜索cn属性
    searchFilter = "cn=test"                       #设置过滤属性,这里只显示cn=test的信息

    try:
       ldap_result_id = conn.search(baseDN,searchScope,searchFilter,retrieveAttributes)                                 
    #调用search方法返回结果id
       result_set = []
    while 1:
       result_type, result_data = conn.result(ldap_result_id, 0)       #通过结果id返回信息
       if result_data == []:
          break
       else:
          if result_type == ldap.RES_SEARCH_ENTRY:
             result_set.append(result_data)                  

       print result_set[0][0][1]['o'][0]       #result_set是一个复合列表,需通过索引返回组织单元(o)信息

    except ldap.LDAPError, e:
       print e

    这里采用的是非同步方式,同步方式的连接和搜索命令后有“_s”后缀,如search_s。非同步方式需通过一个结果id来访问目录服务信息。

    下面是一个修改目录信息的示例:

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    import ldap

    try:
       conn = ldap.open("server_name")
       conn.protocol_version = ldap.VERSION3
       username = "cn=admin,dc=company,dc=com"
       password = "123"
       conn.simple_bind_s(username,password)

    except ldap.LDAPError, e:
       print e

    try:
       dn = "cn=test,dc=employees,dc=company,dc=com"
       conn.modify_s(dn,[(ldap.MOD_ADD,'mail','test@163.com')])     #增加一个mail属性
    except ldap.LDAPError, e:
       print e

    ldap.MOD_ADD表示增加属性,ldap.MOD_DELETE表示删除属性,ldap.MOD_REPLACE表示修改属性。

    下面是一个增加目录项的示例:

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    import ldap,ldap.modlist                 #ldap.modlist是ldap的子模块,用于格式化目录服务的数据项

    try:
            conn = ldap.open("server_name")
            conn.protocol_version = ldap.VERSION3
            username = "cn=admin,dc=company,dc=com"
            password = "123"
            conn.simple_bind_s(username,password)

    except ldap.LDAPError, e:
            print e

    try:
            dn = "cn=test,dc=card,dc=company,dc=com"
            modlist = ldap.modlist.addModlist({          #格式化目录项,除对象类型要求必填项外,
            'cn': ['test'],                              #其它项可自由增减                       
            'objectClass': ['top', 'person', 'organizationalPerson', 'inetOrgPerson'],
            'o': ['\xe5\xb9\xbf\xe5\xb7\x9e'],           #这些为utf-8编码的中文
            'street': ['\xe5\xb9\xbf\xe5\xb7\x9e'],
            'sn': ['tester'],
            'mail': ['test@163.com', 'test@21cn.com'],
            'homePhone': ['xxxxxxxx'], 'uid': ['test'] })
    #       print modlist                                #显示格式化数据项,格式化后是一个元组列表
            conn.add_s(dn,modlist)                       #调用add_s方法添加目录项

    except ldap.LDAPError, e:
            print e

    其实我们也可按格式化后元组列表的形式把目录项直接写到add_s()里,省却转换的步骤。

    下面是一个删除目录项的示例:

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    import ldap

    try:
            conn = ldap.open("server_name")
            conn.protocol_version = ldap.VERSION3
            username = "cn=admin,dc=company,dc=com"
            password = "123"
            conn.simple_bind_s(username,password)

    except ldap.LDAPError, e:
            print e

    try:
            dn = "cn=sale,dc=company,dc=com"
            conn.delete_s(dn)

    except ldap.LDAPError, e:
            print e

    Chapter 13. ftplib -- FTP protocol client
    Table of Contents

    13.1. 示例
    ftplib模块定义了FTP类和一些方法,用以进行客户端的ftp编程。我们可用python编写一个自已的ftp客户端程序,用于下载文件或镜像站点。如果想了解ftp协议的详细内容,请参考RFC959。

    13.1. 示例
    该模块是python的通用模块,所以默认应该已安装。ftplib模块使用很简单,暂时只有一个FTP类和十几个函数。下面用一个交互方式演示一下ftplib的主要功能。

    >>> from ftplib import FTP
    >>> ftp=FTP('ftp.python.org')
    >>> ftp.login()
    '230 Login successful.'
    >>> ftp.dir()
    drwxrwxr-x    7 1004     1004          512 Aug 13 01:35 pub
    >>> ftp.cwd('pub')
    '250 Directory successfully changed.'
    >>> ftp.dir()
    drwxrwxr-x    5 1000     1004         1024 Dec 24 11:04 docs.python.org
    drwxrwsr-x    2 1002     1004          512 Oct 12  2001 jython
    lrwx------    1 0        1003           25 Aug 03  2001 python ->
    www.python.org/ftp/python
    drwxr-xr-x    9 1018     1004          512 Feb 02 03:44 pyvault
    drwxr-xr-x    2 1005     1004          512 May 06  2003 tmp
    drwxrwsr-x   59 1004     1004         3072 Feb 03 14:58
    www.python.org
    >>> ftp.quit()
    '221 Goodbye.'

    下面一个下载文件的示例

    #!/usr/bin/env python

    #author:Jims of
    www.ringkee.com
    #create date: 2005/02/05
    #description: Using ftplib module download a file from a ftp server.

    from ftplib import FTP

    ftp=FTP()

    ftp.set_debuglevel(2)              #打开调试级别2,显示详细信息
    ftp.connect('ftp_server','port')   #连接
    ftp.login('username','password')   #登录,如果匿名登录则用空串代替即可

    print ftp.getwelcome()             #显示ftp服务器欢迎信息
    ftp.cwd('xxx/xxx/')                #选择操作目录
    bufsize = 1024                     #设置缓冲块大小
    filename='dog.jpg'                        
    file_handler = open(filename,'wb').write              #以写模式在本地打开文件
    ftp.retrbinary('RETR dog.jpg',file_handler,bufsize)   #接收服务器上文件并写入本地文件
    ftp.set_debuglevel(0)                                 #关闭调试

    ftp.quit()                                            #退出ftp服务器

    下面一个上传文件的示例,要成功运行该脚本,需在ftp服务器上有上传文件的权限。

    #!/usr/bin/env python

    #author:Jims of
    www.ringkee.com
    #create date: 2005/02/05
    #description: Using ftplib module upload a file to a ftp server.

    from ftplib import FTP

    ftp=FTP()

    ftp.set_debuglevel(2)
    ftp.connect('ftp_server','port')
    ftp.login('username','password')

    print ftp.getwelcome()
    ftp.cwd('xxx/xxx/')
    bufsize = 1024
    filename='dog.jpg'
    file_handler = open(filename,'rb')
    ftp.storbinary('STOR dog.jpg',file_handler,bufsize)   #上传文件
    ftp.set_debuglevel(0)

    file_handler.close()         #关闭文件
    ftp.quit()

    是不是很简单,其它功能可查询python的官方网站,网址是
    http://docs.python.org/lib/module-ftplib.html

    Chapter 14. Psyco
    Table of Contents

    14.1. 安装
    Psyco是一个Python代码加速度器,可使Python代码的执行速度提高到与编译语言一样的水平。

    14.1. 安装
    安装Psyco很简单,它有两种安装方式,一种是源码方式,一种是二进制码方式:

    如果用源码方式安装,你需在源码的目录中调用python setup.py install命令编译生成psyco子目录,再把该子目录整个拷贝到python的site-packages目录下。

    如果用二进制码方式安装,按这个网址列表中的python与psyco版本对应表下载合适的二进制文件,解压后会生成一个psyco-1.x的目录,把该目录下的psyco目录整个拷贝到python的site-packages目录下即可。

    Chapter 15. smtplib
    Table of Contents

    15.1. 示例
    15.1. 示例
    smtplib模块以发送电子邮件。下面是一个示例,可发送附件。

    #!/usr/bin/python
    #-*- encoding:utf-8 -*-

    import smtplib,mimetypes
    from email import Encoders
    from email.MIMEBase import MIMEBase
    from email.MIMEText import MIMEText
    from email.MIMEMultipart import MIMEMultipart

    msg = MIMEMultipart()                        #创建可包含附件的MIME对象
    msg['Subject'] = 'this is title'
    msg['From'] = 'yjnet@21cn.com'
    msg['To'] = 'yjnet@21cn.com'

    txt = MIMEText('这是邮件正文的中文测试。',_charset='utf-8')
    msg.attach(txt)

    filename = 'jdk15.tar'                      #附件名
    fp = open(filename,'rb')
    ctype,encoding = mimetypes.guess_type(filename)
    if ctype is None or encoding is not None:
            ctype = 'application/octet-stream'
    maintype,subtype = ctype.split('/',1)
    m = MIMEBase(maintype,subtype)
    m.set_payload(fp.read())
    fp.close()
    Encoders.encode_base64(m)                                             #把附件编码
    m.add_header('Content-disposition','attachment',filename=filename)    #修改邮件头
    msg.attach(m)                                                         #添加附件

    s = smtplib.SMTP('smtp.21cn.com')                                     #连接邮件服务器
    s.login('yjnet','****')                                               #登录邮件服务器
    s.sendmail('yjnet@21cn.com','yjnet@21cn.com',msg.as_string())         #发送邮件
    s.close()

    Chapter 16. XMPPPY
    Table of Contents

    16.1. 示例
    16.2. cjkcodecs
    Jabber服务器采用开发的XMPP协议,Google Talk也是采用XMPP协议的IM系统。在Python中有一个xmpppy模块支持该协议。也就是说,我们可以通过该模块与Jabber服务器通信,是不是很Cool。

    16.1. 示例
    下面是一个简单的示例,可使大家对该模块有一个大概的了解。

    #导入xmpppy模块
    >>> import xmpp
    #建立Client实例,debian是我的jabber服务器名,jabber服务器的安装可参考我的Debian学习笔记。
    >>> c=xmpp.Client('debian',debug=[])
    #连接
    >>> c.connect()
    'tcp'
    #验证
    >>> c.auth('yangjing','12345')
    'old_auth'
    #登入
    >>> c.sendInitPresence()
    #向ringkee@debian
    >>> c.send(xmpp.protocol.Message('ringkee@debian ','test message from yangjing'))
    '20'
    #下面测试信息接收功能,如果没有信息,则pending_data()为空
    >>>c.TCPsocket.pending_data()
    []
    #如果有信息,则pending_data()不为空
    >>> c.TCPsocket.pending_data()
    [<socket._socketobject object at 0xb795beb4>]
    #接收信息
    >>> c.TCPsocket.receive()
    "<message type='chat' to='yangjing@debian/xmpppy' from='ringkee@debian/Gaim'><x xmlns='jabber:x:event'><composing/></x><body>message from ringkee@debian</body><html xmlns='http://jabber.org/protocol/xhtml-im'><body xmlns='http://www.w3.org/1999/xhtml'>message from <a HREF='mailto:ringkee@debian'>ringkee@debian</a></body></html></message>"
    #登出
    >>> c.disconnect()

    16.2. cjkcodecs
    在python2.4版以前,python不能处理cjk(中国,日本和韩国)的编码,所以就有了cjkcodecs模块。安装该模块后Python就能处理cjk字符了。下载网址:
    http://cjkpython.i18n.org/
  • 开始学习python

    2009-07-14 08:55:22

    这几天不是很忙,闲着也是闲着,学点东西补充一下大脑,一直想弄懂一门编程语言,现在就动手吧!虽然其他的语言也了解一点点,但没有一门是精通的,对于测试人员来说,掌握一门编程语言是必不可少的。在网上逛了一大圈,看到不少的人在说python是一门开源工具语言,免费、易学。于是就从网上下载了些资料开始学习。呵呵,学一点是一点。能坚持多久是多久。相关的资料在网上一搜索一堆,在此我只是把我学到的进行简单的总结,也是对学习的一种温固吧!也可做以后学习的参考资料。

    下面是一些相关的网址:官方网站是www.byteofpython.info。可以在这个网站上在线阅读本书,也可以下载本书的最新版本。

    一、python的特色:

    (1)简单(2)易学(3)免费、开源(4)高层语言(5)可移植性(6)解释性(7)面向对象(8)可扩展性(9)可嵌入性(10)丰富的库

    二、有关python的清屏,在网上查找有人说可以用以下模式试试看,打以下命令
    .>> import os
    .>> os.system('cls')
    结果是:

    >>> import os
    >>> os.system('cls')
    0

    没能实现清屏功能,此问题现在到此,等得到确切答案再做补充。

Open Toolbar