<p>这里有一个稍微扩展的版本:</p>
<p>它可以在Python2.x和3.x中工作,并使用真实的字母和单词长度频率。在</p>
<pre><code>from itertools import islice
from random import choice, randint
import sys
if sys.hexversion < 0x3000000:
inp = raw_input
rng = xrange
else:
inp = input
rng = range
LETTERS = ( # relative character frequencies
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabb"
"bbbbbbbbbbcccccccccccccccccccccdddddddddddddddddddddddddddddddde"
"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"
"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefffffffffffffffffgggggggggggggggg"
"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiiiiiiiiiiii"
"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijjkkkkkklllllllllllllllllllll"
"llllllllllmmmmmmmmmmmmmmmmmmmnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn"
"nnnnnnnnnnnnnnnnoooooooooooooooooooooooooooooooooooooooooooooooo"
"ooooooooopppppppppppppppqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr"
"rrrrrrsssssssssssssssssssssssssssssssssssssssssssssssstttttttttt"
"ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttuuuuuu"
"uuuuuuuuuuuuuuuvvvvvvvvwwwwwwwwwwwwwwwwwwxxxyyyyyyyyyyyyyyyzz"
)
CONSONANTS = ''.join(ch for ch in LETTERS if ch not in "aeiouy")
VOWELS = ''.join(ch for ch in LETTERS if ch in "aeiouy")
PUNCTUATION = "....??!"
is_cons = set(CONSONANTS).__contains__ # is_cons(x) == x in set(CONSONANTS)
WORDLEN = [ # relative word-length frequencies
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,
8, 9, 9, 9, 10, 10, 10, 11, 11, 12
]
wordlen = lambda: choice(WORDLEN)
def get_int(prompt):
while True:
try:
return int(inp(prompt))
except ValueError:
pass
def gibberish():
"""
Generate an infinite sequence of random letters,
allowing no more than two consecutive consonants
"""
a = choice(LETTERS); yield a
b = choice(LETTERS); yield b
while True:
c = choice(VOWELS if is_cons(a) and is_cons(b) else LETTERS)
yield c
a, b = b, c
def take_n(iterable, n):
return list(islice(iterable, n))
def add_spaces(iterable, make_word_length):
iterable = iter(iterable)
while True:
for i in rng(make_word_length()):
yield next(iterable)
yield ' '
def gibberish_sentence():
length = get_int("How many characters of gibberish would you like? ")
chars = take_n(gibberish(), length) # make that many chars
chars = add_spaces(chars, wordlen) # add spaces to make "words"
sentence = ''.join(chars).rsplit(' ', 1)[0] # crop at last space (don't leave a part-word at the end)
return sentence.capitalize() + choice(PUNCTUATION) # capitalize and add punctuation
def main():
print(gibberish_sentence())
if __name__=="__main__":
main()
</code></pre>
<p>样本输出:</p>
^{pr2}$