<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/podcast2.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.feedsky.com/known" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/known" type="application/rss+xml"></fs:self_link><lastBuildDate>Tue, 20 Sep 2011 13:56:00 GMT</lastBuildDate><title>博客园-</title><description>blog</description><link atom:type="text/html">http://www.cnblogs.com/known/</link><id xmlns="http://www.w3.org/2005/Atom">http://feed.cnblogs.com/blog/u/24837/rss</id><author xmlns="http://www.w3.org/2005/Atom"><name>known</name><uri>http://www.cnblogs.com/known/</uri></author><generator xmlns="http://www.w3.org/2005/Atom">CNBlogs BlogServer</generator><link xmlns="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/24837/rss"></link><pubDate>Tue, 29 Nov 2011 12:35:42 GMT</pubDate><managingEditor>known</managingEditor><item><title>VBScript之Eval函数与Execute语句（Array.ForEach的实现）</title><id xmlns="http://www.w3.org/2005/Atom">http://www.cnblogs.com/known/archive/2011/09/20/2182706.html</id><author xmlns="http://www.w3.org/2005/Atom"><name>known</name><uri>http://www.cnblogs.com/known/</uri></author><content xmlns="http://www.w3.org/2005/Atom" 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 &gt;
&lt;pre &gt;[result = ]Eval(expression)
&lt;/pre&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 &gt;
&lt;pre &gt;Dim a, b
a = 1
b = 2
MsgBox Eval(&quot;a + b&quot;)&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;Execute statements
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;所需要的statements参数是一个字符串表达式，其中包含一个或多个要执行的语句。如果要在statements参数中包含多条语句，应使用冒号或嵌入的分行将其分隔开。下面是Execute语句的简单示例：&lt;/p&gt;
&lt;div &gt;
&lt;pre &gt;Dim a, b, c, d
a = 1
b = 2
Execute &quot;c = a + b : d = a + c&quot;
MsgBox c
MsgBox d
&lt;/pre&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 &gt;
&lt;pre &gt;Sub ForEach(source, method)
    Dim i, current
    For i = 0 To UBound(source)
        If IsObject(source(i)) Then '判断数组元素是否为对象
            Set current = source(i)
        Else
            current = source(i)
        End If
        Eval(method &amp;amp; &quot;(current)&quot;) '调用遍历方法
    Next
End Sub&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;遍历一个整数数组的示例：&lt;/p&gt;
&lt;div &gt;
&lt;pre &gt;'显示数组元素方法
Function ShowValue(val)
    MsgBox val
End Function

Dim i, arr(10)
'给数组元素赋值
For i = 0 To 10
    arr(i) = i
Next
'调用ForEach遍历
Call ForEach(arr, &quot;ShowValue&quot;)
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;遍历一个对象数组的示例：&lt;/p&gt;
&lt;div &gt;
&lt;pre &gt;'用户类
Class User
    '用户属性
    Public UserName, Email

    'ToString方法
    Function ToString()
        ToString = Me.UserName &amp;amp; &quot; : &quot; &amp;amp; Me.Email
    End Function
End Class

'显示用户信息方法
Function ShowUser(usr)
    MsgBox usr.ToString()
End Function

Dim arr(5), u
'给数组元素赋值
For i = 0 To 5
    Set u = New User
    u.UserName = &quot;user&quot; &amp;amp; CStr(i)
    u.Email    = &quot;user&quot; &amp;amp; CStr(i) &amp;amp; &quot;@xxx.com&quot;
    Set arr(i) = u
Next
'调用ForEach遍历
Call ForEach(arr, &quot;ShowUser&quot;)
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;看代码很简洁，不是嘛，原来VBScript也可以像C#一样使用ForEach。VBScript应该还能够实现C#中的其他很多特性，以后在编写测试代码过程中，要不断去总结。&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/known/aggbug/2182706.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/known/archive/2011/09/20/2182706.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content><description>每当使用C#中的Array.ForEach时，感觉很爽。最近在做QTP自动化测试时，偶然在QTP自带示例中看到一段代码可以动态调用方法，于是先喜若狂，着手改编了一下，写了一个VBScript版的Array.ForEach功能，使用起来确实不错。其实关键的一个地方就在于使用了VBScript中的Eval函数。首先我们来看看Eval函数的作用。1. Eval函数Eval函数主要是计算一个表达式的值并返回结果。其签名如下：[result = ]Eval(expression)参数如下：result：可选项。是一个变量，用于接受返回的结果。如果未指定结果，应考虑使用Execute语句代替。expres</description><content:encoded>&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 &gt;
&lt;pre &gt;[result = ]Eval(expression)
&lt;/pre&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 &gt;
&lt;pre &gt;Dim a, b
a = 1
b = 2
MsgBox Eval(&quot;a + b&quot;)&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;Execute statements
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;所需要的statements参数是一个字符串表达式，其中包含一个或多个要执行的语句。如果要在statements参数中包含多条语句，应使用冒号或嵌入的分行将其分隔开。下面是Execute语句的简单示例：&lt;/p&gt;
&lt;div &gt;
&lt;pre &gt;Dim a, b, c, d
a = 1
b = 2
Execute &quot;c = a + b : d = a + c&quot;
MsgBox c
MsgBox d
&lt;/pre&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 &gt;
&lt;pre &gt;Sub ForEach(source, method)
    Dim i, current
    For i = 0 To UBound(source)
        If IsObject(source(i)) Then '判断数组元素是否为对象
            Set current = source(i)
        Else
            current = source(i)
        End If
        Eval(method &amp;amp; &quot;(current)&quot;) '调用遍历方法
    Next
End Sub&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;遍历一个整数数组的示例：&lt;/p&gt;
&lt;div &gt;
&lt;pre &gt;'显示数组元素方法
Function ShowValue(val)
    MsgBox val
End Function

Dim i, arr(10)
'给数组元素赋值
For i = 0 To 10
    arr(i) = i
Next
'调用ForEach遍历
Call ForEach(arr, &quot;ShowValue&quot;)
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;遍历一个对象数组的示例：&lt;/p&gt;
&lt;div &gt;
&lt;pre &gt;'用户类
Class User
    '用户属性
    Public UserName, Email

    'ToString方法
    Function ToString()
        ToString = Me.UserName &amp;amp; &quot; : &quot; &amp;amp; Me.Email
    End Function
End Class

'显示用户信息方法
Function ShowUser(usr)
    MsgBox usr.ToString()
End Function

Dim arr(5), u
'给数组元素赋值
For i = 0 To 5
    Set u = New User
    u.UserName = &quot;user&quot; &amp;amp; CStr(i)
    u.Email    = &quot;user&quot; &amp;amp; CStr(i) &amp;amp; &quot;@xxx.com&quot;
    Set arr(i) = u
Next
'调用ForEach遍历
Call ForEach(arr, &quot;ShowUser&quot;)
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;看代码很简洁，不是嘛，原来VBScript也可以像C#一样使用ForEach。VBScript应该还能够实现C#中的其他很多特性，以后在编写测试代码过程中，要不断去总结。&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/known/aggbug/2182706.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/known/archive/2011/09/20/2182706.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content:encoded><pubDate>Tue, 20 Sep 2011 21:56:00 +0800</pubDate><guid isPermaLink="false">http://www.cnblogs.com/known/archive/2011/09/20/2182706.html</guid><dc:creator>known</dc:creator></item><item><title>QTP自动化测试之VBScript对象</title><id xmlns="http://www.w3.org/2005/Atom">http://www.cnblogs.com/known/archive/2011/09/12/2173586.html</id><author xmlns="http://www.w3.org/2005/Atom"><name>known</name><uri>http://www.cnblogs.com/known/</uri></author><content xmlns="http://www.w3.org/2005/Atom" 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 &gt;
&lt;pre &gt;Class User
    '私有字段，也可以使用Public语句定义公有字段
    Private m_UserName
    Private m_Profile

    'Initialize事件相当于构造函数
    Private Sub Class_Initialize
        m_UserName = Empty   '设置UserName初始值为空字符串
    End Sub

    'Terminate事件相当于析构函数
    Private Sub Class_Terminate
        Set m_Profile = Nothing   '将对象设置为Nothing，销毁对象
    End Sub

    'Property Get语句，获取属性值或对象引用，Default只与Public一起使用，表示该属性为类的默认属性
    Public Default Property Get UserName
        UserName = m_UserName
    End Property
    'Property Let语句，设置属性值
    Public Property Let UserName(newUserName)
        m_UserName = newUserName
    End Property

    Public Property Get Profile
        Set Profile = m_Profile
    End Property
    'Property Set语句，设置属性对象引用
    Public Property Set Profile(newProfile)
        Set m_Profile = newProfile
    End Property

    'ToString方法
    Public Function ToString()
        ToString = &quot;Hello! &quot; &amp;amp; Me.UserName   'Me相当于C#中的this关键字
    End Function
End Class
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;用VBScript创建的对象并不是真正的面向对象，它不能继承和实现多态，但是在QTP对象模型Utility中，提供了一个RegisterUserFunc方法可以覆写对象的方法，但这也不是真正意义上的面向对象。Class及其成员如何创建，上面已经简单介绍过，若要对其中的一些语句进一步了解，还需要去仔细阅读一些参考文档。下面我们来看看如何调用对象，在&lt;a href=&quot;http://www.cnblogs.com/known/archive/2011/09/09/2171647.html&quot;&gt;《VBScript基础上》&lt;/a&gt;变量赋值中也已经提到过。&lt;/p&gt;
&lt;div &gt;
&lt;pre &gt;Dim u                  '定义对象变量名，注意变量名不能与类名相同，即使是大小写不同
Set u = New User       '创建对象用New语句
u.UserName = &quot;known&quot;   '给属性赋值
MsgBox u.ToString()    '调用方法
&lt;/pre&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 &gt;
&lt;pre &gt;'定义并创建Dictionary对象，使用CreateObject创建并返回自动化对象的引用
Dim d
Set d = CreateObject(&quot;Scripting.Dictionary&quot;)

'向Dictionary对象中添加键值对
d.Add &quot;a&quot;, &quot;Known&quot;    'Add方法第一个参数是Key值，第二个是Item值
d.Add &quot;b&quot;, &quot;Christina&quot;
d.Add &quot;c&quot;, &quot;test&quot;
d.Add &quot;d&quot;, &quot;fuck&quot;
Call ShowDictionary(d)

'遍历Dictionary对象，更改Item值
For i = 0 To d.Count - 1     'Count返回Dictionary对象中的项目数
    If d.Exists(&quot;c&quot;) Then    'Exists判断Dictionary对象中是否存在指定关键字
        d.Item(&quot;c&quot;) = &quot;Test&quot; 'Item返回Dictionary对象中指定Key的Item值
    End If
Next
d.Remove(&quot;d&quot;)  'Remove从Dictionary对象中删除一个关键字，项目对。
Call ShowDictionary(d)

'输出Dictionary对象所有键值
Sub ShowDictionary(dic)
    Dim str, a
    a = dic.Items  'Items返回一个包含所有Item值的数组
    For i = 0 To dic.Count - 1
        str = str &amp;amp; a(i) &amp;amp; vbCrlf
    Next
    MsgBox(str)
End Sub
&lt;/pre&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 &gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;th width=&quot;20%&quot;&gt;对象/集合&lt;/th&gt;&lt;th width=&quot;80%&quot;&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;对象。包含用来收集信息的方法和属性，这些信息是关于连接在系统上的驱动器的，如驱动器的共享名和它有多少可用空间。请注意，&quot;drive&quot; 并非必须是硬盘，也可以是 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 &gt;
&lt;pre &gt;'定义并创建对象
Dim fso, filePath, folderPath
Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
filePath = &quot;C:\\Test.txt&quot;
folderPath = &quot;D:\\Test&quot;
Call MoveFile(filePath, folderPath)

'将文件移动到指定文件夹
Sub MoveFile(sourceFile, targetFolder)
    Dim file, fileName
    '获取文件对象
    Set file = fso.GetFile(sourceFile)
    '判断目标文件夹是否存在
    If Not fso.FolderExists(targetFolder) Then
        fso.CreateFolder(targetFolder)
    End If
    '将文件移动到目标位置
    file.Move(targetFolder &amp;amp; &quot;\\&quot; &amp;amp; file.Name)
End Sub
&lt;/pre&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 &gt;
&lt;pre &gt;'示例1：
On Error Resume Next
Err.Raise 6  '产生溢出错误
MsgBox(&quot;Error #&quot; &amp;amp; CStr(Err.Number) &amp;amp; &quot; &quot; &amp;amp; Err.Description)
Err.Clear

'示例2：
'定义数据库连接
Dim conn
Set conn = CreateObject(&quot;ADODB.Connection&quot;)
conn.BeginTrans  '开始事务

...

'提交数据库事务错误处理
On Error Resume Next
If conn.Errors.Count &amp;gt; 0 Then
    conn.RollbackTrans  '回滚事务
Else
    conn.CommitTrans    '提交事务
End If
Err.Clear
&lt;/pre&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 &gt;
&lt;pre &gt;Function RegExpTest(patrn, strng)
    Dim regEx, match, matches            '建立变量。
    Set regEx = New RegExp               '建立正则表达式。
    regEx.Pattern = patrn                '设置模式。
    regEx.IgnoreCase = True              '设置是否区分字符大小写。
    regEx.Global = True                  '设置全局可用性。
    Set matches = regEx.Execute(strng)   '执行搜索。
    For Each match in matches            '遍历匹配集合。
        retStr = retStr &amp;amp; &quot;Match found at position &quot;
        retStr = retStr &amp;amp; match.FirstIndex &amp;amp; &quot;. Match Value is '&quot;
        retStr = retStr &amp;amp; match.Value &amp;amp; &quot;'.&quot; &amp;amp; vbCRLF
    Next
    RegExpTest = retStr
End Function

MsgBox(RegExpTest(&quot;is.&quot;, &quot;IS1 is2 IS3 is4&quot;))
&lt;/pre&gt;
&lt;/div&gt;&lt;img src=&quot;http://www.cnblogs.com/known/aggbug/2173586.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/known/archive/2011/09/12/2173586.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content><description>VBScript作为脚本语言不仅能够编写简单的脚本，而且还能够创建及使用对象编写复杂的脚本，如Class对象，数据字典，操作文件夹及文件，错误处理，正则表达式等等。1. Class对象2. Dictionary对象3. FileSystemObject对象4. Err对象5. RegExp对象1. Class对象使用Class语句可以创建一个对象，可以为它编写字段、属性及方法，它只有两个对象事件——Initialize与Terminate。首先来看一个简单的Class示例：Class User &amp;#39;私有字段，也可以使用Public语句定义公有字段 Private m_UserName..</description><content:encoded>&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 &gt;
&lt;pre &gt;Class User
    '私有字段，也可以使用Public语句定义公有字段
    Private m_UserName
    Private m_Profile

    'Initialize事件相当于构造函数
    Private Sub Class_Initialize
        m_UserName = Empty   '设置UserName初始值为空字符串
    End Sub

    'Terminate事件相当于析构函数
    Private Sub Class_Terminate
        Set m_Profile = Nothing   '将对象设置为Nothing，销毁对象
    End Sub

    'Property Get语句，获取属性值或对象引用，Default只与Public一起使用，表示该属性为类的默认属性
    Public Default Property Get UserName
        UserName = m_UserName
    End Property
    'Property Let语句，设置属性值
    Public Property Let UserName(newUserName)
        m_UserName = newUserName
    End Property

    Public Property Get Profile
        Set Profile = m_Profile
    End Property
    'Property Set语句，设置属性对象引用
    Public Property Set Profile(newProfile)
        Set m_Profile = newProfile
    End Property

    'ToString方法
    Public Function ToString()
        ToString = &quot;Hello! &quot; &amp;amp; Me.UserName   'Me相当于C#中的this关键字
    End Function
End Class
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;用VBScript创建的对象并不是真正的面向对象，它不能继承和实现多态，但是在QTP对象模型Utility中，提供了一个RegisterUserFunc方法可以覆写对象的方法，但这也不是真正意义上的面向对象。Class及其成员如何创建，上面已经简单介绍过，若要对其中的一些语句进一步了解，还需要去仔细阅读一些参考文档。下面我们来看看如何调用对象，在&lt;a href=&quot;http://www.cnblogs.com/known/archive/2011/09/09/2171647.html&quot;&gt;《VBScript基础上》&lt;/a&gt;变量赋值中也已经提到过。&lt;/p&gt;
&lt;div &gt;
&lt;pre &gt;Dim u                  '定义对象变量名，注意变量名不能与类名相同，即使是大小写不同
Set u = New User       '创建对象用New语句
u.UserName = &quot;known&quot;   '给属性赋值
MsgBox u.ToString()    '调用方法
&lt;/pre&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 &gt;
&lt;pre &gt;'定义并创建Dictionary对象，使用CreateObject创建并返回自动化对象的引用
Dim d
Set d = CreateObject(&quot;Scripting.Dictionary&quot;)

'向Dictionary对象中添加键值对
d.Add &quot;a&quot;, &quot;Known&quot;    'Add方法第一个参数是Key值，第二个是Item值
d.Add &quot;b&quot;, &quot;Christina&quot;
d.Add &quot;c&quot;, &quot;test&quot;
d.Add &quot;d&quot;, &quot;fuck&quot;
Call ShowDictionary(d)

'遍历Dictionary对象，更改Item值
For i = 0 To d.Count - 1     'Count返回Dictionary对象中的项目数
    If d.Exists(&quot;c&quot;) Then    'Exists判断Dictionary对象中是否存在指定关键字
        d.Item(&quot;c&quot;) = &quot;Test&quot; 'Item返回Dictionary对象中指定Key的Item值
    End If
Next
d.Remove(&quot;d&quot;)  'Remove从Dictionary对象中删除一个关键字，项目对。
Call ShowDictionary(d)

'输出Dictionary对象所有键值
Sub ShowDictionary(dic)
    Dim str, a
    a = dic.Items  'Items返回一个包含所有Item值的数组
    For i = 0 To dic.Count - 1
        str = str &amp;amp; a(i) &amp;amp; vbCrlf
    Next
    MsgBox(str)
End Sub
&lt;/pre&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 &gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;th width=&quot;20%&quot;&gt;对象/集合&lt;/th&gt;&lt;th width=&quot;80%&quot;&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;对象。包含用来收集信息的方法和属性，这些信息是关于连接在系统上的驱动器的，如驱动器的共享名和它有多少可用空间。请注意，&quot;drive&quot; 并非必须是硬盘，也可以是 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 &gt;
&lt;pre &gt;'定义并创建对象
Dim fso, filePath, folderPath
Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
filePath = &quot;C:\\Test.txt&quot;
folderPath = &quot;D:\\Test&quot;
Call MoveFile(filePath, folderPath)

'将文件移动到指定文件夹
Sub MoveFile(sourceFile, targetFolder)
    Dim file, fileName
    '获取文件对象
    Set file = fso.GetFile(sourceFile)
    '判断目标文件夹是否存在
    If Not fso.FolderExists(targetFolder) Then
        fso.CreateFolder(targetFolder)
    End If
    '将文件移动到目标位置
    file.Move(targetFolder &amp;amp; &quot;\\&quot; &amp;amp; file.Name)
End Sub
&lt;/pre&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 &gt;
&lt;pre &gt;'示例1：
On Error Resume Next
Err.Raise 6  '产生溢出错误
MsgBox(&quot;Error #&quot; &amp;amp; CStr(Err.Number) &amp;amp; &quot; &quot; &amp;amp; Err.Description)
Err.Clear

'示例2：
'定义数据库连接
Dim conn
Set conn = CreateObject(&quot;ADODB.Connection&quot;)
conn.BeginTrans  '开始事务

...

'提交数据库事务错误处理
On Error Resume Next
If conn.Errors.Count &amp;gt; 0 Then
    conn.RollbackTrans  '回滚事务
Else
    conn.CommitTrans    '提交事务
End If
Err.Clear
&lt;/pre&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 &gt;
&lt;pre &gt;Function RegExpTest(patrn, strng)
    Dim regEx, match, matches            '建立变量。
    Set regEx = New RegExp               '建立正则表达式。
    regEx.Pattern = patrn                '设置模式。
    regEx.IgnoreCase = True              '设置是否区分字符大小写。
    regEx.Global = True                  '设置全局可用性。
    Set matches = regEx.Execute(strng)   '执行搜索。
    For Each match in matches            '遍历匹配集合。
        retStr = retStr &amp;amp; &quot;Match found at position &quot;
        retStr = retStr &amp;amp; match.FirstIndex &amp;amp; &quot;. Match Value is '&quot;
        retStr = retStr &amp;amp; match.Value &amp;amp; &quot;'.&quot; &amp;amp; vbCRLF
    Next
    RegExpTest = retStr
End Function

MsgBox(RegExpTest(&quot;is.&quot;, &quot;IS1 is2 IS3 is4&quot;))
&lt;/pre&gt;
&lt;/div&gt;&lt;img src=&quot;http://www.cnblogs.com/known/aggbug/2173586.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/known/archive/2011/09/12/2173586.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content:encoded><pubDate>Mon, 12 Sep 2011 09:19:00 +0800</pubDate><guid isPermaLink="false">http://www.cnblogs.com/known/archive/2011/09/12/2173586.html</guid><dc:creator>known</dc:creator></item><item><title>QTP自动化测试之VBScript基础（下）</title><id xmlns="http://www.w3.org/2005/Atom">http://www.cnblogs.com/known/archive/2011/09/09/2172647.html</id><author xmlns="http://www.w3.org/2005/Atom"><name>known</name><uri>http://www.cnblogs.com/known/</uri></author><content xmlns="http://www.w3.org/2005/Atom" 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 &gt;
&lt;pre &gt;If condition Then statements [Else elsestatements]&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;或者使用块形式&lt;/p&gt;
&lt;div &gt;
&lt;pre &gt;If condition Then
    [statements]
[ElseIf condition-n Then
    [elseifstatements]] . . .
[Else
    [elsestatements]]
End If&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;'1. 条件为True时
'单行形式
Dim myDate
myDate = #2011-9-8#   '日期时间字符串需用#括起来
If myDate &amp;lt; Now Then myDate = Now
'块形式
If i = 100 Then
    c = True
    i = 0
End If

'2. 条件为True和False时
If user.UserName = &quot;admin&quot; Then
    showAdminPage = True
Else
    showAdminPage = False
End If

'3. 对多个条件判断
If value = 0 Then
    MsgBox(0)
ElseIf value = 1 Then
    MsgBox(9999)
Else
    MsgBox(&quot;输入不合法！&quot;)
End If&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;Select Case testexpression
    [Case expressionlist-n
        [statements-n]] . . .
    [Case Else expressionlist-n
        [elsestatements-n]]
End Select
&lt;/pre&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 &gt;
&lt;pre &gt;Dim value : value = 5   '多条语句在一行,需用冒号分开
Select Case value
    Case 0:
        MsgBox(0)
    Case 1:
        MsgBox(9999)
    Case Else
        MsgBox(&quot;输入不合法！&quot;)
End Select&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;Do [{While | Until} condition]
    [statements]
    [Exit Do]
    [statements]
Loop&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;当条件变为&lt;b&gt;True&lt;/b&gt;之前重复执行某语句块。&lt;/p&gt;
&lt;div &gt;
&lt;pre &gt;Do
    [statements]
    [Exit Do]
    [statements]
Loop [{While | Until} condition]&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;Do Until response = vbNo
    myNum = Int(6 * Rnd + 1)   '产生1到6之间的随机数
    response = MsgBox(myNum &amp;amp; &quot;想要另一个数吗？&quot;, vbYesNo)
Loop

Dim check, counter
check = True : counter = 0
Do
    Do While count &amp;lt; 20
        counter = counter + 1  '增加计数器
        If counter = 10 Then
            check = false
            Exit Do   '终止内循环
        End If
    Loop
Loop Until Not check&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;While condition
    [statements]
Wend&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;For counter = start To end [Step step]
    [statements]
    [Exit For]
    [statements]
Next&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;For Each element In group
    [statements]
    [Exit For]
    [statements]
Next [element]&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;[Public [Default] | Private] Sub name [(arglist)] 
    [statements]
    [Exit Sub]
    [statements]
End Sub&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;[Public [Default]| Private] Function name [(arglist)]
    [statements]
    [name = expression]
    [Exit Function] 
    [statements]
    [name = expression]
End Function&lt;/pre&gt;
&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=&quot;http://www.cnblogs.com/known/aggbug/2172647.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/known/archive/2011/09/09/2172647.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content><description>要想使用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...</description><content:encoded>&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 &gt;
&lt;pre &gt;If condition Then statements [Else elsestatements]&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;或者使用块形式&lt;/p&gt;
&lt;div &gt;
&lt;pre &gt;If condition Then
    [statements]
[ElseIf condition-n Then
    [elseifstatements]] . . .
[Else
    [elsestatements]]
End If&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;'1. 条件为True时
'单行形式
Dim myDate
myDate = #2011-9-8#   '日期时间字符串需用#括起来
If myDate &amp;lt; Now Then myDate = Now
'块形式
If i = 100 Then
    c = True
    i = 0
End If

'2. 条件为True和False时
If user.UserName = &quot;admin&quot; Then
    showAdminPage = True
Else
    showAdminPage = False
End If

'3. 对多个条件判断
If value = 0 Then
    MsgBox(0)
ElseIf value = 1 Then
    MsgBox(9999)
Else
    MsgBox(&quot;输入不合法！&quot;)
End If&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;Select Case testexpression
    [Case expressionlist-n
        [statements-n]] . . .
    [Case Else expressionlist-n
        [elsestatements-n]]
End Select
&lt;/pre&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 &gt;
&lt;pre &gt;Dim value : value = 5   '多条语句在一行,需用冒号分开
Select Case value
    Case 0:
        MsgBox(0)
    Case 1:
        MsgBox(9999)
    Case Else
        MsgBox(&quot;输入不合法！&quot;)
End Select&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;Do [{While | Until} condition]
    [statements]
    [Exit Do]
    [statements]
Loop&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;当条件变为&lt;b&gt;True&lt;/b&gt;之前重复执行某语句块。&lt;/p&gt;
&lt;div &gt;
&lt;pre &gt;Do
    [statements]
    [Exit Do]
    [statements]
Loop [{While | Until} condition]&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;Do Until response = vbNo
    myNum = Int(6 * Rnd + 1)   '产生1到6之间的随机数
    response = MsgBox(myNum &amp;amp; &quot;想要另一个数吗？&quot;, vbYesNo)
Loop

Dim check, counter
check = True : counter = 0
Do
    Do While count &amp;lt; 20
        counter = counter + 1  '增加计数器
        If counter = 10 Then
            check = false
            Exit Do   '终止内循环
        End If
    Loop
Loop Until Not check&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;While condition
    [statements]
Wend&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;For counter = start To end [Step step]
    [statements]
    [Exit For]
    [statements]
Next&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;For Each element In group
    [statements]
    [Exit For]
    [statements]
Next [element]&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;[Public [Default] | Private] Sub name [(arglist)] 
    [statements]
    [Exit Sub]
    [statements]
End Sub&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;[Public [Default]| Private] Function name [(arglist)]
    [statements]
    [name = expression]
    [Exit Function] 
    [statements]
    [name = expression]
End Function&lt;/pre&gt;
&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=&quot;http://www.cnblogs.com/known/aggbug/2172647.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/known/archive/2011/09/09/2172647.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content:encoded><pubDate>Fri, 09 Sep 2011 16:35:00 +0800</pubDate><guid isPermaLink="false">http://www.cnblogs.com/known/archive/2011/09/09/2172647.html</guid><dc:creator>known</dc:creator></item><item><title>QTP自动化测试之VBScript基础（上）</title><id xmlns="http://www.w3.org/2005/Atom">http://www.cnblogs.com/known/archive/2011/09/09/2171647.html</id><author xmlns="http://www.w3.org/2005/Atom"><name>known</name><uri>http://www.cnblogs.com/known/</uri></author><content xmlns="http://www.w3.org/2005/Atom" 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=&quot;http://www.vbsedit.com/&quot;&gt;VbsEdit&lt;/a&gt;，该工具既能编辑代码，又可调试代码，有不错的智能提示，还有很多示例代码。可惜不是免费使用，不过网上已经有绿色版，您可以搜索下载。若你已经安装了QTP，那么使用QTP工具也是一个不错的选择。参考文档可以使用在线版&lt;a href=&quot;http://www.3http.com/book/script3/000.htm?vtorimicrosoftwindowsscripttechnologies.htm&quot;&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 &gt;
&lt;pre &gt;MsgBox(&quot;Hello world!&quot;)
MsgBox &quot;Hello world!&quot;
result = MsgBox(&quot;Hello World!&quot;, vbOKOnly, &quot;Greeting&quot;)
MsgBox &quot;Hello World!&quot;, vbOKOnly, &quot;Greeting&quot;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;既然在此出现的第一个函数是MsgBox，那么就简单介绍一下该函数，其签名如下:&lt;/p&gt;
&lt;div &gt;
&lt;pre &gt;MsgBox(prompt[, buttons][, title][, helpfile, context])&lt;/pre&gt;
&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 &gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;th width=&quot;15%&quot;&gt;子类型&lt;/th&gt;&lt;th width=&quot;85%&quot;&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；对于字符串变量，值为零长度字符串 (&quot;&quot;)。&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 &gt;
&lt;pre &gt;Option Explicit
Dim i, conn   '声明多个变量时用逗号隔开
Public UserName, Password
Private m_id&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;Dim i, conn, ui
i = 0
Set conn = CreateObject(&quot;ADODB.Connection&quot;)
Set ui = New UserInfo&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;Dim a(9), table(2, 3)
a(0) = 1
...
a(9) = 11
MsgBox(a(1))   '输出数组变量值

table(0, 0) = 1
...
table(2, 3) = 10&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;我们也可以声明动态数组（在运行脚本时大小发生变化的数组），使用Dim或ReDim语句，但括号中不包含任何数字。要使用动态数组，必须随后使用ReDim确定维数和每一维的大小。若同时使用Preserve关键字，则在重新调整大小时保留数组的内容。&lt;/p&gt;
&lt;div &gt;
&lt;pre &gt;Dim count, a()
count = 9
ReDim a(count)
ReDim Preserve a(10)&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;[Public | Private] Const constname = expression&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;Const PI = 3.14   '常数默认为公有。
Private Const STEP_APPLY = &quot;Apply&quot;   '定义私有常数。
Const STEP_APPLY = &quot;Apply&quot;, PI  = 3.14   '在一行上定义多个常数。&lt;/pre&gt;
&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 &gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;th width=&quot;50%&quot;&gt;描述&lt;/th&gt;&lt;th width=&quot;50%&quot;&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 &gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;th width=&quot;50%&quot;&gt;描述&lt;/th&gt;&lt;th width=&quot;50%&quot;&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 &gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;th width=&quot;50%&quot;&gt;描述&lt;/th&gt;&lt;th width=&quot;50%&quot;&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=&quot;http://www.cnblogs.com/known/aggbug/2171647.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/known/archive/2011/09/09/2171647.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content><description>要想使用QTP进行自动化测试，必须了解VBScript这门语言，对于使用过ASP或VB开发的人来说，VBScript已经再熟悉不过了，但是没有接触过VBScript的同学也不要灰心，因为这门语言简单易学。1. VBScript利器 2. Hello World 3. 数据类型 4. 变量 5. 常数 6. 运算符1. VBScript利器子曰：工欲善其事，必先利其器。学习一门语言自然是离不开工具及文档，有好的工具及文档在手，学习起来也会得心应手。在此，我推荐大家一个很不错的编辑工具——VbsEdit，该工具既能编辑代码，又可调试代码，有不错的智能提示，还有很多示例代...</description><content:encoded>&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=&quot;http://www.vbsedit.com/&quot;&gt;VbsEdit&lt;/a&gt;，该工具既能编辑代码，又可调试代码，有不错的智能提示，还有很多示例代码。可惜不是免费使用，不过网上已经有绿色版，您可以搜索下载。若你已经安装了QTP，那么使用QTP工具也是一个不错的选择。参考文档可以使用在线版&lt;a href=&quot;http://www.3http.com/book/script3/000.htm?vtorimicrosoftwindowsscripttechnologies.htm&quot;&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 &gt;
&lt;pre &gt;MsgBox(&quot;Hello world!&quot;)
MsgBox &quot;Hello world!&quot;
result = MsgBox(&quot;Hello World!&quot;, vbOKOnly, &quot;Greeting&quot;)
MsgBox &quot;Hello World!&quot;, vbOKOnly, &quot;Greeting&quot;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;既然在此出现的第一个函数是MsgBox，那么就简单介绍一下该函数，其签名如下:&lt;/p&gt;
&lt;div &gt;
&lt;pre &gt;MsgBox(prompt[, buttons][, title][, helpfile, context])&lt;/pre&gt;
&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 &gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;th width=&quot;15%&quot;&gt;子类型&lt;/th&gt;&lt;th width=&quot;85%&quot;&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；对于字符串变量，值为零长度字符串 (&quot;&quot;)。&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 &gt;
&lt;pre &gt;Option Explicit
Dim i, conn   '声明多个变量时用逗号隔开
Public UserName, Password
Private m_id&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;Dim i, conn, ui
i = 0
Set conn = CreateObject(&quot;ADODB.Connection&quot;)
Set ui = New UserInfo&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;Dim a(9), table(2, 3)
a(0) = 1
...
a(9) = 11
MsgBox(a(1))   '输出数组变量值

table(0, 0) = 1
...
table(2, 3) = 10&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;我们也可以声明动态数组（在运行脚本时大小发生变化的数组），使用Dim或ReDim语句，但括号中不包含任何数字。要使用动态数组，必须随后使用ReDim确定维数和每一维的大小。若同时使用Preserve关键字，则在重新调整大小时保留数组的内容。&lt;/p&gt;
&lt;div &gt;
&lt;pre &gt;Dim count, a()
count = 9
ReDim a(count)
ReDim Preserve a(10)&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;[Public | Private] Const constname = expression&lt;/pre&gt;
&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 &gt;
&lt;pre &gt;Const PI = 3.14   '常数默认为公有。
Private Const STEP_APPLY = &quot;Apply&quot;   '定义私有常数。
Const STEP_APPLY = &quot;Apply&quot;, PI  = 3.14   '在一行上定义多个常数。&lt;/pre&gt;
&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 &gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;th width=&quot;50%&quot;&gt;描述&lt;/th&gt;&lt;th width=&quot;50%&quot;&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 &gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;th width=&quot;50%&quot;&gt;描述&lt;/th&gt;&lt;th width=&quot;50%&quot;&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 &gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;th width=&quot;50%&quot;&gt;描述&lt;/th&gt;&lt;th width=&quot;50%&quot;&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=&quot;http://www.cnblogs.com/known/aggbug/2171647.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/known/archive/2011/09/09/2171647.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content:encoded><pubDate>Fri, 09 Sep 2011 10:53:00 +0800</pubDate><guid isPermaLink="false">http://www.cnblogs.com/known/archive/2011/09/09/2171647.html</guid><dc:creator>known</dc:creator></item><item><title>ASP.NET服务器端数据查询控件</title><id xmlns="http://www.w3.org/2005/Atom">http://www.cnblogs.com/known/archive/2011/08/18/2144012.html</id><author xmlns="http://www.w3.org/2005/Atom"><name>known</name><uri>http://www.cnblogs.com/known/</uri></author><content xmlns="http://www.w3.org/2005/Atom" 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 &gt;
&lt;pre &gt;&amp;lt;asp:QueryView ID=&quot;QueryView1&quot; runat=&quot;server&quot; CssClass=&quot;grid&quot; QueryCssClass=&quot;form query&quot; 
               ConnectionName=&quot;Default&quot; EntityName=&quot;T_POST&quot; AllowPaging=&quot;true&quot; PagerSettings-Position=&quot;TopAndBottom&quot;&amp;gt; 
    &amp;lt;AlternatingRowStyle CssClass=&quot;even&quot; /&amp;gt; 
    &amp;lt;Columns&amp;gt; 
        &amp;lt;asp:BoundDataField DataField=&quot;TYPE&quot; HeaderText=&quot;类别&quot; ItemStyle-Width=&quot;15%&quot; CodeCategory=&quot;PostType&quot; 
                            Operator=&quot;Equal&quot; ControlType=&quot;DropDownList&quot; EmptyText=&quot;所有类别&quot; /&amp;gt; 
        &amp;lt;asp:BoundDataField DataField=&quot;TITLE&quot; HeaderText=&quot;标题&quot; ItemStyle-Width=&quot;50%&quot; Operator=&quot;Contain&quot; /&amp;gt; 
        &amp;lt;asp:BoundDataField DataField=&quot;CREATED_BY&quot; HeaderText=&quot;作者&quot; ItemStyle-Width=&quot;15%&quot; /&amp;gt; 
        &amp;lt;asp:BoundDataField DataField=&quot;CREATED_DATE&quot; HeaderText=&quot;创建时间&quot; ItemStyle-Width=&quot;20%&quot; 
                            DataFormatString=&quot;{0:yyyy-MM-dd HH:mm:ss}&quot; ItemStyle-HorizontalAlign=&quot;Center&quot; /&amp;gt; 
    &amp;lt;/Columns&amp;gt; 
&amp;lt;/asp:QueryView&amp;gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;运行效果图如下：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://images.cnblogs.com/cnblogs_com/known/201108/201108180929436140.png&quot;&gt;&lt;img style=&quot;background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://images.cnblogs.com/cnblogs_com/known/201108/201108180929442727.png&quot; width=&quot;739&quot; height=&quot;586&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;源码下载：&lt;a href=&quot;http://files.cnblogs.com/known/QLite.rar&quot;&gt;&lt;span style=&quot;color: #002c99;&quot; color=&quot;#002c99&quot;&gt;QLite.rar&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/known/aggbug/2144012.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/known/archive/2011/08/18/2144012.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content><description>最近写了一个简单的ASP.NET服务器端数据查询控件，该控件是对ASP.NET现有的GridView控件进行了一些扩展。现在分享一下成果，希望能帮助想要实现类似控件的童鞋。该控件有如下功能：自定义GridView分页；根据绑定字段及表名自动生成查询语句并执行；设置绑定字段Operator属性，自动生成查询条件；设置绑定字段CodeCategory属性，自动将代码字段转换为代码名称。导出Excel功能。示例代码如下：&amp;lt;asp:QueryView ID=&amp;quot;QueryView1&amp;quot; runat=&amp;quot;server&amp;quot; CssClass=&amp;quot;grid&amp;qu</description><content:encoded>&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 &gt;
&lt;pre &gt;&amp;lt;asp:QueryView ID=&quot;QueryView1&quot; runat=&quot;server&quot; CssClass=&quot;grid&quot; QueryCssClass=&quot;form query&quot; 
               ConnectionName=&quot;Default&quot; EntityName=&quot;T_POST&quot; AllowPaging=&quot;true&quot; PagerSettings-Position=&quot;TopAndBottom&quot;&amp;gt; 
    &amp;lt;AlternatingRowStyle CssClass=&quot;even&quot; /&amp;gt; 
    &amp;lt;Columns&amp;gt; 
        &amp;lt;asp:BoundDataField DataField=&quot;TYPE&quot; HeaderText=&quot;类别&quot; ItemStyle-Width=&quot;15%&quot; CodeCategory=&quot;PostType&quot; 
                            Operator=&quot;Equal&quot; ControlType=&quot;DropDownList&quot; EmptyText=&quot;所有类别&quot; /&amp;gt; 
        &amp;lt;asp:BoundDataField DataField=&quot;TITLE&quot; HeaderText=&quot;标题&quot; ItemStyle-Width=&quot;50%&quot; Operator=&quot;Contain&quot; /&amp;gt; 
        &amp;lt;asp:BoundDataField DataField=&quot;CREATED_BY&quot; HeaderText=&quot;作者&quot; ItemStyle-Width=&quot;15%&quot; /&amp;gt; 
        &amp;lt;asp:BoundDataField DataField=&quot;CREATED_DATE&quot; HeaderText=&quot;创建时间&quot; ItemStyle-Width=&quot;20%&quot; 
                            DataFormatString=&quot;{0:yyyy-MM-dd HH:mm:ss}&quot; ItemStyle-HorizontalAlign=&quot;Center&quot; /&amp;gt; 
    &amp;lt;/Columns&amp;gt; 
&amp;lt;/asp:QueryView&amp;gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;运行效果图如下：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://images.cnblogs.com/cnblogs_com/known/201108/201108180929436140.png&quot;&gt;&lt;img style=&quot;background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://images.cnblogs.com/cnblogs_com/known/201108/201108180929442727.png&quot; width=&quot;739&quot; height=&quot;586&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;源码下载：&lt;a href=&quot;http://files.cnblogs.com/known/QLite.rar&quot;&gt;&lt;span style=&quot;color: #002c99;&quot; color=&quot;#002c99&quot;&gt;QLite.rar&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/known/aggbug/2144012.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/known/archive/2011/08/18/2144012.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content:encoded><pubDate>Thu, 18 Aug 2011 09:30:00 +0800</pubDate><guid isPermaLink="false">http://www.cnblogs.com/known/archive/2011/08/18/2144012.html</guid><dc:creator>known</dc:creator></item><item><title>面向对象设计的原则</title><id xmlns="http://www.w3.org/2005/Atom">http://www.cnblogs.com/known/archive/2010/10/11/1848267.html</id><author xmlns="http://www.w3.org/2005/Atom"><name>known</name><uri>http://www.cnblogs.com/known/</uri></author><content xmlns="http://www.w3.org/2005/Atom" type="html">&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;SRP 单一职责原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;　　就一个类而言，应该仅有一个引起它变化的原因。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;OCP 开放&amp;mdash;封闭原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;　　软件实体（类、模块、函数等）应该是可以扩展的，但是不可修改。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;LSP Liskov替换原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;　　子类型必须能够替换掉它们的基类型。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;DIP 依赖倒置原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;　　抽象不应该依赖于细节。细节应该依赖于抽象。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;ISP 接口隔离原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;　　不应该强迫客户依赖于它们不用的方法。接口属于客户，不属于它所在的类层次结构。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;REP 重用发布等价原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;　　重用的粒度就是发布的粒度。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;CCP 公用封闭原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;　　包中的所有类对于同一性质的变化应该是共同封闭的。一个变化若对一个包产生影响，则将对该包中的所有类产生影响，而对于其他的包不造成任何影响。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;CRP 共同重用原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;　　一个包中的所有类应该是共同重用的。如果重用了包中的一个类，那么就要重用包中的所有类。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;ADP 无环依赖原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;　　在包的依赖关系图中不允许存在环。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;SDP 稳定依赖原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;　　操着稳定的方向进行依赖。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;SAP 稳定抽象原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;　　包的抽象程度应该和其稳定程度一致。&lt;/span&gt;&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/known/aggbug/1848267.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/known/archive/2010/10/11/1848267.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content><description>SRP 单一职责原则　　就一个类而言，应该仅有一个引起它变化的原因。OCP 开放&amp;mdash;封闭原则　　软件实体（类、模块、函数等）应该是可以扩展的，但是不可修改。LSP Liskov替换原则　　子类型必须能够替换掉它们的基类型。DIP 依赖倒置原则　　抽象不应该依赖于细节。细节应该依赖于抽象。ISP 接口隔离原则　　不应该强迫客户依赖于它们不用的方法。接口属于客户，不属于它所在的类层次结构。R...</description><content:encoded>&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;SRP 单一职责原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;　　就一个类而言，应该仅有一个引起它变化的原因。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;OCP 开放&amp;mdash;封闭原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;　　软件实体（类、模块、函数等）应该是可以扩展的，但是不可修改。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;LSP Liskov替换原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;　　子类型必须能够替换掉它们的基类型。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;DIP 依赖倒置原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;　　抽象不应该依赖于细节。细节应该依赖于抽象。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;ISP 接口隔离原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;　　不应该强迫客户依赖于它们不用的方法。接口属于客户，不属于它所在的类层次结构。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;REP 重用发布等价原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;　　重用的粒度就是发布的粒度。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;CCP 公用封闭原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;　　包中的所有类对于同一性质的变化应该是共同封闭的。一个变化若对一个包产生影响，则将对该包中的所有类产生影响，而对于其他的包不造成任何影响。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;CRP 共同重用原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;　　一个包中的所有类应该是共同重用的。如果重用了包中的一个类，那么就要重用包中的所有类。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;ADP 无环依赖原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;　　在包的依赖关系图中不允许存在环。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;SDP 稳定依赖原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;　　操着稳定的方向进行依赖。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;SAP 稳定抽象原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;　　包的抽象程度应该和其稳定程度一致。&lt;/span&gt;&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/known/aggbug/1848267.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/known/archive/2010/10/11/1848267.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content:encoded><pubDate>Mon, 11 Oct 2010 21:48:00 +0800</pubDate><guid isPermaLink="false">http://www.cnblogs.com/known/archive/2010/10/11/1848267.html</guid><dc:creator>known</dc:creator></item><item><title>敏捷宣言遵循的原则</title><id xmlns="http://www.w3.org/2005/Atom">http://www.cnblogs.com/known/archive/2010/10/11/1848260.html</id><author xmlns="http://www.w3.org/2005/Atom"><name>known</name><uri>http://www.cnblogs.com/known/</uri></author><content xmlns="http://www.w3.org/2005/Atom" type="html">&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;我们最优先要做的是通过尽早的、持续的交付有价值的软件来使客户满意。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;即使到了开发的后期，也欢迎改变需求。敏捷过程利用变化来为客户创造竞争优势。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;经常性地交付可以工作的软件，交付的间隔可以从几个星期到几个月，交付的时间间隔越短越好。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;在整个项目开发期间，业务人员和开发人员必须天天一起工作。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;围绕被激励起来的个体来构建项目。给他们提供所需的环境和支持，并且信任他们能够完成工作。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;在团队内部，最具有效果并且富有效率的传递信息的方法，就是面对面的交谈。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;工作的软件是首要的进度度量标准。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;敏捷过程提倡可持续的开发速度。责任人、开发者和用户应该保持一个长期的、恒定的开发速度。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;不断地关注优秀的技能和好的设计会增强敏捷能力。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;简单&amp;mdash;&amp;mdash;使未完成的工作最大化的艺术&amp;mdash;&amp;mdash;是根本的。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;最好的架构、需求和设计出自于自组织的团队。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;每隔一定时间，团队会在如何才能更有效地工作方面进行反省，然后相应地对自己的行为进行调整。&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src=&quot;http://www.cnblogs.com/known/aggbug/1848260.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/known/archive/2010/10/11/1848260.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content><description>我们最优先要做的是通过尽早的、持续的交付有价值的软件来使客户满意。即使到了开发的后期，也欢迎改变需求。敏捷过程利用变化来为客户创造竞争优势。经常性地交付可以工作的软件，交付的间隔可以从几个星期到几个月，交付的时间间隔越短越好。在整个项目开发期间，业务人员和开发人员必须天天一起工作。围绕被激励起来的个体来构建项目。给他们提供所需的环境和支持，并且信任他们能够完成工作。在团队内部，最具有效果并且富有效...</description><content:encoded>&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;我们最优先要做的是通过尽早的、持续的交付有价值的软件来使客户满意。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;即使到了开发的后期，也欢迎改变需求。敏捷过程利用变化来为客户创造竞争优势。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;经常性地交付可以工作的软件，交付的间隔可以从几个星期到几个月，交付的时间间隔越短越好。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;在整个项目开发期间，业务人员和开发人员必须天天一起工作。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;围绕被激励起来的个体来构建项目。给他们提供所需的环境和支持，并且信任他们能够完成工作。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;在团队内部，最具有效果并且富有效率的传递信息的方法，就是面对面的交谈。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;工作的软件是首要的进度度量标准。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;敏捷过程提倡可持续的开发速度。责任人、开发者和用户应该保持一个长期的、恒定的开发速度。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;不断地关注优秀的技能和好的设计会增强敏捷能力。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;简单&amp;mdash;&amp;mdash;使未完成的工作最大化的艺术&amp;mdash;&amp;mdash;是根本的。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;最好的架构、需求和设计出自于自组织的团队。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;每隔一定时间，团队会在如何才能更有效地工作方面进行反省，然后相应地对自己的行为进行调整。&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src=&quot;http://www.cnblogs.com/known/aggbug/1848260.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/known/archive/2010/10/11/1848260.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content:encoded><pubDate>Mon, 11 Oct 2010 21:32:00 +0800</pubDate><guid isPermaLink="false">http://www.cnblogs.com/known/archive/2010/10/11/1848260.html</guid><dc:creator>known</dc:creator></item><item><title>Python学习笔记（11）：更多内容</title><id xmlns="http://www.w3.org/2005/Atom">http://www.cnblogs.com/known/archive/2010/09/09/1822622.html</id><author xmlns="http://www.w3.org/2005/Atom"><name>known</name><uri>http://www.cnblogs.com/known/</uri></author><content xmlns="http://www.w3.org/2005/Atom" 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 &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 &gt;
&lt;pre &gt;flag = True
if flag: print(&quot;Yes&quot;)
&lt;/pre&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 &gt;
&lt;pre &gt;listone = [2, 3, 4]
listtwo = [2 * i for i in listone if i &amp;gt; 2]
print(listtwo)
&lt;/pre&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 &gt;
&lt;pre &gt;def powersum(power, *args):
    '''Return the sum of each argument raised to specified power.'''
    total = 0
    for i in args:
        total += pow(i, power)
    return total
&lt;/pre&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 &gt;
&lt;pre &gt;def make_repeater(n):
    return lambda s : s * n

twice = make_repeater(2)
print(twice(&quot;ha&quot;))
print(twice(5))
&lt;/pre&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 &gt;
&lt;pre &gt;exec(&quot;print('Hello World')&quot;)
&lt;/pre&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 &gt;
&lt;pre &gt;eval(&quot;2 * 3&quot;)
&lt;/pre&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 &gt;
&lt;pre &gt;&amp;gt;&amp;gt;&amp;gt; mylist = [&quot;item&quot;]
&amp;gt;&amp;gt;&amp;gt; assert(len(mylist) &amp;gt;= 1)
&amp;gt;&amp;gt;&amp;gt; mylist.pop()
'item'
&amp;gt;&amp;gt;&amp;gt; assert(len(mylist) &amp;gt;= 1)
Traceback (most recent call last):
  File &quot;&amp;lt;pyshell#13&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;
    assert(len(mylist) &amp;gt;= 1)
AssertionError
&lt;/pre&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 &gt;
&lt;pre &gt;&amp;gt;&amp;gt;&amp;gt; i = []
&amp;gt;&amp;gt;&amp;gt; i.append(&quot;item&quot;)
&amp;gt;&amp;gt;&amp;gt; repr(i)
&quot;['item']&quot;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;基本上，repr函数和反引号用来获取对象的可打印的表示形式。你可以通过定义类的__repr__方法来控制你的对象在被repr函数调用的时候返回的内容。&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/known/aggbug/1822622.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/known/archive/2010/09/09/1822622.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content><description>1. 特殊方法在类中有一些特殊的方法具有特殊的意义，如__init__和__del__方法。通常，特殊方法都被用来模仿某个行为。如果你要为你的类使用x[key]这样的索引操作，那么你只需要实现__getitem__()方法即可。名称说明__init__(self, ...)这个方法在新建对象恰好要被返回使用之前被调用。__del__(self)恰好在对象要被删除之前调用。__str__(self)在我们对对象使用print语句或是使用str()的时候调用。__lt__(self, other)当使用 小于 运算符（&amp;lt;）的时候调用。类似地，对于所有的运算符（+，&amp;gt;等等）都有特殊的方法</description><content:encoded>&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 &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 &gt;
&lt;pre &gt;flag = True
if flag: print(&quot;Yes&quot;)
&lt;/pre&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 &gt;
&lt;pre &gt;listone = [2, 3, 4]
listtwo = [2 * i for i in listone if i &amp;gt; 2]
print(listtwo)
&lt;/pre&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 &gt;
&lt;pre &gt;def powersum(power, *args):
    '''Return the sum of each argument raised to specified power.'''
    total = 0
    for i in args:
        total += pow(i, power)
    return total
&lt;/pre&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 &gt;
&lt;pre &gt;def make_repeater(n):
    return lambda s : s * n

twice = make_repeater(2)
print(twice(&quot;ha&quot;))
print(twice(5))
&lt;/pre&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 &gt;
&lt;pre &gt;exec(&quot;print('Hello World')&quot;)
&lt;/pre&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 &gt;
&lt;pre &gt;eval(&quot;2 * 3&quot;)
&lt;/pre&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 &gt;
&lt;pre &gt;&amp;gt;&amp;gt;&amp;gt; mylist = [&quot;item&quot;]
&amp;gt;&amp;gt;&amp;gt; assert(len(mylist) &amp;gt;= 1)
&amp;gt;&amp;gt;&amp;gt; mylist.pop()
'item'
&amp;gt;&amp;gt;&amp;gt; assert(len(mylist) &amp;gt;= 1)
Traceback (most recent call last):
  File &quot;&amp;lt;pyshell#13&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;
    assert(len(mylist) &amp;gt;= 1)
AssertionError
&lt;/pre&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 &gt;
&lt;pre &gt;&amp;gt;&amp;gt;&amp;gt; i = []
&amp;gt;&amp;gt;&amp;gt; i.append(&quot;item&quot;)
&amp;gt;&amp;gt;&amp;gt; repr(i)
&quot;['item']&quot;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;基本上，repr函数和反引号用来获取对象的可打印的表示形式。你可以通过定义类的__repr__方法来控制你的对象在被repr函数调用的时候返回的内容。&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/known/aggbug/1822622.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/known/archive/2010/09/09/1822622.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content:encoded><pubDate>Thu, 09 Sep 2010 21:15:00 +0800</pubDate><guid isPermaLink="false">http://www.cnblogs.com/known/archive/2010/09/09/1822622.html</guid><dc:creator>known</dc:creator></item><item><title>Python学习笔记（10）：异常</title><id xmlns="http://www.w3.org/2005/Atom">http://www.cnblogs.com/known/archive/2010/09/08/1821819.html</id><author xmlns="http://www.w3.org/2005/Atom"><name>known</name><uri>http://www.cnblogs.com/known/</uri></author><content xmlns="http://www.w3.org/2005/Atom" 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(&quot;Hello world&quot;)&lt;br /&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;Traceback (most recent call last):&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp; File &quot;&amp;lt;pyshell#0&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Print(&quot;Hello world&quot;)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ff0000;&quot;&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 &gt;
&lt;pre &gt;try:
    f = open(&quot;test.txt&quot;)
    f.close()
except(IOError):
    print(&quot;The file is not exist.&quot;)
except:
    print(&quot;Some error occurred.&quot;)

print(&quot;Done&quot;)
&lt;/pre&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 &gt;
&lt;pre &gt;class ShortInputError(Exception):
    '''A user-defined exception class.'''
    def __init__(self, length, atleast):
        Exception.__init__(self)
        self.length = length
        self.atleast = atleast

try:
    s = input(&quot;Enter something --&amp;gt;&quot;)
    if len(s) &amp;lt; 3:
        raise(ShortInputError(len(s), 3))
    #Other work can continue as usual here
except(EOFError):
    print(&quot;Why did you do an EOF on me?&quot;)
except ShortInputError as e:
    print(&quot;ShortInputError: The input was of length %d, \
was expecting at least %d&quot; % (e.length, e.atleast))
else:
    print(&quot;No exception was raised.&quot;)
&lt;/pre&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 &gt;
&lt;pre &gt;import time

try:
    f = open(&quot;poem.txt&quot;)
    while True: # our usual file-reading idiom
        line = f.readline()
        if len(line) == 0:
            break
        time.sleep(2)
        print(line),
finally:
    f.close()
    print(&quot;Cleaning up...closed the file&quot;)
&lt;/pre&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;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 &gt;
&lt;pre &gt;def divide(x, y):
    try:
        result = x/ y
    except ZeroDivisionError:
        print(&quot;Division by zero!&quot;)
    else:
        print(&quot;result is&quot;, result)
    finally:
        print(&quot;executing finally clause&quot;)
&lt;/pre&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(&quot;2&quot;, &quot;1&quot;)&lt;br /&gt;executing finally clause&lt;br /&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;Traceback (most recent call last):&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp; File &quot;&amp;lt;pyshell#13&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; divide(&quot;2&quot;, &quot;1&quot;)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp; File &quot;&amp;lt;pyshell#10&amp;gt;&quot;, line 3, in divide&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = x/ y&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ff0000;&quot;&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=&quot;http://www.cnblogs.com/known/aggbug/1821819.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/known/archive/2010/09/08/1821819.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content><description>当程序执行的时候，可能会出现一些异常现象，这个可能是会存在的。例如，你在读文件的时候，而那个文件不存在。此时，我们可以用异常来处理。1. 错误我们来做个简单的测试，我们故意把print方法写出Print。&amp;gt;&amp;gt;&amp;gt; Print(&amp;quot;Hello world&amp;quot;)Traceback (most recent call last): File &amp;quot;&amp;lt;pyshell#0&amp;gt;&amp;quot;, line 1, in &amp;lt;module&amp;gt; Print(&amp;quot;Hello world&amp;quot;)NameError: name &amp;#39;Print&amp;#</description><content:encoded>&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(&quot;Hello world&quot;)&lt;br /&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;Traceback (most recent call last):&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp; File &quot;&amp;lt;pyshell#0&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Print(&quot;Hello world&quot;)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ff0000;&quot;&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 &gt;
&lt;pre &gt;try:
    f = open(&quot;test.txt&quot;)
    f.close()
except(IOError):
    print(&quot;The file is not exist.&quot;)
except:
    print(&quot;Some error occurred.&quot;)

print(&quot;Done&quot;)
&lt;/pre&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 &gt;
&lt;pre &gt;class ShortInputError(Exception):
    '''A user-defined exception class.'''
    def __init__(self, length, atleast):
        Exception.__init__(self)
        self.length = length
        self.atleast = atleast

try:
    s = input(&quot;Enter something --&amp;gt;&quot;)
    if len(s) &amp;lt; 3:
        raise(ShortInputError(len(s), 3))
    #Other work can continue as usual here
except(EOFError):
    print(&quot;Why did you do an EOF on me?&quot;)
except ShortInputError as e:
    print(&quot;ShortInputError: The input was of length %d, \
was expecting at least %d&quot; % (e.length, e.atleast))
else:
    print(&quot;No exception was raised.&quot;)
&lt;/pre&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 &gt;
&lt;pre &gt;import time

try:
    f = open(&quot;poem.txt&quot;)
    while True: # our usual file-reading idiom
        line = f.readline()
        if len(line) == 0:
            break
        time.sleep(2)
        print(line),
finally:
    f.close()
    print(&quot;Cleaning up...closed the file&quot;)
&lt;/pre&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;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 &gt;
&lt;pre &gt;def divide(x, y):
    try:
        result = x/ y
    except ZeroDivisionError:
        print(&quot;Division by zero!&quot;)
    else:
        print(&quot;result is&quot;, result)
    finally:
        print(&quot;executing finally clause&quot;)
&lt;/pre&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(&quot;2&quot;, &quot;1&quot;)&lt;br /&gt;executing finally clause&lt;br /&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;Traceback (most recent call last):&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp; File &quot;&amp;lt;pyshell#13&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; divide(&quot;2&quot;, &quot;1&quot;)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp; File &quot;&amp;lt;pyshell#10&amp;gt;&quot;, line 3, in divide&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = x/ y&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ff0000;&quot;&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=&quot;http://www.cnblogs.com/known/aggbug/1821819.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/known/archive/2010/09/08/1821819.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content:encoded><pubDate>Wed, 08 Sep 2010 23:09:00 +0800</pubDate><guid isPermaLink="false">http://www.cnblogs.com/known/archive/2010/09/08/1821819.html</guid><dc:creator>known</dc:creator></item><item><title>Python学习笔记（9）：输入/输出</title><id xmlns="http://www.w3.org/2005/Atom">http://www.cnblogs.com/known/archive/2010/09/08/1821792.html</id><author xmlns="http://www.w3.org/2005/Atom"><name>known</name><uri>http://www.cnblogs.com/known/</uri></author><content xmlns="http://www.w3.org/2005/Atom" 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 &gt;
&lt;pre &gt;name = input(&quot;Please input your name:\n&quot;)
print(&quot;Hello,&quot;, name)
&lt;/pre&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 &gt;
&lt;pre &gt;poem = '''\
Programming is fun
When the work is done
if you wanna make your work also fun:
    use Python!
'''

f = open('poem.txt', 'w') #open for 'w'riting
f.write(poem)             #write text to file
f.close()                 #close the file

f = open('poem.txt')
#if no mode is specified, 'r'ead mode is assumed by default
while True:
    line = f.readline()
    if len(line) == 0:#Zero length indicates EOF
        break
    print(line),
    #Notice comma to avoid automatic newline added by Python
f.close()#close the file
&lt;/pre&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;use Python!&lt;/p&gt;
&lt;p&gt;open一个文件模式可以为读模式（'r'）、写模式（'w'）或追加模式（'a'），还有其他模式，你可以用help(open)来查看。&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/known/aggbug/1821792.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/known/archive/2010/09/08/1821792.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content><description>通常，一个程序都会有输入/输出，这样可以与用户进行交互。用户输入一些信息，你会对他输入的内容进行一些适当的操作，然后再输出给用户想要的结果。Python的输入/输出，我们可以用input进行输入，print进行输出，这些都是简单的控制台输入/输出，复杂的有处理文件等。1. input和printname = input(&amp;quot;Please input your name:\n&amp;quot;)print(&amp;quot;Hello,&amp;quot;, name)运行结果：Please input your name:knownHello, known2. 处理文件poem = &amp;#39;&amp;#39;&amp;</description><content:encoded>&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 &gt;
&lt;pre &gt;name = input(&quot;Please input your name:\n&quot;)
print(&quot;Hello,&quot;, name)
&lt;/pre&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 &gt;
&lt;pre &gt;poem = '''\
Programming is fun
When the work is done
if you wanna make your work also fun:
    use Python!
'''

f = open('poem.txt', 'w') #open for 'w'riting
f.write(poem)             #write text to file
f.close()                 #close the file

f = open('poem.txt')
#if no mode is specified, 'r'ead mode is assumed by default
while True:
    line = f.readline()
    if len(line) == 0:#Zero length indicates EOF
        break
    print(line),
    #Notice comma to avoid automatic newline added by Python
f.close()#close the file
&lt;/pre&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;use Python!&lt;/p&gt;
&lt;p&gt;open一个文件模式可以为读模式（'r'）、写模式（'w'）或追加模式（'a'），还有其他模式，你可以用help(open)来查看。&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/known/aggbug/1821792.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/known/archive/2010/09/08/1821792.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content:encoded><pubDate>Wed, 08 Sep 2010 22:08:00 +0800</pubDate><guid isPermaLink="false">http://www.cnblogs.com/known/archive/2010/09/08/1821792.html</guid><dc:creator>known</dc:creator></item></channel></rss>
