【问题标题】:Strings not joining in Python字符串未加入 Python
【发布时间】:2013-07-20 02:57:57
【问题描述】:

我正在尝试使用 python 创建一个简单的密码生成器,它以以下格式读取您提供的模式,A 用于大写字符,a 用于小写字符,$ 用于数字,@987654324 @ 为符号。该模式将通过命令行参数给出,并通过sys.exit() 方法返回输出。

由于某种原因,我的脚本无法正常工作,但对我来说看起来不错,但我似乎无法弄清楚它有什么问题。它在我的终端窗口上输出一个空行。

#!/usr/bin/env python
# IMPORTS
import os
import sys
import random

alc = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
auc = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
num = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
sym = ["!", "#", "%", "&", "?", "@", "(", ")", "[", "]", "<", ">", "*", "+", ",", ".", "~", ":", ";", "=", "-", "_", "\\", "/"]

pattern = list(sys.argv[1])
password = ""

# PROCESSING

for x in pattern:
    if x == "A":
        random.shuffle(auc)
        password.join(auc[0])
    elif x == "a":
        random.shuffle(alc)
        password.join(alc[0])
    elif x == "$":
        random.shuffle(num)
        password.join(num[0])
    elif x == "#":
        random.shuffle(sym)
        password.join(sym[0])
    else:
        password = "ERROR: Invalid Syntax."
        break

# END PROCESSING

sys.exit(password)

【问题讨论】:

  • 运行脚本时,输入什么作为参数?
  • 为什么选择 password.join ?应该是密码+=...

标签: python random terminal passwords generator


【解决方案1】:

这是您想要做的更简单的版本:

import os
import sys
import random
import string

vals = {'a': string.ascii_lowercase,
        'b': string.ascii_uppercase,
        '$': '0123456789',
        '#': '!#%&?@()[]<>*+,.~:;=-_\\/',
       }

pattern = sys.argv[1]

password = ''.join(random.choice(vals[c]) for c in pattern) # assumes that there are no invalid characters in the input

password = ''.join(random.choice(vals[c][0]) for c in pattern if c in vals) # takes only the valid characters in the input

random.shuffle 是一个相对昂贵的操作,将整个列表打乱。另一方面,random.choice 在可迭代对象中选择一个随机元素。

希望对你有帮助

【讨论】:

    【解决方案2】:

    字符串是不可变的,因此当您调用join() 时,它不会改变password。它返回输出。

    password.join(thelist[0])
    

    应该是:

    password = password.join(thelist[0])
    

    所以当你去打印password时,只会出现'',因为你从未改变过它。

    join 这里甚至不需要。你可以做password += auc[0]。我在下面展示了这个。

    您也可以清理代码中的一些内容。 string 模块将帮助您:

    >>> import string
    >>> print list(string.lowercase)
    ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
    >>> print list(string.uppercase)
    ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
    >>> print list(string.punctuation)
    ['!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~']
    >>> print list(string.digits)
    ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
    

    您可以使用random.choice()

    for x in pattern:
        if x == "A":
            password += random.choice(auc)
        elif ...
    

    【讨论】:

    • 这使它工作得更好,但现在它只输出模式中的最后一个项目,当我输入它AA##$$aa 它只给我最后一个,一个小写字符。似乎每一遍都覆盖了整个字符串。顺便感谢您的优化提示,您知道我可以为symnum 列表做些什么吗?
    • @LuizBerti 嗯,它不应该那样做。另外,我添加了 sym 和 num 的解决方案
    • @LuizBerti 这很有趣。在我们进行任何转换之前,$ 似乎已被某个数字取代
    • 您的回答绝对精彩。您不仅修复了我的代码,还改进了它,非常感谢很多
    【解决方案3】:

    你必须使用password = password.join(alc[0])password += alc[0]

    A.join(b) 不会更改 A。它创建一个与A+b 相同的新字符串并返回它,但A 保持不变。

    【讨论】:

      猜你喜欢
      • 2020-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      相关资源
      最近更新 更多