Python 迭代与查找:遍历、计数、搜索三大核心技能
📝 用 for 循环遍历文本 + 统计单词 + 线性查找,实战编程思维
7. 迭代与查找
本章我们将:
7.1 循环与字符串
遍历字符串中的每个字符:
# 遍历字符串,空格结尾不换行for letter in'Gadsby':print(letter, end=' ')
运行结果:
G a d s b y
判断单词是否含字母 e
# 判断单词是否包含 e 或 Edefhas_e(word):for letter in word:# 找到就立即返回 Trueif letter == 'e'or letter == 'E':returnTrue# 遍历完都没找到returnFalse
print(has_e('Gadsby'))print(has_e('Emma'))
运行结果:
FalseTrue
7.2 读取单词列表文件
读取 words.txt 单词表(约11万个单词)。
# 打开文件file_object = open('words.txt')# 读取一行line = file_object.readline()print(line)
运行结果:
'aa\n'
# 去掉换行符和空白word = line.strip()print(word)
运行结果:
'aa'
逐行遍历文件:
for line inopen('words.txt'): word = line.strip()print(word)
7.3 更新变量
在循环中修改变量的值(累加、累减等)。
x = 5# 赋值更新x = 7# 增量更新(在原值上+1)x = x + 1print(x)
运行结果:
8
增量赋值运算符
z = 0# 等价于 z = z + 1z += 1# 等价于 z = z + 2z += 2print(z)
运行结果:
3
7.4 循环与计数
统计总单词数、含 e 的单词数。
# 总单词计数器total = 0# 含 e 的单词计数器count = 0for line inopen('words.txt'): word = line.strip() total += 1if has_e(word): count += 1print('总单词数:', total)print('含 e 的单词数:', count)print('百分比:', count / total * 100)
运行结果:
总单词数: 113783含 e 的单词数: 76162百分比: 66.936...
7.5 in 运算符
直接判断字符是否在字符串中:
defhas_e(word):# 转小写后判断是否包含 'e'return'e'in word.lower()
print(has_e('Gadsby'))print(has_e('Emma'))
运行结果:
FalseTrue
7.6 搜索(线性查找)
线性查找:逐个检查,找到立即返回。
# 判断单词是否包含指定字母表中的任意一个defuses_any(word, letters):for letter in word.lower():if letter in letters.lower():returnTruereturnFalse
print(uses_any('banana', 'aeiou'))print(uses_any('apple', 'xyz'))
运行结果:
TrueFalse
7.7 文档测试 doctest
在文档字符串里写测试用例,自动校验函数。
defuses_any(word, letters):"""检查单词是否包含指定字母中的任意一个 >>> uses_any('banana', 'aeiou') True >>> uses_any('apple', 'xyz') False """for letter in word.lower():if letter in letters.lower():returnTruereturnFalse
# 运行测试from doctest import run_docstring_examplesdefrun_doctests(func): run_docstring_examples(func, globals(), name=func.__name__)run_doctests(uses_any)
7.8 术语表
7.9 练习题(带答案模板)
7.9.2 uses_none
检查单词不使用任何禁用字母:
defuses_none(word, forbidden):"""检查单词是否不使用禁用字母 >>> uses_none('banana', 'xyz') True >>> uses_none('apple', 'efg') False """for letter in word.lower():if letter in forbidden.lower():returnFalsereturnTrue
7.9.3 uses_only
检查单词只用允许的字母:
defuses_only(word, available):"""检查单词是否只使用指定字母 >>> uses_only('banana', 'ban') True >>> uses_only('apple', 'apl') False """for letter in word.lower():if letter notin available.lower():returnFalsereturnTrue
7.9.4 uses_all
检查单词包含所有必需字母:
defuses_all(word, required):"""检查单词是否包含所有必需字母 >>> uses_all('banana', 'ban') True >>> uses_all('apple', 'api') False """for letter in required.lower():if letter notin word.lower():returnFalsereturnTrue
7.9.5 拼写蜜蜂游戏 check_word
defcheck_word(word, available, required):"""检查单词是否符合拼写蜜蜂规则 >>> check_word('color', 'ACDLORT', 'R') True >>> check_word('rat', 'ACDLORT', 'R') False """iflen(word) < 4:returnFalseif required.lower() notin word.lower():returnFalsereturn uses_only(word, available)