字符串(String)
字符串是一个字符的序列,使用成对的单引号或双引号包裹内容:
str_1 = "Hello world"
str_2 = 'Hello world'
也可以用三引号表示(’’’或”””),用三引号表示字符串可以保留字符串中的全部格式信息:
str_3 = """
this is
a test
today
"""
注:无论是单引号或是双引号,都必须成对出现。不能单独出现。如果在字符串中还存在”或者’则需要使用转义字符:
str_4 = 'hello/'s world'
基本的字符串运算
长度len()函数:
str_5 = "hello world"
print len(str_5)
输出结果
拼接(+)
frist_name = 'xiao'
name = 'ming'
print frist_name + name
输出结果
重复(*)
s = 'hello'
print s * 3
输出结果
成员运算符(in):
判断一个字符串是否是另一个字符串的子串,返回值Ture或者False
s = 'hello'
print 'h' in s
输出结果
也可以利用in判断字符串是否是另一个字符串的子串,Python是大小写敏感的语言,所以只有大小写一致的话才可以返回Ture。
for语句遍历字符串
作用:枚举字符串的 每个字符。
s = 'hello'
for chr in s:
print chr
运行结果
案例
编写一个函数,计算一个字符串中元音字母的数目。(元音字母aeiou或者AEIOU)
def vowels_count(s):
count = 0
for chr in s:
if chr in 'aeiouAEIOU':
count += 1
return count
print vowels_count('hello world')
输出结果:
字符串索引
字符串中每个字符都有一个索引值(下标),索引从0(前向)或-1(后向)开始
froward index
0
1
2
3
4
h
e
l
l
o
backward index
-5
-4
-3
-2
-1
索引运算符 [ ]
例如:
s = 'hello'
print s[0],s[-1]
运行结果
注意,如果索引值超出索引范围的话,程序会报错,报错如下:
切片(Slicing)
选择字符串的子序列
语法[start:finish]
start:子序列开始位置的索引值
finish:子序列结束位置的下一个字符索引值。例如
s = 'hello'
print s[0:2]
运行结果:
注:如果不提供start或者finish,则默认start为第一个字符开始,finish为最后一个字符。
切片操作也可以接受第三个参数,[start:finish:countBy],其默认值为1。例如:
s = 'hello'
print s[0:5:2]
运行结果:
注:countBy可以为负数。如果值为-1的话则为获取字符串的逆序。例如:
s = 'hello'
print s[::-1]

字符串是不可变的,字符串一旦定义,则不可改变。即采用下标赋值的办法不可以改变字符串
例如:
s = 'hello'
s[-1] = 'a'
print s
运行结果:
字符串的方法
replace —— 替换
如果想要改变字符串内部的字符,可以使用字符串方法(对象提供的函数)
使用方法:my_str.replace(old, new),生成一个新的字符串,其中使用new替换old字符串。
例如:
s = 'hello'
print s.replace('l','a')#使得s生成了一个新的字符串
print s #s的值仍然为hello
s = s.replace('l','a')#如果想修改字符串则只能s进行赋值
print s
运行结果
注:replace方法返回一个新的字符串,原字符串内容不变,要想改变原来的字符串,则需要将新生成的字符串重新赋值给原来的字符串。
使用my_str.replace(old, new),方法将替换所有的old为new。
find —— 查找
例如:
s = 'hello'
print s.find('l')
运行结果:
返回所提供字符第一次出现的下标值,上例中参数为 l ,l 第一次出现的下标为2所以返回2
split —— 切分
例如:
s = 'hello world'
print s.split()
运行结果:
如果不提供任何参数,则split从空格处进行切分。
也可以提供一个参数,按照某一个特定字符进行切分,例如:
s = 'www.google.com'print s.split('.')
运行结果:
也可以提供两个参数,按照某一特定字符切分 n 次,例如:
s = 'www.google.com'print s.split('.',1)#只进行一次切分结果
运行结果
按照某一字符串进行切分n次,例如:
s = 'baidu||google||360||soso||yahoo'
print s.split('||',2)#从||处切分2次,不提供后面的参数可全部切分
运行结果:
按照某一特定字符分割n次,将得到的值分别赋值给n+1个字符串。
s = 'baidu||google'
str_1, str_2 = s.split('||',1)
print str_1
print str_2
运行结果:
实例1——人名游戏
读取人名列表names.txt然后将人名转换为首字母大写,其他字母小写的格式。
f = open('names.txt','r') #打开names.txt 只读模式r 可写模式w
for line in f: #按行遍历names.txt
line =line.strip()#strip方法去除空格,回车
print line.title()#title方法转换为首字母大写其与字母小写
f.close()#关闭文件
要点:
文件打开open函数返回的是一个对象,将该对象赋值给f
strip方法,用于一处字符串头尾指定的字符,没有任何参数时,默认删除空白符,包括:
n  换行    r  回车    t 水平制表
strip也可以接受字符串参数,将删除操作字符串头尾出现的指定字符,例如
str = "0000000hello!!!0000000"
print str.strip( '0' )
运行结果
判断回文字符串
在刚才例程的基础上,定义一个函数is_panlidrom,判断字符串是否为回文字符串,如果是返回TRUE否则返回FALSE,最后打印回文字符串。
分析:所谓回文字符串,指从头至尾和从尾至头相同的字符串,例如,bob就是一个回文字符串。
根据前文知识可得出,如果str[0] == str[-1] and str[1] == str[-2] and str[2] == str[-3]……str[len(str)/2] == str[-len(str)/2+1]条件全部成立时,str为回文字符串,否则不是。因此例程如下:
f = open('names.txt','r') #打开names.txt 只读模式r 可写模式w
def is_panlidrom(name):
low = 0#定义索引最小值
high = len(name) - 1#定义索引最大值,因为从零开始,所以最大为下标减一
while low < high:#当最小值小于最大值时,执行循环
if name[low] != name[high]:#第一个字符不等于最后一个字符,返回FALSE 不再继续判断
return False
low += 1#最小值加一
high -= 1#最大值减一
return True
for line in f:
line = line.strip()#移除头尾的空格回车等字符
if is_panlidrom(line):#调用函数
print line
f.close()
将其改造成递归版,思路如下:
根据递归掐头去尾留中间的方法,确定跳出递归的条件为字符串的长度为1的时候,返回其是回文字符串,否则进行判断str[0:-1]是否为回文字符串,依次递归:
f = open('names.txt','r') #打开names.txt 只读模式r 可写模式w
def is_panlidrom_rec(name):
if len(name) <= 1:#如果字符串长度为1,则直接返回True
return True
else:
if name[0] != name[-1]:#否则判断第一位和最后一位是否相等,如果否,返回FALSE
return False
else:
return is_panlidrom_rec(name[1:-1])#否则判断name[1:-1]是否为回文字符串
for line in f:
line = line.strip()
if is_panlidrom_rec(line):
print line
f.close()
更简单的方法
f = open('names.txt','r') #打开names.txt 只读模式r 可写模式w
for line in f:
line = line.strip()
if line == line[::-1]:#切片求逆序
print line
f.close()
字符串比较大小
字符大小比较的实质就是比较其ASCII码的大小,字符串大小比较是按照字典序排序。
首先比较两个字符串的第一个字符是否相同,如果相同,则比较下一个,如果不同,则字符串的大小关系由这两个字符的关系决定。
如果其中一个字符为空(较短),则其更小。
'a' < 'b'
True
'aaab'
True
'aa' < 'aaab'
Ture
'abc > 'bcd'
False
实例:定义函数is_ascending。判断传入字符串是否是升序排列
f = open('names.txt')#打开文件
def is_ascending(name):
p = name[0] #p赋值为第一个字符
for c in name:
print c,p
if p > c:#如果c,大于第一个字符,则返回否
return False
p = c #将p赋值为c
return True
for line in f:
line = line.strip()
if is_ascending(line):
print line
f.close()
以abc作为测试用例验证is_ascending函数。将参数’abc’传入is_ascending,其执行过程如下:
第一次循环时,p = a c = a 则 p = c,不满足p > c的条件,因此不执行return False语句。执行p = c,此时,p = a。
第二次循环时,p = a c = b 则 p < c,不满足p > c的条件,因此不执行return False语句。执行p = c,此时,p = b。
第三次循环时,p = b c = c 则 p< c,不满足p > c的条件,因此不执行return False语句。执行p = c,此时,p = c。但由于len(‘abc’)=3,因此循环到此结束。跳出循环,直接执行return True
字符串格式化(Formatting)