我已经完成了我想做的事情,但我认为可以做得更好。我要我的代码看起来很专业。
我的代码所做的是询问您的名字,并以下面的形式给出输出。
输入:杰克输出:J=喜悦a=令人敬畏的c=好奇的k=善良
请通过查看以下代码,向我展示如何以专业的方式编写代码。
#!/usr/bin/env python
import sys
import string
names = {
'a': 'awesome',
'b': 'bold',
'c': 'curious',
'd':'delightful',
'e':'emotional',
'f':'fearless',
'g':'gifted',
'h':'helpful',
'i':'imaginary',
'j':'joyful',
'k':'kindhearted',
'l':'lovable',
'm':'memorable',
'n':'naughty',
'o':'open',
'p':'playful',
'q':'quarrelsome',
'r':'reliable',
's':'serious',
't':'thoughtful',
'u':'unique',
'v':'victorious',
'w':'wise',
'x':'xerox copy',
'y':'yummy',
'z':'zealous'
}
def main():
i=j=0
user = raw_input("What is your name?: ")
print ""
while i<len(user):
while j<len(names):
if user[i]==names.keys()[j]:
print " " + user[i] + ' = ' + names.values()[j]
j=j+1
while j!=0:
j=0
i=i+1
if __name__ == '__main__':
main()
发布于 2014-07-29 08:03:03
在有关样式的代码中,可以很容易地检测/改进一些东西。如果需要,您将找到各种工具来自动执行检查:pep8
、pyflakes
、pychecker
。他们会给你很多有趣的信息,从imported module xxx is not used
,到bad indentation
,通过missing documentation
,wrong spacing
和invalid constant name
。另外,了解Python中有一个风格指南,称为PEP8 8,肯定值得一读,这对您来说可能是件好事。
在修复了所有使工具高兴的内容之后,代码如下所示:
"""Module docstring"""
NAMES = {
'a': 'awesome',
'b': 'bold',
'c': 'curious',
'd': 'delightful',
'e': 'emotional',
'f': 'fearless',
'g': 'gifted',
'h': 'helpful',
'i': 'imaginary',
'j': 'joyful',
'k': 'kindhearted',
'l': 'lovable',
'm': 'memorable',
'n': 'naughty',
'o': 'open',
'p': 'playful',
'q': 'quarrelsome',
'r': 'reliable',
's': 'serious',
't': 'thoughtful',
'u': 'unique',
'v': 'victorious',
'w': 'wise',
'x': 'xerox copy',
'y': 'yummy',
'z': 'zealous'
}
def main():
"""Main function"""
i = j = 0
user = raw_input("What is your name?: ")
print ""
while i < len(user):
while j < len(NAMES):
if user[i] == NAMES.keys()[j]:
print " " + user[i] + ' = ' + NAMES.values()[j]
j = j + 1
while j != 0:
j = 0
i = i + 1
if __name__ == '__main__':
main()
您的容器(user
和names
)中有一个while
循环。这是有点不切实际的,但如果你真的想这样做,它更清楚地初始化你要用循环前循环的变量,这样你就不必尝试在循环之后重新设置它。
i = 0
while i < len(user):
j = 0
while j < len(NAMES):
if user[i] == NAMES.keys()[j]:
print " " + user[i] + ' = ' + NAMES.values()[j]
j = j + 1
i = i + 1
更好的是,range
函数可以生成您想要的值,这样您就不需要自己进行增量了:
for i in range(len(user)):
for j in range(len(NAMES)):
if user[i] == NAMES.keys()[j]:
print " " + user[i] + ' = ' + NAMES.values()[j]
但是Python为您提供了一种更好的遍历容器的方法:
for c in user:
for j in range(len(NAMES)):
if c == NAMES.keys()[j]:
print " " + c + ' = ' + NAMES.values()[j]
另外,由于您使用的是字典,所以不需要在NAMES
上循环。您可以自然地在dict中查找键:
for c in user:
if c in NAMES:
print " " + c + ' = ' + NAMES[c]
发布于 2014-07-29 08:53:02
您的初始字典可以很容易地由python构建,而不必键入所有的初始字母-词组合:
NAMES = {word[0]: word for word in ('awesome', 'bold', 'curious' ...)}
发布于 2014-07-29 13:22:14
您的代码看起来像一个由C程序员编写的Python程序。没关系--学习如何用Python习惯性地完成任务需要练习。
它有助于思考一个对手可以破坏你的程序的方式。例如:
What is your name?: John Smith
o = open
h = helpful
n = naughty
m = memorable
i = imaginary
t = thoughtful
h = helpful
即使您不知道解决方案,添加# TODO: handle capital letters, spaces, etc.
注释也是个好主意。
names
不是字典的合适名称。我建议使用ATTRIBUTES
,因为它描述了它包含的值的类型。使用所有的大写表示它应该被视为一个常量.
import sys
和import string
都是不必要的,所以您应该删除它们。
#!/usr/bin/env python
ATTRIBUTES = {
'a': 'awesome',
'b': 'bold',
'c': 'curious',
# etc…
'z': 'zealous',
}
def main():
user = raw_input('What is your name?: ')
print
for c in user.lower():
attribute = ATTRIBUTES.get(c)
if attribute:
print(' %c = %s' % (c, attribute))
else:
print(' %c' % (c))
if __name__ == '__main__':
main()
https://codereview.stackexchange.com/questions/58351
复制相似问题