for문에서 dictionary의 key, value 를 한번에 돌리기 python
2012.01.27 11:35 Edit
dictionary의 key, value를 for문에서 한번에 두 개의 변수로 받아오고 싶은데 방법을 모르겠어요.
for key in dictionary.keys():
value = dictionary[key]
로 해결을 하고 있는데 더 좋은 방법이 없나요 ?
최근에 후배들에게 자주 받은 질문이네요.
iteritems나 zip( http://docs.python.org/library/functions.html#zip )을 활용하면 됩니다!
dictionary에서 기본적으로 제공하는 iteritems 메서드를 사용하면 쉽게 활용할 수 있습니다.
for k, v in dictionary.iteritems():
print "%s : %s"%(k,v)
>>> foo = dict(key1="value1", key2="value2", key3="value3")
>>> for key, value in foo.iteritems():
... print "%s : %s"%(key, value)
...
key3 : value3
key2 : value2
key1 : value1
zip은 iteration을 지원하는 type의 값을 parameter로 받습니다. 리스트, 튜플 등등
그 후 파라미터들 중 가장 길이가 짧은 값을 기준으로 그 길이만큼 각 파라미터들의 같은 위치에 있는 노드들을 튜플로 묶은 리스트를 반환합니다.
zip([1,2,3], ['a','b','c','d']) => [(1, 'a'), (2, 'b'), (3, 'c')]
와 같이 말이죠
dictionary에는 keys()와 values() 라는 메서드가 있습니다.
각각 해당 사전의 키들과 값들을 리스트로 반환하는 메서드입니다.
따라서 zip(dictionary.keys(), dictionary.values()) 를 해주면
[(key, value), (key, value), (key, value)] 식으로 반환을 해주죠 이를 for문에 넣으면 됩니다 !
for key, value in zip(dictionary.keys(), dictionary.values()):
print "%s : %s"%(key, value)
>>> foo = dict(key1="value1", key2="value2", key3="value3")
>>> for key, value in zip(foo.keys(), foo.values()):
... print "%s : %s"%(key, value)
...
key3 : value3
key2 : value2
key1 : value1
더 좋은 방법이 있다면 알려주세요 'ㅡ'
Messages 1
Leave Message
앱서버용 django plugin django
2011.12.31 18:44 Edit
올해 저는 정말 많은 일들을 했었는데요. 그 중 개발과 관련된 업적을 하나를 소개하려합니다.
2011년에는 스마트폰 어플리케이션 서버개발을 많이 하게 됐었는데 개발을 하다보니 겹치는 부분들이 많이 보였고 쉽게 스마트폰 어플리케이션의 서버 개발을 할 수 있는 프레임워크가 필요해졌습니다.
그래서 Django plug-in "Request Processor"을 개발하게 되었습니다 !
Request Processor를 사용하면 다음과 같은 이점이 있습니다.
- 스마트폰 어플리케이션 서버에서 주로 구현해야하는 기능들이 이미 구현돼있다. (Phone authentication, User authentication, SMS, APNS, JSON Protocol Communication etc)
- 개발 중 서버내에서 에러가 발생했을 때(클라이언트 요청이 잘못되거나 서버 구현이 잘못되거나) 힘을 들이지 않고 에러가 발생한 상세한 원인을 클라이언트에게 보기쉽게 전달해주므로 문제를 발견하기 쉽고 디버깅이 쉬워진다.
- 서버 코드를 문서처럼 쉽게 볼 수 있도록 작성할 수 있다.
- 디버깅을 쉽게 할 수 있도록 도와주는 로그가 남아 개발속도를 높인다.
저는 개인적으로 서버코드가 깔끔해지는 것이 가장 좋습니다 !
아래 코드는 Request Processor를 사용한 한 앱 서버의 코드 일부인데요 내용은 사용자가 닉네임을 등록하는 부분입니다.
method = 'POST'exception_dict = {UnsupportedRequestMethodError: 2,NoParameterError: 3,NotAuthenticatedUserError: 4,InvalidParameterError: 5}def process_request (self):self.save_nickname()self.notificate_to_friends()def save_nickname(self):nickname = self._get_parameter('nickname')if len(nickname) > 10:raise InvalidParameterError('nickname', nickname)user = self._get_user()user.first_name = nicknameuser.save()def notificate_to_friends(self):nickname = self._get_parameter('nickname')friend_list = Friend.objects.filter(to_user=self._get_user(), status=Friend.STATUS_APPROVED)for friend in friend_list:if self._does_friend_need_nickname(friend):friend.is_sended = Falsefriend.save()def _does_friend_need_nickname(self, friend):return not Contact.does_user_have_phone_number(friend.from_user, self._get_user().get_profile().phone_number)
Framework flow를 간단히 소개하면 urls.py에서 RequestProcessor의 static method를 호출하고 그 static method는 자신을 생성한 후 생성된 instance의 process_request를 호출합니다.
urls.py => RequestProcessor의 한 static method => NicknameRegister instance 생성 => instance.process_request()
process_request 의 구현코드는 해당 기능의 큰 흐름만을 가지고 있습니다. 각 클래스에서 하는 일을 파악하기 위해서는 process_request 메서드만 보면 됩니다.
이 클래스는 닉네임을 저장하고 친구들에게 알려주는군요.
method는 이 클래스를 호출하기 위해 요청해야할 method입니다. GET과 POST가 있습니다. 맞지 않은 method인 경우에는 에러를 냅니다.
exception_dict는 에러가 발생했을 때 각 에러에 대한 에러코드를 dictionary 상수로 지정해놓으면 각 에러가 발생했을 때(exception raised) 그 에러가 발생한 이유와 지정한 에러코드가 클라이언트에게 넘어갑니다. 저희 팀은 따라서 각 요청 프로토콜에 대하여 에러코드를 정리한 문서가 있습니다. 다음은 에러가 발생했을 때 response의 예입니다.
{"return_code":3, "reason":"Parameter 'nickname' is omitted"}
Request Processor의 모든 것을 보여드리지도 못한게 아쉽네요.
아직은 완성단계가 아니지만 시간이 날 때 완성을 시키면 소스를 공개하도록 하겠습니다 !
RequestProcessor를 활용하여 채팅 메시지를 날리는 소스를 하나 더 보여드리면서 포스팅을 마치겠습니다 ㅎㅎ
https://gist.github.com/021809a30b976a38844a
class SendMessage(RequestProcessor):method = "POST"exception_dict = {UnsupportedRequestMethodError: 2,NoParameterError: 3,NotAuthenticatedUserError: 4,InvalidParameterError: 5}def process_request(self):target_room = self.get_valid_target_room()message = self._get_parameter('message')participant_user_list = filter(lambda user:user != self._get_user(), target_room.get_participant_user_list())for user in participant_user_list:device_token = user.get_profile().device_tokenname = Friend.objects.get(from_user=user, to_user=self._get_user()).get_name()arguments = dict(page="chat mesage", room_id=target_room.pk)send_push("%s : %s"%(name, message), [device_token], arguments=arguments)def get_valid_target_room(self):try:target_room_id = self._get_parameter('target_room_id')room = ChatRoom.objects.get(id=target_room_id)if self._get_user() not in room.get_participant_user_list():raise InvalidParameterError('target_room_id', "You are not participant of the room %s"%target_room_id)except ChatRoom.DoesNotExist:raise InvalidParameterError('target_room_id', "%s is not valid room id"%target_room_id)return room
추신 : 쓰고나니 반응이 좋아 test code도 추가합니다 ㅎㅎ
url = '/user/nickname-register/'def setUp(self):self._add_users()def testSucceeded(self):return_code = self._request_post({'username':self.username, 'password':self.password, 'nickname':u'김승연'})self.assertEqual(return_code, 1)user = User.objects.get(username=self.username)self.assertEqual(user.first_name, u'김승연')return_code = self._request_post({'username':self.username, 'password':self.password, 'nickname':u'Acuros'})self.assertEqual(return_code, 1)user = User.objects.get(username=self.username)self.assertEqual(user.first_name, u'Acuros')return_code = self._request_post({'username':self.username, 'password':self.password, 'nickname':u'김승연김승연'})self.assertEqual(return_code, 1)user = User.objects.get(username=self.username)self.assertEqual(user.first_name, u'김승연김승연')def testInvalidParameterError(self):return_code = self._request_post({'username':self.username, 'password':self.password, 'nickname':u'나는열자리가넘는이름입니다'})self.assertEqual(return_code, 5)
Leave Message
Javascript Function Return Caching Javascript
2011.10.24 14:22 Edit
Javascript Function Return Caching / 자바스크립트 함수 return 캐슁하기
function factorial(num)
{
if(arguments.callee.cache[num] != null)
{
return arguments.callee.cache[num];
}
var product = 1;
for(var i=1; i<=num; ++i)
{
product *= i;
}
arguments.callee.cache[num] = product;
return product;
}
factorial.cache = {};
alert(factorial(5) == 120);
alert(factorial.cache[5] == 120);
간단하게는 factorial이나 isPrime 같이 단순연산결과를 저장해놓는 것 부터 Query 결과를 저장해놓는 것 등등 성능향상을 위해 javascript에서도 가끔 함수 결과를 caching해놔야하는 경우가 생깁니다.
위의 예제는 function property를 이용하여 return result를 caching한 것입니다.
arguments.callee는 function 자기 자신을 의미합니다.
더 좋은 예제들이 있다면 언제든 환영입니다 !
- Tag :
- cache , caching , arguments.callee
Leave Message
수학과 해킹 잡담
2011.10.21 01:28 Edit
이럴수가 김승연이 수학을 들먹이다니 .. 아마 전무후무 할 것 같습니다.
저는 제 후배들이나 해킹을 막 시작하는 학생들에게 강의를 할 때 이런 질문을 많이 받아봤습니다.
"강사님은 해킹을 언제부터 하셨나요 ?", "선배는 학교공부와 전공공부의 비중을 어떻게 두셨어요 ?"(사실 저는 1:19 정도였습니다 .. 거의 컴퓨터만 했죠 이부분은 나중에 따로 포스팅하겠습니다.), "정말 영어수학 잘 해야하나요 ?" 등등
이 글로 특히 "정말 영어수학 잘 해야하나요 ?" 그 중에서도 "수학 잘 해야하나요?" 에 대한 저의 생각을 밝히고자 합니다.
해킹 커뮤니티들에서 그리고 꽤 높은 위치에 계신 해커들이 영어수학 잘 하라는 의미는 두 가지로 나뉩니다.
1. 정말 해킹을 하면서 영어와 수학을 사용하기 때문에
2. 일단 좋은 대학교를 가서 좋은 환경에서 공부하면 더 잘할 수 있기 때문에
저는 이 중에서 2번에 대해서는 별로 동의하지 않습니다. 이것과 관련된 생각들은 위에서 밝힌 것과 같이 다음에 올려보도록 하겠습니다.
그럼 1번이 문제인데 영어는 외국 해커들 만나면서 쓰고 문서들 보면서 쓰고 문서 써야될 때도 쓰고 등등 정말 많이 사용되기 때문에 정말 동의합니다.
저도 어렸을 때 부터 영어를 공부해왔기에 외국인과 영어로 대화하는 것이 부담되지 않았기 때문에 외국 해커들과 많이 친해질 수 있었고
이것이 정말 큰 도움과 재미가 되었기 때문입니다. 하지만 수학은 실제 해킹에서 직접적으로 사용되는 사례가 거의 없습니다.
해킹관련 분야 중 암호학은 그냥 수학이라고 해도 되는 부분인데 암호학은 해킹/보안 분야에서 작은 한 부분에 속합니다.
그럼 나머지는 ???
하지만 저는 수학이 해킹에 사용된다고 말을 합니다.
해킹을 하는 과정과 수학문제를 푸는 과정이 매우 유사하며 수학적 논리가 해킹에 많은 도움이 된다는 것을 느꼈습니다.
하지만 해킹을 할 때 수학문제를 풀어야 하는 것은 아니기 때문에 수능식의 "수리 문제"를 잘 풀어야 할 필요는 없다고 생각합니다.
저는 곱의 미분 공식과 분수 미분 공식 증명과정을 좋아합니다. (쓰고나니까 변태같네요)
그 이유는 공식 증명과정이 SQL Injection이나 Script Injection 과정과 매우 흡사하기 때문이죠.
아래 그림을 보시죠.
미분의 정의와 곱의 법칙, 분수 법칙의 증명
두 증명과정 모두 기본 정의에서 시작된 식에서 결론에 이르기까지 여러 트릭이 사용됩니다.
마치 SQL Injection을 할 때 문자열에서 빠져나와 SQL 명령구문이 되기 위해 '를 사용하거나
Script Injection을 할 때 Attribute value에서 빠져나와 Script를 쓰기 위해 "><script> 를 쓰는 것 같은 느낌을 주는 부분들이 있습니다.
예를 들면 -f(x)g(z) + f(x)g(z) 를 더하는 과정이 저에게는 ' or ''=' 라던가 "><img src="" onerror="alert(1)" /> 처럼 보였습니다. (물론 저만 그럴 수도 있지만 ㅋㅋ)
결국 위에서 보면 주어진 식에서 원하는 식으로 만들어 가는 것은 수학이나 해킹이나 똑같이 느껴집니다.
뿐만 아니라 수학에서 여러 specific한 식들을 일반화시켜 정리를 만들어 가는 과정처럼 여러 specific한 공격들을 일반화시켜 공격기법을 만들어내는 것 조차
수학과 해킹의 매우 유사한 부분이라고 생각합니다.
이처럼 실제 해킹을 할 때에 수리능력이 필요한 경우는 없지만 수학적 사고가 해킹을 할 때에 많은 도움이 된다고 생각합니다.
하지만 그렇다고 수학을 못한다고 해서 해킹을 못하는 것도 아닙니다. 오히려 해킹을 하면서 수학적 사고가 커지는 경우가 있기도 합니다.
어쨌든 저의 주장과 결론은 수학을 해야하는 이유는 수능을 잘봐서 대학을 잘 가기 위해서도 아니고 (이 부분은 나중에 따로 포스팅을 할 생각입니다)
해킹을 할 때 수학문제를 풀어야하기 때문도 아니라 논리적 사고를 키우기 위해서라는 점입니다.
으 마무리가 가장 아쉽네요.
다음에는 "전공공부와 학과공부의 비중을 어떻게 두셨나요 ?"와 관련된 포스팅을 해볼 생각입니다.
정리도 안된 글 읽어주셔서 감사합니다 'ㅡ'
Messages 2
Leave Message
Deview 2011 참가 후기 잡담
2011.10.20 23:03 Edit
NHN 개발 컨퍼런스 Deview 2011에 참가하고 왔습니다.
원래는 참가신청도 놓쳤고 참가할 생각이 없었지만 컨퍼런스 전날 후배 박아윤(남자 ..)이 컨퍼런스를 못가게돼서 이름을 빌려줄 수 있었고
다른 후배 조성환이 가자고 꼬셔서 결국 가게됐습니다.
가서 등록을 해야하는데 줄이 길었습니다. 일단 줄을 서러 가는 도중에 아는 분들을 많이 만날 수 있었습니다 ㅋㅋ
성수형, 동우형, 열호형, 후배들 등등.
어쨌든 제 차례가 됐고 제 이름으로는 사전등록이 안돼있어서 후배 아윤이 이름으로 등록을 했습니다.
등록하는데 바코드 뒷 번호 두 개를 요구하더군요 ;ㅁ; 이런 ㅋㅋ 그래서 음 임기응변으로 "등록한 이메일로는 확인불가능한가요 ?" => "아 네 확인 가능합니다 ^^"
다행이 아윤이 메일을 대고 등록에 성공했습니다! 등록할 때 왼쪽 앞에서 누군가 사진을 찍었던 기억이 있는데 기사에 올라갔더군요 ㅋㅋ

아이뉴스 기사에 첨부된 Acuros, 김승연
Keynote가 재미가 없어서 (.. 죄송합니다 ㅋㅋ ) 디미고 출신 KAIST 11학번 상엽이형이랑 커피빈에서 잡담을 나눴습니다.
그냥 KAIST 얘기나 벤처얘기나 개발얘기 BP얘기 등등 ..
얘기하다보니 점심시간이 돼서 다시 후배들이랑 점심을 먹으러 푸드코트로 향했습니다. 아 점심은 nhn에서 쿠폰을 나눠주어서 무료로 먹을 수 있었습니다.
하지만 역시 사람이 많아서 자리확보와 주문까지 시간이 꽤 걸렸습니다. 이 시간동안에도 많은 사람들을 만날 수 있었어요 ㅋㅋ
Software Maestro 2기 연수생분들, 저와 함께 1기를 보냈든 형들, 해킹하는 형들까지 ..
아무튼 점심을 먹고 본격적으로 Session들이 시작했습니다. 저는 첫 세션으로 NHN에서는 애자일 이렇게 적용한다 (?) 였나 그걸 듣고 싶었지만
사전등록에서 신청한 Session과는 무관하게 선착순으로 90명만 받았더군요.
이럴수가 ㅋㅋ 그래서 저는 "위치기반서비스 이대로 안전한가" 라는 한 전북대 박사과정 학생분의 논문발표를 듣게됐습니다.
뭔가 실용적이고 새로운걸 기대했지만 역시 그저 논문이었습니다. 듣다가 중간에 불가항력에 의해 잠이 들어버렸습니다.
Session 2에서는 "개발자가 싫어하는 이야기" 라는 주제로 NHN I&S의 기술문서를 담당하고 있는(?) 김붕미 차장(?) 님의 Technical Writing Session을 참여했습니다.
여기서는 그래도 꽤 재미있었습니다. "What is Technical Writing", "Benefit from Technical Writing", "Writing Process", "Technical Writing in NHN" 네 개의 주제였는데
간단하게 정리해보자면
Technical writing은 다양한 산업분야에서 전문가 또는 비전문가를 위해 기술내용을 담은 문서를 작성하는 것이고 한마디로 "특정 독자에게 특정목적을 가지고 특정정보를 전달한다" 라고 하셨습니다.
기술문서작성이 주는 이점은
1. 대내외 커뮤니케이션
2. 제품/서비스 품질 향상 - ex ) User Assistant
3. 기술정보 축적
기술문서 작성 과정은
Pre-writing - 주제확정, 어떤 내용을 어느정도로 쓸건지 정하기, 독자수준 고려하기
Organization - 정보의 조각들을 잘 묶기
Writing - 적절항 형식으로 정확하고 선명하고 간결하게 전달하기
Editing - 고쳐쓰기
Re-writing - 다시 고쳐쓰기
정도네요. 이런걸 들으면 뭐합니까 ㅋㅋ 지금 이 글도 이렇게 날려쓰는데
아무튼 그 뒤에는 Crazy Speed Web Development 라는 Session을 들었습니다.
2011년 중반 이후 자바스크립트의 개발 흐름 변화를 설명하고 터져나오는 자바스크립트 라이브러리&프레임워크들의 흐름을 보고 적절하게 사용하는 방법(?)을 발표해주셨지만 제가 전날 잠을 잘 못 잔지라 ,,, 역시 중간에 자버렸습니다. 이 뒤에도 세션들이 더 있었지만 저는 더 들을 힘이 없었고 .. 유가람 디자이너님이랑 얘기를 했습니다.
두서없이 날려썼지만 앞의 내용은 저에게 별로 중요하지 않고 중요한 것은 실제로 제가 얻은 것입니다.
저는 이날 deview에서 얻은 것은 우리나라만 해도 나보다 뛰어난 개발자는 엄청나게 많고 나에게 해주는 "잘한다"라는 칭찬들은 "고등학생 수준에서 조금 하네" 정도이기 때문에 더 열심히 해야겠다는 자극을 얻었습니다.
해킹도 그렇고 개발도 그렇고 KAIST 공부도 그렇고 !
세상엔 저보다 잘하는 사람들은 엄청나게 많고 제가 그 중에서 살아남기 위해서는 자만하지 않고 계속 위에는 사람들이 많이 있다는 사실을 자각하며
고등학생 때 쏟았던 열정 이상으로 열심히 해야겠습니다. 할게 많네요 !
아래는 성수선배가 찍어주신 사진을 첨부합니다 >_<

Layer7 조성수 선배가 찍어주신 사진

Tnx to combacsa