Q3. JTP 12345 -> 12,345 예제에서 소스코드 구조 질문
# commanumber.py import string def comma_number(number): if number[0] in ['+', '-']: sign_mark, number = number[:1], number[1:] else: sign_mark = '' try: tmp = string.split(number, '.') num = tmp[0]; decimal = '.' + tmp[1] except: num = number; decimal = '' head_num = len(num) % 3 result = '' for pos in range(len(num)): if pos == head_num and head_num: result = result + ',' elif (pos - head_num) % 3 == 0 and pos: result = result + ',' result = result + num[pos] return sign_mark + result + decimal print comma_number("12345678.345678")
이해 되지 않는 부분은
for pos in range(len(num)):
if pos == head_num and head_num:
result = result + ','
elif (pos - head_num) % 3 == 0 and pos:
result = result + ','
result = result + num[pos]
return sign_mark + result + decimal
여기서,
for pos in range(len(num)):
pos 를 num의 길이만큼 돌린다.
if pos == head_num and head_num:
pos가 head_num과 일치하고 head_num이 거짓이 아닐 때 (0이 아닐때)
result = result + ','
쉼표 추가
elif(pos-head_num) % 3 == 0 and pos:
pos --> 현재 계산하는 수
head_num 쉼표가 추가되지 않는 앞부분 수.
12,345 일 경우 12 가 head_num 이 됨.
result=result+','
쉼표 추가
return sign_mark + result + decimal
sign_mark -> 부호
result -> , 가 추가된
decimal -> 소수점 이하의 숫자
--> 리턴값
12,345
Q1. 책에서는 Win32 API가 stdcall을 사용한다고 말했는데, 어떤 곳에서는 윗 부분처럼 함수의 파라미터가 명확하게 정의되어 있어 함수 외부에서 파라미터를 pop하는 cdecl 방식을 주로 이용한다고 함. 진실은?
함수마다 호출 규약이 다름.
--> WinAPI 중에도 파라미터가 명확히 정의되지 않은 것이 있음.
내부에서 POP하는 stdcall을 사용하는 함수도 있음.
대신 외부에서 POP 하는 cdecl 보다 stdcall이 빠름.
속도
stdcall > cdecl
동적 파라미터
stdcall X
cdecl O
Q2. 스택에서 꺼낼 때, 함수내에서 pop 하는 것과 호출자에서 pop 하는 것중 무엇이 다르며, 왜 함수 내에서 가변적인 파라미터를 스택에서 pop 할 수 없는가.
호출한 함수에서는 피 호출 함수의 파라미터의 갯수와 크기를 알 수 있지만 피 호출 함수 내부에선 알 수 없다.
--> 왜 알 수 없는지 더 알아볼 것.
'스터디 > 파이썬 해킹 프로그래밍' 카테고리의 다른 글
디버거와 프로세스를 연결하는 방법, CPU 레지스터 값을 출력하는 방법 (0) | 2015.01.15 |
---|---|
DLL 기초개념 (0) | 2015.01.14 |
2015-01-15 스터디 (0) | 2015.01.12 |
2015-01-12 질문 정리 (0) | 2015.01.12 |
레지스터 / 브레이크 포인트 (0) | 2015.01.11 |