首页 > 程序开发 > Web开发 > Python >

Dave Python练习二—字符串

2011-09-16

#encoding=utf-8#序列:字符串、列表和元组#*******************************************#***************** 字符串 ****************#*******************************************#************Part 1: ...

#encoding=utf-8

#序列:字符串、列表和元组
#*******************************************
#***************** 字符串 ****************
#*******************************************

#************Part 1: 序列 ***********************
#序列,包括下面这些:字符串(普通字符串和unicode 字符串),列表,和元组类型。

#序列
#序列类型有着相同的访问模式:它的每一个元素可以通过指定一个偏移量的方式得到。
#下标偏移量是从0 开始到 总元素数-1 结束 -- 之所以要减一是因为我们是从0 开始计数的。

#序列类型操作符

#按照优先级从高到底的顺序排列
#
#序列操作符 作用
#seq[ind] 获得下标为ind 的元素
#seq[ind1:ind2] 获得下标从ind1 到ind2 间的元素集合
#seq * expr 序列重复expr 次
#seq1 + seq2 连接序列seq1 和seq2
#obj in seq 判断obj 元素是否包含在seq 中
#obj not in seq 判断obj 元素是否不包含在seq 中

#成员关系操作符 (in, not in)
#成员关系操作符使用来判断一个元素是否属于一个序列的。比如对字符串类型来说,就是
#判断一个字符是否属于这个字符串,对和元组类型来说,就代表了一个对象是否属于该对象序
#列。in/not in 操作符的返回值一般来讲就是True/False,满足成员关系就返回True,否则返
#回False。该操作符的语法如下:
#obj [not] in sequence

#连接操作符( + )
#这个操作符允许我们把一个序列和另一个相同类型的序列做连接。语法如下:
#sequence1 + sequence2
#该表达式的结果是一个包含sequence1 和sequence2 的内容的新序列.注意,这种方式看
#起来似乎实现了把两个序列内容合并的概念,但是这个操作不是最快或者说最有效的。对字符
#串来说,这个操作不如把所有的子字符串放到一个列表或可迭代对象中,然后调用一个join
#方法来把所有的内容连接在一起节约内存;类似地,对列表来说,我们推荐读者用列表类型的
#extend()方法来把两个或者多个列表对象合并.当你需要简单地把两个对象的内容合并,或者说
#不能依赖于可变对象的那些没有返回值(实际上它返回一个None)的内建方法来完成的时候时,
#连接操作符还是很方便的一个选择.

#重复操作符 ( * )
#当你需要需要一个序列的多份拷贝时,重复操作符非常有用,它的语法如下:
#sequence * copies_int
#copies_int 必须是一个整数(不能是长整数).像连接操作符一样,该操
#作符返回一个新的包含多份原对象拷贝的对象。

#切片操作符 ( [], [:], [::] )
#简单地讲,所谓序列类型就是包含一些顺序排列的对象的一个结构.你可以简单的用方括号
#加一个下标的方式访问它的每一个元素,或者通过在方括号中用冒号把开始下标和结束下标分开的方式来访问一组连续的元素.
#
#访问某一个数据元素的语法如下:
#sequence[index]
#sequence 是序列的名字,index 是想要访问的元素对应的偏移量.偏移量可以是正值,范围
#从0 到偏移最大值(比序列长度少一),用len()函数(下一节会讲),可以得到序列长度,实际
#的范围是 0 <= inde <= len(sequece)-1 .另外,也可以使用负索引,范围是 -1 到序列的负
#长度,-len(sequence), -len(sequence) <= index <= -1.正负索引的区别在于正索引以序列
#的开始为起点,负索引以序列的结束为起点.

#内建函数(BIFs)
#序列本身就内含了迭代的概念,之所以会这样,是因为迭代这个概念就是从序列,迭代器,或者其他支持迭代操作的对象中泛化得来的

#类型转换
#内建函数list(),str()和tuple()被用做在各种序列类型之间转换。你可以把它们理解成
#其他语言里面的类型转换,但是并没有进行任何的转换。这些转换实际上是工厂函数,
#将对象作为参数,并将其内容(浅)拷贝到新生成的对象中。

#所谓浅拷贝就是只拷贝了对对象的索引,而不是重新建立了一个对象


#序列类型转换工厂函数
#函数 含义
#list(iter) 把可迭代对象转换为列表
#str(obj) 把obj 对象转换成字符串(对象的字符串表示法)
#unicode(obj) 把对象转换成Unicode 字符串(使用默认编码)
#basestring() 抽象工厂函数,其作用仅仅是为str 和unicode 函数提供父类,所以不能被实例化,也不能被调用。
#tuple(iter) 把一个可迭代对象转换成一个元组对象


#Operational
#Python 为序列类型提供以下可操作BIFs.注意,len(),reversed()和sum()函数只能接受序列类型对象作为参数,
#而剩下的则还可以接受可迭代对象做为参数,另外,max()和min()函数也可以接受一个参数列表.


#************Part 2: 字符串 ***********************
#Python 里面单引号和双引号的作用是相同的,Python 实际上有3 类字符串.
#通常意义的字符串(str)和Unicode 字符串(unicode)实际上都是抽象类basestring 的子类.这个basestring 是不能实例化的.

#字符串的创建和赋值
#str=&#39;Dave is DBA!&#39;
#print(str)
#str1="dave is dba"
#print(str1)
#--双引号和单引号的作用是一样的

#访问字符串的值(字符和子串)
#str=&#39;What is Oracle!&#39;
#print(str[0],str[4:6])

#改变字符串
#str1=&#39;dave&#39;
#print(str1,id(str1))
#str1=&#39;oracle&#39;
#print(str1,id(str1))
#-->
#dave 35562528
#oracle 35562080
#跟数字类型一样,字符串类型也是不可变的,所以你要改变一个字符串就必须通过创建一个新串的方式来实现


#删除字符和字符串
#字符串是不可变的,所以不能仅仅删除一个字符串里的某个字符,你能做的
#是清空一个空字符串,或者是把剔除了不需要的部分后的字符串组合起来形成一个新串。
#在大部分应用程序里,没有必要显式的删除字符串。定义这个字符串的代码最终会结束,那时Python 会自动释放这些字符串.

#str1=&#39;what a fucking day&#39;
#str1=str1[0:5]+str1[7:]
#print(str1)
#-->what fucking day

#这里通过拼接来删除,这里是创建了一个新的对象,手工del 对象:
#del str1

#************Part 3: 字符串和操作符 ***********************
#标准类型操作符
#str1=&#39;oracle&#39;
#str2=&#39;mysql&#39;
#print(str1>str2)
#-->True
#在做比较操作的时候,字符串是按照ASCII 值的大小来比较的.

#序列操作符切片( [ ] 和 [ : ] )
#正向索引时,索引值开始于0,结束于总长度减1。如果开始索引或者结束索引没有被指定,则分别以字符串的第一个和最后一个索引值为默认值。
#str1=&#39;the big bang theory&#39;
#print(str1[0]+&#39;,&#39;+str1[5:10]+&#39;,&#39;+str1[5:])
#-->t,ig ba,ig bang theory

#反向索引操作时,是从-1 开始,向字符串的开始方向计数,到字符串长度的负数为索引的结束.
#即:-1 表示最后一位,-2 表示倒数第二位
#str1=&#39;the big bang theory&#39;
#print(str1[-1]+&#39;,&#39;+str1[-1:-6]+&#39;,&#39;+str1[-5:])
#-->y,,heory
#print(str1[-1]+&#39;,&#39;+str1[-6:-1]+&#39;,&#39;+str1[-5:])
#-->y,theor,heory
#这里注意,如果用方向索引,那么str1 的顺序也必须是从左到右。 否则就不能输出结果。


#成员操作符(in ,not in)
#成员操作符用于判断一个字符或者一个子串(中的字符)是否出现在另一个字符串中。出现
#则返回True,否则返回False.注意,成员操作符不是用来判断一个字符串是否包含另一个字符
#串的,这样的功能由find()或者index()(还有它们的兄弟:rfind()和rindex())函数来完成

#print(&#39;bc&#39; in &#39;abcd&#39;)
#-->True


#连接符( + )
#可以通过连接操作符来从原有字符串获得一个新的字符串.

#重复操作符( * )
#重复操作符创建一个包含了原有字符串的多个拷贝的新串
#print(&#39;Dave&#39;*3)
#-->DaveDaveDave


#************Part 4:只适用于字符串的操作符 ***********************
#
#input()
#内建的input()函数使用给定字符串提示用户输入并将这个输入返回.
#str=input(&#39;plz input a string:&#39;)
#print(str)
#-->
#plz input a string:dave is good
#dave is good

#************Part 5:字符串的独特特性 ***********************
#特殊字符串和控制字符
#像其他高级语言和脚本语言一样,一个反斜线加一个单一字符可以表示一个特殊字符,通常
#是一个不可打印的字符,这就是我们上面讨论的特殊字符,如果这些特殊字符是包含在一个原
#始字符串中的,那么它就失去了转义的功能.

#除了通常用的特殊字符,比如换行符(\n),tab 符(\t)之外,也可以直接用ASCII 码值来标
#示特殊字符:\000 或者\xXX,分别对应字符的八进制和十六进制ASCII 码值,下面分别是十进
#制,八进制和十六进制的0,65,和255:
#
# ASCII ASCII ASCII
#Decimal 0 65 255
#Octal \000 \101 \177
#Hexadecimal \x00 \x41 \xFF
#
#合法的ASCII 码值范围是从0 到255(八进制的是0177,十六进制是0XFF).

#print(&#39;\x41&#39;)
#-->A

#反斜杠开头的转义字符
#/X 八进制 十进制 十六进制 字符 说明
#\0 000 0 0x00 NUL 空字符Nul
#\a 007 7 0x07 BEL 响铃字符
#\b 010 8 0x08 BS 退格
#\t 011 9 0x09 HT 横向制表符
#\n 012 10 0x0A LF 换行
#\v 013 11 0x0B VT 纵向制表符
#\f 014 12 0x0C FF 换页
#\r 015 13 0x0D CR 回车
#\e 033 27 0x1B ESC 转义
#\" 042 34 0x22 " 双引号
#\&#39; 047 39 0x27 &#39; 单引号
#\\ 134 92 0x5C \ 反斜杠

#\OOO 八进制值(范围是000 到0177)
#\xXX x 打头的十六进制值(范围是0x00 到0xFF)
#\ 连字符,将本行和下一行的内容连接起来.


#三引号
#虽然你可以用单引号或者双引号来定义字符串,但是如果你需要包含诸如换行符这样的特
#殊字符时,单引号或者双引号就不是那么方便了。Python 的三引号就是为了解决这个问题的,
#它允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符.

#一个典型的用例是,当你需要一块HTML 或者SQL 时,这时用字符串组合,特殊字符串转义将会非常的繁琐.

#errHTML = &#39;&#39;&#39;
#<HTML><HEAD><TITLE>
#Friends CGI Demo</TITLE></HEAD>
#<BODY><H3>ERROR</H3>
#<B>%s</B><P>
#<FORM><INPUT TYPE=button VALUE=Back
#ONCLICK="window.history.back()"></FORM>
#</BODY></HTML>
#&#39;&#39;&#39;
#
#cursor.execute(&#39;&#39;&#39;
#CREATE TABLE users (
#login VARCHAR(8), uid INTEGER,
#prid INTEGER)
#&#39;&#39;&#39;)

#************Part 6:Unicode ***********************
#Unicode 术语
#名词 意思
#ASCII 美国标准信息交换码
#BMP 基本多文种平面(第零平面)
#BOM 字节顺序标记(标识字节顺序的字符)
#CJK/CJKV 中文-日文-韩文(和越南语)的缩写
#Code point 类似于ASCII 值,代表Unicode 字符的值,范围在range(1114112)或者说0x000000 到0x10FFFF.
#Octet 八位二进制数的位组
#UCS 通用字符集
#UCS2 UCS 的双字节编码方式(见UTF-16)
#UCS4 UCS 的四字节编码方式.
#UTF Unicode 或者UCS 的转换格式.
#UTF-8 八位UTF 转换格式(无符号字节序列, 长度为一到四个字节)
#UTF-16 16 位UTF 转换格式(无符号字节序列,通常是16 位长[两个字节],见UCS2)


#什么是Unicode?
#Unicode 是计算机可以支持这个星球上多种语言的秘密武器.在Unicode 之前,用的都是
#ASCII,ASCII 码非常简单,每个英文字符都是以七位二进制数的方式存贮在计算机内,其范围
#是32 到126.当用户在文件中键入一个大写字符A 时,计算机会把A 的ASCII 码值65
#写入磁盘,然后当计算机读取该文件时,它会首先把65 转化成字符A 然后显示到屏幕上.
#ASCII 编码的文件小巧易读。一个程序只需简单地把文件的每个字节读出来,把对应的数
#值转换成字符显示出来就可以了.但是ASCII 字符只能表示95 个可打印字符.后来的软件厂商把
#ASCII 码扩展到了8 位,这样一来它就可以多标识128 个字符,可是223 个字符对需要成千上万
#的字符的非欧洲语系的语言来说仍然太少
#Unicode 通过使用一个或多个字节来表示一个字符的方法突破了ASCII 的限制. 在这样机
#制下, Unicode 可以表示超过90,000 个字符.

#在Python 2.x里,Python 把硬编码的字符串叫做字面上的字符串,默认所有字面上的字符串都用ASCII 编码,可以通过在字符串前面加一
#个&#39;u&#39;前缀的方式声明Unicode 字符串,这个&#39;u&#39;前缀告诉Python 后面的字符串要编码成Unicode字符串 .

#>>> "Hello World" # ASCII string
#>>> u"Hello World" # Unicode string


#Codecs 是什么?
#codec 是COder/DECoder 的首字母组合.它定义了文本跟二进制值的转换方式,跟ASCII 那
#种用一个字节把字符转换成数字的方式不同,Unicode 用的是多字节.这导致了Unicode 支持多
#种不同的编码方式. 比如说codec 支持的四种耳熟能详的编码方式是 :ASCII,ISO8859-1/Latin-1,UTF-8 和UTF-16.
#中最著名的是UTF-8 编码,它也用一个字节来编码ASCII 字符,这让那些必须同时处理ASCII
#码和Unicode 码文本的程序员的工作变得非常轻松,因为ASCII 字符的UTF-8 编码跟ASCII 编码完全相同。

#UTF-8 编码可以用1 个到4 个字节来表示其他语言的字符,CJK/East 这样的东亚文字一般都
#是用3 个字节来表示,那些少用的、特殊的、或者历史遗留的字符用4 个字节来表示.这给那些
#需要直接处理Unicode 数据的程序员带来了麻烦,因为他们没有办法按照固定长度逐一读出各
#个字符.幸运的是我们不需要掌握直接读写Unicode 数据的方法,Python 已经替我们完成了相
#关细节,我们无须为处理多字节字符的复杂问题而担心.Python 里面的其他编码不是很常用,
#事实上,我们认为大部分的Python 程序员根本就用不着去处理其他的编码,UTF-16 可能是个例外.

#UTF-16 可能是以后大行其道的一种编码格式,它容易读写,因为它把所有的字符都是用单独的一个16 位字,两个字节来存储的,
#正因为此,这两个字节的顺序需要定义一下,一般的UTF-16 编码文件都需要一个BOM(Byte Order Mark),
#或者你显式地定义UTF-16-LE(小端)或者UTF-16-BE(大端)字节序.
#从技术上讲,UTF-16 也是一种变长编码,但它不是很常用(人们一般不会知道或者根本不
#在意除了基本多文种平面BMP 之外到底使用的是那种平面),尽管如此,UTF-16 并不向后兼容
#ASCII,因此,实现它的程序很少,因为大家需要对ASCII 进行支持


#编码解码
#Unicode 支持多种编码格式,这为程序员带来了额外的负担,每当你向一个文件写入字符
#串的时候,你必须定义一个编码(encoding 参数)用于把对应的Unicode 内容转换成你定义的格
#式,Python 通过Unicode 字符串的encode()函数解决了这个问题,该函数接受字符串中的字符
#为参数,输出你指定的编码格式的内容。
#所以,每次我们写一个Unicode 字符串到磁盘上我们都要用指定的编码器给他"编码"一下,
#相应地,当我们从这个文件读取数据时,我们必须"解码"该文件,使之成为相应的Unicode 字符串对象.

#Python 标准库里面的绝大部分模块都是兼容Unicode 的.除了pickle 模块!pickle 模块只
#支持ASCII 字符串。如果你把一个Unicode 字符串交给pickle 模块来unpickle,它会报异常.
#你必须先把你的字符串转换成ASCII 字符串才可以.所以最好是避免基于文本的pickle 操作.
#幸运地是现在二进制格式已经作为pickle 的默认格式了,pickle 的二进制格式支持不错.这点
#在你向数据库里面存东西是尤为突出,把它们作为BLOB 字段存储而不是作为TEXT 或者VARCHAR
#字段存储要好很多.万一有人把你的字段改成了Unicode 类型,这可以避免pickle 的崩溃.


#核心模块: re
#正则表达式(RE)提供了高级的字符串模式匹配方案.通过描述这些模式的语法,你可以像使
#用“过滤器”一样高效地查找传进来的文本。这些过滤器允许你基于自定义的模式字符串抽取
#匹配模式、执行查找-替换或分割字符串.

#Python 字符串不是通过NUL 或者&#39;\0&#39;来结束的
#C 编程的一个主要问题是你访问了一个字符串后面的本不属于你的空间,这种情况发生在你
#没有在字符串末尾添加终结符,NUL 或者&#39;\0&#39;(ASCII 值为0)的时候.Python 不仅为你自动管理内
#存,而且也把C 的这个负担或者说是小麻烦去掉了.Python 中的字符串不是以NUL 结束的,所以
#你不需要为是否已经添加终结符担心.字符串中只包含你所定义的东西,没有别的.

作者“David Dai Oracle 笔记 -- 为安庆崛起而奋斗”

相关文章
最新文章
热点推荐