相对来说,我对蟒蛇比较陌生,我正努力自学。
我已经创建了一个python程序,它将接受当前月份的前三个字母,并将一个字母添加到第一个字母,两个字母添加到第二个字母,三个字母添加到第三个字母。
它通过将月份的字符转换为ASCII数字,然后将X添加到其中来实现这一点。
请看下面的代码,这是我写的,如果你可以,请提供反馈,你觉得它可以缩短等等。
import datetime
myDate = datetime.datetime.now()
month = myDate.strftime("%b")
month_list = list(month)
#below line is for testing other months or words. To use, please comment out the above three lines (myDate, month and month_list)
#month_list = ["Z", "z", "Z", ""]
letter_one = month_list[0]
letter_one_ascii = ord(letter_one)
letter_one_ascii += 1
if letter_one_ascii == 91 or letter_one_ascii == 123:
letter_one_ascii = 65
else:
letter_one = chr(letter_one_ascii)
letter_two = month_list[1]
letter_two_ascii = ord(letter_two)
letter_two_ascii += 2
if letter_two_ascii == 91 or letter_two_ascii == 123:
letter_two_ascii = 65
elif letter_two_ascii == 92 or letter_two_ascii == 124:
letter_two_ascii = 66
else:
letter_two = chr(letter_two_ascii)
letter_three = month_list[2]
letter_three_ascii = ord(letter_three)
letter_three_ascii += 3
if letter_three_ascii == 91 or letter_three_ascii == 123:
letter_three_ascii = 65
elif letter_three_ascii == 92 or letter_three_ascii == 124:
letter_three_ascii = 66
elif letter_three_ascii == 93 or letter_three_ascii == 125:
letter_three_ascii = 67
else:
letter_three == chr(letter_three_ascii)
letter_one = chr(letter_one_ascii)
letter_two = chr(letter_two_ascii)
letter_three = chr(letter_three_ascii)
print "Your Password is: " + letter_one.upper(), letter_two.upper(), letter_three.upper()发布于 2017-05-18 19:03:36
与实际编程语言无关,您违反了许多规则和建议。
首先-你不能重复你自己。小片段
if letter_one_ascii == 91 or letter_one_ascii == 123:
letter_one_ascii = 65以稍微更改的名称重复。
if letter_three_ascii == 91 or letter_three_ascii == 123:
letter_three_ascii = 65或略有改变的值
elif letter_three_ascii == 92 or letter_three_ascii == 124:
letter_three_ascii = 66很可能您没有键入该类型,但您确实复制、粘贴和编辑了名称和/或值。这很容易出错,因为您很容易忘记更改名称或值。这样的错误很难发现。如果你必须扩展这个生成器来处理5个字符,你会怎么做?还是6岁?典型解决方案:编写一个由n个字母移位的函数,另一个由一个字母移动的函数
def shift_by_one(letter):
# some magic here
return new_letter
def shift_by_n(letter, n):
# some magic here using previously defined function 'shift_by_one'
return new_letter你不再重复你自己了,扩展也很容易。最后,您应该实现另一个函数,根据您的规则转换一个单词。
def shift_word(word):
# some magic here using previously defined function 'shift_by_n'
return new_word第二,你应该命名你的神奇数字,特别是如果它们出现不止一次。但即使只出现一次,124代表什么呢?还是66岁?这对你来说很难维持,对另一个人来说更难。而不是65,您可以使用类似于
first_letter_ascii = ord('A')第三次边界检查。您可以像以前一样在增量之后这样做,但也可以在之前完成。如果外部值不存在或没有意义,则首选后者。而不是
letter_one_ascii = ord(letter_one)
letter_one_ascii += 1
if letter_one_ascii == 91 or letter_one_ascii == 123:
letter_one_ascii = 65
else:
letter_one = chr(letter_one_ascii)你可以很容易地写
if letter_one == 'Z' or letter_one == 'z':
letter_one = 'A'
else:
letter_one_ascii = ord(letter_one)
letter_one_ascii += 1
letter_one = chr(letter_one_ascii)这样做的可读性要高得多,顺便说一句,这将使shift_by_one成为主体。
边界检查的其他选项是模块化操作。
arr = 'ABCD'
print(arr[4%len(arr)])以及谨慎地将数组扩展到外部
arr = 'ABCDA'
print(arr[4])第四,在处理大写和小写时,您处理了许多特殊情况。然而,在您的最终输出中,您只对大写感兴趣。立即将月份转换为大写,并分别删除所有90+数字--字母'z‘。
month = myDate.strftime("%b").upper()这也使您能够使用模块化边界检查,我们可以消除shift_by_n中的循环。
def shift_by_n(letter, n):
index = ord(letter) - ord('A')
index = (index + n) % 26
letter = chr(index + ord('A'))
return letter最后,一些python内容:您不必将字符串转换为一个列表来访问字符,string提供了切片和可迭代性。
word = myDate.strftime("%b").upper()[:3]如果您以字符列表结尾,并且希望有一个字符串,则可以通过以下方式连接所有字符
''.join(mylist)python的另一个好特性是我们在shift_word中使用的列表理解功能。
letters = [shift_by_n(letter,n+1) for n, letter in enumerate(word)]我们最后
import datetime
def shift_by_n(letter, n):
index = ord(letter) - ord('A')
index = (index + n) % 26
letter = chr(index + ord('A'))
return letter
def shift_word(word):
letters = [shift_by_n(letter,n+1) for n, letter in enumerate(word)]
return ''.join(letters)
myDate = datetime.datetime.now()
word = myDate.strftime("%b").upper()[:3]
print "Your Password is: " + shift_word(word)发布于 2017-05-18 14:02:14
为什么不把所有重复的代码放入一个函数中呢?
import datetime
myDate = datetime.datetime.now()
month = myDate.strftime("%b")
month_list = list(month)
#below line is for testing other months or words. To use, please comment out the above three lines (myDate, month and month_list)
#month_list = ["Z", "z", "Z", ""]
def mapLetters(inputLetters):
retLetters =[]
for i, l in enumerate(inputLetters):
letter = ord(l) + (i + 1)
# REPLACES
#letter_one = month_list[0]
#letter_one_ascii = ord(letter_one)
#letter_one_ascii += 1
if letter > ord('Z') and letter < ord('a'):
letter = ord('A') + (letter - (1 + ord('Z')))
elif letter > ord('z'):
letter = ord('A') + (letter - (1 + ord('z')))
## REPLACES
#if letter_three_ascii == 91 or letter_three_ascii == 123:
# letter_three_ascii = 65
#elif letter_three_ascii == 92 or letter_three_ascii == 124:
# letter_three_ascii = 66
#elif letter_three_ascii == 93 or letter_three_ascii == 125:
# letter_three_ascii = 67
#else:
# letter_three == chr(letter_three_ascii)
retLetters.append(chr(letter))
return retLetters
print("{} -> {}".format(month_list, mapLetters(month_list)))
# ['M', 'a', 'y'] -> ['N', 'c', 'B']更新:
基于@Graipher建议的更改。@Stefan's
还删除了“魔术数字”的ascii。
https://codereview.stackexchange.com/questions/163649
复制相似问题