키-값 쌍을 key=value의 형태로 가지고 있고 그것을 하나의 문자열로 결합하고 싶습니다. 문자열 리스트를 하나의 문자열로 결합하려면 문자열 객체의 join 메쏘드를 사용합니다.
다음은 buildConnectionString 함수에서 리스트를 결합하는 예입니다:
- return ";".join(['%s=%s" % (k, v) for k, v in params.items()])
계속 읽기 전에 흥미로운 주의사항 하나가 있습니다. 함수도 객체이고, 문자열도 객체이며, ... 모든 것이 다 객체라고 반복해서 말했습니다. 어쩌면 문자열 변수도 객체라고 생각하실지 모르겠습니다. 그러나 아닙니다. 이 예제를 자세히 살펴보시면 문자열 ";"가 바로 객체이며 그의 join 메쏘드를 호출하고 있는 것을 알 수 있습니다.
join 메쏘드는 리스트의 원소들을 하나의 문자열로 결합합니다. 각 원소는 쌍반점으로 갈라서 말이지요. 구분자가 반드시 쌍반점일 필요는 없습니다; 심지어 한개짜리 문자일 필요조차 없습니다. 문자열이면 무엇이든 됩니다.
◈ join 메쏘드는 문자열 리스트에만 작동합니다; 강제로 유형을 변환하지 않습니다. 문자열이 아닌 원소를 하나 이상 리스트로 결합하면 예외가 일어납니다.
예제 3.27. odbchelper.py의 출력
- >>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"}
- >>> ['%s=%s" % (k, v) for k, v in params.items()]
['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
>>> ";".join(['%s=%s" % (k, v) for k, v in params.items()])
'server=mpilgrim;uid=sa;database=master;pwd=secret'
그러면 이 문자열은 odbchelper 함수로부터 반환되고 호출 블록에 의하여 인쇄됩니다. 그리하여 이 장을 처음 읽을 때 경탄해 마지 않던 그 출력을 보게됩니다.
문자열을 리스트로 가르는 유사 메쏘드가 있지 않을까 의문이 드실겁니다. 물론 있습니다. 이른바 split 메쏘드가 바로 그것입니다.
예제 3.28. 문자열 가르기
- >>> li = ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
- >>> s = ";".join(li)
>>> s
'server=mpilgrim;uid=sa;database=master;pwd=secret'
>>> s.split(";") ①
['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
>>> s.split(";", 1) ②
['server=mpilgrim', 'uid=sa;database=master;pwd=secret']
① split 메쏘드는 join 메쏘드와 반대로 문자열을 여러-원소의 리스트로 가릅니다. 가름자(“;”)가 완전히 잘려 나가고 없음을 주목하세요; 반환된 리스트의 어떤 원소에도 나타나지 않습니다.
② split 메쏘드는 선택적으로 두 번째 인자를 받는데 이 인자는 가를 횟수를 지정합니다. (“"이런, 선택적 인자라...” 다음 장의 함수에서 이렇게 하는 방법을 배우겠습니다.)
√ anystring.split(delimiter, 1)는 문자열에서 부분문자열을 검색한 다음 그 부분문자열 앞에 있는 것(첫번째 원소)을 그리고 그 다음에 있는 것(두 번째 원소)을 처리할 때 유용한 테크닉입니다 .
3.7.1. 문자열 메쏘드에 숨은 역사
본인은 처음 파이썬을 배울 때 join이 리스트의 메쏘드가 되어 구분자를 인자로 받아야 한다고 기대했었습니다. 많은 사람들이 같은 생각이었는데 join 메쏘드 뒤에는 숨겨진 뒷이야기가 있습니다. 파이썬 1.6 이전에서 문자열은 이런 유용한 메쏘드들을 모두 갖추고 있지 못했습니다. 따로 string 모듈이 있었는데 여기에 모든 문자열 함수가 담겨 있었습니다; 함수마다 모두 문자열을 그의 첫 인자로 받았습니다. 함수들은 문자열 자체보다 우위에 둘 만큼 중요하게 여겨졌습니다. lower와 upper 그리고 split과 같은 함수는 그 만한 의미가 있었습니다. 많은 파이썬 프로그래머가 이 새로운 join 메쏘드를 반대합니다. 대신에 리스트 메쏘드가 되거나 또는 아무데도 옮기지 말고 오히려 예전 string 모듈의 일부가 되는 편이 더 좋다고 주장합니다 (여전히 그 안에 유용한 것들이 수 없이 많습니다). 여기에서는 단독으로 새로운 join 메쏘드를 사용했지만 어느 방식으로 코드를 작성하셔도 상관없습니다. 정말 신경이 쓰인다면 대신에 예전의 string.join 함수를 사용하시면 됩니다.
3.8. 요약
odbchelper.py 프로그램과 그의 출력은 이제 완전히 이해가 되셨을 줄로 믿습니다.
- def buildConnectionString(params):
- """Build a connection string from a dictionary of parameters.
Returns string."""
return ";".join(['%s=%s" % (k, v) for k, v in params.items()])
if __name__ == "__main__":
myParams = {"server":"mpilgrim", \
"database":"master", \
"uid":"sa", \
"pwd":"secret" \
}
print buildConnectionString(myParams)
다음은 odbchelper.py의 출력입니다:
server=mpilgrim;uid=sa;database=master;pwd=secret
'Python' 카테고리의 다른 글
4.3. type, str, dir, callable 그리고 기타 내장 함수들 (0) | 2012.01.11 |
---|---|
4. 강력한 내부검사 (0) | 2012.01.11 |
3.6. 리스트 짝짓기 (0) | 2012.01.11 |
3.5. 문자열 형식화 (0) | 2012.01.11 |
3.4. 변수 선언 (0) | 2012.01.11 |