24.1 질문있습니다
, 손 병현님이 작성24.1에서 문자열을 가운데로 정렬할떄 남는 공간이 홀수이면 왼쪽 공백이 한 칸 더 많다고 되어있는데 IDLE에 직접 해보니 오른쪽 공백이 한 칸 더 많습니다.
왜 이런건지 궁금합니다
'Tsukasa'.center(12) 라고 입력하니
' Tsukasa ' 라고 결과가 나왔네요
Re: 24.1 질문있습니다
, 도장_ 관리자님이 작성>>> 'Tsukasa'.center(12)
' Tsukasa '
왼쪽에 2칸, 오른쪽에 3칸인데, 이는 파이썬의 내부 구현에 따른 결과입니다.
직접 테스트해보고 정렬을 맞추는 방법을 추천합니다. 구현 내용을 보고 직접 계산하는 것보단 직접 테스트하는 게 더 빠르게 때문입니다.
구현 내용을 보려면...
https://svn.python.org/projects/python/trunk/Objects/stringobject.c
파이썬의 문자열 객체 구현은 stringobject.c에 구현되어 있습니다. C 언어로 구현되어 있습니다.
str.center() 함수의 구현은
PyDoc_STRVAR(center__doc__,
"S.center(width[, fillchar]) -> string\n"
"\n"
"Return S centered in a string of length width. Padding is\n"
"done using the specified fill character (default is a space)");
static PyObject *
string_center(PyStringObject *self, PyObject *args)
{
Py_ssize_t marg, left;
Py_ssize_t width;
char fillchar = ' ';
if (!PyArg_ParseTuple(args, "n|c:center", &width, &fillchar))
return NULL;
if (PyString_GET_SIZE(self) >= width && PyString_CheckExact(self)) {
Py_INCREF(self);
return (PyObject*) self;
}
marg = width - PyString_GET_SIZE(self);
left = marg / 2 + (marg & width & 1);
return pad(self, left, marg - left, fillchar);
}
입니다.
전부 다 알 필요는 없고, 핵심만 살펴보겠습니다.
'Tsukasa'.center(12)
이 테스트에서 길이는 이렇게 됩니다.
Tsukasa = 7
width = 12
width = 12
문자열 구현에서 채워 넣을 문자열을 구하는 부분
marg = width - PyString_GET_SIZE(self);
left = marg / 2 + (marg & width & 1);
여기서 self는 Tsukasa 문자열입니다.
left = marg / 2 + (marg & width & 1);
여기서 self는 Tsukasa 문자열입니다.
marg = 12 - 7 = 5
marg를 구한 다음에 왼쪽에 채워 넣을 공백을 계산합니다.
left = 5 / 2 + (5 & 12 & 1)
C 언어이므로
5 / 2 = 2
가 됩니다.
5 = 0101
12 = 1100
1 = 0001
5 & 12 & 1 = 0
12 = 1100
1 = 0001
5 & 12 & 1 = 0
비트 연산의 결과는 0이 됩니다.
따라서 왼쪽은 2칸이 됩니다.
left = 2
return pad(self, left, marg - left, fillchar);
구현의 마지막에서 self는 전달한 문자열이니 'Tsukasa'일 것이고,
left = 2
marg - left = 5 - 2 = 3
이므로
왼쪽은 2, 오른쪽은 3이 채워집니다.
초보용 입문서로 이 과정을 전부 설명하는 건 무리가 있어서 단순화된 설명이 제시되는 점 양해 부탁드립니다.