社区首页 >问答首页 >密码生成器-字母检查

密码生成器-字母检查
EN

Stack Overflow用户
提问于 2020-05-10 06:06:01
回答 2查看 81关注 0票数 0

我正在尝试构建一个密码生成器,它将为我提供由小写、大写、数字和特殊字符组成的密码。下面是我的密码。它生成所需长度的密码,但这些密码不包含每个组的字符。有人能帮我解释一下我做错了什么吗?

非常感谢。

代码语言:javascript
代码运行次数:0
复制
    import random

    lower_case = list("abcdefghijklmnopqrstuvwxyz")
    upper_case = list("abcdefghijklmnopqrstuvwxyz".upper())
    num = []
    for i in range(0, 10):
        num.append(i)
    s_letters = ["_", "@", "."]
    available_char = lower_case + upper_case + num + s_letters



def set_password():
    password_gen(length())


def length():
    user_l = input("Please enter length of password. Minimum 6.\n")

    try:
        int(user_l) >= 6
    except:
        print("invalid number")
        length()
    return int(user_l)



def password_gen(x):
    password = []
    for i in range(x):
        character = random.choice(available_char)
        password.append(str(character))

    set_a = set(password)
    while True:
        valid = True
        if set_a & set(lower_case) == {}:
            password_gen(x)
            valid = False
        if set_a & set(upper_case) == {}:
            password_gen(x)
            valid = False
        if set_a & set(num) == {}:
            password_gen(x)
            valid = False
        if set_a & set(s_letters) == {}:
            password_gen(x)
            valid = False
        if valid:
            print("Your password is " + "".join(password))
            print(set_a & set(lower_case))
            print(set_a & set(upper_case))
            print(set_a & set(num))
            print(set_a & set(s_letters))
            break

set_password()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-10 06:27:07

  1. 您的方法length没有给出数字为>=6的保证,因为语句int(user_l) >= 6不会引发异常,您可以使用assert int(user_l) >= 6,而不是一次又一次地调用该方法,使用一个give循环

def ():user_l = user_l =input(“请输入密码长度.最小6.\n"),而不是user_l.isdigit()或int(user_l) < 6: user_l=input(”请输入密码长度.最小6.\n")返回一个构建密码的方法,另一个方法来验证密码

def generate_pwd(长度):密码= []对于i在范围(长度):字符= random.choice(available_char) password.append(str(字符))返回密码

  • {}是空的,而不是空的set,也可以使用空set的布尔值False,并且使用elif来避免做所有的事情。

如果不是set_a &set_a,则是另一种更易读的方式:如果所有条件都为True,则密码有效

valid = set_a & set(ascii_lowercase)和set_a & set(ascii_uppercase)和\ set_a &set(位数)和set_a &set

以下是使用string内置字母表的完整代码

代码语言:javascript
代码运行次数:0
复制
import random
from string import ascii_lowercase, ascii_uppercase, digits

s_letters = ["_", "@", "."]
available_char = list(ascii_lowercase) + list(ascii_uppercase) + list(digits) + s_letters

def set_password():
    password_gen(length())

def length():
    user_l = input("Please enter length of password. Minimum 6.\n")
    while not user_l.isdigit() or int(user_l) < 6:
        user_l = input("Please enter length of password. Minimum 6.\n")
    return int(user_l)

def generate_pwd(length):
    return [str(random.choice(available_char)) for i in range(length)]

def password_gen(length):
    valid = False
    password = []
    set_a = set()
    while not valid:
        password = generate_pwd(length)
        set_a = set(password)
        valid = set_a & set(ascii_lowercase) and set_a & set(ascii_uppercase) and \
                set_a & set(digits) and set_a & set(s_letters)

    print("Your password is " + "".join(password))
    print(set_a & set(ascii_lowercase))
    print(set_a & set(ascii_uppercase))
    print(set_a & set(digits))
    print(set_a & set(s_letters))
票数 1
EN

Stack Overflow用户

发布于 2020-05-10 06:23:31

也许您可以创建与每个字符类型对应的另一个键列表(例如,char_type = [“number”, “special”, “lowercase”, “uppercase”])。然后,在从其中一个列表中选择一个随机项之前,可以从“char_type”列表中随机选择一个项。当您接近所需的长度时,您可以进行适当的检查,以确保如果字符串中还不存在所需的类型,则在命中所需的字符长度之前将添加该类型。

就像这样:

代码语言:javascript
代码运行次数:0
复制
import random

character_types = {}
character_types["lower_case"] = list("abcdefghijklmnopqrstuvwxyz")
character_types["upper_case"] = [char.upper() for char in character_types["lower_case"]]
character_types["num"] = [str(i) for i in range(0, 10)]
character_types["s_letters"] = ["_", "@", "."]
character_types["types"] = [key for key in character_types.keys()]
# available_char = lower_case + upper_case + num + s_letters


def set_password():
    password_gen(length())


def length():
    user_l = input("Please enter length of password. Minimum 6.\n")


    if not int(user_l) >= 6:
        print("invalid number")
        length()
    return int(user_l)


def password_gen(x):
    password = []
    password_types = set()
    required_types = 4
    for i in range(x):
        char_type = random.choice(character_types["types"])
        if x - len(password) <= 4:
            if "s_letters" not in password_types:
                char_type = "s_letters"
            elif "lower_case" not in password_types:
                char_type = "lower_case"
            elif "upper_case" not in password_types:
                char_type = "upper_case"
            elif "num" not in password_types:
                char_type = "num"

        character = random.choice(character_types[char_type])
        password_types.add(char_type)
        password.append(character)

    set_a = set(password)
    # while True:
    #     valid = True
    #     if set_a & set(lower_case) == {}:
    #         password_gen(x)
    #         valid = False
    #     if set_a & set(upper_case) == {}:
    #         password_gen(x)
    #         valid = False
    #     if set_a & set(num) == {}:
    #         password_gen(x)
    #         valid = False
    #     if set_a & set(s_letters) == {}:
    #         password_gen(x)
    #         valid = False
    #     if valid:
    print("Your password is " + "".join(password))
    print(set_a & set(character_types["lower_case"]))
    print(set_a & set(character_types["upper_case"]))
    print(set_a & set(character_types["num"])) # This was initially not working because num did not consist of strings, whereas the password did.
    print(set_a & set(character_types["s_letters"]))
    # break


set_password()

没有必要进行最终检查,因为规则防止创建无效密码。这也阻止了我们反复生成密码,以便我们可以找到一个有效的密码。

@azro也正确地提到,您的长度检查并不妨碍某人选择长度小于6(固定在上面)。

您可以对上述代码进行改进。目前,当它检查以确保密码中存在所有必需的类型时,它是按照固定的顺序进行的。因此,它总是以相同的顺序追加缺少的字符类型(如果字符串中没有这些字符类型)。相反,您可以在每一步确定缺少哪些字符类型(维护一个"missing_types“或其他什么的列表),然后从列表中随机选择一个类型,然后根据所选类型随机选择一个字符。

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

https://stackoverflow.com/questions/61713327

复制
相关文章
一系列令人敬畏的.NET核心库,工具,框架和软件[通俗易懂]
原文地址:https://github.com/thangchung/awesome-dotnet-core
全栈程序员站长
2022/09/13
18.8K0
前后端分离项目模板
进入 demo-backend/src/main/resources 打开 application.yaml 文件修改数据源配置:
浪漫主义狗
2023/09/04
1880
前后端分离项目模板
Java 后端开发实践 - 项目模板
整理出一套公共性的项目模板,旨在尽量多地包含日常开发所需,减少开发者的重复性工作以及提供一些最佳实践。
芋道源码
2020/12/08
6480
Java 后端开发实践 - 项目模板
Blazor资源大全,很棒的Blazor(1)
Blazor允许您使用C#而不是JavaScript构建交互式Web用户界面。Blazor应用程序由使用C#、HTML和CSS实现的可重用的Web用户界面组件组成。客户端和服务器代码都是用C#编写的,允许您共享代码和库。 更多信息请参阅官方Blazor网站[22]。
用户10786849
2023/10/13
5660
Blazor资源大全,很棒的Blazor(1)
创建API服务最小只要4行代码!!!尝新体验ASP.NET Core 6预览版本中的最小Web API(minimal APIS)新特性
本文首发于《创建API服务最小只要4行代码!!!尝新体验ASP.NET Core 6预览版本中的最小Web API(minimal APIS)新特性》
Rector
2021/08/19
5.2K0
创建API服务最小只要4行代码!!!尝新体验ASP.NET Core 6预览版本中的最小Web API(minimal APIS)新特性
后端开发实践:Spring Boot项目模板
在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为“第0个迭代”要做的事情。但是,当项目运行了一段时间之后再来反观,我总会发现一些不足的地方,要么测试分类没有分好,要么基本的编码架子没有考虑周全。
Java团长
2019/07/19
1.6K0
后端开发实践:Spring Boot项目模板
React项目配置6(前后端分离如何控制用户权限)
本教程总共6篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章! 1、React项目配置1(如何管理项目公共js方法)---2018.01.11 2、React项目配置2(自己封装Ajax)---2018.01.12 3、React项目配置3(如何管理项目API接口)---2018.01.15 4、React项目配置4(如何在开发时跨域获取api请求)---2018.01.16 5、React项目配置5(引入MockJs,实现假接口开发)---2018.01.17 6、R
前端人人
2018/04/11
1.6K0
Rainbond 中Vue、React项目如何调用后端接口
通常我们会在项目的全局配置文件.env.production中直接写入后端ip,例如:
曾庆国
2020/11/19
1.5K0
.NET Core快速入门教程 3、我的第一个.NET Core App (CentOS篇)
一、前言 本篇开发环境? 1、操作系统:CentOS7(因为ken比较偏爱CentOS7) 2、SDK版本:.NET Core 2.0 Preview 你可能需要的前置知识 1、了解如何通过Hyper-V安装CentOS虚拟机 2、了解CentOS7基础命令/常用命令 二、安装 .NET Core SDK 1、安装必要依赖 sudo yum -y install libunwind libicu 2、下载(SDK列表) cd /home/downloads curl -sSL -o dotnet-
KenTalk
2018/09/11
1.6K0
.NET Core快速入门教程 2、我的第一个.NET Core App(Windows篇)
一、前言 本篇开发环境? 1、操作系统: Windows 10 X64 2、SDK: .NET Core 2.0 Preview 二、安装 .NET Core SDK 1、下载 .NET Core 下载地址:https://www.microsoft.com/net/download/core 根据自己电脑情况选择对应版本即可 .NET CORE 2.0下载地址:https://aka.ms/dotnet-sdk-2.0.0-preview2-win-x64 2、安装 微软出品,一键安装,只需一步,看图
KenTalk
2018/09/11
1.6K0
.NET Core快速入门教程 2、我的第一个.NET Core App(Windows篇)
后端开发实践系列——Spring Boot项目模板
在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为“第0个迭代”要做的事情。但是,当项目运行了一段时间之后再来反观,我总会发现一些不足的地方,要么测试分类没有分好,要么基本的编码架子没有考虑周全。
好好学java
2019/12/05
4390
后端开发实践系列——Spring Boot项目模板
别了,JavaScript;你好,Blazor
Web开发与JavaScript开发向来是同义词。直到WebAssembly的横空出世,WebAssembly (Wasm)是一种在浏览器中可以执行的二进制指令。 WebAssembly 的 官方工具链 能够编译 C/C++ 代码,但许多社区也提供了不同语言的编译器,如 Rust,Python,Java 和 Blazor(C#)。特别是 Rust 社区非常活跃,可以开始看到完整的前端框架,如 Yew 和 Dodrio,这为基于浏览器的应用带来了更多新的可能性,只要测试一些使用 WebAssembly 构建的优秀应用,就可知道基于浏览器的近乎原生的应用现在已经成为现实,例如 Sketchup 或 Magnum。
张善友
2020/06/19
3.1K0
别了,JavaScript;你好,Blazor
ApiTemplate:.net后端项目模板完善与总结
ApiTemplate后端项目开发模板,发布也有一段时间了。为了补充应用场景,以及详细说明本人总结的一些开发经验,现已常见的《用户/登录权限验证》功能模块来进行详细的讲解。我会以为开发此模拟的实现路径为主线进行说明,希望能帮助到某些开发朋友。
sam dragon
2020/06/29
5030
ApiTemplate:.net后端项目模板完善与总结
.NET周报【1月第3期 2023-01-20】
https://www.cnblogs.com/InCerry/p/building-a-self-contained-game-in-c-under-8-kilobytes-74c3cf60ea04.html
InCerry
2023/03/08
4.8K0
.NET周报【1月第3期 2023-01-20】
使用.NET Core+Docker 开发微服务
.NET Core发布很久了,因为近几年主要使用java,所以还没使用过.NET Core,今天正好有一个c#写的demo,需要做成服务,不想再转成java来实现,考虑使用.NET CORE来尝下鲜,目标是开发一个微服务,然后部署到Docker swarm集群,供其他应用调用。
JadePeng
2018/09/27
3.2K0
使用.NET Core+Docker 开发微服务
【周一通勤电台 · 特辑】六千字漫谈2022后端框架流行趋势
这篇文章基于我对后端框架的了解以及研究,提供了2021-2022年度以及未来一年内可能流行的后台框架。
翊君
2022/03/15
4.4K0
【周一通勤电台 · 特辑】六千字漫谈2022后端框架流行趋势
Meteor React Native 项目模板更新啦!
之前Spencer Carli曾发布了Meteor+React Native的项目模板,这个模板发布已经有3个多月了,并且有一些过时。作者最近重新构思了这个模板,让它更适合实际的项目而不仅仅是一个De
时见疏星
2018/06/01
9040
.NET周报 【6月第4期 2023-06-25】
https://www.cnblogs.com/eventhorizon/p/17497359.html
InCerry
2023/08/31
2980
.NET周报 【6月第4期 2023-06-25】
《从零开始学ASP.NET CORE MVC》:VS2019创建ASP.NET Core Web程序(三)
步骤1:在Visual Studio 2019中创建新的asp.net Core项目
角落的白板报
2019/05/05
3.9K0
《从零开始学ASP.NET CORE MVC》:VS2019创建ASP.NET Core Web程序(三)
《从零开始学ASP.NET CORE MVC》:VS2017创建ASP.NET Core Web程序(三)
步骤1:在Visual Studio 2017中创建新的asp.net Core项目
角落的白板报
2019/05/05
2.8K0
《从零开始学ASP.NET CORE MVC》:VS2017创建ASP.NET Core Web程序(三)

相似问题

DateTime与时间戳的比较

12

比较DateTime unix时间戳

10

无法将datetime.datetime与int进行比较;将datetime与unix时间戳进行比较

10

.Net DateTime.Now与PostgreSQL时间戳比较

319

MySQL:比较datetime和时间戳

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文