你误解了如何==
和or
工作。您需要分别测试每个字符:
if s[i] == 1 or s[i] == 2 or s[i] == 3 ...:
或使用in
测试:
if s[i] in (1, 2, 3, 4, ...):
除了你在这里测试字符,而不是整数,所以要么把你的字符变成整数,要么测试数字:
if int(s[i]) in (1, 2, 3, 4, ...):
或者
if s[i] in '1234567890':
后者之所以有效,是因为字符串也是序列;测试字符串中是否有一个字符也是'1234567890'
有效的成员资格测试。
由于字符串是序列,您也可以直接循环它们:
for char in s:
if char in '1234567890':
无需在while
那里使用循环和计数器。
这仍然只测试数字;要测试字母,您可以执行以下两项操作之一:
使用该string
模块,它具有ascii_letters
和digits
属性:
import string
for char in s:
if char in string.ascii_letters + string.digits:
或测试字符是否在两个已知字符之间:
if 'a' <= char <= 'z' or 'A' <= char <= 'Z' or '0' <= char <= '9':
这是有效的,因为字符串是可比较和可排序的;它们根据它们在 ASCII 码表中的位置而变小或变大。
你的下一个问题是你回来True
得太早了;您为第一个匹配项执行此操作,但您需要测试所有字符。只有True
在没有发现任何遗漏时才返回:
for char in s:
if char not in string.ascii_letters + string.digits:
return False
return True
现在我们测试所有字符,返回False
第一个不是字母数字的字符,但只有当循环完成时,我们才返回True
。