如何去掉字符串中多余的字符
# 使用 strip,lstrip,rstrip 去掉两端多余的空白符,不能去中间的
import re
string = ' whsan gda '
print(string.strip())
print(string.lstrip())
print(string.rstrip())
# 使用切片方法去掉中间的特殊字符
string = 'dhang:daxig'
print(string[:5]+string[6:])
# 使用 replace 方法来替换全部的特殊字符
string = 'dhang dhangdi dh '
print(string.replace(' ',''))
# 使用正则表达式来完成多个字符的替换
string = '(djaigidanb:d \t)xah'
new_string = re.sub('[\s:\t()]+','',string)
print(new_string)
可迭代对象、迭代器对象
Iterable 可迭代的;可迭代对象可以理解成能用 for 循环遍历的数据结构,例如 dict,list,str 等都是可迭代的,但是他们都不是迭代器对象。
from collections import Iterable, Iterator
lst = [1,2,3,4]
x = isinstance(lst,Iterable)
print(x)
y = isinstance(lst,Iterator)
print(y)
Iterator 迭代器对象,针对可迭代对象,可以通过 iter() 函数来把他们变成一个迭代器对象~,例如:下面代码中的 iter_lst 就是一个迭代器对象,也在第三行中使用 isinstance 函数来验证了,他确实是一个迭代器对象。
lst = [1,2,3,4]
iter_lst = iter(lst)
print(isinstance(iter_lst,Iterator))
Iterator
对象可以通过使用 next
方法来对整个迭代器中的元素进行遍历;而且这种遍历是不可逆的,一次性的,用完就没有,next()
返回最后一个迭代器元素的时候,会抛出异常StopIteration
:
from collections import Iterator
lst = [1,2,3,4]
iter_lst = iter(lst)
print(isinstance(iter_lst,Iterator))
while iter_lst:
x = next(iter_lst)
print(x,iter_lst)
如何构造和使用迭代器对象
其实,就像我们已知的,当我们得知一个对象是可迭代对象 Iterable,那么我们可以遍历这个对象中的每一个元素,list,dict,tuple等都是如此,他们都是可迭代的;这是因为他们的内部都有一个
__iter__
方法,这个方法可以把一个对象变成可迭代的对象
但是,仅仅只包含 __iter__
方法,是不能被称为 “迭代器”的,因为迭代器的特点,是可以使用 next()
方法,而next ()
方法是底层调用的是 __next__
方法
所以,根据以上描述,迭代器底层一定要有
__iter__
方法和__next__
方法;而可迭代对象则只需要包含__iter__
方法。迭代器自身也是可迭代的
如果还不明白,可以看这张关系图~
那么问题来了:迭代器存在的意义是什么呢?
节省存储空间!!!
想象这些场景:
- 如果一篇文章非常的长,这个时候如果把它整体读到内存中,那么会占用很大的内存空间;迭代器可以将文本的每一行进行迭代,这样可以节省大量的内存空间
- 再比如,现在要使用网络爬虫对数据进行爬取,如果不适用迭代器,那么爬取的结果会在最后才显示并存储,如果使用迭代器,则可以对资源进行拆分和存储,节省大量的内存空间。