<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Known</title><subtitle type="text">站得高，看得远。.NET、SharePoint、QTP。</subtitle><id>http://feed.cnblogs.com/blog/u/24837/rss</id><updated>2012-04-17T00:33:46Z</updated><author><name>known</name><uri>http://www.cnblogs.com/known/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/known/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/24837/rss"/><entry><id>http://www.cnblogs.com/known/archive/2011/09/20/2182706.html</id><title type="text">VBScript之Eval函数与Execute语句（Array.ForEach的实现）</title><summary type="text">每当使用C#中的Array.ForEach时，感觉很爽。最近在做QTP自动化测试时，偶然在QTP自带示例中看到一段代码可以动态调用方法，于是先喜若狂，着手改编了一下，写了一个VBScript版的Array.ForEach功能，使用起来确实不错。其实关键的一个地方就在于使用了VBScript中的Eval函数。首先我们来看看Eval函数的作用。1. Eval函数Eval函数主要是计算一个表达式的值并返回结果。其签名如下：[result = ]Eval(expression)参数如下：result：可选项。是一个变量，用于接受返回的结果。如果未指定结果，应考虑使用Execute语句代替。expres</summary><published>2011-09-20T13:56:00Z</published><updated>2011-09-20T13:56:00Z</updated><author><name>known</name><uri>http://www.cnblogs.com/known/</uri></author><link rel="alternate" href="http://www.cnblogs.com/known/archive/2011/09/20/2182706.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/known/archive/2011/09/20/2182706.html"/><content type="html">&lt;p&gt;每当使用C#中的Array.ForEach时，感觉很爽。最近在做QTP自动化测试时，偶然在QTP自带示例中看到一段代码可以动态调用方法，于是先喜若狂，着手改编了一下，写了一个VBScript版的Array.ForEach功能，使用起来确实不错。其实关键的一个地方就在于使用了VBScript中的Eval函数。首先我们来看看Eval函数的作用。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. Eval函数&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Eval函数主要是计算一个表达式的值并返回结果。其签名如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;[result = ]Eval(expression)&lt;br/&gt;&lt;/div&gt;&lt;p&gt;参数如下：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;result：可选项。是一个变量，用于接受返回的结果。如果未指定结果，应考虑使用Execute语句代替。&lt;/li&gt;&lt;li&gt;expression：必选项。可以是包含任何有效VBScript表达式的字符串。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;在VBScript中，x = y可以有两种解释。第一种方式是赋值语句，将y的值赋予x。第二种解释是测试x和y是否相等。如果相等，result为True；否则result为False。Eval方法总是采用第二种解释，而Execute语句总是采用第一种。下面是Eval函数的简单示例：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Dim a, b&lt;br/&gt;a = 1&lt;br/&gt;b = 2&lt;br/&gt;MsgBox Eval("a + b")&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2. Excute语句&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;执行一个或多个指定的语句。其签名如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Execute statements&lt;br/&gt;&lt;/div&gt;&lt;p&gt;所需要的statements参数是一个字符串表达式，其中包含一个或多个要执行的语句。如果要在statements参数中包含多条语句，应使用冒号或嵌入的分行将其分隔开。下面是Execute语句的简单示例：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Dim a, b, c, d&lt;br/&gt;a = 1&lt;br/&gt;b = 2&lt;br/&gt;Execute "c = a + b : d = a + c"&lt;br/&gt;MsgBox c&lt;br/&gt;MsgBox d&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3. 自定义ForEach函数&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;ForEach函数有两个参数，一个是数组变量，一个是遍历方法名称。其实现代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Sub ForEach(source, method)&lt;br/&gt;    Dim i, current&lt;br/&gt;    For i = 0 To UBound(source)&lt;br/&gt;        If IsObject(source(i)) Then '判断数组元素是否为对象&lt;br/&gt;            Set current = source(i)&lt;br/&gt;        Else&lt;br/&gt;            current = source(i)&lt;br/&gt;        End If&lt;br/&gt;        Eval(method &amp;amp; "(current)") '调用遍历方法&lt;br/&gt;    Next&lt;br/&gt;End Sub&amp;nbsp;&lt;/div&gt;&lt;p&gt;遍历一个整数数组的示例：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;'显示数组元素方法&lt;br/&gt;Function ShowValue(val)&lt;br/&gt;    MsgBox val&lt;br/&gt;End Function&lt;br/&gt;&lt;br/&gt;Dim i, arr(10)&lt;br/&gt;'给数组元素赋值&lt;br/&gt;For i = 0 To 10&lt;br/&gt;    arr(i) = i&lt;br/&gt;Next&lt;br/&gt;'调用ForEach遍历&lt;br/&gt;Call ForEach(arr, "ShowValue")&lt;br/&gt;&lt;/div&gt;&lt;p&gt;遍历一个对象数组的示例：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;'用户类&lt;br/&gt;Class User&lt;br/&gt;    '用户属性&lt;br/&gt;    Public UserName, Email&lt;br/&gt;&lt;br/&gt;    'ToString方法&lt;br/&gt;    Function ToString()&lt;br/&gt;        ToString = Me.UserName &amp;amp; " : " &amp;amp; Me.Email&lt;br/&gt;    End Function&lt;br/&gt;End Class&lt;br/&gt;&lt;br/&gt;'显示用户信息方法&lt;br/&gt;Function ShowUser(usr)&lt;br/&gt;    MsgBox usr.ToString()&lt;br/&gt;End Function&lt;br/&gt;&lt;br/&gt;Dim arr(5), u&lt;br/&gt;'给数组元素赋值&lt;br/&gt;For i = 0 To 5&lt;br/&gt;    Set u = New User&lt;br/&gt;    u.UserName = "user" &amp;amp; CStr(i)&lt;br/&gt;    u.Email    = "user" &amp;amp; CStr(i) &amp;amp; "@xxx.com"&lt;br/&gt;    Set arr(i) = u&lt;br/&gt;Next&lt;br/&gt;'调用ForEach遍历&lt;br/&gt;Call ForEach(arr, "ShowUser")&lt;br/&gt;&lt;/div&gt;&lt;p&gt;看代码很简洁，不是嘛，原来VBScript也可以像C#一样使用ForEach。VBScript应该还能够实现C#中的其他很多特性，以后在编写测试代码过程中，要不断去总结。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/known/aggbug/2182706.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/known/archive/2011/09/20/2182706.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/known/archive/2011/09/12/2173586.html</id><title type="text">QTP自动化测试之VBScript对象</title><summary type="text">VBScript作为脚本语言不仅能够编写简单的脚本，而且还能够创建及使用对象编写复杂的脚本，如Class对象，数据字典，操作文件夹及文件，错误处理，正则表达式等等。1. Class对象2. Dictionary对象3. FileSystemObject对象4. Err对象5. RegExp对象1. Class对象使用Class语句可以创建一个对象，可以为它编写字段、属性及方法，它只有两个对象事件——Initialize与Terminate。首先来看一个简单的Class示例：Class User '私有字段，也可以使用Public语句定义公有字段 Private m_UserName..</summary><published>2011-09-12T01:19:00Z</published><updated>2011-09-12T01:19:00Z</updated><author><name>known</name><uri>http://www.cnblogs.com/known/</uri></author><link rel="alternate" href="http://www.cnblogs.com/known/archive/2011/09/12/2173586.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/known/archive/2011/09/12/2173586.html"/><content type="html">&lt;p&gt;VBScript作为脚本语言不仅能够编写简单的脚本，而且还能够创建及使用对象编写复杂的脚本，如Class对象，数据字典，操作文件夹及文件，错误处理，正则表达式等等。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;1. Class对象&lt;br /&gt;2. Dictionary对象&lt;br /&gt;3. FileSystemObject对象&lt;br /&gt;4. Err对象&lt;br /&gt;5. RegExp对象&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;1. Class对象&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;使用Class语句可以创建一个对象，可以为它编写字段、属性及方法，它只有两个对象事件&amp;mdash;&amp;mdash;&lt;strong&gt;Initialize&lt;/strong&gt;与&lt;strong&gt;Terminate&lt;/strong&gt;。首先来看一个简单的Class示例：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Class User&lt;br/&gt;    '私有字段，也可以使用Public语句定义公有字段&lt;br/&gt;    Private m_UserName&lt;br/&gt;    Private m_Profile&lt;br/&gt;&lt;br/&gt;    'Initialize事件相当于构造函数&lt;br/&gt;    Private Sub Class_Initialize&lt;br/&gt;        m_UserName = Empty   '设置UserName初始值为空字符串&lt;br/&gt;    End Sub&lt;br/&gt;&lt;br/&gt;    'Terminate事件相当于析构函数&lt;br/&gt;    Private Sub Class_Terminate&lt;br/&gt;        Set m_Profile = Nothing   '将对象设置为Nothing，销毁对象&lt;br/&gt;    End Sub&lt;br/&gt;&lt;br/&gt;    'Property Get语句，获取属性值或对象引用，Default只与Public一起使用，表示该属性为类的默认属性&lt;br/&gt;    Public Default Property Get UserName&lt;br/&gt;        UserName = m_UserName&lt;br/&gt;    End Property&lt;br/&gt;    'Property Let语句，设置属性值&lt;br/&gt;    Public Property Let UserName(newUserName)&lt;br/&gt;        m_UserName = newUserName&lt;br/&gt;    End Property&lt;br/&gt;&lt;br/&gt;    Public Property Get Profile&lt;br/&gt;        Set Profile = m_Profile&lt;br/&gt;    End Property&lt;br/&gt;    'Property Set语句，设置属性对象引用&lt;br/&gt;    Public Property Set Profile(newProfile)&lt;br/&gt;        Set m_Profile = newProfile&lt;br/&gt;    End Property&lt;br/&gt;&lt;br/&gt;    'ToString方法&lt;br/&gt;    Public Function ToString()&lt;br/&gt;        ToString = "Hello! " &amp;amp; Me.UserName   'Me相当于C#中的this关键字&lt;br/&gt;    End Function&lt;br/&gt;End Class&lt;br/&gt;&lt;/div&gt;&lt;p&gt;用VBScript创建的对象并不是真正的面向对象，它不能继承和实现多态，但是在QTP对象模型Utility中，提供了一个RegisterUserFunc方法可以覆写对象的方法，但这也不是真正意义上的面向对象。Class及其成员如何创建，上面已经简单介绍过，若要对其中的一些语句进一步了解，还需要去仔细阅读一些参考文档。下面我们来看看如何调用对象，在&lt;a href="http://www.cnblogs.com/known/archive/2011/09/09/2171647.html"&gt;《VBScript基础上》&lt;/a&gt;变量赋值中也已经提到过。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Dim u                  '定义对象变量名，注意变量名不能与类名相同，即使是大小写不同&lt;br/&gt;Set u = New User       '创建对象用New语句&lt;br/&gt;u.UserName = "known"   '给属性赋值&lt;br/&gt;MsgBox u.ToString()    '调用方法&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2. Dictionary对象&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Dictionary是存储数据键和项目对的对象，其主要属性有Count、Item、Key，主要方法有Add、Exists、Items、Keys、Remove、RemoveAll。下面是该对象的一个综合示例：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;'定义并创建Dictionary对象，使用CreateObject创建并返回自动化对象的引用&lt;br/&gt;Dim d&lt;br/&gt;Set d = CreateObject("Scripting.Dictionary")&lt;br/&gt;&lt;br/&gt;'向Dictionary对象中添加键值对&lt;br/&gt;d.Add "a", "Known"    'Add方法第一个参数是Key值，第二个是Item值&lt;br/&gt;d.Add "b", "Christina"&lt;br/&gt;d.Add "c", "test"&lt;br/&gt;d.Add "d", "fuck"&lt;br/&gt;Call ShowDictionary(d)&lt;br/&gt;&lt;br/&gt;'遍历Dictionary对象，更改Item值&lt;br/&gt;For i = 0 To d.Count - 1     'Count返回Dictionary对象中的项目数&lt;br/&gt;    If d.Exists("c") Then    'Exists判断Dictionary对象中是否存在指定关键字&lt;br/&gt;        d.Item("c") = "Test" 'Item返回Dictionary对象中指定Key的Item值&lt;br/&gt;    End If&lt;br/&gt;Next&lt;br/&gt;d.Remove("d")  'Remove从Dictionary对象中删除一个关键字，项目对。&lt;br/&gt;Call ShowDictionary(d)&lt;br/&gt;&lt;br/&gt;'输出Dictionary对象所有键值&lt;br/&gt;Sub ShowDictionary(dic)&lt;br/&gt;    Dim str, a&lt;br/&gt;    a = dic.Items  'Items返回一个包含所有Item值的数组&lt;br/&gt;    For i = 0 To dic.Count - 1&lt;br/&gt;        str = str &amp;amp; a(i) &amp;amp; vbCrlf&lt;br/&gt;    Next&lt;br/&gt;    MsgBox(str)&lt;br/&gt;End Sub&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3. FileSystemObject对象&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;FileSystemObject对象可以操作驱动器、文件夹及文件，其对象模型包含下面的对象和集合。&lt;/p&gt;&lt;table class="grid"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th width="20%"&gt;对象/集合&lt;/th&gt;&lt;th width="80%"&gt;描述&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;FileSystemObject&lt;/td&gt;&lt;td&gt;主对象。包含用来创建、删除和获得有关信息，以及通常用来操作驱动器、文件夹和文件的方法和属性。和该对象相关联的许多方法，与其他 FSO 对象中的方法完全相似；它们是为了方便才被提供的。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Drive&lt;/td&gt;&lt;td&gt;对象。包含用来收集信息的方法和属性，这些信息是关于连接在系统上的驱动器的，如驱动器的共享名和它有多少可用空间。请注意，"drive" 并非必须是硬盘，也可以是 CD-ROM 驱动器，RAM 磁盘等等。并非必须把驱动器实物地连接到系统上；它也可以通过网络在逻辑上被连接起来。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Drives&lt;/td&gt;&lt;td&gt;集合。提供驱动器的列表，这些驱动器实物地或在逻辑上与系统相连接。&lt;b&gt;Drives&lt;/b&gt; 集合包括所有驱动器，与类型无关。要可移动的媒体驱动器在该集合中显现，不必把媒体插入到驱动器中。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;File&lt;/td&gt;&lt;td&gt;对象。包含用来创建、删除或移动文件的方法和属性。也用来向系统询问文件名、路径和多种其他属性。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Files&lt;/td&gt;&lt;td&gt;集合。提供包含在文件夹内的所有文件的列表。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Folder&lt;/td&gt;&lt;td&gt;对象。包含用来创建、删除或移动文件夹的方法和属性。也用来向系统询问文件夹名、路径和多种其他属性。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Folders&lt;/td&gt;&lt;td&gt;集合。提供在 &lt;b&gt;Folder&lt;/b&gt; 内的所有文件夹的列表。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TextStream&lt;/td&gt;&lt;td&gt;对象。用来读写文本文件。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;FileSystemObject对象所有属性、方法及对象和集合的详细说明，您可以查阅参考文档，因为内容比较多，我们就看一个简单的示例，直观地来了解一下该对象的使用，该示例是将一个文件复制到指定文件夹下。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;'定义并创建对象&lt;br/&gt;Dim fso, filePath, folderPath&lt;br/&gt;Set fso = CreateObject("Scripting.FileSystemObject")&lt;br/&gt;filePath = "C:\\Test.txt"&lt;br/&gt;folderPath = "D:\\Test"&lt;br/&gt;Call MoveFile(filePath, folderPath)&lt;br/&gt;&lt;br/&gt;'将文件移动到指定文件夹&lt;br/&gt;Sub MoveFile(sourceFile, targetFolder)&lt;br/&gt;    Dim file, fileName&lt;br/&gt;    '获取文件对象&lt;br/&gt;    Set file = fso.GetFile(sourceFile)&lt;br/&gt;    '判断目标文件夹是否存在&lt;br/&gt;    If Not fso.FolderExists(targetFolder) Then&lt;br/&gt;        fso.CreateFolder(targetFolder)&lt;br/&gt;    End If&lt;br/&gt;    '将文件移动到目标位置&lt;br/&gt;    file.Move(targetFolder &amp;amp; "\\" &amp;amp; file.Name)&lt;br/&gt;End Sub&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;4. Err对象&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Err对象是一个具有全局范围的内部对象，不必在代码中创建它的实例，含有关于运行时错误的信息。主要属性有Description、HelpContext、HelpFile、Number、Source，主要方法有Clear、Raise，其属性及方法的详细说明详见参考文档。下面的示例说明了Err对象的用法：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;'示例1：&lt;br/&gt;On Error Resume Next&lt;br/&gt;Err.Raise 6  '产生溢出错误&lt;br/&gt;MsgBox("Error #" &amp;amp; CStr(Err.Number) &amp;amp; " " &amp;amp; Err.Description)&lt;br/&gt;Err.Clear&lt;br/&gt;&lt;br/&gt;'示例2：&lt;br/&gt;'定义数据库连接&lt;br/&gt;Dim conn&lt;br/&gt;Set conn = CreateObject("ADODB.Connection")&lt;br/&gt;conn.BeginTrans  '开始事务&lt;br/&gt;&lt;br/&gt;...&lt;br/&gt;&lt;br/&gt;'提交数据库事务错误处理&lt;br/&gt;On Error Resume Next&lt;br/&gt;If conn.Errors.Count &amp;gt; 0 Then&lt;br/&gt;    conn.RollbackTrans  '回滚事务&lt;br/&gt;Else&lt;br/&gt;    conn.CommitTrans    '提交事务&lt;br/&gt;End If&lt;br/&gt;Err.Clear&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;5. RegExp对象&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;RegExp是正则表达式对象，提供简单的正则表达式支持功能。主要属性有Global、IgnoreCase、Pattern，主要方法有Execute、Replace、Test，其属性及方法的详细说明详见参考文档。下面的示例说明了RegExp对象的用法：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Function RegExpTest(patrn, strng)&lt;br/&gt;    Dim regEx, match, matches            '建立变量。&lt;br/&gt;    Set regEx = New RegExp               '建立正则表达式。&lt;br/&gt;    regEx.Pattern = patrn                '设置模式。&lt;br/&gt;    regEx.IgnoreCase = True              '设置是否区分字符大小写。&lt;br/&gt;    regEx.Global = True                  '设置全局可用性。&lt;br/&gt;    Set matches = regEx.Execute(strng)   '执行搜索。&lt;br/&gt;    For Each match in matches            '遍历匹配集合。&lt;br/&gt;        retStr = retStr &amp;amp; "Match found at position "&lt;br/&gt;        retStr = retStr &amp;amp; match.FirstIndex &amp;amp; ". Match Value is '"&lt;br/&gt;        retStr = retStr &amp;amp; match.Value &amp;amp; "'." &amp;amp; vbCRLF&lt;br/&gt;    Next&lt;br/&gt;    RegExpTest = retStr&lt;br/&gt;End Function&lt;br/&gt;&lt;br/&gt;MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4"))&lt;br/&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/known/aggbug/2173586.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/known/archive/2011/09/12/2173586.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/known/archive/2011/09/09/2172647.html</id><title type="text">QTP自动化测试之VBScript基础（下）</title><summary type="text">要想使用QTP进行自动化测试，必须了解VBScript这门语言，对于使用过ASP或VB开发的人来说，VBScript已经再熟悉不过了，但是没有接触过VBScript的同学也不要灰心，因为这门语言简单易学。7. 条件语句8. 循环语句9. 过程7. 条件语句VBScript中可以使用以下条件语句：If…Then…Else语句Select Case语句7.1. If…Then…Else语句If…Then…Else语句结构如下：If condition Then statements [Else elsestatements]或者使用块形式If condition Then [statemen...</summary><published>2011-09-09T08:35:00Z</published><updated>2011-09-09T08:35:00Z</updated><author><name>known</name><uri>http://www.cnblogs.com/known/</uri></author><link rel="alternate" href="http://www.cnblogs.com/known/archive/2011/09/09/2172647.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/known/archive/2011/09/09/2172647.html"/><content type="html">&lt;p&gt;要想使用QTP进行自动化测试，必须了解VBScript这门语言，对于使用过ASP或VB开发的人来说，VBScript已经再熟悉不过了，但是没有接触过VBScript的同学也不要灰心，因为这门语言简单易学。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;7. 条件语句&lt;br /&gt;8. 循环语句&lt;br /&gt;9. 过程&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;7. 条件语句&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;VBScript中可以使用以下条件语句：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;If&amp;hellip;Then&amp;hellip;Else语句&lt;/li&gt;&lt;li&gt;Select Case语句&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;7.1. If&amp;hellip;Then&amp;hellip;Else语句&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;If&amp;hellip;Then&amp;hellip;Else语句结构如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;If condition Then statements [Else elsestatements]&lt;/div&gt;&lt;p&gt;或者使用块形式&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;If condition Then&lt;br/&gt;    [statements]&lt;br/&gt;[ElseIf condition-n Then&lt;br/&gt;    [elseifstatements]] . . .&lt;br/&gt;[Else&lt;br/&gt;    [elsestatements]]&lt;br/&gt;End If&lt;/div&gt;&lt;p&gt;主要参数：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;condition：为一个（多个）数值或字符串表达式，其运算结果为True或False，若condition为Null，则被视为False。&lt;/li&gt;&lt;li&gt;statements：为condition等于True时执行的一条或多条（以冒号分开）语句。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;对于短小简单的测试，可以使用单行形式（第一种语法），但块形式（第二种语法）提供了比单行形式更强的结构化与适应性，比较容易阅读、维护及调试。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;'1. 条件为True时&lt;br/&gt;'单行形式&lt;br/&gt;Dim myDate&lt;br/&gt;myDate = #2011-9-8#   '日期时间字符串需用#括起来&lt;br/&gt;If myDate &amp;lt; Now Then myDate = Now&lt;br/&gt;'块形式&lt;br/&gt;If i = 100 Then&lt;br/&gt;    c = True&lt;br/&gt;    i = 0&lt;br/&gt;End If&lt;br/&gt;&lt;br/&gt;'2. 条件为True和False时&lt;br/&gt;If user.UserName = "admin" Then&lt;br/&gt;    showAdminPage = True&lt;br/&gt;Else&lt;br/&gt;    showAdminPage = False&lt;br/&gt;End If&lt;br/&gt;&lt;br/&gt;'3. 对多个条件判断&lt;br/&gt;If value = 0 Then&lt;br/&gt;    MsgBox(0)&lt;br/&gt;ElseIf value = 1 Then&lt;br/&gt;    MsgBox(9999)&lt;br/&gt;Else&lt;br/&gt;    MsgBox("输入不合法！")&lt;br/&gt;End If&lt;/div&gt;&lt;p&gt;&lt;strong&gt;7.2. Select Case语句&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;语法结构如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Select Case testexpression&lt;br/&gt;    [Case expressionlist-n&lt;br/&gt;        [statements-n]] . . .&lt;br/&gt;    [Case Else expressionlist-n&lt;br/&gt;        [elsestatements-n]]&lt;br/&gt;End Select&lt;br/&gt;&lt;/div&gt;&lt;p&gt;主要参数：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;testexpression：任意数值或字符串表达式。&lt;/li&gt;&lt;li&gt;statements：当testexpression与expressionlist-n中的任意部分匹配时，执行的一条或多条语句。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Select Case结构提供了If...Then...ElseIf结构的另一个变通形式，功能与If...Then...ElseIf类似，但可以使代码更加简练易读，它与Case语句关联使用。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Dim value : value = 5   '多条语句在一行,需用冒号分开&lt;br/&gt;Select Case value&lt;br/&gt;    Case 0:&lt;br/&gt;        MsgBox(0)&lt;br/&gt;    Case 1:&lt;br/&gt;        MsgBox(9999)&lt;br/&gt;    Case Else&lt;br/&gt;        MsgBox("输入不合法！")&lt;br/&gt;End Select&lt;/div&gt;&lt;p&gt;&lt;strong&gt;8. 循环语句&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;VBScript中可以使用以下循环语句：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Do...Loop语句&lt;/li&gt;&lt;li&gt;While...Wend语句&lt;/li&gt;&lt;li&gt;For...Next语句&lt;/li&gt;&lt;li&gt;For Each...Next语句&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;8.1. Do&amp;hellip;Loop语句&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当（或直到）条件为&lt;b&gt;True&lt;/b&gt;时循环，语法结构如下：&lt;/p&gt;&lt;p&gt;当条件为&lt;b&gt;True&lt;/b&gt;时重复执行某语句块。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Do [{While | Until} condition]&lt;br/&gt;    [statements]&lt;br/&gt;    [Exit Do]&lt;br/&gt;    [statements]&lt;br/&gt;Loop&lt;/div&gt;&lt;p&gt;当条件变为&lt;b&gt;True&lt;/b&gt;之前重复执行某语句块。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Do&lt;br/&gt;    [statements]&lt;br/&gt;    [Exit Do]&lt;br/&gt;    [statements]&lt;br/&gt;Loop [{While | Until} condition]&lt;/div&gt;&lt;p&gt;主要参数：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;condition：数值或字符串表达式，其值为True或False。如果condition为Null，则condition被当作False。&lt;/li&gt;&lt;li&gt;statements：当condition为True时被重复执行的一条或多条命令。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Exit Do可以退出循环体，循环可以嵌套使用。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Do Until response = vbNo&lt;br/&gt;    myNum = Int(6 * Rnd + 1)   '产生1到6之间的随机数&lt;br/&gt;    response = MsgBox(myNum &amp;amp; "想要另一个数吗？", vbYesNo)&lt;br/&gt;Loop&lt;br/&gt;&lt;br/&gt;Dim check, counter&lt;br/&gt;check = True : counter = 0&lt;br/&gt;Do&lt;br/&gt;    Do While count &amp;lt; 20&lt;br/&gt;        counter = counter + 1  '增加计数器&lt;br/&gt;        If counter = 10 Then&lt;br/&gt;            check = false&lt;br/&gt;            Exit Do   '终止内循环&lt;br/&gt;        End If&lt;br/&gt;    Loop&lt;br/&gt;Loop Until Not check&lt;/div&gt;&lt;p&gt;&lt;strong&gt;8.2. While&amp;hellip;Wend语句&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当条件为&lt;b&gt;True&lt;/b&gt;时循环，语法结构如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;While condition&lt;br/&gt;    [statements]&lt;br/&gt;Wend&lt;/div&gt;&lt;p&gt;主要参数：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;condition：数值或字符串表达式，其值为True或False。如果condition为Null，则condition被当作False。&lt;/li&gt;&lt;li&gt;statements：当condition为True时被重复执行的一条或多条命令。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;While&amp;hellip;Wend没有Exit语句，从头一直循环到尾，若要在中途退出，则需用Do&amp;hellip;Loop语句。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;8.3. For&amp;hellip;Next语句&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;指定循环次数，使用计数器重复运行语句，语法结构如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;For counter = start To end [Step step]&lt;br/&gt;    [statements]&lt;br/&gt;    [Exit For]&lt;br/&gt;    [statements]&lt;br/&gt;Next&lt;/div&gt;&lt;p&gt;主要参数：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;counter：用做循环计数器的数值变量。这个变量不能是数组元素或用户自定义类型的元素。&lt;/li&gt;&lt;li&gt;start：counter的初值。&lt;/li&gt;&lt;li&gt;end：counter的终值。&lt;/li&gt;&lt;li&gt;step：counter的步长。如果没有指定，则step的默认值为1。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;8.4. For Each&amp;hellip;Next语句&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;对于集合中的每项或数组中的每个元素，重复执行一组语句，语法结构如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;For Each element In group&lt;br/&gt;    [statements]&lt;br/&gt;    [Exit For]&lt;br/&gt;    [statements]&lt;br/&gt;Next [element]&lt;/div&gt;&lt;p&gt;主要参数：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;element：用来枚举集合或数组中所有元素的变量。对于集合，element可能是Variant变量、通用Object变量或任意指定的Automation对象变量。对于数组，element只能是Variant变量。&lt;/li&gt;&lt;li&gt;group：对象集合或数组的名称。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;9. 过程&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在VBScript中，过程被分为两类：Sub过程和Function过程。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;9.1 Sub过程&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;语法结构如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;[Public [Default] | Private] Sub name [(arglist)] &lt;br/&gt;    [statements]&lt;br/&gt;    [Exit Sub]&lt;br/&gt;    [statements]&lt;br/&gt;End Sub&lt;/div&gt;&lt;p&gt;主要参数：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Public：表示Sub过程可被所有脚本中的所有其他过程访问。&lt;/li&gt;&lt;li&gt;Default：只与Class块中的Public关键字连用，用来表示Sub过程是类的默认方法。如果在类中指定了不止一个Default过程，就会出错。&lt;/li&gt;&lt;li&gt;Private：表示Sub过程只可被声明该过程的脚本中的其他过程访问。&lt;/li&gt;&lt;li&gt;name：Sub的名称，遵循标准变量命名规则。&lt;/li&gt;&lt;li&gt;arglist：代表在调用时要传递给Sub过程的参数的变量列表。用逗号隔开多个变量。其语法为：[ByVal | ByRef] varname[()]，ByVal表示该参数是按值传递的，ByRef表示该参数按引用传递，varname代表参数的变量名称。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;如没有显式地指定使用Public或Private，则Sub过程默认为Public。调用Sub过程时，只需输入过程名及所有参数值，参数值之间使用逗号分隔。不需使用Call语句，但如果使用了此语句，则必须将所有参数包含在括号之中。调用Sub过程的两种方式。一种使用Call语句；另一种则不使用。两种方式效果相同，如：Call MySub(a, b)或MySub a, b。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;9.2 Function过程&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;语法结构如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;[Public [Default]| Private] Function name [(arglist)]&lt;br/&gt;    [statements]&lt;br/&gt;    [name = expression]&lt;br/&gt;    [Exit Function] &lt;br/&gt;    [statements]&lt;br/&gt;    [name = expression]&lt;br/&gt;End Function&lt;/div&gt;&lt;p&gt;主要参数：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Public：表示Function过程可被所有脚本中的所有其他过程访问。&lt;/li&gt;&lt;li&gt;Default：只与Class块中的Public关键字连用，用来表示Function过程是类的默认方法。如果在类中指定了不止一个Default过程，就会出错。&lt;/li&gt;&lt;li&gt;Private：表示Function过程只可被声明该过程的脚本中的其他过程访问。&lt;/li&gt;&lt;li&gt;name：Function的名称，遵循标准变量命名规则。&lt;/li&gt;&lt;li&gt;arglist：代表在调用时要传递给Function过程的参数的变量列表。用逗号隔开多个变量。其语法为：[ByVal | ByRef] varname[()]，ByVal表示该参数是按值传递的，ByRef表示该参数按引用传递，varname代表参数的变量名称。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;如没有显式地指定使用Public或Private，则Function过程默认为Public。调用Function过程时，函数名必须用在变量赋值语句的右端或表达式中，如：b = MyFunction(a)。要从函数返回一个值，只需将值赋给函数名。在过程的任意位置都可以出现任意个这样的赋值。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;9.3 Sub与Function的区别&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Sub没有返回值，而Function有返回值。&lt;/li&gt;&lt;li&gt;Sub不能放在表达式中，而Function可以。&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://www.cnblogs.com/known/aggbug/2172647.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/known/archive/2011/09/09/2172647.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/known/archive/2011/09/09/2171647.html</id><title type="text">QTP自动化测试之VBScript基础（上）</title><summary type="text">要想使用QTP进行自动化测试，必须了解VBScript这门语言，对于使用过ASP或VB开发的人来说，VBScript已经再熟悉不过了，但是没有接触过VBScript的同学也不要灰心，因为这门语言简单易学。1. VBScript利器 2. Hello World 3. 数据类型 4. 变量 5. 常数 6. 运算符1. VBScript利器子曰：工欲善其事，必先利其器。学习一门语言自然是离不开工具及文档，有好的工具及文档在手，学习起来也会得心应手。在此，我推荐大家一个很不错的编辑工具——VbsEdit，该工具既能编辑代码，又可调试代码，有不错的智能提示，还有很多示例代...</summary><published>2011-09-09T02:53:00Z</published><updated>2011-09-09T02:53:00Z</updated><author><name>known</name><uri>http://www.cnblogs.com/known/</uri></author><link rel="alternate" href="http://www.cnblogs.com/known/archive/2011/09/09/2171647.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/known/archive/2011/09/09/2171647.html"/><content type="html">&lt;p&gt;要想使用QTP进行自动化测试，必须了解VBScript这门语言，对于使用过ASP或VB开发的人来说，VBScript已经再熟悉不过了，但是没有接触过VBScript的同学也不要灰心，因为这门语言简单易学。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;1. VBScript利器   &lt;br /&gt;2. Hello World    &lt;br /&gt;3. 数据类型    &lt;br /&gt;4. 变量    &lt;br /&gt;5. 常数    &lt;br /&gt;6. 运算符&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;1. VBScript利器&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;子曰：工欲善其事，必先利其器。学习一门语言自然是离不开工具及文档，有好的工具及文档在手，学习起来也会得心应手。在此，我推荐大家一个很不错的编辑工具&amp;mdash;&amp;mdash;&lt;a href="http://www.vbsedit.com/"&gt;VbsEdit&lt;/a&gt;，该工具既能编辑代码，又可调试代码，有不错的智能提示，还有很多示例代码。可惜不是免费使用，不过网上已经有绿色版，您可以搜索下载。若你已经安装了QTP，那么使用QTP工具也是一个不错的选择。参考文档可以使用在线版&lt;a href="http://www.3http.com/book/script3/000.htm?vtorimicrosoftwindowsscripttechnologies.htm"&gt;《Microsoft Windows脚本技术》&lt;/a&gt;，也可以从网上搜索下载CHM文件。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. Hello World&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;每种语言的入门都是一样，从简单的Hello World开始，我们也不例外。如何使用VBScript来弹出一个对话框显示Hello World问候语呢？很简单，代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;MsgBox("Hello world!")&lt;br/&gt;MsgBox "Hello world!"&lt;br/&gt;result = MsgBox("Hello World!", vbOKOnly, "Greeting")&lt;br/&gt;MsgBox "Hello World!", vbOKOnly, "Greeting"&lt;/div&gt;&lt;p&gt;既然在此出现的第一个函数是MsgBox，那么就简单介绍一下该函数，其签名如下:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;MsgBox(prompt[, buttons][, title][, helpfile, context])&lt;/div&gt;&lt;p&gt;主要参数：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;prompt：为要显示的消息，其他带[]参数为可选参数；&lt;/li&gt;&lt;li&gt;buttons：为显示对话框按钮及类型，默认值为0，即只显示&amp;ldquo;确定&amp;rdquo;按钮；&lt;/li&gt;&lt;li&gt;title：为对话框标题栏文字。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;MsgBox函数也有返回值，当你点击确定或取消按钮时，其返回的值是不一样的。其他详细内容，大家可以去查阅参考文档，这里就不逐一说明。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. 数据类型&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;VBScript只有一种数据类型&amp;mdash;&amp;mdash;&lt;strong&gt;Variant&lt;/strong&gt;，它是根据上下文来判断是数字还是字符串。因为&lt;b&gt;Variant&lt;/b&gt;是VBScript中唯一的数据类型，所以它也是VBScript中所有函数的返回值的数据类型。为了进一步区分数据类型，它包含如下数据子类型：&lt;/p&gt;&lt;table class="grid"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th width="15%"&gt;子类型&lt;/th&gt;&lt;th width="85%"&gt;描述&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Empty&lt;/td&gt;&lt;td&gt;未初始化的&lt;b&gt;Variant&lt;/b&gt;。对于数值变量，值为0；对于字符串变量，值为零长度字符串 ("")。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Null&lt;/td&gt;&lt;td&gt;不包含任何有效数据的&lt;b&gt;Variant&lt;/b&gt;。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Boolean&lt;/td&gt;&lt;td&gt;包含True或False。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Byte&lt;/td&gt;&lt;td&gt;包含0到255之间的整数。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Integer&lt;/td&gt;&lt;td&gt;包含-32,768到32,767之间的整数。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Currency&lt;/td&gt;&lt;td&gt;-922,337,203,685,477.5808到922,337,203,685,477.5807。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Long&lt;/td&gt;&lt;td&gt;包含-2,147,483,648到2,147,483,647之间的整数。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Single&lt;/td&gt;&lt;td&gt;包含单精度浮点数，负数范围从-3.402823E38到-1.401298E-45，正数范围从1.401298E-45到3.402823E38。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Double&lt;/td&gt;&lt;td&gt;包含双精度浮点数，负数范围从-1.79769313486232E308到-4.94065645841247E-324，正数范围从4.94065645841247E-324到1.79769313486232E308。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Date (Time)&lt;/td&gt;&lt;td&gt;包含表示日期的数字，日期范围从公元100年1月1日到公元9999年12月31日。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;String&lt;/td&gt;&lt;td&gt;包含变长字符串，最大长度可为20亿个字符。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Object&lt;/td&gt;&lt;td&gt;包含对象。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Error&lt;/td&gt;&lt;td&gt;包含错误号。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;您可以使用转换函数（CInt，CStr等等）来转换数据的子类型。另外，可使用VarType函数返回数据的Variant子类型。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. 变量&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4.1. 变量声明&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;变量声明有两种方式&amp;mdash;&amp;mdash;显式与隐式，显式使用Dim、Public、Private语句进行声明，隐式直接使用变量名。使用隐式声明方式的习惯不好，因为这样有时会由于变量名拼错而导致程序运行出现意外，因此，最好在每个脚本开始第一行使用Option Explicit语句强制显式声明所有变量。声明示例如下:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Option Explicit&lt;br/&gt;Dim i, conn   '声明多个变量时用逗号隔开&lt;br/&gt;Public UserName, Password&lt;br/&gt;Private m_id&lt;/div&gt;&lt;p&gt;注意：在VBScript中，变量名是不区分大小写，即userName与UserName是指同一个变量。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4.2. 命名规则&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;VBScript中变量命名是有其规则标准的，变量命名必须遵循：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;第一个字符必须是字母。&lt;/li&gt;&lt;li&gt;不能包含嵌入的句点。&lt;/li&gt;&lt;li&gt;长度不能超过255个字符。&lt;/li&gt;&lt;li&gt;在被声明的作用域内必须唯一。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;4.3. 作用域与存活期&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;变量的作用域由声明它的位置所决定。如果在过程中声明的，则只有该过程可以使用，即过程级变量；如果在过程之外声明的，则该变量可以被脚本中所有过程所使用，即Script级变量。&lt;/p&gt;&lt;p&gt;变量所存在的时间为存活期。Script级变量的存活期为从被声明开始，直到脚本运行结束为止；过程级变量的存活期仅是过程被调用执行开始到结束的时间。不同的过程可以使用相同的变量名，因为局部变量只有声明它的过程才能识别。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4.4. 变量赋值&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;给变量赋值很简单，使用等号进行赋值，等号左边为变量名，右边为变量值。若该变量是对象引用级别的，则需使用Set语句。示例代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Dim i, conn, ui&lt;br/&gt;i = 0&lt;br/&gt;Set conn = CreateObject("ADODB.Connection")&lt;br/&gt;Set ui = New UserInfo&lt;/div&gt;&lt;p&gt;&lt;strong&gt;4.5. 标量与数组&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;只包含一个值的变量成为标量变量；有时候为了方便将一组相关值赋给一个变量,则成为数组变量。区别标量与数组的唯一方式是声明时数组变量名后面带有括号()。变量声明就不说了，前面已经提到，这里我们看看怎样声明一维数组及多维数组（最大60维&amp;mdash;&amp;mdash;:)只要您能够理解）。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Dim a(9), table(2, 3)&lt;br/&gt;a(0) = 1&lt;br/&gt;...&lt;br/&gt;a(9) = 11&lt;br/&gt;MsgBox(a(1))   '输出数组变量值&lt;br/&gt;&lt;br/&gt;table(0, 0) = 1&lt;br/&gt;...&lt;br/&gt;table(2, 3) = 10&lt;/div&gt;&lt;p&gt;我们也可以声明动态数组（在运行脚本时大小发生变化的数组），使用Dim或ReDim语句，但括号中不包含任何数字。要使用动态数组，必须随后使用ReDim确定维数和每一维的大小。若同时使用Preserve关键字，则在重新调整大小时保留数组的内容。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Dim count, a()&lt;br/&gt;count = 9&lt;br/&gt;ReDim a(count)&lt;br/&gt;ReDim Preserve a(10)&lt;/div&gt;&lt;p&gt;&lt;strong&gt;5. 常数&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;常数在VBScript中是表示不变的值，用于代替数字或字符串。其内部定义了许多常数，都是以vb开头，例如在Hello World程序中涉及到的MsgBox常数&amp;ldquo;vbOKOnly&amp;rdquo;。除了MsgBox常数外，还有颜色常数、比较常数、日期和时间常数等等，详见参考文档。&lt;/p&gt;&lt;p&gt;内部自带常数，我们可以直接使用。当自带常数不能满足我们的需求时，我们也可以自定义常数，在VBScript中是使用Const语句来定义常数，该语句的签名如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;[Public | Private] Const constname = expression&lt;/div&gt;&lt;p&gt;主要参数：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;constname：为常数名称，为了区分常数与变量，最好有一套自己的命名规则，这里推荐字母全大写，单词间用下划线分割；&lt;/li&gt;&lt;li&gt;expression：文字或其他常数，或包括除 &lt;b&gt;Is&lt;/b&gt; 外的所有算术运算符和逻辑运算符的任意组合。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;常数默认是Public级别，您也可以指定为Private级别，在同一行中声明多个常数需要用逗号分割，常数声明中不能使用变量、自定义函数及内部函数。下面是常数的一些示例代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Const PI = 3.14   '常数默认为公有。&lt;br/&gt;Private Const STEP_APPLY = "Apply"   '定义私有常数。&lt;br/&gt;Const STEP_APPLY = "Apply", PI  = 3.14   '在一行上定义多个常数。&lt;/div&gt;&lt;p&gt;&lt;strong&gt;6. 运算符&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;VBScript有一套完整的运算符，包括算术运算符、比较运算符、连接运算符和逻辑运算符。当表达式中含有多个运算符时，它们的运算优先级是：算术运算符 &amp;gt; 比较运算符 &amp;gt; 逻辑运算符。所有比较运算符的优先级相同，算术运算符和逻辑运算符的优先级如下所示：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6.1. 算术运算符&lt;/strong&gt;&lt;/p&gt;&lt;table class="grid"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th width="50%"&gt;描述&lt;/th&gt;&lt;th width="50%"&gt;符号&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;求幂&lt;/td&gt;&lt;td&gt;^&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;负号&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;乘&lt;/td&gt;&lt;td&gt;*&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;除&lt;/td&gt;&lt;td&gt;/&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;整除&lt;/td&gt;&lt;td&gt;\&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;求余&lt;/td&gt;&lt;td&gt;Mod&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;加&lt;/td&gt;&lt;td&gt;+&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;减&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;字符串连接&lt;/td&gt;&lt;td&gt;&amp;amp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;字符串连接 (&amp;amp;) 运算符不是算术运算符，但是在优先级顺序中，它排在所有算术运算符之后和所有比较运算符之前。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6.2. 逻辑运算符&lt;/strong&gt;&lt;/p&gt;&lt;table class="grid"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th width="50%"&gt;描述&lt;/th&gt;&lt;th width="50%"&gt;符号&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;逻辑非&lt;/td&gt;&lt;td&gt;Not&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;逻辑与&lt;/td&gt;&lt;td&gt;And&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;逻辑或&lt;/td&gt;&lt;td&gt;Or&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;逻辑异或&lt;/td&gt;&lt;td&gt;Xor&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;逻辑等价&lt;/td&gt;&lt;td&gt;Eqv&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;逻辑隐含&lt;/td&gt;&lt;td&gt;Imp&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;6.3. 比较运算符&lt;/strong&gt;&lt;/p&gt;&lt;table class="grid"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th width="50%"&gt;描述&lt;/th&gt;&lt;th width="50%"&gt;符号&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;等于&lt;/td&gt;&lt;td&gt;=&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;不等于&lt;/td&gt;&lt;td&gt;&amp;lt;&amp;gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;小于&lt;/td&gt;&lt;td&gt;&amp;lt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;大于&lt;/td&gt;&lt;td&gt;&amp;gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;小于等于&lt;/td&gt;&lt;td&gt;&amp;lt;=&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;大于等于&lt;/td&gt;&lt;td&gt;&amp;gt;=&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;对象引用比较&lt;/td&gt;&lt;td&gt;Is&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Is 运算符是对象引用比较运算符。它并不比较对象或对象的值，而只是进行检查，判断两个对象引用是否引用同一个对象。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/known/aggbug/2171647.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/known/archive/2011/09/09/2171647.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/known/archive/2011/08/18/2144012.html</id><title type="text">ASP.NET服务器端数据查询控件</title><summary type="text">最近写了一个简单的ASP.NET服务器端数据查询控件，该控件是对ASP.NET现有的GridView控件进行了一些扩展。现在分享一下成果，希望能帮助想要实现类似控件的童鞋。该控件有如下功能：自定义GridView分页；根据绑定字段及表名自动生成查询语句并执行；设置绑定字段Operator属性，自动生成查询条件；设置绑定字段CodeCategory属性，自动将代码字段转换为代码名称。导出Excel功能。示例代码如下：&lt;asp:QueryView ID="QueryView1" runat="server" CssClass="grid&amp;qu</summary><published>2011-08-18T01:30:00Z</published><updated>2011-08-18T01:30:00Z</updated><author><name>known</name><uri>http://www.cnblogs.com/known/</uri></author><link rel="alternate" href="http://www.cnblogs.com/known/archive/2011/08/18/2144012.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/known/archive/2011/08/18/2144012.html"/><content type="html">&lt;p&gt;最近写了一个简单的ASP.NET服务器端数据查询控件，该控件是对ASP.NET现有的GridView控件进行了一些扩展。现在分享一下成果，希望能帮助想要实现类似控件的童鞋。&lt;/p&gt;&lt;p&gt;该控件有如下功能：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;自定义GridView分页；&lt;/li&gt;&lt;li&gt;根据绑定字段及表名自动生成查询语句并执行；&lt;/li&gt;&lt;li&gt;设置绑定字段Operator属性，自动生成查询条件；&lt;/li&gt;&lt;li&gt;设置绑定字段CodeCategory属性，自动将代码字段转换为代码名称。&lt;/li&gt;&lt;li&gt;导出Excel功能。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;示例代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;lt;asp:QueryView ID="QueryView1" runat="server" CssClass="grid" QueryCssClass="form query" &lt;br/&gt;               ConnectionName="Default" EntityName="T_POST" AllowPaging="true" PagerSettings-Position="TopAndBottom"&amp;gt; &lt;br/&gt;    &amp;lt;AlternatingRowStyle CssClass="even" /&amp;gt; &lt;br/&gt;    &amp;lt;Columns&amp;gt; &lt;br/&gt;        &amp;lt;asp:BoundDataField DataField="TYPE" HeaderText="类别" ItemStyle-Width="15%" CodeCategory="PostType" &lt;br/&gt;                            Operator="Equal" ControlType="DropDownList" EmptyText="所有类别" /&amp;gt; &lt;br/&gt;        &amp;lt;asp:BoundDataField DataField="TITLE" HeaderText="标题" ItemStyle-Width="50%" Operator="Contain" /&amp;gt; &lt;br/&gt;        &amp;lt;asp:BoundDataField DataField="CREATED_BY" HeaderText="作者" ItemStyle-Width="15%" /&amp;gt; &lt;br/&gt;        &amp;lt;asp:BoundDataField DataField="CREATED_DATE" HeaderText="创建时间" ItemStyle-Width="20%" &lt;br/&gt;                            DataFormatString="{0:yyyy-MM-dd HH:mm:ss}" ItemStyle-HorizontalAlign="Center" /&amp;gt; &lt;br/&gt;    &amp;lt;/Columns&amp;gt; &lt;br/&gt;&amp;lt;/asp:QueryView&amp;gt;&lt;br/&gt;&lt;/div&gt;&lt;p&gt;运行效果图如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/known/201108/201108180929436140.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/known/201108/201108180929442727.png" width="739" height="586" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;源码下载：&lt;a href="http://files.cnblogs.com/known/QLite.rar"&gt;&lt;span style="color: #002c99;" color="#002c99"&gt;QLite.rar&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/known/aggbug/2144012.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/known/archive/2011/08/18/2144012.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/known/archive/2010/10/11/1848267.html</id><title type="text">面向对象设计的原则</title><summary type="text">SRP 单一职责原则就一个类而言，应该仅有一个引起它变化的原因。OCP 开放—封闭原则软件实体（类、模块、函数等）应该是可以扩展的，但是不可修改。LSP Liskov替换原则子类型必须能够替换掉它们的基类型。DIP 依赖倒置原则抽象不应该依赖于细节。细节应该依赖于抽象。ISP 接口隔离原则不应该强迫客户依赖于它们不用的方法。接口属于客户，不属于它所在的类层次结构。R...</summary><published>2010-10-11T13:48:00Z</published><updated>2010-10-11T13:48:00Z</updated><author><name>known</name><uri>http://www.cnblogs.com/known/</uri></author><link rel="alternate" href="http://www.cnblogs.com/known/archive/2010/10/11/1848267.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/known/archive/2010/10/11/1848267.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 12pt;"&gt;SRP 单一职责原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;就一个类而言，应该仅有一个引起它变化的原因。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 12pt;"&gt;OCP 开放&amp;mdash;封闭原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;软件实体（类、模块、函数等）应该是可以扩展的，但是不可修改。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 12pt;"&gt;LSP Liskov替换原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;子类型必须能够替换掉它们的基类型。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 12pt;"&gt;DIP 依赖倒置原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;抽象不应该依赖于细节。细节应该依赖于抽象。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 12pt;"&gt;ISP 接口隔离原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;不应该强迫客户依赖于它们不用的方法。接口属于客户，不属于它所在的类层次结构。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 12pt;"&gt;REP 重用发布等价原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;重用的粒度就是发布的粒度。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 12pt;"&gt;CCP 公用封闭原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;包中的所有类对于同一性质的变化应该是共同封闭的。一个变化若对一个包产生影响，则将对该包中的所有类产生影响，而对于其他的包不造成任何影响。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 12pt;"&gt;CRP 共同重用原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;一个包中的所有类应该是共同重用的。如果重用了包中的一个类，那么就要重用包中的所有类。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 12pt;"&gt;ADP 无环依赖原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;在包的依赖关系图中不允许存在环。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 12pt;"&gt;SDP 稳定依赖原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;操着稳定的方向进行依赖。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 12pt;"&gt;SAP 稳定抽象原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;包的抽象程度应该和其稳定程度一致。&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/known/aggbug/1848267.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/known/archive/2010/10/11/1848267.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/known/archive/2010/10/11/1848260.html</id><title type="text">敏捷宣言遵循的原则</title><summary type="text">我们最优先要做的是通过尽早的、持续的交付有价值的软件来使客户满意。即使到了开发的后期，也欢迎改变需求。敏捷过程利用变化来为客户创造竞争优势。经常性地交付可以工作的软件，交付的间隔可以从几个星期到几个月，交付的时间间隔越短越好。在整个项目开发期间，业务人员和开发人员必须天天一起工作。围绕被激励起来的个体来构建项目。给他们提供所需的环境和支持，并且信任他们能够完成工作。在团队内部，最具有效果并且富有效...</summary><published>2010-10-11T13:32:00Z</published><updated>2010-10-11T13:32:00Z</updated><author><name>known</name><uri>http://www.cnblogs.com/known/</uri></author><link rel="alternate" href="http://www.cnblogs.com/known/archive/2010/10/11/1848260.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/known/archive/2010/10/11/1848260.html"/><content type="html">&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: 14pt;"&gt;我们最优先要做的是通过尽早的、持续的交付有价值的软件来使客户满意。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 14pt;"&gt;即使到了开发的后期，也欢迎改变需求。敏捷过程利用变化来为客户创造竞争优势。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 14pt;"&gt;经常性地交付可以工作的软件，交付的间隔可以从几个星期到几个月，交付的时间间隔越短越好。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 14pt;"&gt;在整个项目开发期间，业务人员和开发人员必须天天一起工作。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 14pt;"&gt;围绕被激励起来的个体来构建项目。给他们提供所需的环境和支持，并且信任他们能够完成工作。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 14pt;"&gt;在团队内部，最具有效果并且富有效率的传递信息的方法，就是面对面的交谈。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 14pt;"&gt;工作的软件是首要的进度度量标准。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 14pt;"&gt;敏捷过程提倡可持续的开发速度。责任人、开发者和用户应该保持一个长期的、恒定的开发速度。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 14pt;"&gt;不断地关注优秀的技能和好的设计会增强敏捷能力。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 14pt;"&gt;简单&amp;mdash;&amp;mdash;使未完成的工作最大化的艺术&amp;mdash;&amp;mdash;是根本的。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 14pt;"&gt;最好的架构、需求和设计出自于自组织的团队。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 14pt;"&gt;每隔一定时间，团队会在如何才能更有效地工作方面进行反省，然后相应地对自己的行为进行调整。&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://www.cnblogs.com/known/aggbug/1848260.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/known/archive/2010/10/11/1848260.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/known/archive/2010/09/09/1822622.html</id><title type="text">Python学习笔记（11）：更多内容</title><summary type="text">1. 特殊方法在类中有一些特殊的方法具有特殊的意义，如__init__和__del__方法。通常，特殊方法都被用来模仿某个行为。如果你要为你的类使用x[key]这样的索引操作，那么你只需要实现__getitem__()方法即可。名称说明__init__(self, ...)这个方法在新建对象恰好要被返回使用之前被调用。__del__(self)恰好在对象要被删除之前调用。__str__(self)在我们对对象使用print语句或是使用str()的时候调用。__lt__(self, other)当使用 小于 运算符（&lt;）的时候调用。类似地，对于所有的运算符（+，&gt;等等）都有特殊的方法</summary><published>2010-09-09T13:15:00Z</published><updated>2010-09-09T13:15:00Z</updated><author><name>known</name><uri>http://www.cnblogs.com/known/</uri></author><link rel="alternate" href="http://www.cnblogs.com/known/archive/2010/09/09/1822622.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/known/archive/2010/09/09/1822622.html"/><content type="html">&lt;p&gt;&lt;strong&gt;1. 特殊方法&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在类中有一些特殊的方法具有特殊的意义，如__init__和__del__方法。通常，特殊方法都被用来模仿某个行为。如果你要为你的类使用x[key]这样的索引操作，那么你只需要实现__getitem__()方法即可。&lt;/p&gt;&lt;table class="grid"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;名称&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;__init__(self, ...)&lt;/td&gt;&lt;td&gt;这个方法在新建对象恰好要被返回使用之前被调用。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;__del__(self)&lt;/td&gt;&lt;td&gt;恰好在对象要被删除之前调用。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;__str__(self)&lt;/td&gt;&lt;td&gt;在我们对对象使用print语句或是使用str()的时候调用。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;__lt__(self, other)&lt;/td&gt;&lt;td&gt;当使用 小于 运算符（&amp;lt;）的时候调用。类似地，对于所有的运算符（+，&amp;gt;等等）都有特殊的方法。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;__getitem__(self, key)&lt;/td&gt;&lt;td&gt;使用x[key]索引操作符的时候调用。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;__len__(self)&lt;/td&gt;&lt;td&gt;对序列对象使用内建的len()函数的时候调用。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;2. 单语句块&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;一般，每个语句块都是通过它的缩进层次与其他语句块分开的。然而，有时候你的语句块只包含一句语句，那么你可以在条件语句或循环语句的同一行指明它。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;flag = True&lt;br/&gt;if flag: print("Yes")&lt;br/&gt;&lt;/div&gt;&lt;p&gt;虽然这样做可以使你的程序变得小一些 ，但是除了检验错误之外我强烈建议你不要使用这种缩略方法。不使用它的一个主要的理由是一旦你使用了恰当的缩进，你就可以很方便地添加一个额外的语句。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. 列表综合&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;通过列表综合，可以从一个已有的列表导出一个新的列表。例如，你有一个数的列表，而你想要得到一个对应的列表，使其中所有大于2的数都是原来的2倍。对于这种应用，列表综合是最理想的方法。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;listone = [2, 3, 4]&lt;br/&gt;listtwo = [2 * i for i in listone if i &amp;gt; 2]&lt;br/&gt;print(listtwo)&lt;br/&gt;&lt;/div&gt;&lt;p&gt;这段话的意思是：将listone中的所有大于2的数分别乘以2，得出一个新的listtwo。运行结果：&lt;/p&gt;&lt;p&gt;[6, 8]&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. 在函数中接收元组和列表&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当要使函数接收元组或字典形式的参数的时候，有一种特殊的方法，它分别使用*和**前缀。这种方法在函数需要获取可变数量的参数的时候特别有用。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;def powersum(power, *args):&lt;br/&gt;    '''Return the sum of each argument raised to specified power.'''&lt;br/&gt;    total = 0&lt;br/&gt;    for i in args:&lt;br/&gt;        total += pow(i, power)&lt;br/&gt;    return total&lt;br/&gt;&lt;/div&gt;&lt;p&gt;由于在args变量前有*前缀，所有多余的函数参数都会作为一个元组存储在args中。如果使用的是**前缀，多余的参数则会被认为是一个字典的键/值对。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5. lambda形式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;lambda语句被用来创建新的函数对象，并且在运行时返回它们。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;def make_repeater(n):&lt;br/&gt;    return lambda s : s * n&lt;br/&gt;&lt;br/&gt;twice = make_repeater(2)&lt;br/&gt;print(twice("ha"))&lt;br/&gt;print(twice(5))&lt;br/&gt;&lt;/div&gt;&lt;p&gt;运行结果：&lt;/p&gt;&lt;p&gt;haha&lt;/p&gt;&lt;p&gt;10&lt;/p&gt;&lt;p&gt;这里，我们使用了make_repeater函数在运行时创建新的函数对象，并且返回它。lambda语句用来创建函数对象。本质上，lambda需要一个参数，后面仅跟单个表达式作为函数体，而表达式的值被这个新建的函数返回。注意，即便是print语句也不能用在lambda形式中，只能使用表达式。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6. exec和eval语句&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;exec语句用来执行储存在字符串或文件中的Python语句。例如，我们可以在运行时生成一个包含Python代码的字符串，然后使用exec语句执行这些语句。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;exec("print('Hello World')")&lt;br/&gt;&lt;/div&gt;&lt;p&gt;运行结果：&lt;/p&gt;&lt;p&gt;Hello World&lt;/p&gt;&lt;p&gt;eval语句用来计算存储在字符串中的有效Python表达式。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;eval("2 * 3")&lt;br/&gt;&lt;/div&gt;&lt;p&gt;运行结果：&lt;/p&gt;&lt;p&gt;6&lt;/p&gt;&lt;p&gt;&lt;strong&gt;7. assert语句&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;assert语句用来声明某个条件是真的。例如，如果你非常确信某个你使用的列表中至少有一个元素，而你想要检验这一点，并且在它非真的时候引发一个错误，那么assert语句是应用在这种情形下的理想语句。当assert语句失败的时候，会引发一个AssertionError。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;gt;&amp;gt;&amp;gt; mylist = ["item"]&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; assert(len(mylist) &amp;gt;= 1)&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; mylist.pop()&lt;br/&gt;'item'&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; assert(len(mylist) &amp;gt;= 1)&lt;br/&gt;Traceback (most recent call last):&lt;br/&gt;  File "&amp;lt;pyshell#13&amp;gt;", line 1, in &amp;lt;module&amp;gt;&lt;br/&gt;    assert(len(mylist) &amp;gt;= 1)&lt;br/&gt;AssertionError&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;8. repr函数&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;repr函数用来取得对象的规范字符串表示。注意，在大多数时候有eval(repr(object)) == object。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;gt;&amp;gt;&amp;gt; i = []&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; i.append("item")&lt;br/&gt;&amp;gt;&amp;gt;&amp;gt; repr(i)&lt;br/&gt;"['item']"&lt;br/&gt;&lt;/div&gt;&lt;p&gt;基本上，repr函数和反引号用来获取对象的可打印的表示形式。你可以通过定义类的__repr__方法来控制你的对象在被repr函数调用的时候返回的内容。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/known/aggbug/1822622.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/known/archive/2010/09/09/1822622.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/known/archive/2010/09/08/1821819.html</id><title type="text">Python学习笔记（10）：异常</title><summary type="text">当程序执行的时候，可能会出现一些异常现象，这个可能是会存在的。例如，你在读文件的时候，而那个文件不存在。此时，我们可以用异常来处理。1. 错误我们来做个简单的测试，我们故意把print方法写出Print。&gt;&gt;&gt; Print("Hello world")Traceback (most recent call last): File "&lt;pyshell#0&gt;", line 1, in &lt;module&gt; Print("Hello world")NameError: name 'Print&amp;#</summary><published>2010-09-08T15:09:00Z</published><updated>2010-09-08T15:09:00Z</updated><author><name>known</name><uri>http://www.cnblogs.com/known/</uri></author><link rel="alternate" href="http://www.cnblogs.com/known/archive/2010/09/08/1821819.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/known/archive/2010/09/08/1821819.html"/><content type="html">&lt;p&gt;当程序执行的时候，可能会出现一些异常现象，这个可能是会存在的。例如，你在读文件的时候，而那个文件不存在。此时，我们可以用异常来处理。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. 错误&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们来做个简单的测试，我们故意把print方法写出Print。&lt;/p&gt;&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; Print("Hello world")&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;Traceback (most recent call last):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;&amp;nbsp; File "&amp;lt;pyshell#0&amp;gt;", line 1, in &amp;lt;module&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Print("Hello world")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;NameError: name 'Print' is not defined&lt;/span&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/p&gt;&lt;p&gt;系统会抛出NameError异常。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. try..except&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们可以用try..except处理异常。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;try:&lt;br/&gt;    f = open("test.txt")&lt;br/&gt;    f.close()&lt;br/&gt;except(IOError):&lt;br/&gt;    print("The file is not exist.")&lt;br/&gt;except:&lt;br/&gt;    print("Some error occurred.")&lt;br/&gt;&lt;br/&gt;print("Done")&lt;br/&gt;&lt;/div&gt;&lt;p&gt;运行结果：&lt;/p&gt;&lt;p&gt;The file is not exist.&lt;br /&gt;Done&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. 引发异常&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;你可以用raise语句来引发异常。我们先自定义一个ShortInputError异常，需要继承Exception类。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;class ShortInputError(Exception):&lt;br/&gt;    '''A user-defined exception class.'''&lt;br/&gt;    def __init__(self, length, atleast):&lt;br/&gt;        Exception.__init__(self)&lt;br/&gt;        self.length = length&lt;br/&gt;        self.atleast = atleast&lt;br/&gt;&lt;br/&gt;try:&lt;br/&gt;    s = input("Enter something --&amp;gt;")&lt;br/&gt;    if len(s) &amp;lt; 3:&lt;br/&gt;        raise(ShortInputError(len(s), 3))&lt;br/&gt;    #Other work can continue as usual here&lt;br/&gt;except(EOFError):&lt;br/&gt;    print("Why did you do an EOF on me?")&lt;br/&gt;except ShortInputError as e:&lt;br/&gt;    print("ShortInputError: The input was of length %d, \&lt;br/&gt;was expecting at least %d" % (e.length, e.atleast))&lt;br/&gt;else:&lt;br/&gt;    print("No exception was raised.")&lt;br/&gt;&lt;/div&gt;&lt;p&gt;输入两个字符运行结果：&lt;/p&gt;&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; &lt;br /&gt;Enter something --&amp;gt;tr&lt;br /&gt;ShortInputError: The input was of length 2, was expecting at least 3&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/p&gt;&lt;p&gt;输入三个字符以上运行结果：&lt;/p&gt;&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; &lt;br /&gt;Enter something --&amp;gt;test&lt;br /&gt;No exception was raised.&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. try..finally&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;假如你在读一个文件的时候，希望在无论异常发生与否的情况下都关闭文件，该怎么做呢？这可以使用finally块来完成。注意，在一个try块下，你可以同时使用except从句和finally块。如果你要同时使用它们的话，需要把一个嵌入另外一个。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;import time&lt;br/&gt;&lt;br/&gt;try:&lt;br/&gt;    f = open("poem.txt")&lt;br/&gt;    while True: # our usual file-reading idiom&lt;br/&gt;        line = f.readline()&lt;br/&gt;        if len(line) == 0:&lt;br/&gt;            break&lt;br/&gt;        time.sleep(2)&lt;br/&gt;        print(line),&lt;br/&gt;finally:&lt;br/&gt;    f.close()&lt;br/&gt;    print("Cleaning up...closed the file")&lt;br/&gt;&lt;/div&gt;&lt;p&gt;运行结果：&lt;/p&gt;&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; &lt;br /&gt;Programming is fun&lt;/p&gt;&lt;p&gt;When the work is done&lt;/p&gt;&lt;p&gt;if you wanna make your work also fun:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; use Python!&lt;/p&gt;&lt;p&gt;Cleaning up...closed the file&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;def divide(x, y):&lt;br/&gt;    try:&lt;br/&gt;        result = x/ y&lt;br/&gt;    except ZeroDivisionError:&lt;br/&gt;        print("Division by zero!")&lt;br/&gt;    else:&lt;br/&gt;        print("result is", result)&lt;br/&gt;    finally:&lt;br/&gt;        print("executing finally clause")&lt;br/&gt;&lt;/div&gt;&lt;p&gt;测试结果：&lt;/p&gt;&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; divide(2, 1)&lt;br /&gt;result is 2.0&lt;br /&gt;executing finally clause&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; divide(2, 0)&lt;br /&gt;Division by zero!&lt;br /&gt;executing finally clause&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; divide("2", "1")&lt;br /&gt;executing finally clause&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;Traceback (most recent call last):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;&amp;nbsp; File "&amp;lt;pyshell#13&amp;gt;", line 1, in &amp;lt;module&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; divide("2", "1")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;&amp;nbsp; File "&amp;lt;pyshell#10&amp;gt;", line 3, in divide&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = x/ y&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;TypeError: unsupported operand type(s) for /: 'str' and 'str'&lt;/span&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/known/aggbug/1821819.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/known/archive/2010/09/08/1821819.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/known/archive/2010/09/08/1821792.html</id><title type="text">Python学习笔记（9）：输入/输出</title><summary type="text">通常，一个程序都会有输入/输出，这样可以与用户进行交互。用户输入一些信息，你会对他输入的内容进行一些适当的操作，然后再输出给用户想要的结果。Python的输入/输出，我们可以用input进行输入，print进行输出，这些都是简单的控制台输入/输出，复杂的有处理文件等。1. input和printname = input("Please input your name:\n")print("Hello,", name)运行结果：Please input your name:knownHello, known2. 处理文件poem = ''&amp;</summary><published>2010-09-08T14:08:00Z</published><updated>2010-09-08T14:08:00Z</updated><author><name>known</name><uri>http://www.cnblogs.com/known/</uri></author><link rel="alternate" href="http://www.cnblogs.com/known/archive/2010/09/08/1821792.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/known/archive/2010/09/08/1821792.html"/><content type="html">&lt;p&gt;通常，一个程序都会有输入/输出，这样可以与用户进行交互。用户输入一些信息，你会对他输入的内容进行一些适当的操作，然后再输出给用户想要的结果。Python的输入/输出，我们可以用input进行输入，print进行输出，这些都是简单的控制台输入/输出，复杂的有处理文件等。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. input和print&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;name = input("Please input your name:\n")&lt;br/&gt;print("Hello,", name)&lt;br/&gt;&lt;/div&gt;&lt;p&gt;运行结果：&lt;/p&gt;&lt;p&gt;Please input your name:&lt;br /&gt;known&lt;br /&gt;Hello, known&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. 处理文件&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;poem = '''\&lt;br/&gt;Programming is fun&lt;br/&gt;When the work is done&lt;br/&gt;if you wanna make your work also fun:&lt;br/&gt;    use Python!&lt;br/&gt;'''&lt;br/&gt;&lt;br/&gt;f = open('poem.txt', 'w') #open for 'w'riting&lt;br/&gt;f.write(poem)             #write text to file&lt;br/&gt;f.close()                 #close the file&lt;br/&gt;&lt;br/&gt;f = open('poem.txt')&lt;br/&gt;#if no mode is specified, 'r'ead mode is assumed by default&lt;br/&gt;while True:&lt;br/&gt;    line = f.readline()&lt;br/&gt;    if len(line) == 0:#Zero length indicates EOF&lt;br/&gt;        break&lt;br/&gt;    print(line),&lt;br/&gt;    #Notice comma to avoid automatic newline added by Python&lt;br/&gt;f.close()#close the file&lt;br/&gt;&lt;/div&gt;&lt;p&gt;运行结果：&lt;/p&gt;&lt;p&gt;Programming is fun&lt;/p&gt;&lt;p&gt;When the work is done&lt;/p&gt;&lt;p&gt;if you wanna make your work also fun:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; use Python!&lt;/p&gt;&lt;p&gt;open一个文件模式可以为读模式（'r'）、写模式（'w'）或追加模式（'a'），还有其他模式，你可以用help(open)来查看。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/known/aggbug/1821792.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/known/archive/2010/09/08/1821792.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
