Используйте random.choice()
import random
foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))
Для криптографически безопасного случайного выбора (например, для генерации пароля от списка слов), используйте random.SystemRandom
класс
import random
foo = ['battery', 'correct', 'horse', 'staple']
secure_random = random.SystemRandom()
print(secure_random.choice(foo))
или secrets.choice()
import secrets
foo = ['a', 'b', 'c', 'd', 'e']
print(secrets.choice(foo))
When talking about continuations, you’ll have to distinguish between two different kinds of them:
First-class continuations – Continuation-support that is deeply integrated in the language (Scheme or Ruby). Clojure does not support first-class continuations.
Continuation-passing-style (CPS) – CPS is just a style of coding and any language supporting anonymous functions will allow this style (which applies to Clojure too).
Examples:
-- Standard function
double :: Int -> Int
double x = 2 * x
-- CPS-function – We pass the continuation explicitly
doubleCPS :: Int -> (Int -> res) -> res
doubleCPS x cont = cont (2 * x)
; Call
print (double 2)
; Call CPS: Continue execution with specified anonymous function
double 2 (\res -> print res)
Read continuation on Wikipedia.
I don’t think that continuations are necessary for a good language, but especially first-class continuations and CPS in functional languages like Haskell can be quite useful (intelligent backtracking example).
Является ли продолжение необходимой функцией языка?
Нет. Во многих языках нет продолжений.
Если нет, разве вам не нужны продолжения? Я видел много хороших примеров, особенно от этого парня. Какая альтернатива?
Стек вызовов
Я написал порт cl-cont для Clojure, который добавляет продолжения в Common Lisp.
Обычное использование продолжений заключается в реализации структур управления для: возврата из функции, выхода из цикла, обработки исключений и т. д. Большинство языков (например, Java, C ++ и т. д.) предоставляют эти функции как часть основного языка. Некоторые языки этого не делают (например: Схема). Вместо этого эти языки представляют продолжения как объекты первого класса и позволяют программисту определять новые управляющие структуры. Таким образом, Scheme следует рассматривать как инструментарий языка программирования, а не как законченный язык сам по себе.
В Clojure нам почти никогда не нужно использовать продолжения напрямую, потому что почти все управляющие структуры обеспечиваются комбинацией языка и виртуальной машины. Все еще, Первоклассные продолжения могут стать мощным инструментом в руках компетентного программиста. Продолжения, особенно в Scheme, лучше, чем эквивалентные аналоги на других языках (например, пара setjmp / longjmp в C). Эта статья содержит более подробную информацию об этом.
Кстати, будет интересно узнать, как Рич Хикки оправдывает свое мнение о продолжениях. Есть ссылки для этого?
Clojure (или, скорее, clojure.contrib.monads
) имеет монаду продолжения; вот статья, описывающая его использование и мотивацию .