簡體   English   中英

Python - 嘗試制作隨機字符串生成器

[英]Python - Trying to make a Random String Generator

我正在嘗試根據您提供的長度制作一個字符串生成器,它從 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)

這不是 pythonic 大聲笑見克里斯的評論

首先,我不知道 i 是什么? 你只需要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 -這在第一次評估條件時永遠不會為真

正確的 Pythonic 方法是使用這樣的 for 循環:

for i in range(stringsize):
    ...

字符串連接

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM