1

当且仅当输入的是字母数字(仅包含字母或数字)而不使用方法或导入时,使函数返回 True 的好方法是什么?

到目前为止,在课堂上,我们只涵盖了boolswhile循环和if- 语句,并且只允许使用我们所学的内容。

这就是我得到的

def alphanumeric(s):
    i = 0
    while i < len(s):
        if s[i] == 1 or s[i] == 2 or s[i] == 3.....:
            i = i + 1
            return True
        else:
            return False

有没有更简洁的方法可以在不使用方法或导入的情况下做到这一点?我所拥有的不起作用,无论我输入什么都返回 False 。

解决。感谢所有帮助过的人!

4

7 回答 7

3

你误解了如何==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_lettersdigits属性:

    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

于 2013-06-07T23:29:54.900 回答
2

您可以使用 Python 比较运算符来测试字符,因此您可以执行以下操作:

def is_alphanumeric(s):
  for ch in s:
    if not ('a' <= ch <= 'z' or 'A' <= ch <= 'Z' or '0' <= ch <= '9'):
      return False
  return True

这将遍历字符串中的每个字符,并查看它是否介于“a”和“z”或“A”和“Z”或“0”和“9”之间。

于 2013-06-07T23:32:21.310 回答
1

假设“不允许使用任何方法”意味着没有正则表达式或类似的东西,您可以使用它。

如果需要,我会留给你手动写出来string.digitsascii_letters)(那是个玩笑,如果你不被允许,你实际上可以使用@mipadi 的方法import string

from string import digits, ascii_letters as alphabet
valid = digits + alphabet
def alphanumeric(s):
    return all(c in valid for c in s)


>>> alphanumeric('1a')
True
>>> alphanumeric('_')
False

相当于:

def alphanumeric(s):
    for c in s:
        if c not in valid:
            return False
    else:
        return True
于 2013-06-07T23:29:29.390 回答
0

您可以使用in运算符并遍历输入字符串s

for c in s:
    if c not in 'abcdefABC123':

从一个标志开始,如果任何字符违反字母数字要求,则将True其设置为。False

于 2013-06-07T23:33:27.700 回答
0

首先,我认为 s 是一个字符串。

所以你必须这样做,s[i] == '1'因为s[i]它是一个子字符串而不是一个整数。

这就是你的函数总是返回 False 的原因。然后,只有在查看第一个字符后才返回 true 或 false,您必须测试每个字符,直到一个字符不是字母数字或直到结尾。

def alphanumeric(s):
    i = 0
    flag = True
    char = 'a...zA...Z0..9'
    charLen = len(char)
    while (i < len(s) and flag) :
        subflag = False
        charIndex = 0
        while charIndex < charLen:
            subflag = subflag or (s[i] == char[charIndex])
            charIndex += 1 # Equivalent of charIndex = charIndex + 1
        flag = flag and subflag
        i = i +1
    return flag
于 2013-06-07T23:33:57.907 回答
0

几点建议:

首先,当您看到一个字母数字字符时,您尝试返回 True - 您需要在返回 True 之前检查所有字符(尽管您可以在看到单个非字母数字字符时返回 False)。

其次,如果 s 是字符串,则 s[i] 是字符(即 '1',而不是 1)。

三、当你写

if s[i] == 1 or 2 or 3

您正在评估 (s[i] == 1),然后将 2 本身作为布尔值(始终为假)等。要将 s[i] 与每个进行比较,您需要

if s[i] == '1' or s[i] == '2' or s[i] == '3'

或者,更简洁地说,

if s[i] in ['1', '2', '3', ...]
于 2013-06-07T23:44:35.990 回答
0
def isAlphaNumeric(myString):
    return not any((c for c in myString if not c in "abcdef...ABC...123"))
于 2013-06-07T23:46:23.113 回答