Skip to main content
 首页 » 编程设计

python之如何随机化 if/elif 语句的顺序

2025年05月04日23JustinYoung

首先,介绍一下背景知识,以便您了解我要做什么。我正在创建一个可发音的单词生成器。为了使单词可发音,只有某些字母组可以跟在另一组字母的成员之后。例如,单词不能以“dtb”开头。这很容易通过一行 if 语句来实现,如果在单词中满足条件,则附加一个字母。但是,由于这是一个随机词生成器,我想随机化执行 if/elif 语句的顺序。我认为最好的方法是拥有一个函数列表(其中每个函数代表一个 if 语句或规则), 打乱列表,并遍历直到满足条件。这可以通过为每个规则显式定义如下函数来实现:

string = '' 
def rule1(): 
    string += random_letter 
    if string[0] in letter_set_A: 
        string += random_from_letter_set_B 
    return string 

但是我宁愿不这样做,因为我最终会得到十几个与我不需要的名称相关联的显式函数。我进一步研究了 lambda 以在列表中创建隐式函数,但它们不支持我在上面使用的赋值。

是否有可能创建一个像上面这样的复杂函数列表,这些函数可以在格式my_list[i]() 中调用而无需明确定义它们?如果不是,如何随机化 if/elif 语句的执行顺序?

请您参考如下方法:

假设有一个字典 key:value,其中给定一个字符 c 作为键,您将一个列表作为值,其中包含允许的字符。
在这种情况下,你可以做类似的事情

import random 
 
allowed = {'a':['b'],'b':['c'],'c':['a']} 
 
n_chars = 4 
 
word = random.choice(list(allowed.keys())) 
 
while len(word) < n_chars: 
    word += random.choice(allowed[word[-1]]) 

同样的方法适用于更复杂的函数,如下所示:

import random 
 
def f1():  
    return "a" 
def f2():  
    return "b" 
def f3():  
    return "c"   
 
allowed = {'a':[f1,f2],'b':[f2,f3],'c':[f3,f1]} 
 
n_chars = 4 
 
word = random.choice(list(allowed.keys())) 
 
while len(word) < n_chars: 
    word += random.choice(allowed[word[-1]])()