本站首页    管理页面    写新日志    退出


«October 2025»
1234
567891011
12131415161718
19202122232425
262728293031


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7627244
建立时间:2006年5月29日




[Python]Python基础篇2
软件技术

lhwork 发表于 2007/2/2 10:19:59

Chapter 6. 模块 Table of Contents 6.1. String模块 6.2. time模块 模块可把一个复杂的程序按功能分开,分别存放到不同文件中,使程序更容易维护和管理。在Python中的模块是一个以.py结尾的Python代码文件。可通过import命令输入,如:import sys import会完成以下三个操作: 创建新的名称空间(namespace),该名称空间中拥有输入模块中定义的所有对象; 执行模块中的代码; 创建该名称空间的变量名。 import语句可同时输入多个模块,如:import os,sys,system 也可写成:import osimport sysimport system 有些模块的名称很长,我们可在输入时给它起个简单的别名,这样在使用模块中的对象就方便很多,如:import ftplib as ftp 有时我们可能只想使用模块中某个对象,又不想把整个模块输入,则可以用from...import语句输入特定对象。如:from ftplib import FTP 这样,我们就可直接使用FTP(),而不用带前缀。 如果装载模块出错,会引发ImportError异常。我们可捕获该异常进行相应处理。 Python脚本和模块都是一个以.py结束的文件,那程序是如何判断一个.py文件是作为脚本还是模块呢?关键是一个名为__name__的变 量,如果它的值是__main__,则不能作为模块,只能作为脚本直接运行。所以在很多脚本的最后都有一段类似下面的语句,限制只能以脚本方式运行,不作 为模块:if __name__ == '__main__': main() 几个功能相近的模块我们可组成一个Python包,存放到一个目录结构中,通过输入包的路径来调用对象。要定义包,就要建一个与包名同名的目录,接 着在该目录下创建__init__.py文件。该文件是包的初始化文件,可以为空,也可定义一个代码。例如一个WebDesign包的目录如下:/WebDesign __init_.py design.py draw.py ... 我们可通过以下语句输入design模块:import WebDesign.design 6.1. String模块 replace(string,old,new[,maxsplit]) 字符串的替换函数,把字符串中的old替换成new。默认是把string中所有的old值替换成new值,如果给出maxsplit值,还可控制替换的个数,如果maxsplit为1,则只替换第一个old值。>>>a="11223344">>>print string.replace(a,"1","one")oneone2223344>>>print string.replace(a,"1","one",1)one12223344 capitalize(string) 该函数可把字符串的首个字符替换成大字。>>> import string>>> print string.capitalize("python")Python split(string,sep=None,maxsplit=-1) 从string字符串中返回一个列表,以sep的值为分界符。>>> import string>>> ip="192.168.3.3">>> ip_list=string.split(ip,'.')>>> print ip_list['192', '168', '3', '3'] join(string[,sep]) 返回用sep连接的字串,默认的sep是空格。>>> import string>>> a = ['a','b','c']>>> b = string.join(a,'-')>>> b'a-b-c'>>> a['a', 'b', 'c'] 6.2. time模块 内置模块time包含很多与时间相关函数。我们可通过它获得当前的时间和格式化时间输出。 time(),以浮点形式返回自Linux新世纪以来经过的秒数。在linux中,00:00:00 UTC, January 1, 1970是新纪元的开始。>>> time.time()1150269086.6630149>>> time.ctime(1150269086.6630149)>>> 'Wed Jun 14 15:11:26 2006' ctime([sec]),把秒数转换成日期格式,如果不带参数,则显示当前的时间。>>> import time>>> time.ctime()>>> 'Wed Jun 14 15:02:50 2006'>>> time.ctime(1138068452427683)'Sat Dec 14 04:51:44 1901' sleep(secs),定时。>>> time.sleep(10) >>> #10秒后才会出现>>>提示符 Chapter 7. 类 类是面向对象编程的一个重要概念。通过类的创建和继承,可重用代码,减少代码复杂度。Python是一种面向对象的脚本语言,用class语句可创建类,语法规则如下:class classnmae([class_parent,...]): ... def method(): ...... 一个例子:#!/usr/bin/python#-*- encoding:utf-8 -*-class test: #定义一个test类 desc = "这是一个测试类。" #在类中定义一个属性desc def __init__(self,name1): #对象构造函数,初始化类 self.name1 = name1 def show(self,name2): #在类中定义一个方法show() print "hello world" print 'name1:',self.name1 print 'name2:',name2instance = test('这是传递给name1的值') #生成test类的实例对象instanceprint instance.desc #调用类中的desc属性instance.show('这是传递给name2的值') #调用类中的show()方法 把该脚本命名为test.py,并用chmod +x test.py使脚本有执行的权限 ,运行该脚本结果如下:debian:~/python# ./test.py这是一个测试类。hello worldname1: 这是传递给name1的值name2: 这是传递给name2的值 这里只是Python语言中类的一个简单介绍。详细介绍可参考网站上自由文档栏目中的Python资料。 Chapter 8. 异常处理 Python的异常处理能力是很强大的,可向用户准确反馈出错信息。在Python中,异常也是对象,可对它进行操作。所有异常都是基类Exception的成员。异常处理的try语法有两种,一种是:try: blockexcept [exception,[data...]]: blockelse: block 该种异常处理语法的规则是: 执行try下的语句,如果引发异常,则执行过程会跳到第一个except语句。 如果第一个except中定义的异常与引发的异常匹配,则执行该except中的语句。 如果引发的异常不匹配第一个except,则会搜索第二个except,允许编写的except数量没有限制。 如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。 如果没有发生异常,则执行else块代码。 try语句的第二种语法是:try: blockfinally: block 该语句的执行规则是: 执行try下的代码。 如果发生异常,在该异常传递到下一级try时,执行finally中的代码。 如果没有发生异常,则执行finally中的代码。 第二种try语法在无论有没有发生异常都要执行代码的情况下是很有用的。例如我们在python中打开一个文件进行读写操作,我在操作过程中不管是否出现异常,最终我都是要把该文件关闭的。 除了系统引发的异常外,我们还可用raise语句手工引发一个异常:raise [exception[,data]] Chapter 9. 文件处理 Table of Contents 9.1. 文件处理的函数和方法 9.2. 示例 文件是我们储存信息的地方,我们经常要对文件进行读、写、删除等的操作,在Python中,我们可用Python提供的函数和方法方便地操作文件。 9.1. 文件处理的函数和方法 使用Open()函数可打开文件,语法格式如下:file_handler = open(filename,[,mode[,bufsize]] filename是你要操作的文件名,如果不在当前路径,需指出具体路径。mode是打开文件的模式,表示你要如何操作文件,bufsize表示是否使用缓存。 Table 9.1. mode 模式 描述 r 以读方式打开文件,可读取文件信息。 w 以写方式打开文件,可向文件写入信息。 a 以追加方式打开文件,文件指针自动移到文件尾。 r+ 以读写方式打开文件,可对文件进行读和写操作。 w+ 消除文件内容,然后以读写方式打开文件。 a+ 以读写方式打开文件,并把文件指针移到文件尾。 b 以二进制模式打开文件,而不是以文本模式。该模式只对Windows或Dos有效,类Unix的文件是用二进制模式进行操作的。 Table 9.2. bufsize bufsize取值 描述 0 禁用缓冲 1 行缓冲 >1 指定缓冲区的大小 <1 系统默认的缓冲区大小 open()函数返回一个文件对象,我们可通过read()或write()函数对文件进行读写操作,下面是一些文件对象方法: Table 9.3. 文件对象方法 方法 描述 f.close() 关闭文件,记住用open()打开文件后一定要记得关闭它,否则会占用系统的可打开文件句柄数。 f.fileno() 获得文件描述符 f.flush() 刷新输出缓存 f.isatty() 如果文件是一个交互终端,则返回True,否则返回False。 f.read([count]) 读出文件,如果有count,则读出count个字节。 f.readline() 读出一行信息。 f.readlines() 读出所有行,也就是读出整个文件的信息。 f.seek(offset[,where]) 把文件指针移动到相对于where的offset位置。offset为0表示文件开始处,这是默认值 ;1表示当前位置;2表示文件结尾。 f.tell() 获得文件指针位置。 f.truncate([size]) 截取文件,使文件的大小为size。 f.write(string) 把string字符串写入文件。 f.writelines(list) 把list中的字符串一行一行地写入文件。 9.2. 示例 文件的打开或创建#!/usr/bin/env python#-*- encoding:UTF-8 -*-filehandler = open('test.txt','w') #以写模式打开文件,如果文件不存在则创建filehandler.write('this is a file open/create test.\nthe second line.')filehandler.close()#!/usr/bin/env python#-*- encoding:UTF-8 -*-filehandler = open('test.txt','a') #以追加模式打开文件,如果文件不存在则创建filehandler.write('\nappend the text in another line.\n')filehandler.close() 读取文件#!/usr/bin/env python#-*- encoding:UTF-8 -*-filehandler = open('test.txt','r') #以读方式打开文件,rb为二进制方式(如图片或可执行文件等) print 'read() function:' #读取整个文件print filehandler.read() print 'readline() function:' #返回文件头,读取一行filehandler.seek(0)print filehandler.readline() print 'readlines() function:' #返回文件头,返回所有行的列表filehandler.seek(0)print filehandler.readlines() print 'list all lines' #返回文件头,显示所有行filehandler.seek(0)textlist = filehandler.readlines()for line in textlist: print lineprint 'seek() function' #移位到第32个字符,从33个字符开始显示余下内容filehandler.seek(32)print filehandler.read()print 'tell() function' #移位到文件头,从头开始显示2位字符filehandler.seek(0)print filehandler.readline() #显示第一行内容print filehandler.tell() #显示当前位置print filehandler.readline() #显示第二行内容print filehandler.read() #显示余下所有内容filehandler.close() #关闭文件句柄 文件系统操作#!/usr/bin/env python#-*- encoding:utf-8 -*-import os,fnmatch,globfor fileName in os.listdir ( '/root' ): #列出/root目录内容,不包括.和.. print fileName os.mkdir('py') #在当前目录下创建一个py目录,且只能创建一层os.rmdir( 'py') #在当前目录下删除py目录,且只能删除一层os.makedirs('py/aa') #可创建多层目录os.removedirs('py/aa') #可删除多层目录print 'demonstration fnmatch module' for fileName in os.listdir ( '/root/python/file' ): if fnmatch.fnmatch(fileName,'*.txt'): #利用UNIX风格的通配,只显示后缀为txt的文件 print fileNameprint 'demonstration glob module'for fileName in glob.glob ( '*.txt' ): #利用UNIX风格的通配,只显示后缀为txt的文件 print fileName 获取文件状态#!/usr/bin/env python#-*- encoding:UTF-8 -*-import os,time,statfileStats = os.stat ( 'test.txt' ) #获取文件/目录的状态fileInfo = {'Size':fileStats [ stat.ST_SIZE ], #获取文件大小'LastModified':time.ctime( fileStats [ stat.ST_MTIME ] ), #获取文件最后修改时间'LastAccessed':time.ctime( fileStats [ stat.ST_ATIME ] ), #获取文件最后访问时间'CreationTime':time.ctime( fileStats [ stat.ST_CTIME ] ), #获取文件创建时间'Mode':fileStats [ stat.ST_MODE ] #获取文件的模式}#print fileInfofor field in fileInfo: #显示对象内容 print '%s:%s' % (field,fileInfo[field])#for infoField,infoValue in fileInfo:# print '%s:%s' % (infoField,infoValue)if stat.S_ISDIR ( fileStats [ stat.ST_MODE ] ): #判断是否路径 print 'Directory. 'else: print 'Non-directory.'if stat.S_ISREG ( fileStats [ stat.ST_MODE ] ): #判断是否一般文件 print 'Regular file.'elif stat.S_ISLNK ( fileStats [ stat.ST_MODe ] ): #判断是否链接文件 print 'Shortcut.'elif stat.S_ISSOCK ( fileStats [ stat.ST_MODe ] ): #判断是否套接字文件 print 'Socket.'elif stat.S_ISFIFO ( fileStats [ stat.ST_MODe ] ): #判断是否命名管道 print 'Named pipe.'elif stat.S_ISBLK ( fileStats [ stat.ST_MODe ] ): #判断是否块设备 print 'Block special device.'elif stat.S_ISCHR ( fileStats [ stat.ST_MODe ] ): #判断是否字符设置 print 'Character special device.'#!/usr/bin/env python#-*- encoding:UTF-8 -*-import os.pathfileStats = 'test.txt'if os.path.isdir ( fileStats ): #判断是否路径 print 'Directory.'elif os.path.isfile ( fileStats ): #判断是否一般文件 print 'File.'elif os.path.islink ( fileStats ): #判断是否链接文件 print 'Shortcut.'elif os.path.ismount ( fileStats ): #判断是否挂接点 print 'Mount point.' stat模块描述了os.stat(filename)返回的文件属性列表中各值的意义。我们可方便地根据stat模块存取os.stat()中的值。 串行化文件#!/usr/bin/env python#-*- encoding:UTF-8 -*-import picklefilehandler = open('pickle.txt','w')text = ['this is a pickle demonstrate','aa','bb']pickle.dump(text,filehandler) #把text的内容序列化后保存到pickle.txt文件中filehandler.close()filehandler2 = open('pickle.txt')textlist = pickle.load(filehandler2) #还原序列化字符串print textlistfilehandler2.close()#cpickle是用C写的pickle模块,比标准的pickle速度快很多,使用方法同pickle。 内存文件#!/usr/bin/env python#-*- coding: utf-8 -*-import StringIOfileHandle = StringIO.StringIO ( "Let freedom ring." ) #create file in memoryprint fileHandle.read() # "Let freedom ring."fileHandle.close()#cStringIO是用C写的StringIO模块,执行速度比StringIO快。 shutil模块是一个高级的文件处理模块,可实现文件的拷贝、删除等操作。 Chapter 10. 正则表达式 Table of Contents 10.1. 基本元素 10.2. 操作 正则表达式是一个很有用的工具,可处理复杂的字符匹配和替换工作。在Python中内置了一个re模块以支持正则表达式。 正则表达式有两种基本的操作,分别是匹配和替换。 匹配就是在一个文本字符串中搜索匹配一特殊表达式; 替换就是在一个字符串中查找并替换匹配一特殊表达式的字符串。 10.1. 基本元素 正则表达式定义了一系列的特殊字符元素以执行匹配动作。 Table 10.1. 正则表达式基本字符 字符 描述 text 匹配text字符串 . 匹配除换行符之外的任意一个单个字符 ^ 匹配一个字符串的开头 $ 匹配一个字符串的末尾 在正则表达式中,我们还可用匹配限定符来约束匹配的次数。 Table 10.2. 匹配限定符 最大匹配 最小匹配 描述 * *? 重复匹配前表达式零次或多次 + +? 重复匹配前表达式一次或多次 ? ?? 重复匹配前表达式零次或一次 {m} {m}? 精确重复匹配前表达式m次 {m,} {m,}? 至少重复匹配前表达式m次 {m,n} {m,n}? 至少重复匹配前表达式m次,至多重复匹配前表达式n次 据上所述,".*"为最大匹配,能匹配源字符串所有能匹配的字符串。".*?"为最小匹配,只匹配第一次出现的字符串。如:d.*g能匹配任意以d开头,以g结尾的字符串,如"debug"和"debugging",甚至"dog is walking"。而d.*?g只能匹配"debug",在"dog is walking"字符串中,则只匹配到"dog "。 在一些更复杂的匹配中,我们可用到组和运算符。 Table 10.3. 组和运算符 组 描述 [...] 匹配集合内的字符,如[a-z],[1-9]或[,./;'] [^...] 匹配除集合外的所有字符,相当于取反操作 A|B 匹配表达式A或B,相当于OR操作 (...) 表达式分组,每对括号为一组,如([a-b]+)([A-Z]+)([1-9]+) \number 匹配在number表达式组内的文本 有一组特殊的字符序列,用来匹配具体的字符类型或字符环境。如\b匹配字符边界,food\b匹配"food"、"zoofood",而和"foodies"不匹配。 Table 10.4. 特殊字符序列 字符 描述 \A 只匹配字符串的开始 \b 匹配一个单词边界 \B 匹配一个单词的非边界 \d 匹配任意十进制数字字符,等价于r'[0-9]' \D 匹配任意非十进制数字字符,等价于r'[^0-9]' \s 匹配任意空格字符(空格符、tab制表符、换行符、回车、换页符、垂直线符号) \S 匹配任意非空格字符 \w 匹配任意字母数字字符 \W 匹配任意非字母数字字符 \Z 仅匹配字符串的尾部 \\ 匹配反斜线字符 有一套声明(assertion)对具体事件进行声明。 Table 10.5. 正则表达式声明 声明 描述 (?iLmsux) 匹配空字符串,iLmsux字符对应下表的正则表达式修饰符。 (?:...) 匹配圆括号内定义的表达式,但不填充字符组表。 (?P<name>) 匹配圆括号内定义的表达式,但匹配的表达式还可用作name标识的符号组。 (?P=name) 匹配所有与前面命名的字符组相匹配的文本。 (?#...) 引入注释,忽略圆括号内的内容。 (?=...) 如果所提供的文本与下一个正则表达式元素匹配,这之间没有多余的文本就匹配。这允许在一个表达式中进行超前操作,而不影响正则表达式其余部分的分析。如"Martin"其后紧跟"Brown",则"Martin(?=Brown)"就只与"Martin"匹配。 (?!...) 仅当指定表达式与下一个正则表达式元素不匹配时匹配,是(?=...)的反操作。 (?<=...) 如果字符串当前位置的前缀字符串是给定文本,就匹配,整个表达式就在当前位置终止。如(?<=abc)def表达式与"abcdef"匹配。这种匹配是对前缀字符数量的精确匹配。 (?<!...) 如果字符串当前位置的前缀字符串不是给定的正文,就匹配,是(?<=...)的反操作。 正则表达式还支持一些处理标志,它会影响正则式的执行方法。 Table 10.6. 处理标志 标志 描述 I或IGNORECASE 忽略表达式的大小写来匹配文本。 10.2. 操作 通过re模块,我们就可在python中利用正则式对字符串进行搜索、抽取和替换操作。如:re.search()函数能执行一个基本的搜索操作,它能返回一个MatchObject对象。re.findall()函数能返回匹配列表。>>> import re>>> a="this is my re module test">>> obj = re.search(r'.*is',a)>>> print obj<_sre.SRE_Match object at 0xb7d7a218>>>> obj.group()'this is'>>> re.findall(r'.*is',a)['this is'] MatchObject对象方法 Table 10.7. MatchObject对象方法 方法 描述 expand(template) 展开模板中用反斜线定义的内容。 m.group([group,...]) 返回匹配的文本,是个元组。此文本是与给定group或由其索引数字定义的组匹配的文本,如果没有组定组名,则返回所有匹配项。 m.groups([default]) 返回一个元组,该元组包含模式中与所有组匹配的文本。如果给出default参数,default参数值就是与给定表达式不匹配的组的返回值。default参数的默认取值为None。 m.groupdict([default]) 返回一个字典,该字典包含匹配的所有子组。如果给出default参数,其值就是那些不匹配组的返回值。default参数的默认取值为None。 m.start([group]) 返回指定group的开始位置,或返回全部匹配的开始位置。 m.end([group]) 返回指定group的结束位置,或返回全部匹配的结束位置。 m.span([group]) 返回两元素组,此元组等价于关于一给定组或一个完整匹配表达式的(m.start(group),m.end(group)))列表 m.pos 传递给match()或search()函数的pos值。 m.endpos 传递给match()或search()函数的endpos值。 m.lastindex   m.lastgroup   m.re 创建这个MatchObject对象的正则式对象 m.string 提供给match()或search()函数的字符串。 使用sub()或subn()函数可在字符串上执行替换操作。sub()函数的基本格式如下:sub(pattern,replace,string[,count]) 示例>>> str = 'The dog on my bed'>>> rep = re.sub('dog','cat',str)>>> print repThe cat on my bed replace参数可接受函数。要获得替换的次数,可使用subn()函数。subn()函数返回一个元组,此元组包含替换了的文本和替换的次数。 如果需用同一个正则式进行多次匹配操作,我们可把正则式编译成内部语言,提高处理速度。编译正则式用compile()函数来实现。compile()函数的基本格式如下:compile(str[,flags]) str表示需编译的正则式串,flags是修饰标志符。正则式被编译后生成一个对象,该对象有多种方法和属性。 Table 10.8. 正则式对象方法/属性 方法/属性 描述 r.search(string[,pos[,endpos]]) 同search()函数,但此函数允许指定搜索的起点和终点 r.match(string[,pos[,endpos]]) 同match()函数,但此函数允许指定搜索的起点和终点 r.split(string[,max]) 同split()函数 r.findall(string) 同findall()函数 r.sub(replace,string[,count]) 同sub()函数 r.subn(replace,string[,count]) 同subn()函数 r.flags 创建对象时定义的标志 r.groupindex 将r'(?Pid)'定义的符号组名字映射为组序号的字典 r.pattern 在创建对象时使用的模式 转义字符串用re.escape()函数。 通过getattr获取对象引用 >>> li=['a','b']>>> getattr(li,'append')>>> getattr(li,'append')('c') #相当于li.append('c')>>> li['a', 'b', 'c']>>> handler=getattr(li,'append',None)>>> handler<built-in method append of list object at 0xb7d4a52c>>>> handler('cc') #相当于li.append('cc')>>> li['a','b','c','cc']>>>result = handler('bb')>>>li['a','b','c','cc','bb']>>>print resultNone Chapter 11. 调试 Python自带了一个调试器叫pdb,和Gnu的gbd类似。下面用一个简单的程序来演示pdb的功能。程序代码如下:#!/usr/bin/pythonimport pdba = "aaa"pdb.set_trace()b = "bbb"c = "ccc"final = a + b + cprint final 该程序已导入pdb模块,并在代码中添加的pdb.set_trace()跟踪点。现在让我们来运行该程序。localhost:~/python/pdb# python pdbtest.py--Return--> /usr/lib/python2.3/pdb.py(992)set_trace()->None-> Pdb().set_trace() # 从跟踪点开始执行(Pdb) n # n 读入下一行代码> /root/python/pdb/pdbtest.py(6)?()-> b = "bbb"(Pdb) n> /root/python/pdb/pdbtest.py(7)?()-> c = "ccc"(Pdb) p b # p 打印变量值'bbb'(Pdb) l # l 显示当前执行位置 2 3 import pdb 4 a = "aaa" 5 pdb.set_trace() 6 b = "bbb" 7 -> c = "ccc" 8 final = a + b + c 9 print final 10[EOF](Pdb) n > /root/python/pdb/pdbtest.py(8)?()-> final = a + b + c(Pdb) n # 如果命令和上次的一样,也可直接按回车,不用输入'n' > /root/python/pdb/pdbtest.py(9)?()-> print final(Pdb) naaabbbccc--Return--> /root/python/pdb/pdbtest.py(9)?()->None-> print final(Pdb) p a,b,c,final('aaa', 'bbb', 'ccc', 'aaabbbccc')(Pdb)('aaa', 'bbb', 'ccc', 'aaabbbccc')(Pdb) nlocalhost:~/python/pdb# # 返回shell pdb还有很多命令,用help命令就可以列出所有的pdb命令,用help p可以查询p命令的说明。 Chapter 12. HOW-TO 本章内容记录Python的一些小技巧小知识。来源是网上摘录或自己学习所得。 如何判断操作系统类型import sysprint sys.platformprint sys.version 显示和修改python的Module搜索路径>>> import sys>>> print sys.path['', '/usr/lib/python23.zip', '/usr/lib/python2.3', '/usr/lib/python2.3/plat-linux2', '/usr/lib/python2.3/lib-tk', '/usr/lib/python2.3/lib-dynload', '/usr/local/lib/python2.3/site-packages', '/usr/lib/python2.3/site-packages']>>> sys.path.append('/usr/lib/mypath')>>> print sys.path['', '/usr/lib/python23.zip', '/usr/lib/python2.3', '/usr/lib/python2.3/plat-linux2','/usr/lib/python2.3/lib-tk', '/usr/lib/python2.3/lib-dynload', '/usr/local/lib/python2.3/site-packages', '/usr/lib/python2.3/site-packages', '/usr/lib/mypath'] 把列表转换成字符串>>> t=['a','b','c']>>> print t['a', 'b', 'c']>>> import string>>> print string.join(t)a b c 运行系统程序>>>import os>>>os.system('ls') #用os.system()可执行系统命令>>>exec "os.system('ls')" #用exec可执行字符串中的命令,两个命令的效果一样。 以上两个命令的输出都是直接显示在屏幕上,不能保存到变量中,如果我们要把输出保存起来,可用os.pope\ n()函数。>>>cmd = '/usr/bin/mkntpwd %s' % password>>>handler = os.popen(cmd,'r')>>>passwordString=handler.read() #passwordString为mkntpwd程序的输出结果 使用commands模块也可以获取程序的输出,它包含一些基于os.popen()的封装函数,使我们能更方便地获取运行系统命令和获取命令的输出,但该模块只在Unix系统下有效,不能用于Windows平台。>>> import commands>>> status,output = commands.getstatusoutput('ls -l')>>> print output总计 96564-rw-r--r-- 1 root root 4459 2005-12-01 10:23 2005.sxw-rw-r--r-- 1 root root 27511 2006-04-12 16:54 20060412_user.ods-rw-r--r-- 1 root root 202258 2006-01-06 16:48 2006风景-1月.jpg...>>> print status0 在Python2.4中引入一个新的模块叫subprocess,用于取代os.system、os.spawn*、os.popen*、popen2.*、commands.*。 编码转换#!/usr/bin/python#-*-coding:utf-8 -*-a=u"测试"b=a.encode('gb2312')print aprint b 交换两个变量>>> a,b = 1,2>>> a,b(1, 2)>>> a,b = b,a>>> a,b(2, 1)>>> a2>>> b1 测试数据类型>>> a=123>>> b='test'>>> a123>>> b'test'>>> isinstance(a,int)True>>> isinstance(a,str)False>>> isinstance(b,int)False>>> isinstance(b,str)True 用in判断是否包含子字符串>>> a='this is my test'>>> 'is' in aTrue>>> 'mm' in aFalse __iter__迭代器>>> a = "iterator">>> t = iter(a)>>> t.next()'i'>>> t.next()'t'>>> t.next()'e'>>> t.next()'r'>>> t.next()'a'>>> t.next()'t'>>> t.next()'o'>>> t.next()'r'>>> t.next()Traceback (most recent call last): File "<stdin>", line 1, in ?StopIteration 自已写一个迭代器类>>> class reverse:... def __init__(self,data):... self.data=data... self.index=len(data)... def __iter__(self):... return self... def next(self):... if self.index == 0:... raise StopIteration... self.index = self.index - 1... return self.data[self.index]...>>> for char in reverse('iterator'):... print char...rotareti>>> 通过getattr可以得到一个在运行时才知道具体函数名的对象的引用,能增强我们程序的灵活性。>>> li=['a','b']>>> getattr(li,'append')>>> getattr(li,'append')('c') #相当于li.append('c')>>> li['a', 'b', 'c']>>> handler=getattr(li,'append',None)>>> handler<built-in method append of list object at 0xb7d4a52c>>>> handler('cc') #相当于li.append('cc')>>> li['a','b','c','cc']>>>result = handler('bb')>>>li['a','b','c','cc','bb']>>>print resultNone 编程示例:import statsoutdef output(data, format="text"): output_function = getattr(statsout, "output_%s" % format) return output_function(data) 以上代码表示,output函数接收一个data参数和format参数,根据format参数的值,从statsout模块中取出 output_text函数运行,data参数通过output_function(data)传递给了statsout模块中的output_text 函数。format取不同值可从statsout模块中取出不同的函数运行(output_xxxx)。也就是说我们要运行的函数是在程序运行后才确定 的。这样我们可把不同的函数以output_xxx形式命名放在statout模块中,通过以上程序可动态调用各种函数。 hasattr用于确定一个对象是否具有某个属性。语法: hasattr(object, name) -> bool判断object中是否有name属性,返回一个布尔值。 拆分序列>>> a=[c for c in 'abcdefg']>>> a['a', 'b', 'c', 'd', 'e', 'f', 'g']>>> 按if条件拆分序列>>> a=[c for c in '123456' if int(c)<3] 如果if的条件为真,则执行for循环>>> a['1', '2']>>> a=[c for c in '123456' if int(c)>3] 如果if的条件为假,则不执行for循环>>> a['4', '5', '6'] __dict__记录模块或类中所有对象的信息,它以字典{name:object}的形式记录这些信息,如果wikiaction是一个模块,则可以这样显示:>>>import wikiaction>>>print wikiaction.__dict__{'do_test': <function do_test at 0xb7c10534>, 'do_diff': <function do_diff at 0xb7c0ef0c>, 'do_refresh': <function do_refresh at 0xb7c1025c>, 'do_userform': <function do_userform at 0xb7c103e4>, 'getHandler': <function getHandler at 0xb7c105a4>, 'do_raw': <function do_raw at 0xb7c10454>, 'do_chart': <function do_chart at 0xb7c104c4>, 're': <module 're' from '/usr/lib/python2.3/re.pyc'>, 'pysupport': <module 'MoinMoin.util.pysupport' from '/usr/lib/python2.3/site-packages/MoinMoin/util/pysupport.pyc'>, 'config': <module 'MoinMoin.config' from '/usr/lib/python2.3/site-packages/MoinMoin/config.pyc'>} 'and'的特殊用法>>> 'a' and 'b' #如果两个都为真值,返回最后一个真值'b'>>> 'b' and 'a' #同上'a'>>> 'a' and 'b' and 'c' #同上'c'>>> '' and 'a' #如果有假值,则返回假值''>>> 'a' and '' and 'c' #同上''>>> '' and 0 #如果两个都为假值,返回第一个假值''>>> 0 and '' #同上0 'or'的的特殊用法>>> 'a' or 'b' #如果有一个为真值,则返回第一个真值'a'>>> 'b' or 'a' #同上'b'>>> 'a' or 'b' or '' #同上'a'>>> 0 and '' and {} #如果所有都是假值,则返回第一个假值0>>> {} and '' and {} #同上{} lambda匿名函数的用法>>> a=lambda c:c*2>>> a<function <lambda> at 0xb7dd710c>>>> a(2)4>>> a(5)10


阅读全文(3930) | 回复(1) | 编辑 | 精华
 


回复:Python基础篇2
软件技术

来自南京(游客)发表评论于2008/2/22 9:27:05

原来在这里,估计很多人像我一样开始没有注意到。比基础1的浏览量明显少了很多


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.063 second(s), page refreshed 144800615 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号