首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 3.7中的密码生成器

Python 3.7中的密码生成器
EN

Code Review用户
提问于 2018-11-13 15:57:28
回答 4查看 1.7K关注 0票数 2

我正在学习如何用Python编写代码,而且以前从未编写过代码,我只想知道是否有任何方法可以升级我的PasswordGenerator。

代码语言:javascript
复制
#!/usr/bin/env python3
import random


def passwordgenerator():
    mypw = ""
    count = 0
    alphabet_number =    "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    symbols = "!?@%#$"
    running1 = True
    while running1:

        if len(symbols) == 1:

            #  Reset symbols
            symbols = "!?@%#$"

        if len(alphabet_number) == 1:

            #  Reset letters/numbers
            alphabet_number = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

        elif count == pw_length:

            if mypw.isupper() or mypw.islower():  # check if there is only upper     or only lower letter and rerun if True
                passwordgenerator()

            else:
                x = mypw
                y = list(x)  # creates a list and put the pw in to shuffle it
                random.shuffle(y)
                mypw = "".join(y)

                print(mypw)
                input("\nPress  to close the program")
                running1 = False

        elif count % 4 == 0:

            #  pick a random symbol every 3 loop and add it to the pw
            symbols_index = random.randrange(len(symbols))
            new_symbols = symbols[symbols_index]
            mypw = mypw + new_symbols

            # delete the symbols that is picked so there are no duplicate
            symbols_list_change = symbols.replace(new_symbols, "")
            symbols = symbols_list_change

        else:

            # pick a random number or letter and add it to the pw
            next_index = random.randrange(len(alphabet_number))
            new_alphabetnumber = alphabet_number[next_index]
            mypw = mypw + new_alphabetnumber

            # delete the symbols that is picked so there are no duplicate
            an_list_change = alphabet_number.replace(new_alphabetnumber, "")
            alphabet_number = an_list_change

        count += 1


if __name__ == '__main__':
    print("/!\ 12 Characters is a minimum for good security /!\ ")

    print("=" * 55)  # just to make it pretty

    running = True
    while running:
        pw_length = input("How many Characters do you want?\n")

        if pw_length.isdigit():  # verify if user input a number
            pw_length = int(pw_length)
            passwordgenerator()
            running = False
        else:
            print("A number is needed")
EN

回答 4

Code Review用户

回答已采纳

发布于 2018-11-13 19:59:43

谢谢你贴出你的代码,很高兴你想要改进你的风格。我列出了一小张清单,列出了你可以改进的地方。这个列表可能不完整,不同的程序员可能有不同的意见,但我尽力做到建设性和不固执己见。

  1. some_var = True,而some_var:# Do,some_var = False通常被写为while:#做某事中断
  2. 全局变量会使函数的推理变得更加困难。因此,与其在全局上定义pw_length,不如将其作为参数传递给passwordgenerator
  3. 函数应该只有一个责任,这是一个很好的经验法则,因此,与其在passwordgenerator中打印密码,不如返回密码并在主函数中打印它。
  4. random.choice从列表中选择随机元素,random.sample从列表中选择k唯一元素。
  5. 不允许重复使用会使密码更加可预测。同样的情况也适用于仅在特定位置使用符号。所以我的最终版本是: def密码生成器( pw_length ):字母表=pw_length返回‘.’.join(如果__name__ == '__main__':print("/!\ 12字符是良好安全性的最低限度/!\ ")打印(“=”* 55) #只是为了使其美观,而True: pw_length=输入(“您想要多少个字符?\n”))如果pw_length.isdigit():#验证用户是否输入一个数字pw_length = int(pw_length) mypw =密码生成器(Pw_length) print(mypw)断开,否则:打印(“需要一个数字”)
票数 4
EN

Code Review用户

发布于 2018-11-13 18:22:42

对于第一个Python程序来说,还不错:

  • 好好利用这一行:if __name__ == '__main__':
  • 很好地使用字符串方法(replaceisupperislower等)。
  • 很好地利用了随机模块方法。

但有些东西可以做得更好:

  • 函数passwordgenerator可以将pw_length作为参数并返回mypw。(密码的打印移到本例中的主要部分)
  • passwordgenerator内部调用passwordgenerator本身(递归调用)可能很棘手(密码意外地总是较低.?)
  • 字符串常数"!?@%#$""abc...XYZ"都发生了两次,它们可以是程序顶部的常量。
  • 我想这句话:elif count == pw_length应该是不同的
  • 可以将一个docstring添加到passwordgenerator中,解释生成密码的属性。
票数 5
EN

Code Review用户

发布于 2018-11-13 20:09:37

这造成的一个非常重要和常见的错误是使用random

对于不需要安全性的应用程序,random就足够了,但是对于这种情况,您确实应该使用secrets 模块。这将产生不可预测的数字,而代价是稍慢一些。不幸的是,这确实会使程序的某些部分变得更难,因为模块没有提供一些方便的random方法,但是这些方法并不太难自己编写。

例如,symbols_index = random.randrange(len(symbols))变成了secrets.randbelow(len(symbols))

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

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

复制
相关文章

相似问题

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