Python试图生成一个随机字符串Gen

2024-10-01 07:48:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着根据你提供的长度做一个字符串生成器,它从两个数组中获取字母,一个用于Maj,一个用于Min,所以这是我的代码,但它通常返回“b”或错误

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)

Tags: 字符串if字母数组minmajrandintappend
2条回答

这不是pythonic哈哈看克里斯的评论

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

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

在那之后,你再也不用它了。你知道吗

如果需要随机字符串生成器,可以执行以下操作。你知道吗

from random import random


def gen(length):
    string = ''
    for _ in range(length):
        shift = int(random()*26) # if you want cap letters, feel free to customzie
        asci = shift + 97
        string += chr(asci)
    return string

print(gen(3))

你的代码大部分是不可出售的,但我会通过它来解释我遇到的所有问题。您的问题中也没有正确地缩进代码,所以我在这方面做了一些假设。你知道吗

解决代码问题

字母表生成

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,然后创建了一个while循环,条件是i < stringsize+1-当第一次计算条件时,这永远不会是真的。你知道吗

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

for i in range(stringsize):
    ...

字符串串联

从技术上讲,Python中的字符串是列表,但通过在列表中附加单个字符来构造字符串并不是很容易。你知道吗

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

对条件逻辑误用整数

代码:

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

相关问题 更多 >