본문 바로가기

스터디/파이썬 해킹 프로그래밍

스터디 질문 답변

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 할 수 없는가.

호출한 함수에서는 피 호출 함수의 파라미터의 갯수와 크기를 알 수 있지만 피 호출 함수 내부에선 알 수 없다.

--> 왜 알 수 없는지 더 알아볼 것.