我在下面的python代码中出错了:

时间:2017-07-30 04:04:37

标签: python validation

待办事项:

python转换为ythonpay(即拿起第一个字母,将其放在最后并添加' ay'并确保用户未输入字数或字母数字)

def check(word):    
      if word.isalnum() or word.isdigit():  
        print ("Enter valid word!")  
      else:  
        print ("Thank You for Entering a valid word!")  
        first_letter = word[0]  
        new_word = word.strip(word[0])  
        PygLatin = new_word+first_letter+"ay"  
        print (PygLatin) 

word= input("enter a word:").lower()  
result = check(word)  

结果我得到了:

1>> enter a word - > python

2 - ;> Enter valid word!

3 个答案:

答案 0 :(得分:2)

您的代码存在两个基本问题(以及一个风格问题)。

通常您希望功能 返回 。例如,你的意图是说一句话,将第一个字母移到单词的末尾,然后添加" ay" ...换句话说,在" Pig Latin中呈现它。"

但是您 打印 - 结果而不是 返回 - 他们。您可能会认为使用 print 会返回一个值(从某种意义上说它"返回"某些内容到您的屏幕或终端)。但那并不是什么"返回"意思是计算机编程。 Python return 语句是您的函数在任何特定的调用(或者#34;调用")函数之后将结果返回给程序的其余部分的方式。

这是最简单的功能:

def pigify(word):
    return word[1:]+word[0].lower()+'ay'

...将采取"切片"从一个字符偏移到字符串一直到字符串结尾的单词。这就是[1:]的意思......它描述了一系列角色,距离范围的起点有多远,然后到达(但不包括)结束的距离。然后它添加第一个字符("零字符"从字符串的开头),将其转换为小写(对所有字符无害,只影响大写字母)然后添加文字字符串" ay" ......它需要所有这些并返回它。

pig_latin = pigify("Python")
print(pig_latin)
# ---> prints "ythonpay"

您的代码的另一个问题是您以混乱的方式调用字符串方法。只有当所有字符都是字母数字且 word时, word.alnum()才会返回True。仅当所有字符都是数字时, word.isdigit()才会返回True。这与调用 word.isdigit()相同,因为数字是字母数字字符集的正确子集。换句话说,只传递代码的字符串将是那些不包含字母(或其他字符)的字符串;显然不是你想要的。

您可能更愿意检查字符串是否完全由字母字符组成:

def pigify(word):
    if word.isalpha():
        return word[1:]+word[0].lower()+'ay'
    # or else? ....

这使您无法使用无效参数(您的函数传递给函数"" word"参数由调用者执行)。

您可以打印错误信息。但是那些人认为糟糕的编程习惯。您可以返回一些特殊值,例如Python的 值;但是,调用函数的代码必须每次都检查结果,否则结果会导致一些其他错误远离调用函数的位置(返回此非字符串值的位置)。

您还可以提出异常:

def pigify(word):
    if word.isalpha():
        return word[1:]+word[0].lower()+'ay'
    raise ValueError("Invalid input for pigify()")

...请注意,在这种情况下,我不需要明确拼出 else ;如果我没有返回一个值,只有当它出现错误时,控制流才会到达该语句。控制流返回调用代码的任何其他时间(调用我的 pigify()函数的程序部分。)

我能做的另一件事是决定 pigify()只返回任何看起来不像"字"与传递完全一样:

def pigify(word):
    if word.isalpha():
        return word[1:]+word[0].lower()+'ay'
    else:
        return word

...在这里,我可以返回单词而不使用 else:,就像之前使用 raise 语句一样。但我个人认为看起来不对劲;所以我已经明确地明确地说明了 else:条款。

大多数情况下,您希望程序由处理数据的函数(或具有方法的对象)组成,然后是较小的代码体(可能是函数或对象及其方法),然后"渲染&# 34;那些操纵的结果。每当您编写操作或转换数据的功能将这些结果写入屏幕或网页,或文件或数据库时,您应暂停并重新考虑您的设计。转换/操作和计算可能是可重用的,而写入结果的代码通常非常具体。因此,将一个与另一个交错通常是一个错误的决定。

答案 1 :(得分:-1)

如果所有字符符合条件,则str.isdigit()str.isalnum()方法仅返回true。您的测试已编写,以便您想要检测任何字符是否符合条件:

>>> word = 'abc123'
>>> word.isdigit()
False
>>> any(map(str.isdigit, word))
True

所以你可以修改代码,从这样开始:

def check(word):
    if not word.isalnum() or any(map(str.isdigit, word)):
        print ("Enter valid word!")
    else:
        print ("Thank You for Entering a valid word!")
    ...

FWIW,str.isalpha()会更容易使用,因为数字已被排除。

答案 2 :(得分:-1)

在您的代码中,如果字符串仅包含字母,只包含数字或包含字母和数字,则isalnum()会出现问题,如果字符串只包含字母并执行代码,则可以尝试匹配:

def check(word):
    if word.isalpha(): # process only if word contains only alphabets
        print("Thank You for Entering a valid word : {}!".format(word))
        print(word[1:] + word[0] + "ay") # slicing is better choice in your case
    else:
        print("Enter valid word!!!")

word = input("enter a word:")
result = check(word.lower())