首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于当前月份的Python密码生成器

基于当前月份的Python密码生成器
EN

Code Review用户
提问于 2017-05-18 13:15:07
回答 2查看 993关注 0票数 4

相对来说,我对蟒蛇比较陌生,我正努力自学。

我已经创建了一个python程序,它将接受当前月份的前三个字母,并将一个字母添加到第一个字母,两个字母添加到第二个字母,三个字母添加到第三个字母。

它通过将月份的字符转换为ASCII数字,然后将X添加到其中来实现这一点。

请看下面的代码,这是我写的,如果你可以,请提供反馈,你觉得它可以缩短等等。

代码语言:javascript
复制
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()
EN

回答 2

Code Review用户

发布于 2017-05-18 19:03:36

与实际编程语言无关,您违反了许多规则和建议。

首先-你不能重复你自己。小片段

代码语言:javascript
复制
if letter_one_ascii == 91 or letter_one_ascii == 123:
    letter_one_ascii = 65

以稍微更改的名称重复。

代码语言:javascript
复制
if letter_three_ascii == 91 or letter_three_ascii == 123:
    letter_three_ascii = 65

或略有改变的值

代码语言:javascript
复制
elif letter_three_ascii == 92 or letter_three_ascii == 124:
    letter_three_ascii = 66

很可能您没有键入该类型,但您确实复制、粘贴和编辑了名称和/或值。这很容易出错,因为您很容易忘记更改名称或值。这样的错误很难发现。如果你必须扩展这个生成器来处理5个字符,你会怎么做?还是6岁?典型解决方案:编写一个由n个字母移位的函数,另一个由一个字母移动的函数

代码语言:javascript
复制
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

你不再重复你自己了,扩展也很容易。最后,您应该实现另一个函数,根据您的规则转换一个单词。

代码语言:javascript
复制
def shift_word(word):
    # some magic here using previously defined function 'shift_by_n'
    return new_word

第二,你应该命名你的神奇数字,特别是如果它们出现不止一次。但即使只出现一次,124代表什么呢?还是66岁?这对你来说很难维持,对另一个人来说更难。而不是65,您可以使用类似于

代码语言:javascript
复制
first_letter_ascii = ord('A')

第三次边界检查。您可以像以前一样在增量之后这样做,但也可以在之前完成。如果外部值不存在或没有意义,则首选后者。而不是

代码语言:javascript
复制
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)

你可以很容易地写

代码语言:javascript
复制
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成为主体。

边界检查的其他选项是模块化操作。

代码语言:javascript
复制
arr = 'ABCD'
print(arr[4%len(arr)])

以及谨慎地将数组扩展到外部

代码语言:javascript
复制
arr = 'ABCDA'
print(arr[4])

第四,在处理大写和小写时,您处理了许多特殊情况。然而,在您的最终输出中,您只对大写感兴趣。立即将月份转换为大写,并分别删除所有90+数字--字母'z‘。

代码语言:javascript
复制
month = myDate.strftime("%b").upper()

这也使您能够使用模块化边界检查,我们可以消除shift_by_n中的循环。

代码语言:javascript
复制
def shift_by_n(letter, n):
    index = ord(letter) - ord('A')
    index = (index + n) % 26
    letter = chr(index + ord('A'))
    return letter

最后,一些python内容:您不必将字符串转换为一个列表来访问字符,string提供了切片和可迭代性。

代码语言:javascript
复制
word = myDate.strftime("%b").upper()[:3]

如果您以字符列表结尾,并且希望有一个字符串,则可以通过以下方式连接所有字符

代码语言:javascript
复制
''.join(mylist)

python的另一个好特性是我们在shift_word中使用的列表理解功能。

代码语言:javascript
复制
letters = [shift_by_n(letter,n+1) for n, letter in enumerate(word)]

我们最后

代码语言:javascript
复制
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)
票数 12
EN

Code Review用户

发布于 2017-05-18 14:02:14

为什么不把所有重复的代码放入一个函数中呢?

代码语言:javascript
复制
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。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/163649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档