一、题目
目的:定义函数findall,实现对字符串find方法的进一步封装
具体要求:要求返回符合要求的所有位置的起始下标,如字符串"helloworldhellopythonhelloc++hellojava",需要找出里面所有的"hello"的位置,最后将返回一个元组(0,10,21,29),即将h的下标全部返回出来,而find方法只能返回第一个
def findall(string, s):
ret = [] #设置空列表备用
if s=='':
return ret #如果要查找的位置为空,直接返回空列表
while True: #设置第一层循环,这个循环的目的是为了重复执行find()函数
index = string.find(s)
'''
取得此层循环中s所在的位置,将字符串作为一个对象检索
如果得到的索引如果得到-1,说明该值并不在string中
'''
if index != -1:
if len(ret)!=0: #
ret.append(ret[-1]+index+len(s)) #如果ret非空,则新添加的值(表示得到的符合要求的索引值在初始string中的实际索引值)应为列表中末尾的值+len(s)+新生成的索引位置
else:
ret.append(index) #如果ret为空列表直接添加即可
string = string[index+len(s):] #每次得到一个位置时,应该将string重新切片,其位置正好从find()得到的索引位置开始以len(s)作为长度结束的位置为止。
else:
break #如果index=-1则说明到string尾部为止都没能查询到s的值。因此检索结束。
return ret
print(findall("abc-abc-abc-ab","-"))
二、代码的具体分析
要读懂这段代码,除了循环的逻辑,还需要了解三个用法。
1.find()函数
用途:检测字符串中是否包含子字符串 str
效果:返回该字符串开始的索引值(即它的位置)
参数:
str -- 指定检索的字符串
beg -- 开始索引,默认为0。
end -- 结束索引,默认为字符串的长度(len(string))。
具体用法:



2、列表切片
Python中列表切片list[-1:]与list[:-1]误区_Shaun_X-CSDN博客
line2-3的对比:区别在于输出物的type
line2是运用了索引的方式,输出了列表中末位所在的'值'。
line3是运用了切片的方式,将列表切片只留下最末位,输出的仍然是一个列表。
line4-5的对比:区别在于区间右端点的包含与否
line4切片时包含右区间,lin5切片时未包含右端点。
具体用法:

3.append()函数(顺便对比extend()函数)
python中 append() 和 extend() 的用法_Arrow and Bullet-CSDN博客
用途:append() 方法用于在列表末尾添加新的对象。
(extend()用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表))
特点:直接改变原列表的结构。
(extend()处理后有返回值,需要储存在新的变量中才能使用)
具体用法:
如下两图所示,append会将整个列表作为子项追加到原列表中,而extend则只是追加列表中的内容。


如下图所示,append会将整个字符串作为子项追加到原列表中,而extend将字符串拆开后追加到原列表中。

如下图所示,append会将整个列表作为子项追加到原列表中,而extend将列表内容追加到原列表中。

网友评论