Python - 尝试制作随机字符串生成器

时间:2017-01-20 11:23:08

标签: python

我正在尝试根据你提供的长度制作一个String生成器,它从2个数组中获取字母,一个为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)

2 个答案:

答案 0 :(得分:0)

这不是pythonic lol见Chris的评论

首先,我不知道我是为了什么?你只需要它 function OpenCloseNav() { "use strict"; var mq = window.matchMedia("(min-width: 50em)"); var x = document.getElementById("_sidebar"); var y = document.getElementById("_main"); var z = document.getElementById("_menu"); if (mq.matches) { // window width is at least 50em if (x.style.width === "0rem") { y.style.marginLeft = "22rem"; y.style.marginRight = "4rem"; x.style.width = "18rem"; x.style.marginLeft = "0rem"; z.style.left = "16rem"; } else { y.style.marginLeft = "10.5rem"; y.style.marginRight = "9.5rem"; x.style.width = "0rem"; z.style.left = "0.25rem"; } } } 然后

i = stringsize+1

之后,你永远不会使用它。

如果您想要一个随机字符串生成器,您可以执行以下操作。

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

答案 1 :(得分:0)

您的代码主要是无法解决的,但我会仔细阅读并解释我遇到的所有问题。你也没有在你的问题中正确地缩进你的代码,所以我在这方面做了一些假设。

解决代码问题

字母代

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 < stringsize+1的while循环 - 当这将永远不会成立时首先评估条件

正确和Pythonic的方法是使用这样的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