У меня две загадки String.printable в одном вопросе.
Во-первых, в Python 2.6:
>>> string.printable
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'
Посмотрите на конец строки, и вы увидите, что '\ x0b \ x0c' торчит, как больной палец. Почему они там? Я использую машину с австралийскими настройками, поэтому на ней не должно быть каких-либо символов с диакритическими знаками и т.п.
Затем попробуйте запустить этот код:
for x in string.printable: print x,
print
for x in string.printable: print x
В первой строке успешно печатаются все символы, разделенные пробелом. Два странных символа оказываются мужским и женским символами.
Во второй строке успешно печатаются все символы, ЗА ИСКЛЮЧЕНИЕМ ПОСЛЕДНЕГО, разделенных переводом строки. Печать мужского символа; женский символ заменяется отсутствующим знаком (прямоугольником).
Я уверен, что Python не предназначался для гендерной предвзятости, так что же такого отличия?
string.digits + string.ascii_letters + string.punctuation собственно.






Есть разница между «для печати» и «может отображаться на вашем экране». Ваш терминал отображает коды управления принтером с низким ASCII 0x0B и 0x0C как мужской и женский символы, потому что это то, что содержат эти индексы в вашем шрифте. Эти символы более точно описываются как символы вертикального табулятора и фида формы. Эти два символа, вместе с \ t \ r и \ n, можно распечатать, и они делают четко определенные вещи на принтере.
+1: символы без диакритических знаков. Мы называли их «управляющими каретками» еще тогда, когда у «принтеров» были «каретки».
Отлично. Это объясняет, почему они появляются в строке .printable. Теперь, почему терминал будет отображать разные коды в зависимости от расстояния? Интересно, как символ Form Feed взаимодействует с предыдущей новой строкой.
@Oddthinking: ваш драйвер терминала делает все, чтобы сопоставить отправленные символы с осмысленным поведением на вашем терминале. Для правильной работы терминального оборудования иногда требуются символы заполнения и другие ошибки.
Изнутри cmd.exe:
>>> print '\x0b'
♂
>>> print '\x0c'
♀
>>> print '\f' # form feed
♀
>>> print '\v' # vertical tab
♂
>>>
Внутри Emacs:
>>> print '\f\v'
^L^K
Вот выдержка из справочной страницы форматы (5):
| Sequence | Character | Terminal Action | |----------+--------------+---------------------------------------------| | \f | form-feed | Moves the printing position to the initial | | | | printing position of the next logical page. | | \v | vertical-tab | Moves the printing position to the start of | | | | the next vertical tab position. If there | | | | are no more vertical tab positions left on | | | | the page, the behavior is undefined. |
Это не заслуживает отдельного ответа, но, скорее всего, большинство людей, которые ищут печатные символы, обнаружат, что
string.digits + string.letters + string.punctuation + ' 'даст желаемый результат, который представляет собой «печатные символы без пробелов плюс пробел».