本帖最后由 jackz007 于 2020-12-14 00:15 编辑
在第一题中
- def findStr(desStr, subStr):
- . . . . . .
- length = len(desStr)
- . . . . . .
- for each1 in range(length-1):
- . . . . . .
- if desStr[each1+1] == subStr[1]:
复制代码
在这个代码中,length 是字符串 desStr 的长度,也就是字符串中的字符个数,那么,通过切片访问字符串的第一个元素是 desStr[0],最后一个元素是 desStr[length - 1],range(length) 会从 0 开始,以步长 1 产生一些列整型数,其中,最后一个整数是 length - 2, 在 for 循环中有这条语句:
- if desStr[each1+1] == subStr[1]:
复制代码
对于 desStr[each1 + 1] 而言,最后一次循环 each1 = length - 2,那么, desStr[each1 + 1] = desStr[length - 2 + 1] = desStr[length - 1] 恰好可以切片到字符串的最后一个字符,如果在 for 循环中范围使用的是 range(length) ,那么,不难预见,最后一次循环 desStr[each1 + 1] = desStr[length - 1 + 1] = desStr[length] 显然会引起字符串下标索引越界错误。
在第二题中
- def count(*param):
- length = len(param)
- for i in range(length):
- . . . . . .
- for each in param[i]:
复制代码
length 是输入可变参数 param 中所包含的元素个数,在本例中 length = 2
循环变量将陆续等于 0 , 1。那么,通过后面的循环,通过 param[0] 和 param[1] 就可以做到对输入参数 param 中 2 个参数的遍历和访问。
总结一下,第一题因为需要在循环中每次访问、比较目标对象的 2 个元素,所以,循环变量的变化范围要使用 range(length - 1) 来界定,第二题每次循环只需要遍历、访问目标对象的一个元素,所以, 循环变量的变化范围使用 range(length) 就可以界定。