Part 1——字符串
所有标准序列操作适用于字符串,但注意字符串是不可变的
设置字符串的格式(精简)
解决方案一:使用字符串格式设置运算符——百分号%
类似于c语言中标准输出中的%,左侧放置格式字符串,右侧指定要设置的格式的值。
format = "Hello, %s.%s enough for ya?"
values = ('world', 'Hot')
format % values
——————————————————————————————————————————————
output:'Hello, world. Hot enough for ya?'
上述的%s转换运算符和c语言中一样,指出要将值插入什么地方
若右边指定的值不是字符串,那么将使用和函数list以及tuple类似的类型转换函数str将其转换为字符串类型
解决方案二:使用模板字符串
类似于UNIX shell的语法,目的是简化基本的格式设置机制
from string import Template
tmpl = Template("Hello, $who! $what enough for ya?")
tmpl.substitute(who="Mars", what="Dusty")
____________________________________________
output:'Hello, Mars! Dusty enough for ya?'
包含等号的参数是关键字参数(之后会介绍),作为用途很广的一种参数,在字符串格式设置中的作用是作为向命名替换字段提供值的方法。
解决方案三:使用字符串方法format{}
每个替换字段都用{}括起来,其中可能包含名称,还可能包含有关如何对相应的值进 行转换和格式设置的信息。
"{}, {} and {}".format("first", "second", "third") 'first, second and third'
"{0}, {1} and {2}".format("first", "second", "third") 'first, second and third'
"{3} {0} {2} {1} {3} {0}".format("be", "not", "or", "to") 'to be or not to be'
"{name} is approximately {value}.".format(value=pi, name="π")
_________________________________________
output:'π is approximately 3.141592653589793.'
在变量名和替换字段名称相等时,可以采用简化的表示方式
from math import e
f"Euler's constant is roughly {e}."(简写方式)
"Euler's constant is roughly {e}.".format(e=e)(一般方式)
___________________________________
output:"Euler's constant is roughly 2.718281828459045."
字符串方法
很多方法从模板string中继承而来。
目前的模板string中还有一些字符串没有的常量和函数,并非完全被字符串方法取代。
center:在字符串两边自动添加空格使字符串居中
函数原型:str.center(width[, fillchar])
返回一个原字符串居中,并使用空格填充至长度 width 的新字符串。默认填充字符为空格。
find:在字符串中查找子串,找到的情况下返回第一个字符的索引,未找到返-1
函数原型:str.find(str,beg=0,end=len(string))
beg开始索引,可省略,默认为0;
end结束索引,可省略,默认为字符串的长度;
依然是左闭右开区间,python惯用的做法
join:用于合并序列的元素,和split相反
函数原型:str.join(sequence)
sequence:要连接的元素序列
返回后并后的新字符串
注意合并的元素必须是字符串
lower:返回字符串的小写版本
函数原型:str.lower()
词首大写的两种方法:
1.利用title方法
2.利用模板string函数capwords
replace:将指定子串替换为另一个字符串
函数原型:str.replace(old,new[,max])
old:被替换的字符串
new:用于替换的字符串
max:可选字符串,替换最多不超过max次
str = "this is string example….wow!!! this is really string"; print str.replace("is", "was"); print str.replace("is", "was", 3);
thwas was string example….wow!!! thwas was really string thwas was string example….wow!!! thwas is really string
split:将字符串拆分为序列,与join相反
函数原型:str.split(str="", num=string.count(str)).
str : 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等
num:分割次数。默认为-1,分割所有
strip:将字符串的开头和结尾空白删除,不删除中间的的空白
函数原型:str.strip([chars])
chars : 移除字符串头尾指定的字符序列
str = "00000003210Runoob01230000000";
print str.strip( '0' );
str2 = " Runoob ";
print str2.strip();
____________________________________________
output:3210Runoob0123 Runoob
translate:类似于replace,但只能进行单字符替换,效率比replace高
函数原型:str.translate(table[, deletechars])
table:转换表(指出不同unicode码点之间的转换关系),利用字符串方法maketrans获得
deletechars:字符串中要过滤的字符列表
字符串maketrans方法接受两个参数,将第一个参数字符串中的每个字符都替换为第二个字符串中的相应字符(例如第一个字符串中第一个字符被替换为第二个字符串中的第二个字符)
例如:>>> table = str.maketrans('cs', 'kz')
>>> table {115: 122, 99: 107}(unicode码点之间的映射关系)
>>> 'this is an incredible test'.translate(table) 'thiz iz an inkredible tezt'
字符串的一些判断方法
很多字符串方法都以is打头,如isspace、isdigit和isupper,它们判断字符串是否具有特定 的性质(如包含的字符全为空白、数字或大写)。如果字符串具备特定的性质,这些方法就返回 True,否则返回False。
Part 2——字典(当索引行不通时)
列表是将数值合成数据结构并通过编号访问的办法,而映射是通过名称来访问的一种数据结构。字典是python中唯一内置的映射类型,其中的值存储在键下。
字典的用途
类似与平时生活中字典,能快速找到特定的单词(键),并查看它的定义(值)。
创建和使用字典
字典由”键:值“的方式组成,每一个称为一项,放置于花括号内。
空字典用两个花括号表示。
在映射中,键在同一个字典中必须保证唯一性。
函数dict
类似于函数list、tuple,是一种类型构造函数。
可以将其他映射或者键-值序列转换创建字
还可以使用关键字实参调用函数
>>> d = dict(name='Gumby', age=42)
>>>d
{'age': 42, 'name': 'Gumby'}
和list、tuple、str一样,若没有参数,将创建一个空字典
基本的字典操作
字典的一些操作和列查相似,但也有一些主要的差别
1.键的类型可以是任何不可变的类型,这是字典的主要优点
2.自动添加:给原本字典中没有的键赋值将会创建一个新项,而列表就不行
3.成员资格:k in d(d是字典)检查的是名称为k的键,而列表检查的是数值
字典的字符串格式设置
在有些情况下,通过在字典中存储一系列命名的值,可让格式设置更容 易些。例如,可在字典中包含各种信息,这样只需在格式字符串中提取所需的信息即可。
利用函数format_map
phonebook {'Beth': '9102', 'Alice': '2341', 'Cecil': '3258'}
"Cecil's phone number is {Cecil}.".format_map(phonebook)
_______________________________
output:"Cecil's phone number is 3258."
字典函数
clear:删除字典的所有项
copy:浅复制(父对象是键,子对象是值)
>>> x = {'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
>>> y = x.copy()
>>> y['username'] = 'mlh'
>>> y['machines'].remove('bar')
>>> y
{'username': 'mlh', 'machines': ['foo', 'baz']}
>>> x
{'username': 'admin', 'machines': ['foo', 'baz']}
区分直接赋值、浅拷贝和深拷贝的区别
直接复制:引用同一个对象,严格划分隶属于浅拷贝;
浅拷贝:仅拷贝父对象本身,不拷贝其内部的子对象。子对象仍然是原始对象中子对象的引用。换句话说,浅拷贝只复制了对象的第一层,更深层的对象则不复制,保持引用。
对上述例子而言,y 中 'username' 的值最初是对 x 中相应值的引用,因为进行的是浅拷贝。但是,当您执行 y['username'] = 'mlh' 这个操作时,情况就变了。
-
在修改之前:y['username']是对 x['username']的引用。这时,y['username'] 和 x['username'] 都指向同一个字符串对象
'admin'
。 -
在修改之后:y['username']被赋予了一个新的字符串
'mlh'
。在 Python 中,字符串是不可变的,所以这个操作实际上创建了一个新的字符串对象'mlh'
并使 y['username']指向它。此时,y['username'] 不再是对 x['username'] 的引用,而是一个指向新字符串的独立引用。
所以,最终 y['username'] 的值 'mlh'
是一个新的独立对象,不是对 x['username'] 的引用。
深拷贝:拷贝父对象及其内部所有层级的子对象。深拷贝创建了父对象和所有内部子对象的独立副本。使用copy模板中的函数deepcopy
fromkeys:创建一个统一值的新字典
函数原型:dict.fromkeys(seq[, value])
seq;字典的键
value:设置键的值,默认为None
返回一个新字典
>>>dict.fromkeys('name','age')
{'name':None,'age':None}
get:访问字典的方法,但是可以提供默认返回值
函数原型:dict.get(key[, value])
key:查找的键
value:如果指定的值不存在下默认的返回值,默认为None
返回指定键的值
items:返回一个包含所有字典项的列表,每个字典项表示为(key,value)的元组形式,但排序随机不定。
返回的这种形式是字典视图,将用于迭代
视图的优点是不复制,始终直接关联底层视图,但并不意味着它不可以复制
keys:返回一个字典视图,包含指定字典的所有的键,通俗的来说就是提取字典的所有的键
pop:删除参数键所对应的项,并返回对应key的值
函数原型:pop(key[,default])
key:键
default:当key不存在时返回的值
-
如果
key
存在 - 删除字典中对应的元素 -
如果
key
不存在 - 返回设置指定的默认值 default -
如果
key
不存在且默认值 default 没有指定 - 触发KeyError
异常
popitem:类似于list的pop,随机弹出一个字典项
注意字典是没有顺序的,自然也没有最后一项之说
setdefault:类似于get,获得指定键对应的值,但会在字典中没有参数键时在字典中添加参数项
函数原型:dict.setdefault(key, default=None)
key:查找的键值
default:键不存在时设置的默认值,默认为None
update:使用一个字典中的想来更新另一个字典
对于通过参数提供的字典,将其项添加到当前字典中。如果当前字典包含键相同的项,就进行替换。 类似于类型构造函数dict,调用update时,可以提供映射、键-值序列对或关键字参数