Python空字符串在非空字符串中返回True?含'di'单词计数代码解析
问题1:为什么Python中空字符串包含在非空字符串时返回True?
- 这是因为从字符串子串的数学定义来说,空字符串
''是所有字符串的子串。你可以把任意字符串s拆成'' + s + '',所以空字符串自然存在于任何字符串的开头、结尾,或是任意两个字符之间的空位置。 - 这种设计也保证了字符串操作的一致性:比如调用
s.find('')会返回0,s.split('')能把每个字符单独拆分,这些操作都依赖于空字符串是任何字符串的子串这一规则。
问题2:代码执行逻辑解析
这段代码的目标是统计文本中包含大小写不敏感的"di"子串的单词数量(单词以空格或.作为分隔符)。
变量初始化
texto = 'imagina.':待处理的输入文本(注:按代码逻辑,该文本不含"di"子串,执行结果应为0;若要得到结果1,输入需为包含"di"的单词,比如'diamina.')cl = 0:统计当前单词的字符数(代码中未实际使用该变量,不影响核心逻辑)flag_di = False:标记当前遍历的单词是否包含"di"子串answer = 0:最终统计的符合条件的单词总数previous = '':记录上一个遍历到的字符,用于判断是否出现"di"组合
循环遍历字符的执行流程(以输入'diamina.'为例,结果为1)
第一个字符
'd':- 不是空格或
.,进入第一个分支,cl自增为1 - 当前字符是
'd',不满足car in 'iI' and previous in 'dD'(previous为空),flag_di保持False - 更新
previous为'd'
- 不是空格或
第二个字符
'i':- 不是空格或
.,cl自增为2 - 当前字符是
'i',previous是'd',满足判断条件,将flag_di设为True - 更新
previous为'i'
- 不是空格或
后续字符
'a'、'm'、'i'、'n'、'a':- 都不是空格或
.,cl持续自增,但都不触发"di"的判断,flag_di保持True - 每次更新
previous为当前字符
- 都不是空格或
最后一个字符
'.':- 属于分隔符,进入else分支
- 此时
flag_di为True,answer自增为1 - 重置
cl、flag_di、previous为初始值
最终输出
循环结束后,print(answer)输出1,符合预期。
补充说明
如果输入是用户描述的'imagina.',由于该单词里没有"di"子串,遍历到.时flag_di还是False,最终输出会是0,和用户说的结果1不符,推测是输入文本存在笔误。
内容的提问来源于stack exchange,提问作者Orion
相关产品推荐
相关产品推荐

