Python-尝试创建一个随机字符串生成器

Python-尝试创建一个随机字符串生成器,python,Python,我试图根据您提供的长度制作一个字符串生成器,它从两个数组中获取字母表,一个用于Maj,一个用于Min,这是我的代码,但它通常返回“b”或error from random import randint def randomstr(stringsize): Alphabet = ["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"]

我试图根据您提供的长度制作一个字符串生成器,它从两个数组中获取字母表,一个用于Maj,一个用于Min,这是我的代码,但它通常返回“b”或error

from random import randint
def randomstr(stringsize):
    Alphabet = ["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"]
    Alphabet2 = ["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"]
    i = stringsize+1
    LocalRanDom = ""
    StringGen = []
    while i < stringsize+1:
        i = i-1
    MajorMin = randint(1,2)
    print(Alphabet[1])
    if MajorMin == 1:
        LocalRanDom = randint(1,26)
        StringGen.append(Alphabet[LocalRanDom])
    if MajorMin == 2:
        LocalRanDom = randint(1,26)
        StringGen.append(Alphabet2[LocalRanDom])
    return StringGen 

randomstr(3)
来自随机导入randint
def randomstr(字符串大小):
字母表=[“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”]
字母2=[“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”]
i=stringsize+1
LocalRanDom=“”
StringGen=[]
而i
这不是pythonic lol见Chris的评论

首先,我不知道我是为了什么?你必须这样做
i=stringsize+1
然后

while i < stringsize+1:
    i = i-1

您的代码基本上无法出售,但我将仔细检查并解释我在使用它时遇到的所有问题。您的问题中也没有正确缩进代码,所以我在这方面做了一些假设

解决代码问题 字母表生成

Alphabet = ["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"]`
Alphabet2 = ["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"]`
这些可以更简洁地表达为:

lowercase_letters = list(string.ascii_lowercase)
uppercase_letters = list(string.ascii_uppercase)
迭代逻辑

您当前的实现根本不会迭代,因为您分配了
i=stringsize+1
,然后使用条件
i
创建了一个while循环-这在第一次计算条件时永远不会是真的

正确的python方法是使用如下的for循环:

for i in range(stringsize):
    ...
字符串串联

Alphabet = ["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"]`
Alphabet2 = ["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"]`
Python中的字符串从技术上讲是列表,但通过在列表中添加单个字符来构造字符串并不是很愉快

一种方法是设置
StringGen='
,然后在for循环中使用
StringGen+=c
向其添加字符。然而。我将在本文底部提供一个解决方案来演示一个不涉及循环内串联的实现

对条件逻辑误用整数

守则:

MajorMin = randint(1,2)
if MajorMin == 1:
    ...
if MajorMin == 2:
    ...
使用这一等效逻辑可以更加清晰:

use_uppercase_letter = random.choice([True, False])
if use_uppercase_letter:
    ...
else:
    ...
替代实现 您的方法的精细变化

下面是一个不同的
randomstr
实现,它基于以下几点:

import string
import random


def randomstr(stringsize):
    lowercase_letters = list(string.ascii_lowercase)
    uppercase_letters = list(string.ascii_uppercase)

    def generate_letters(n):
        for i in range(n):
            use_uppercase_letter = random.choice([True, False])
            if use_uppercase_letter:
                yield random.choice(lowercase_letters)
            else:
                yield random.choice(uppercase_letters)

    return ''.join(c for c in generate_letters(stringsize))


print(randomstr(10))
我的最佳尝试

这是一个更加简洁的实现,如果您需要,我将提供它,但它与您最初的方法有很大的不同

import string
import random


def randomstr(stringsize):
    letters = list(string.ascii_lowercase + string.ascii_uppercase)
    return ''.join(random.choice(letters) for _ in range(stringsize))


print(randomstr(10))
示例运行

以下是您通过上述任一实现获得的输出示例

MYXPupqiRG
ELNMPktrbe
ZnYBjlIxNQ


请更正缩进。
random.sample(string.ascii_letters,n)
似乎更合适。请添加您得到的错误。@ŠhyštērĀeņeļ您确实需要修复缩进,因为待定编辑中的缩进几乎肯定是不正确的。似乎您需要缩进
StringGen.append(字母表)[LocalRanDom])
再上一层,但我不确定,因为您的缩进仍然没有纠正。不错的一层,但我更喜欢另一层,因为代码没有太大变化:D