待办事项:
将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!
答案 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())