Вывести случайный символ Юникода (без использования exec) - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь выяснить, как напечатать случайный символ Юникода в Python 3, используя формат \uXXXX, где каждый X является символом в [0-F].Это то, что у меня пока есть:

import random
chars = '0123456789ABCDEF'
L = len(chars)
fourRandInts = [random.randint(0,L-1) for i in range(4)]
fourRandChars = [chars[i] for i in fourRandInts]
s = r'\u{}{}{}{}'.format(*fourRandChars)
string = "print(u'{}')".format(s)
exec(string)

Кажется, это работает, но я бы предпочел не использовать exec.Есть ли более Pythonic способ сделать это?

EDIT: Может показаться, что этот вопрос является дубликатом # 1477294 "Генерировать случайную строку UTF-8 в Python" судя по названию, но этот вопрос был перефразирован в такой редакции, что ответы там, как правило, не отвечают первоначальному вопросу и не отвечают на этот вопрос.

1 Ответ

0 голосов
/ 15 ноября 2018

Однострочное решение благодаря @ CJ59:

# print random unicode character from the Basic Multilingual Plane (BMP)
import random
print(chr(random.randint(0,65536)))

Из Питона 3 chr() документация:

CHR (я)

Возвращает строку, представляющую символ, у которого кодовой точкой Unicode является целое число i. Например, chr (97) возвращает строку «a», а chr (8364) возвращает строку «€». Это обратное значение ord ().

Допустимый диапазон значений аргумента: от 0 до 1 114 111 (0x10FFFF в базе 16). ValueError будет повышен, если я вне этого диапазона.

Решение, которое сохраняет использование `chars` в моем исходном вопросе, благодаря @Matthias, позволяющему выбирать шестнадцатеричные цифры для создания символа юникода:

# print unicode character using select hex chars
import random
chars = '0123456789ABCDEF'
# create random 4 character string from the characters in chars
hexvalue = ''.join(random.choice(chars) for _ in range(4))
# convert string representation of hex value to int,
# then convert to unicode character for printing
print(chr(int(hexvalue, 16)))

Функция, которая возвращает случайный символ Юникода, только если он печатается:

Эта функция использует метод str.isprintable() для возврата символа, только если он печатается. Это полезно, если вы хотите создать серию символов. Также включает опцию для диапазона символов.

import random
def randomPrintableUnicode(charRange = None):
    if charRange is None:
        charRange = (0,1114112)
    while True:
        i = random.randint(*charRange)
        c = chr(i)
        if c.isprintable():
            return c
        # should add another conditional break
        # to avoid infinite loop

# Print random unicode character
print(randomPrintableUnicode())

# Print random unicode character from the BMP
print(randomPrintableUnicode(charRange = (0,65536)))

# Print random string of 20 characters
# from the Cyrillic alphabet
cyrillicRange = (int('0410',16),int('0450',16))
print(
    ''.join(
        [
            randomPrintableUnicode(charRange = cyrillicRange)
            for _ in range(20)
        ]
    )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...