鱼C论坛

 找回密码
 立即注册
查看: 1883|回复: 2

[已解决]for ... in range()到底怎么用

[复制链接]
发表于 2020-12-13 22:43:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为什么第一个range的范围就是  for each1 in range(length-1)  “length-1”;第二个range的范围就是for i in range(length)“length”?????

1. 编写一个函数 findstr(),该函数统计一个长度为 2 的子字符串在另一个字符串中出现的次数。例如:假定输入的字符串为“You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.”,子字符串为“im”,函数执行后打印“子字母串在目标字符串中共出现 3 次”。

def findStr(desStr, subStr):
    count = 0
    length = len(desStr)
    if subStr not in desStr:
        print('在目标字符串中未找到字符串!')
    else:
        for each1 in range(length-1):      
            if desStr[each1] == subStr[0]:
                if desStr[each1+1] == subStr[1]:
                    count += 1
                    
        print('子字符串在目标字符串中共出现 %d 次' % count)

desStr = input('请输入目标字符串:')
subStr = input('请输入子字符串(两个字符):')
findStr(desStr, subStr)
复制代码

2. 编写一个函数,分别统计出传入字符串参数(可能不只一个参数)的英文字母、空格、数字和其它字符的个数。
def count(*param):
    length = len(param)
    for i in range(length):
        letters = 0
        space = 0
        digit = 0
        others = 0
        for each in param[i]:
            if each.isalpha():
                letters += 1
            elif each.isdigit():
                digit += 1
            elif each == ' ':
                space += 1
            else:
                others += 1
        print('第 %d 个字符串共有:英文字母 %d 个,数字 %d 个,空格 %d 个,其他字符 %d 个。' % (i+1, letters, digit, space, others))
            
count('I love fishc.com.', 'I love you, you love me.')
复制代码
最佳答案
2020-12-14 00:00:22
本帖最后由 jackz007 于 2020-12-14 00:15 编辑

        在第一题中
  1. def findStr(desStr, subStr):
  2. . . . . . .
  3.     length = len(desStr)
  4. . . . . . .
  5.         for each1 in range(length-1):      
  6. . . . . . .
  7.                 if desStr[each1+1] == subStr[1]:
复制代码

       在这个代码中,length 是字符串 desStr 的长度,也就是字符串中的字符个数,那么,通过切片访问字符串的第一个元素是 desStr[0],最后一个元素是 desStr[length - 1],range(length) 会从 0 开始,以步长 1 产生一些列整型数,其中,最后一个整数是 length - 2, 在 for 循环中有这条语句:
  1.                 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] 显然会引起字符串下标索引越界错误。

        在第二题中
  1. def count(*param):
  2.     length = len(param)
  3.     for i in range(length):
  4. . . . . . .
  5.         for each in param[i]:
复制代码

        length 是输入可变参数 param 中所包含的元素个数,在本例中 length = 2
  1.     for i in range(length):
复制代码

        循环变量将陆续等于 0 , 1。那么,通过后面的循环,通过 param[0] 和 param[1] 就可以做到对输入参数 param 中 2 个参数的遍历和访问。

        总结一下,第一题因为需要在循环中每次访问、比较目标对象的 2 个元素,所以,循环变量的变化范围要使用 range(length - 1) 来界定,第二题每次循环只需要遍历、访问目标对象的一个元素,所以, 循环变量的变化范围使用 range(length) 就可以界定。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-14 00:00:22 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +1 鱼币

本帖最后由 jackz007 于 2020-12-14 00:15 编辑

        在第一题中
  1. def findStr(desStr, subStr):
  2. . . . . . .
  3.     length = len(desStr)
  4. . . . . . .
  5.         for each1 in range(length-1):      
  6. . . . . . .
  7.                 if desStr[each1+1] == subStr[1]:
复制代码

       在这个代码中,length 是字符串 desStr 的长度,也就是字符串中的字符个数,那么,通过切片访问字符串的第一个元素是 desStr[0],最后一个元素是 desStr[length - 1],range(length) 会从 0 开始,以步长 1 产生一些列整型数,其中,最后一个整数是 length - 2, 在 for 循环中有这条语句:
  1.                 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] 显然会引起字符串下标索引越界错误。

        在第二题中
  1. def count(*param):
  2.     length = len(param)
  3.     for i in range(length):
  4. . . . . . .
  5.         for each in param[i]:
复制代码

        length 是输入可变参数 param 中所包含的元素个数,在本例中 length = 2
  1.     for i in range(length):
复制代码

        循环变量将陆续等于 0 , 1。那么,通过后面的循环,通过 param[0] 和 param[1] 就可以做到对输入参数 param 中 2 个参数的遍历和访问。

        总结一下,第一题因为需要在循环中每次访问、比较目标对象的 2 个元素,所以,循环变量的变化范围要使用 range(length - 1) 来界定,第二题每次循环只需要遍历、访问目标对象的一个元素,所以, 循环变量的变化范围使用 range(length) 就可以界定。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-14 10:32:45 | 显示全部楼层

回帖奖励 +1 鱼币

帮顶下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-26 20:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表