枚举输入

Enumerating over a input

基本上,我的 objective 这样做是为了在枚举之后更容易编写 if 语句,以查看输入字符串是否包含字符串中间的任何数字..如果它包含比到 return True 所以它是无效的......这可能是在主要功能中执行此操作的几个问题但希望有人可以让我知道我是否正在以“智能”方式进行此操作,以及如何实际将其正确实现到主函数中。

import string


def main():
    plate = input("Plate: ")
    return_val = exclusions(plate)
    checkplate = platecheck(plate)

    if return_val:
        print("Invalid")
    else:
        print(checkplate)
        print("Valid")


def exclusions(s):
    new_string = s.translate(
        str.maketrans('', '', string.punctuation))
    if len(new_string) < len(s):
        print("Please do not use punctuation")
        return True
    elif 2 <= len(new_string) <= 6:
        return False
    else:
        return True


def platecheck(s):
    for i, l in (enumerate(s, 1)): 
        print(l, i) # Some sort of if statement here


main()

就排除功能而言,目前一切正常,确保没有标点符号,并确保输入在 2 到 6 个字符之间。

input/output 正常工作的示例:

输入:

t33st

输出:

Numbers only allowed at the end of the plate
Invalid

当前输出:

t 1
3 2
3 3
s 4
t 5
None
Valid

确定尾部是否为数字的一种简单方法是找到第一个数字并对字符串的其余部分调用 isdigit

def platecheck(s):
    first = next(i for i, c in enumerate(s), len(s))
    return not s[first:].isdigit()

一个更通用的用于检查文本模式的工具称为 regular expressions, which python implements via the re 模块:

plate_pattern = re.compile('\D*\d*')
def platecheck(s):
    return not plate_pattern.fullmatch(s)

你可以exclusions更优雅地写成

def exclusions(s):
    if any(c in string.punctuation for c in s):
        print("Please do not use punctuation")
        return True
    return len(s) > 6 or len(s) < 2

因为 True 表示有问题,你应该将你的函数与 or:

结合起来
return_val = exclusions(plate) or platecheck(plate)

更一般地说,如果你有一个函数列表,你可以使用 any,short-circuits 就像 or:

tests = [exclusions, platecheck]
invalid = any(test(plate) for test in tests)