自动化测试脚本语言-Python 读书笔记
2010-05-11 10:00
489 查看
python读书笔记
1格式说明
1,同一层次的语句必须有相同的缩进。每一组这样的语句称为一个块2,行结束符号
每个块语句(函数def,if,else,for,while等)开始的行以:结束
其他的行没有结束符号,也可以有分号;
3,注释符号为#
4,区分大小写??
5,赋值语句:使用等号=
条件判断语句:使用双等号==
6,变量不需要申明,直接使用
2函数
函数通过def关键字定义。def关键字后跟一个函数的标识符名称,然后跟一对圆括号。圆括号之中可以包括一些变量名,该行以冒号结尾。接下来是一块语句,它们是函数体。下面这个例子将说明这事实上是十分简单的:
def
printMax
(a,b):
if
a>b:
a,'ismaximum'
else
:
b,'ismaximum'
printMax(3,4)#directlygiveliteralvalues
2.1默认参数值
def
say
(message,times=1):
message*times
say('Hello')
say('World',5)
关键参数
def
func
(a,b=5,c=10):
'ais'
,a,'andbis',b,'andcis',c
func(3,7)
func(25,c=24)
func(c=50,a=100)
pass语句在Python中表示一个空的语句块。
def
someFunction
():
pass
2.2在函数中接收元组和列表
当要使函数接收元组或字典形式的参数的时候,有一种特殊的方法,它分别使用*和
**前缀。这种方法在函数需要获取可变数量的参数的时候特别有用。
>>>defpowersum(power,*args):
...'''Returnthesumofeachargumentraisedtospecifiedpower.'''
...total=0
...foriinargs:
...total+=pow(i,power)
...returntotal
...
>>>powersum(2,3,4)
25=3
(
2
)
+4
(
2
)
>>>powersum(2,10)
100
由于在
args变量前有
*前缀,所有多余的函数参数都会作为一个元组存储在
args中。如果使用的是
**前缀,多余的参数则会被认为是一个字典的键/值对
3模块
为了在其他程序中重用模块,模块的文件名必须以.py为扩展名。
3.1import
import
sys
Python下标从0开始计数,而非从1开始。
字节编译的.pyc文件
这些字节编译的文件也是与平台无关的。
3.2from..import语句
如果你想要直接输入argv变量到你的程序中(避免在每次使用它时打
sys.),那么你可以使用
fromsysimportargv语句。如果你想要输入所有
sys模块使用的名字,那么你可以使用
fromsysimport*语句。这对于所有模块都适用。一般说来,应该避免使用
from..import而使用
import语句,因为这样可以使你的程序更加易读,也可以避免名称的冲突
3.3_name_
当一个模块被第一次输入的时候,这个模块的主块将被运行。假如我们只想在程序本身被使用的时候运行主块,而在它被别的模块输入的时候不运行主块,我们该怎么做呢?这可以通过模块的__name__属性完成。if
__name__=='__main__':
'Thisprogramisbeingrunbyitself'
else
:
'Iambeingimportedfromanothermodule'
3.4使用global语句
如果你想要为一个定义在函数外的变量赋值,那么你就得告诉Python这个变量名不是局部的,而是全局的。我们使用global语句完成这一功能。没有
global语句,是不可能为定义在函数外的变量赋值的。
你可以使用同一个
global语句指定多个全局变量。例如
globalx,y,z。
3.5创建你自己的模块
个模块应该被放置在我们输入它的程序的同一个目录中,或者在sys.path所列目录之一
#!/usr/bin/python
#Filename:mymodule.py
def
sayhi
():
'Hi,thisismymodulespeaking.'
version='0.1'
#Endofmymodule.py
说明:文件名.py相当于类名/结构名,里面的函数相当于成员函数,里面的变量相当于成员变量。
3.6使用自己的模块
#!/usr/bin/python
#Filename:mymodule_demo.py
import
mymodule
mymodule.sayhi()
'Version'
,mymodule.version
4数据结构
4.1列表【中括号】
由于你可以增加或删除项目,我们说列表是可变的数据类型,即这种类型是可以被改变的。你可以在列表中添加任何种类的对象包括数甚至其他列表。
shoplist=['apple','mango','carrot','banana']
print'Ihave',len(shoplist),'itemstopurchase.'
print'Theseitemsare:',#Noticethecommaatendoftheline
foriteminshoplist:
printitem,
print'/nIalsohavetobuyrice.'
shoplist.append('rice')
print'Myshoppinglistisnow',shoplist
shoplist.sort()这个方法影响列表本身,而不是返回一个修改后的列表
olditem=shoplist[0]
del
shoplist[0]
i=[]
i.append('item')
4.2列表综合
通过列表综合,可以从一个已有的列表导出一个新的列表。例如,你有一个数的列表,而你想要得到一个对应的列表,使其中所有大于2的数都是原来的2倍。对于这种应用,列表综合是最理想的方法。listone=[2,3,4]
listtwo=[2*iforiinlistoneifi>2]
listtwo
4.3元组(小括号)
元组和列表十分类似,只不过元组和字符串一样是不可变的即你不能修改元组。元组通过圆括号中用逗号分割的项目定义age=22
name='Swaroop'
'%sis%dyearsold'
%(name,age)
4.4字典{大括号},引用时用[中括号]
字典类似于你通过联系人名字查找地址和联系人详细情况的地址簿,即,我们把键(名字)和值(详细情况)联系在一起。注意,键必须是唯一的,就像如果有两个人恰巧同名的话,你无法找到正确的信息。注意,你只能使用不可变的对象(比如字符串)来作为字典的键,但是你可以不可变或可变的对象作为字典的值。基本说来就是,你应该只使用简单的对象作为键。
d={key1:value1,key2:value2}。
注意它们的键/值对用冒号分割,而各个对用逗号分割,所有这些都包括在花括号中
ab={'Swaroop':'swaroopch@byteofpython.info',
'Larry':'larry@wall.org',
'Matsumoto':'matz@ruby-lang.org',
'Spammer':'spammer@hotmail.com'
}
print"Swaroop'saddressis%s"%ab['Swaroop']
#Addingakey/valuepair
ab['Guido']='guido@python.org'
添加
#Deletingakey/valuepair
delab['Spammer']
删除
print'/nThereare%dcontactsintheaddress-book/n'%len(ab)
forname,addressinab.
items
():
print'Contact%sat%s'%(name,address)
if'Guido'inab:#ORab.has_key('Guido')
print"/nGuido'saddressis%s"%ab['Guido']
4.5序列
列表、元组和字符串都是序列,索引同样可以是负数,在那样的情况下,位置是从序列尾开始计算的。
因此,
shoplist[-1]表示序列的最后一个元素而
shoplist[-2]抓取序列的倒数第二个项目
name='swaroop'
'characters1to3is'
,name[1:3]
'characters2toendis'
,name[2:]
'characters1to-1is'
,name[1:-1]
'charactersstarttoendis'
,name[:]
注意,返回的序列从开始位置开始,刚好在结束位置之前结束。即开始位置是包含在序列切片中的,而结束位置被排斥在切片外
for
iinrange(1,5):
i
else
:
'Theforloopisover'
range(1,5)给出序列
[1,2,3,4]。
如果我们为
range提供第三个数,那么它将成为步长。例如,
range(1,5,2)给出
[1,3]。
4.6列表引用与复制
shoplist=['apple','mango','carrot','banana']
mylist=shoplist
引用
mylist=shoplist[:]#makeacopybydoingafullslice
复制
4.7字符串
name='Swaroop'#Thisisastringobject
ifname.startswith('Swa'):
print'Yes,thestringstartswith"Swa"'
if'a'inname:
print'Yes,itcontainsthestring"a"'
ifname.find('war')!=-1:
print'Yes,itcontainsthestring"war"'
delimiter='_*_'
mylist=['Brazil','Russia','India','China']
printdelimiter.join(mylist)
最后一行结果:
Brazil_*_Russia_*_India_*_China
4.8DocStrings
def
printMax
(x,y):
'''Printsthemaximumoftwonumbers.
Thetwovaluesmustbeintegers.'''
x=int(x)#converttointegers,ifpossible
y=int(y)
if
x>y:
x,'ismaximum'
else
:
y,'ismaximum'
printMax(3,5)
printMax.__doc__
输出:
5ismaximum
Printsthemaximumoftwonumbers.
Thetwovaluesmustbeintegers.
5使用类
5.1成员函数
类中的函数
第一个参数都是
self
classPerson:
def__init__(self,name):
self.name=name
defsayHi(self):
print'Hello,mynameis',self.name
p=Person('Swaroop')
成员函数中的第一个变量
self
指当前类
的
那个对象
相当于
this
__init__这个名称的开始和结尾都是双下划线构造函数
__del__析够函数
当对象不再被使用时,
__del__方法运行,但是很难保证这个方法究竟在什么时候运行。如果你想要指明它的运行,你就得使用
del语句,就如同我们在以前的例子中使用的那样
5.2成员变量
有两种类型的域——类的变量(静态变量)和对象的变量,它们根据是类还是对象拥有这个变量而区分
类的变量(相当于静态变量):在类中用类名.变量应用需要先定义
在C++成员变量定义位置初始化
对象的变量:在类中用self.变量使用
在成员函数中直接用self引用,不需要先定义
你只能使用
self变量来参考同一个对象的变量和方法。这被称为属性参考
5.3公共变量与私有变量
Python中所有的类成员(包括数据成员)都是公共的,所有的方法都是有效的,如果你使用的数据成员名称以双下划线前缀比如__privatevar,Python的名称管理体系会有效地把它作为私有变量
6继承
为了使用继承,我们把基本类的名称作为一个元组跟在定义类时的类名称之后。然后,我们注意到基本类的__init__方法专门使用
self变量调用,这样我们就可以初始化对象的基本类部分。这一点十分重要——Python不会自动调用基本类的constructor,你得亲自专门调用它。
如果在继承元组中列了一个以上的类,那么它就被称作多重继承。
class
SchoolMember
:
pass
class
Teacher
(SchoolMember):
pass
7文件操作
7.1读一般文件
poem='''/
Programmingisfun
Whentheworkisdone
ifyouwannamakeyourworkalsofun:
usePython!
'''
f=file('poem.txt','w')#openfor'w'riting
f.write(poem)#writetexttofile
f.close()#closethefile
f=file('poem.txt')
#ifnomodeisspecified,'r'eadmodeisassumedbydefault
whileTrue:
line=f.readline()
iflen(line)==0:#ZerolengthindicatesEOF
break
printline,
#NoticecommatoavoidautomaticnewlineaddedbyPython
f.close()#closethefile
7.2读INI文件
importConfigParserfilename=’c:my.ini’
config=ConfigParser.ConfigParser()
config.readfp(open(fileName))
execTimes=config.get("GLOBAL_CONFIG","execTimes")
8持久化对象-储存器
Python提供一个标准的模块,称为pickle。使用它你可以在一个文件中储存任何Python对象,之后你又可以把它完整无缺地取出来。这被称为持久地储存对象
还有另一个模块称为
cPickle,它的功能和
pickle模块完全相同,只不过它是用C语言编写的,因此要快得多(比
pickle快1000倍)。
importcPickleasp
#importpickleasp
shoplistfile='shoplist.data'
#thenameofthefilewherewewillstoretheobject
shoplist=['apple','mango','carrot']
#Writetothefile
f=file(shoplistfile,'w')
p.dump(shoplist,f)
#dumptheobjecttoafile
f.close()
delshoplist#removetheshoplist
#Readbackfromthestorage
f=file(shoplistfile)
storedlist=p.load(f)
printstoredlist
调用储存器模块的
dump函数,把对象储存到打开的文件中。这个过程称为储存。
接下来,我们使用
pickle模块的
load函数的返回来取回对象。这个过程称为取储存。
9异常
如果某个错误或异常没有被处理,默认的Python处理器就会被调用。它会终止程序的运行,并且打印一个消息,我们已经看到了这样的处理。importsys
try:
s=raw_input('Entersomething-->')
exceptEOFError:
print'/nWhydidyoudoanEOFonme?'
sys.exit()#exittheprogram
except:
print'/nSomeerror/exceptionoccurred.'
#here,wearenotexitingtheprogram
print'Done'
引发异常
你可以使用
raise语句引发异常。你还得指明错误/异常的名称和伴随异常触发的异常对象。你可以引发的错误或异常应该分别是一个
Error或
Exception类的直接或间接导出类。
classShortInputException(Exception):
'''Auser-definedexceptionclass.'''
def__init__(self,length,atleast):
Exception.__init__(self)
self.length=length
self.atleast=atleast
try:
s=raw_input('Entersomething-->')
iflen(s)<3:
raiseShortInputException(len(s),3)
#Otherworkcancontinueasusualhere
except
EOFError:
print'/nWhydidyoudoanEOFonme?'
exceptShortInputException,x:
异常类,异常变量
print'ShortInputException:Theinputwasoflength%d,/
wasexpectingatleast%d'%(x.length,x.atleast)
else:
print'Noexceptionwasraised.'
finally
:
pass
10os模块
这个模块包含普遍的操作系统功能。如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的。即它允许一个程序在编写后不需要任何改动,也不会发生任何问题,就可以在Linux和Windows下运行。一个例子就是使用os.sep可以取代操作系统特定的路径分割符。
下面列出了一些在
os模块中比较有用的部分。它们中的大多数都简单明了。
·
os.name字符串指示你正在使用的平台。比如对于Windows,它是
'nt',而对于Linux/Unix用户,它是
'posix'。
·
os.getcwd()函数得到当前工作目录,即当前Python脚本工作的目录路径。
·
os.getenv()和
os.putenv()函数分别用来读取和设置环境变量。
·
os.listdir()返回指定目录下的所有文件和目录名。
·
os.remove()函数用来删除一个文件。
·
os.system()函数用来运行shell命令。
·
os.linesep字符串给出当前平台使用的行终止符。例如,Windows使用
'/r/n',Linux使用
'/n'而Mac使用
'/r'。
·
os.path.split()函数返回一个路径的目录名和文件名
·
os.path.isfile()和
os.path.isdir()函数分别检验给出的路径是一个文件还是目录。类似地,
os.path.existe()函数用来检验给出的路径是否真地存在。
你可以利用Python标准文档去探索更多有关这些函数和变量的详细知识。你也可以使用
help(sys)等等。
11其他
11.1特殊的方法
__init__(self,...) | 这个方法在新建对象恰好要被返回使用之前被调用。 |
__del__(self) | 恰好在对象要被删除之前调用。 |
__str__(self) | 在我们对对象使用print语句或是使用str()的时候调用。 |
__lt__(self,other) | 当使用小于运算符(<)的时候调用。类似地,对于所有的运算符(+,>等等)都有特殊的方法。 |
__getitem__(self,key) | 使用x[key]索引操作符的时候调用。 |
__len__(self) | 对序列对象使用内建的len()函数的时候调用。 |
11.2lambda形式
lambda语句被用来创建新的函数对象,并且在运行时返回它们。
11.3exec和eval语句
exec语句用来执行储存在字符串或文件中的Python语句。例如,我们可以在运行时生成一个包含Python代码的字符串,然后使用
exec语句执行这些语句。下面是一个简单的例子。
>>>exec'print"HelloWorld"'
HelloWorld
eval语句用来计算存储在字符串中的有效Python表达式。下面是一个简单的例子。
>>>eval('2*3')
6
相关文章推荐
- 自动化测试-python脚本语言
- 【脚本语言系列】关于Python机器学习scikits-learn,你需要知道的事
- Python连续攀升,其他的脚本语言去哪了?
- 【脚本语言系列】关于PythonWeb服务自动化REST,你需要知道的事
- 【脚本语言系列】关于Python图像处理scikits-image, 需要知道的事
- 【脚本语言系列】关于Python统计分析statsmodel,你需要知道的事
- 【脚本语言系列】关于Python基础知识推导式,你需要知道的事
- 【脚本语言系列】关于Python基础知识容器,你需要知道的事
- 【脚本语言系列】关于Python结构化文本文件处理JSON,你需要知道的事
- Python 脚本语言学习(一)-获取版本和安装
- 《Web接口开发与自动化测试基于Python语言》--第13章
- 《Web接口开发与自动化测试基于Python语言》--第12章
- 【脚本语言系列】关于Python基础知识魔法变量,你需要知道的事
- 【脚本语言系列】关于Python测试工具Pyflakes, 你需要知道的事
- 【脚本语言系列】关于Python并发技术asyncio,你需要知道的事
- 【脚本语言系列】关于Python并发技术twisted,你需要知道的事
- 顶级脚本语言:PHP、Ruby、Python
- 【脚本语言系列】关于Python网络通讯socket,你需要知道的事
- 【脚本语言系列】关于Python代码分析工具line_profiler,你需要知道的事
- 【脚本语言系列】关于Python基础知识__slots__,你需要知道的事