已经到了第三章,虽然进度比较慢,还是信心满满,目前还没有遇到特别难理解的,还是在打基础。学编程就是要多练习多用才会进步。加油!
第三章 使用字符串
字符串已经知道了就是用str定义的类型,引号里面的内容。
3.1 基本字符串操作
所有标准的序列操作(索引、分片、乘法、判断成员资格、求长度、取最大最小值)对字符串同样适用,但是字符串是不可变的,因为对原字符串进行改动的操作都是非法的。
website='http://www.python.org'
website[-3:]='com' #报错,分片赋值不可用
'a'+'b' #返回值'ab'
'a'*3 #返回值'aaa'
x='abcde'
x.index('b') #返回值1
x.append('f') #报错
x.count('a') #统计a的数量,返回1
x.extend('f') #报错
x.reverse() #报错
x.sort() #报错
len(x) #返回值5,该字符串的长度为5
max(x) #返回值'e'
min(x) #返回值'a'
3.2 字符串格式化:精简版
字符串格式化用字符串格式化操作符%来实现。
使用方法:%左侧放置一个字符串,右侧放置希望格式化的值。
format="hello,%s,%s enough for ya?" #这里的s可以是任何字母,但是两个必须用同一字母
values=('world','hot') #values的值字符数必须跟上一句需要格式化的数目一致
print(format % values) #返回值hello,world,hot enough for ya?,s被value的值取代
%s部分被称为转换说明符,标记了需要插入转换值的位置,s表示值会被格式化为字符串。
如果要在格式化字符串里面包括百分号,那么必须用%%。
format="P1 with three decimals:%.3f" #f表示浮点类型,3f表示小数点后三位
from math import pi
print(format % pi) #返回值P1 with three decimals:3.142
模板字符串。substitute这个模板方法会用传递进来的关键字参数foo替换字符串中的$foo.
from string import Template
s=Template('$x,glorious $x!')
s.substitute(x='slurm') #返回值'slurm,glorious slurm!'
s=Template("it's ${x}tastic!") #替换值是单词的一部分,把要替换的部分用{}括起来
s.substitute(x='slurm') #返回值"it's slurmtastic!"
s=Template("Make $$ selling $x!") #要显示美元符号,必须用$$
s.substitute(x='slurm') #返回值'Make $ selling slurm!'
s=Template('A $thing must never $action.')
d={} #用字典变量提供值/名称
d['thing']='gentleman'
d['action']='show his socks'
s.substitute(d) #返回值'A gentleman must never show his socks.'
3.3 字符串格式化:完整版
格式化操作符的右操作数可以是任何东西。
如果需要转换的元组作为表达式的一部分存在,必须将它用圆括号括起来。
'%s plus %s equals %s' %(1,1,2) #返回值'1 plus 1 equals 2'
'%s plus %s equals %s' % 1,1,2 #报错
%字符 | %字符标记转换说明符的开始 |
转换标志 | -表示左对齐,+表示在转换值之前要加上正负号,“”(空白字符)表示正数之前保留空格,0表示转换值若位数不对用0填充 |
最小字段宽度 | 转换后的字符串至少应该具有该值指定的宽度,如果是*,则宽度会从值元组中读出 |
点(.)后跟精度值 | 如果转换的是实数,精度值表示小数点后的位数。如是字符串,表示最大字段宽度,*精度从元组中读出 |
转换类型 | 含义 |
---|---|
d,i | 带符号的十进制整数 |
o | 不带符号的八进制 |
u | 不带符号的十进制 |
x | 不带符号的十六进制(小写) |
X | 不带符号的十六进制(大写) |
e | 科学计数法表示的浮点数(小写) |
E | 科学计数法表示的浮点数(大写) |
f,F | 十进制浮点数 |
g | 如果指数大于-4或者小于精度值则和e相同,其它情况与f相同 |
G | 如果指数大于-4或者小于精度值则和E相同,其它情况与F相同 |
C | 单字符(接受整数或者单字符字符串) |
r | 字符串(使用repr转换任意python对象) |
s | 字符串(使用str转换任意python对象) |
3.3.1 简单转换
只需要写出转换类型
'Price of eggs: $%d' % 42 #返回值'Price of eggs: $42'
'hexadecimal price of eggs: %x' % 42 #返回值'hexadecimal price of eggs: 2a',用16进制表示鸡蛋的价格
from math import pi
'pi: %f...' %pi #返回值'pi: 3.141593...'
'very inexact estimate of pi:%i' % pi #返回值'very inexact estimate of pi:3'
'Using str: %s' % 42 #不需要在42后面加l,加了反而报错,返回'Using str: 42'
'Using repr:%r' % 42 #返回值 'Using repr:42'
3.3.2 字段宽度和精度
字段宽度是转换后的值所保留的最小字符的个数,精度(对数字转换来说)是结果中应该包含的小数位数,或者(对字符串转换)是转换后的值能包含的最大 字符个数。
这两个参数都是整数(首先是字段宽度,然后是精度),通过点号分隔,这两个参数是可选的,如果只有精度,就必须包含句点。
'%10f' % pi #字段宽度为10,返回' 3.141593' #实际宽度达不到10,所以在前面加了两个空格
'%8f' %pi #字段宽度为8,返回'3.141593'
'%10.2f' %pi #返回值' 3.14',字段宽度为10,精度为2,显示小数点后2位
'%.2f'%pi #返回值'3.14',精度为2
'%.5s' %'Guido van Rossum' #返回值'Guido',精度为5
3.3.3 符号、对齐和0填充
'%010.2f'%pi #返回值'0000003.14',字段宽度10前面的0表示0填充
'%-10.2f'%pi #返回值'3.14 ',-表示左对齐
'%+10.2f'%pi #返回' +3.14',+表示加上正负号,默认只是在前面填充空格
'%-+10.2f'%pi #返回值'+3.14 ',左对齐并加上正负号
print(('% 5d' % 10)+'\n'+('% 5d' % -10)) #返回值 10,-10。自动在正数前加空格。
print(('%+5d' % 10)+'\n'+('% 5d' % -10)) #返回值+10,-10
字符串格式化示例
#使用给定的宽度打印格式化后的价格列表
width = int(input('Plese enter width: ')) #新版必须要先对参数设定类型,否则会报错
price_width = 10
item_width = int(width-price_width) #同理,这里也是要设定数据类型
header_format = '%-*s%*s' #减号(-1)用来左对齐数值
format = '%-*s%*.2f' #这里第二个*后没有s,如果加上s,浮点数无效,只会在结尾加上.2f。Why?
print('=' * width) #输入数据有多宽就打印多少个等号
print(header_format % (item_width, 'Item', price_width, 'Price'))
print('-' * width)
print(format % (item_width, 'Apples', price_width, 0.4))
print(format % (item_width, 'Pears', price_width, 0.5))
print (format % (item_width, 'Cantaloupes', price_width, 1.92) )
print (format % (item_width, 'Dried Apricots (16 oz.)', price_width, 8) )
print (format % (item_width, 'Prunes (4 lbs.)', price_width, 12) )
print( '=' * width)
3.4 字符串方法
3.4.1 find
find方法可以在一个较长的字符串中查找字符串,返回子串所在位置的最左端索引,如果没有找到,返回-1.
'with a moo-moo here, and a moo-moo there'.find('moo') #返回值7,moo第一次出现是在位置7上。
title="monty python's flying circus"
title.find('monty') #返回值0,find方法不返回布尔值,出现0,说明是在位置0上。
title.find('Monty') #返回值-1,区分大小写,且'Monty'不在字符串中。
还可以设定查找的起始点和终止值的范围
subject='$$$ get rich now!!! $$$'
subject.find('$$$') #返回值0
subject.find('$$$',1) #设置起始点,返回值20.
subject.find('!!!') #返回值16
subject.find('!!!',0,16) #返回值-1。设置了开始点跟结束点,还没有找到就结束了。
3.4.2 join
是split的逆方法,用来在队列中添加元素。需要添加的队列元素都 必须是字符串。
seq=[1,2,3,4,5]
sep='+'
sep.join(seq) #seq和sep类型不一致,报错
seq=['1','2','3','4','5']
sep='+'
sep.join(seq) #返回值'1+2+3+4+5'
dirs='','usr','bin','env'
'/'.join(dirs) #返回值'/usr/bin/env'
print('c:'+'\\'.join(dirs)) #返回值c:\usr\bin\env
3.4.3 lower
返回字符串的小写字母版。
'Trondheim Hammer Dance'.lower() #返回值'trondheim hammer dance'
要编写不区分大小写的代码时,这个方法可以忽略大小 写状态。
name='Gumby'
names=['gumby','smith','jones']
if name.lower() in names:print( 'Found it!') #返回值Found it!lower将所有的字符串都变成小写。这里要按两次回车键才会返回结果。
Title方法,将字符串转换为标题,所有单词的首字母大写
"that's all folks".title() #返回值"That'S All Folks",绝对是处女座好帮手
capwords函数
import string
string.capwords("that's all, folks") #返回值"That's All, Folks",看到区别了吗?这回's没有大写。
3.4.4 replace
返回某字符串的所有匹配项均被替换之后得到字符串。
'This is a test'.replace('is','eez') #返回值'Theez eez a test',不就是word中的ctrl+H查找替换功能嘛。
3.4.5 split
join的逆方法,用来将字符串分割成序列。
'1+2+3+4+5'.split('+') #返回值['1', '2', '3', '4', '5']
'/usr/bin/env'.split('/') #返回值['', 'usr', 'bin', 'env']
'Using the default'.split() #返回值['Using', 'the', 'default']
'1+2+3+4+5'.split() #返回值['1+2+3+4+5'],只有空格不用特别指定。
3.4.6 strip
除去两侧(不包括内部)空格的字符串。
' internal whitespace is kept '.strip() #返回值'internal whitespace is kept',再次确定python不是处女座编出来的?
names=['gumby','smith','jones']<pre name="code" class="python">name='gumby ' #这回是不小心在名字后面多打了一个空格
if name in names:print('found it!') #没有返回值if name.strip() in names:print('found it!') #返回值found it!
也可以指定要去除的字符
'***Spam* for * everyone!!!***'.strip('*!') #返回值'Spam* for * everyone',只会去除两侧的字符。
3.4.7 translate
和replace一样,可以替换字符串中的某些部分,区别在于,replace只处理单个字符。在同时进行多个替换时,比replace效率高。
语法: str.maketrans(intab, outtab]),新版本string模块中的maketrans了,取代的是内建函数bytearray.maketrans()、bytes.maketrans()、str.maketrans()
使用translate转换之前,需要先完成一张转换表,转换表中是以某字符替换某字符的对应关系。
table=str.maketrans('cs','kz')
table #返回值{115: 122, 99: 107}。#变成了table的值变成了字典,下一章会讲到。
len(table) #返回值2
'this is an incredible test'.translate(table) #返回值'thiz iz an inkredible tezt',无法输入第二个参数。Why?