【问题标题】:Random passcode generator in python errorpython错误中的随机密码生成器
【发布时间】:2020-04-29 09:12:02
【问题描述】:

我正在尝试使用随机密码生成器,但是我们可能只使用我列出的某些特殊符号,但代码一直没有运行到我不确定如何解决的错误; TypeError: can only concatenate str (not "list") to str.

这是我正在处理的代码部分。

while True:
    import string

    a  = ["!", "$", "%", "^", "&", "*", "(", ")", "-", "_", "=", "+"]
    from random import *
    characters = string.ascii_letters + a + string.digits
    passcode =  "".join(choice(characters) for x in range(randint(8, 12)))
    print (passcode)

【问题讨论】:

    标签: python arrays string list


    【解决方案1】:

    您应该将a 更改为str

    import string
    import random
    
    
    a  = "!$%^&*()-_=+"
    characters = string.ascii_letters + a + string.digits
    passcode =  "".join(random.choice(characters) for x in range(random.randint(8, 12)))
    print(passcode)
    

    此外,使用from random import * 导入整个random 命名空间也是不好的做法。
    当您的代码运行时,您应该在code review 上发帖以获得一些提示和改进。

    【讨论】:

      【解决方案2】:

      您正在将您的列表连接到您的字符串。您需要进行以下更改,它应该可以工作。

      a  = "!$%^&*()-_=+"
      

      【讨论】:

        【解决方案3】:

        检查类型:

        import string
        a  = ["!", "$", "%", "^", "&", "*", "(", ")", "-", "_", "=", "+"]
        print(type(string.ascii_letters))  # <class 'str'>
        print(type(a))  # <class 'list'>
        print(type(string.digits))  # <class 'str'>
        

        您需要在连接之前将所有lists 转换为str 或将所有strs 转换为list

        characters = string.ascii_letters + "".join(a) + string.digits
        

        characters = list(string.ascii_letters) + a + list(string.digits)
        

        在第一种情况下,您将characters 作为str,在第二种情况下作为list - 两者都被random.choice 接受。附注:不要在循环内importimport 一次就足够了。

        【讨论】:

          【解决方案4】:

          您需要使用列表a"".join(a) 创建一个字符串。如果你在循环之外声明你的列表a 会更好。

          import string
          import random
          a  = ["!", "$", "%", "^", "&", "*", "(", ")", "-", "_", "=", "+"]
          
          while True:
          
              characters = string.ascii_letters + "".join(a)  + string.digits
          
              passcode =  "".join(choice(characters) for x in range(randint(8, 12)))
              print (passcode)
          

          【讨论】:

          • 这是一个不好的例子。您使用str 作为变量使内置函数黯然失色,并使用import * 污染程序的命名空间。
          • @Alex,解决了。目前,我正在从事 C# 项目。把它混合起来。我的坏:(
          • @Alex,感谢您,我对import * 做了一些研究。干杯伙伴!
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-06
          • 1970-01-01
          • 2014-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-29
          相关资源
          最近更新 更多