Django는 Python을 이용한 프레임워크이다.

웹호스팅 프로젝트에서 사용할 웹페이지를 Django를 이용하여 만들어 볼 것이다.!

먼저 간단히, 설치하고 서버를 실행해보는 것부터 시작했다!



(django 설치)


pip 을 이용하여 django를 설치한다!




(설치 확인)


python에 들어가서 import django를 해보아서
django가 잘 설치되었는지 확인한다.

간단한 프로젝트를 만들어서 웹 페이지에 접속해 볼것이다.



(프로젝트 생성)


프로젝트 생성은 위와 같다.

이렇게 하게 되면 디렉토리가 만들어지는데 아래와 같다.



(생성된 디렉토리)


앞으로 manage.py를 이용하여 APP도 만들고 관리를 할 것이다.

그러면 실행해서 한번 웹페이지에 접속해보자!



(서버 실행)


서버 실행은 runserver이다.




(결과)


시도한 결과 연결이 거부되었다.

방화벽탓인지 한번 방화벽을 내려보았다.



(방화벽 오픈)



방화벽을 오픈하여도 같은 현상이 있어서 찾아보니

default로는 로컬호스트에서만 접속할 수 있고, 모든 호스트에서 접속이 가능하게 하려면

0.0.0.0:(port) 로 지정하여 서버를 실행해줘야한다고 한다.



(오픈서버 실행)


서버를 실행하고

다시 접속해본다!



(Disallowd)


허용되지 않은 호스트???..

또 검색을 해본다.

검색을 해본 결과 해당 프로젝트 디렉토리의 settings.py 파일을 수정해주어야한다고 한다.



(settings.py)


ALLOWED_HOSTS 를 *로 모든 사용자가 접속하게 한다.



(접속)


접속해보니 이제 제대로 웹페이지에 접속이 되는 것을 확인할 수 있었다.





오늘은 코딩을 해보았다.
Training 문제로 간단한 문제를 풀었다.


(Prime Factory 문제)



문제는 이렇다.
100만 이상의 숫자의 소수를 구한다.
그 소수의 합 또한 소수인 수를 구한다.

이런 소수를 2개 구한다.
그리고 이어주면된다.

예를 들어
1234567 과 2345678 을 구했다 치면
12345672345678을 답으로 적으면 된다.

이 문제를 풀기위해 소수의 합의 소수를 구해야해서
중복되는 코드가 있으므로 함수를 만들어서 사용했다.

첫번째로 만든 함수는 소수인지 판별하는 것이다.



(소수 판별 함수)



소수 판별 함수는
flag 변수를 두어서
만약 나누어지는 값이 발견되면 flag를 1로 주어 return하고
없다면 그대로 0으로 나간다.
즉 밖에서 보면 0이 나오면 소수이고 1이 나오면 소수가 아니다.


두번째로 구한 소수의 자릿수를 전부 더해주는 함수이다.



(자릿수 더하기 함수)



이 함수의 설명은 코드 보는 것과 같다.
각 자리수의 10의 거듭제곱으로 나누어 각 수를 더해서
return 한다.

이 두가지 함수를 이용해서
계산한다.

처음 시작은 100만으로 시작해서 하나씩 증가시키면서 검사한다.



(완성 코드)



두가지 변수에 가득 차면 반복문이 종료된다.



(실행 결과)



실행 결과를 복사 해서
정답에 넣으면!



(정답)



정답이 된다. :)

간단한 문제지만
30? 40분은 걸렸던거 같다..!

오랜만에 해서 그런가 보다
자주 해야겠다 :)



'WarGame > WeChall' 카테고리의 다른 글

WeChall - (Coding) Training: Programing 1  (0) 2017.01.26



이번 문제도
신기하지만
요상한 문제였다.

문제화면이다. 5번!



(5번 문제화면)




소리내서 읽어봐라??

일단 소스코드로!



(소스코드)



banner.p 라고 보인다.
주석으로 peak hell 비슷한 말이라고 힌트를 줬는데
피클? p 파일을 읽어봤다.



(banner.p 코드)



???.?
이건 뭐지
규칙도 없고
의미도 없는 듯했다.
banner.p로 url 수정해서 들어가면 되나?


(??)



다운하라는 화면이 떳다.
음.! 파일이구나

나는 급히(천천히)
python.org의 참조문서를 찾았다.
p를 눌러서 뭐가있나 보는 순간 피클? 이 있었다.
피자먹는 피클인줄 알았는데
심오한 뜻이 있었다.




(pickle 자료화면)



내용을 찾아보니
파일을 직렬화, 역직렬화 시켜주는 모듈.. 이라고 나와있었다.

내용을 더 찾아봤다. (당연히 도통 무슨소린지)

찾아보니
텍스트 파일이 네트워크로 전송될 때 텍스트 파일그대로 날라가지 않고
직렬화 시켜주어야하는데 그 때 쓰는 모듈이라고 나와있었다.
즉 텍스트 파일을 바이너리로 바꾸어주고 그 바꾸어준 파일이
스트림형태로 소켓에서 입출력 되는 것이다.

그건 그런거시고
문제의 데이터값을 입력해보았다.



(피클 입력)



(피클 입력)



음.. 그래도 규칙(?) 이 나름있는
언어로 바뀌었다. 형태를 보니 튜플이고 리스트였다.

일단 파일을 하나 만들어서 출력해보았다.



(출력 화면)





(출력화면)




음..
왼쪽 부분은 비거나 #이 들어가고
오른쪽 숫자는 합이 일정한거 보니 규칙이 있어보였다.

#의 개수에 따라 결과가 나오는 듯 했다.
반복문을 돌면서 출력!



(for 출력)





(출력화면)



이제 확실해졌다.
오른쪽 숫자는 개수이다.왼쪽은 들어갈 것으로 공백하고 #이 있다.

공백 몇개, # 몇개, 공백 몇개 이렇게 되있다.

일단 빈 문자열을 만들어주고
한행씩 돌면서 문자를 입력했다.




(완성코드)




(실행화면)



실행 결과로 channel이 나왔다.
멋있는 화면이다(?)

해왔던데로 url에 channel 입력


(정답으로 넘어간 화면)



정답이다!

덕분에
피클이라는 모듈을 공부하게 된 계기가 되었다.



'WarGame > Python Challenge' 카테고리의 다른 글

Python Challenge - 4번  (0) 2017.01.09
Python Challenge - 3번  (0) 2017.01.02
Python Challenge - 2  (0) 2017.01.01
Python Challenge - 1  (0) 2017.01.01



(1)에서
ARP Spoofing까지 프로그램을 마무리했다.

그리고 포워딩 기능을 추가하기로 했는데
포워딩을 그냥 윈도우의 라우팅 서비스를 이용할 것이다.

이제 받아온 패킷에서
DNS 패킷을 구별하고
www.naver.com 특정 도메인 네임에 맞는 패킷들을
필터링 할 수 있어야
그 패킷에 대한 응답을 먼저 할 수 있다.
그리고 그래야 DNS Spoofing을 할 수 있다.

먼저 DNS 패킷을 구별해보자.

DNS는 53번 포트를 사용하므로 udp 헤더의 도착지 포트번호를 확인하면 된다.




(DNS 포트 53번 확인)




(DNS 패킷 생성)





(DNS 패킷이 수집된 모습)



DNS 내용이 수집된 화면이다.
맨 앞 두바이트가 Trx ID이고 (DNS Spoofing때 필요한 항목이므로 뽑아낼 수 있어야한다.)
그 다음 2바이트 0x0100 Flag가 보인다.
그 다음 2바이트 Question, Answer, Authority, addional 이 보인다.
그리고 3으로 시작하는 DNS 주소가 보인다.
DNS 패킷이 맞는걸 확인 할 수 있다.

이제 여기서 DNS Question의 주소부분만 떼올 수 있어야한다.
unpack을 사용해서 질문 필드만 떼어내 보았다.




(쿼리 내용 추출)





(내용 화면)



처음에는 출발 포트번호 53번도 적용시켜서 응답까지 봤는데
잠깐 우리가 패킷을 분석하면서 확인해야하므로
목적지 포트 53번만 검사하도록 잠깐 수정했다.
(또, 내 호스트에서 나가는 패킷으로 검사할 것이므로 내 패킷이 보이도록 수정했다.)




(확인을 위한 수정)





(www.naver.com 검색)





(결과화면)



naver 를 검색한 DNS 패킷 내용만 잘 출력되는 것을 볼 수 있다.

여기서 DNS Spoofing에 필요한 정보
1. Src Port Number
2. Transaction ID
3. DNS 물어보는 내용

위 내용을 확인해보도록 하겠다.




(확인 코드)




(결과)



이제 여기서 주소 도메인 네임만 정확히 뽑아내야한다.

그러기 위해 바이트형식으로 되있으니 decode()를 해주었다.



(decode() 코드 추가)





(결과 화면)



www.naver.com이 잘 보인다.
이제 이 것을 문자열로 뽑아내는게 일이다.



(도메인 부분만 뽑아내는 코드)



(결과 화면)



도메인 네임만 잘 보이게 되었다.

이제 다시 src_ip != 100 으로 수정하여 나의 IP를 제외한 다른 패킷들을 볼 것이다.
조건을 수정해주고

ARP Spoofing을 해준다음
아래의 코드를 실행시켰다.
그리고 피해자는 www.naver.com에 접속하였다.





(완성한 코드)





(입력한 naver.com가 보인다.)



피해자가 보낸 패킷의 내용을 덤프 받을 수 있고
확인 할 수 있었다.

여기 까지 했으니 (3)에서는
이 패킷을 받아서 naver.com을 물어보는 패킷에 대해
응답패킷을 만들어서 피해자에게 보낼 것이다.

그렇게 되면 DNS Spoofing 공격에 성공하게 되는데
그 결과를 확인해 볼것이다.




4번 문제또한
새로운 문법을 공부할 수 있는 좋은(?) 계기가.. 되었다.

문제 화면이다.




(4번 문제 화면)




(사진을 클릭한 화면)



44827을 url 끝에 입력하고 들어가니 비슷한 패턴의 숫자가 또 나와서
입력하였다.

세번째(?) 인가..



(손이 아플꺼야 화면)



정확히 이게 맞나 싶은 생각이 들때
이 문구가 나왔다.

이런식으로 계속 들어가야 정답이 나오는데
손으로는 힘들겠다.. 라는 생각이 들었다.

새로운 방법이 필요했고
파이썬에서 제공하는 url 관련 기능을 이용하기로 했다.




(파이썬 문서 참조)



여기 에 있는 것들 중에 urllib.request를 사용할 것이다.

먼저 url 내용을 가져오는 작업을 (실험? 을 통해) 하였다.




(문구가 나오는 화면)



내용을 가져오는 것은 read() 인것 같다.
이 내용을 보니 byte 형식이길래
decode를 해야겠다고 생각이 들었고

decode를 하였다.



(decode 화면)



decode 한 순간
내용이 사라졌다..
이 문제로 굉장히 난감하고 힘든 나날들을 보냈다.

데이터 내용을 접근만 하면 사라져서..

그리고 해결책을 찾아냈다.
urlopen으로 바로 여는게 아니라 그렇게 하면 안됬다.
request.Request로 얻어온 내용으로 open을 하고 그 내용을 read로 읽어 들인 후
decode를 하면 내용을 뽑아 올 수 있었다.

문서를 찾은것이라기보다 이것저것 노가다의 시도 끝에...



(24번째가 숫자이다.)



(뒤에 입력해야할 값을 뽑아냈다.)



이제 뒤에 입력할 내용까지 뽑아내는데 성공했다.

이제 이 값을 url주소에 입력하면서 반복적인 작업을 해줘야한다.

while 문으로 코드의 길이가 없으면 중지되게 계속 반복문을 돌렸다.



(처음 시도)



(결과화면)



아.. 3번째는 팔아프다는 어쩌구 문구 때문에 24번째가 아니었다.

고민없이 뒤에 94485를 수동으로 입력 후 다시 진행



(다른 문구)



2를 나누어서 다시 계속 진행하라고 했다.

음.. 16044를 2 나누어서 8022로 다시 진행




(8022 다시 진행)



(이번엔 또 다른...)



뭔가 착오가 있다고 나왔다.

일단 지금까지 규칙대로 nothing 뒤에 있는 저 숫자
63579를 입력했다.



(63579 입력)



(??! 정답?)



마지막에
peak.html이 나왔다.

내가 보던 정답 유형과 비슷해서 정답이라는게 느껴졌다.



(정답 입력)



(정답!)



정답이다.! :)

뒷걸음치다 소잡은 느낌이긴 하지만..

url 파이썬을 공부하게 된.. 계기가 되었다.

4번 해결..!



'WarGame > Python Challenge' 카테고리의 다른 글

Python Challenge - 5  (0) 2017.01.18
Python Challenge - 3번  (0) 2017.01.02
Python Challenge - 2  (0) 2017.01.01
Python Challenge - 1  (0) 2017.01.01
3번문제는 조금 어려웠다 

문제 화면이다.





(3번 문제 화면)



아래 글귀를 보니 작은 글자 하나가 큰 글자 3개에 양쪽으로 낑겨있다라고 적혀있다.

내 생각엔 소문자 하나에 대문자 3개가 양옆으로 있는 그런 소문자들을 조합하면 답이 나올거 같다.





(소스 코드로)



지체없이
늘 그랫듯이

페이지 소스보기 클릭!





(문자덩어리들)




여기서 우리가 원하는 글자들을 캐야한다..!

우선 이 글들을 복사해서 텍스트 파일로 만들었다.
2번문제에서 배운 교훈을 이용해 파일을 입력으로 받을 생각이다.

우선 내 생각은 이랬다.
유니코드로 소문자는 97부터 122까지였고
대문자는 65부터 90까지다.
즉 ord로 숫자를 판별해서

앞에 세개가 대문자고 가운데 소문자 그리고 뒤 세개가 대문자인지 판별하는 식을 입력했다.

이 조건에 맞으면 리스트에 추가하고 출력! (간단하군!)





(의심없이 코딩)





(실행 결과)



???...
...
..??
이게 답이라고?? 뭔가 잘못됬다는 생각이 들었다.
이렇게 많을리가..
인덱스를 조사해서 어디서 저 소문자들이 출력됬는지 확인했다.





(예외 글자)



확인해보니,
대문자가 연속으로 4개인 경우도 출력하고 5개 등등 앞뒤로
예외상황이 많았다..



(3개 뿐 아니라 더 앞 더 뒤도 한번 더 체크)



검사 글자로부터 앞뒤 3개가 아니라 4개 검사로 늘렸다.




(실패)



이것도 말도 안되고 단어도 아니고 이상하다.

나는 지금까지 해왔던것들을 그대로 유지하면서 진행하려고 노력했으나
난관에 부딪혔다.

한참을 고민해봤지만 새로운 방식으로 해야했다.
전에 암호공부하면서 같이 파이썬을 다룬적이 있는데 그 때 정규식으로 패턴 검색하던 것이 생각났다.

급히
정규식 검색과 파이썬 API 문서 참조를 통해
정규식을 공부하고

다시 이 문제에 접근했다.





(정규식 이용 코드)






(결과)



와..! 
한번에 됬다.! 저기에서 세개로 싸인 소문자들만 읽으면 된다!

하지만 그러기에 조금 찝찝하고 정규식을 더 써볼겸 해서 코드를 추가해보았다.





(한번에 결과를 출력하는 코드)





(실행 결과)



답은 linkedlist !
(이제야 뭔가 답 같다.)






(해왔던 대로 linkedlist 입력)



(??)




처음에 뭔가 싶었지만 뒤에 html을 php로 바꾸어주었다.






(정답~)



3번 문제에서 탈출하였다.!

하던 방식이 안되면 다른 방법으로 접근을 해야된다라는게 
오늘의 교훈 3번의 교훈이다.!

:)

'WarGame > Python Challenge' 카테고리의 다른 글

Python Challenge - 5  (0) 2017.01.18
Python Challenge - 4번  (0) 2017.01.09
Python Challenge - 2  (0) 2017.01.01
Python Challenge - 1  (0) 2017.01.01

파이썬 챌린지 2번째 문제화면이다.


(2번째 문제)




글자를 맞춰보세요...
책에 있을 수도 있고, 페이지소스에 있을 수도 있고~

음... 저 책 이미지를 데이터처리해서 알아내라는건지 싶었지만 모르기도하고.. 어려우니까
다음..!

페이지소스에 있을 수도 있다라.!




(페이지소스)




페이지 소스에 들어가봤다.





(페이지 소스)


역시나!!
예상은 했지만! 주석처리로 문제가 나와있다.

위에 이렇게 써있다.
아래 데이터중에 가장 드문(rare) 문자들을 확인해보세요.
아.! 그러면 이 문자열들을 하나씩 검사해서
횟수를 카운트하면 되겠군!

두 개의 리스트를 써서 문자가 들어오면 한 리스트에 추가 할 것이다.
추가할 때 카운트 리스트에도 값을 1이라고 해서 추가할 것이다.

그 다음에 중복되는 문자가 오면 그 리스트에서 그 문자가 들어있는 인덱스를 찾아서
카운트 인덱스에 있는 숫자를 수정해줄것이다.
-> data 전체에서 그 문자를 카운트할 수 있는 메서드로
(사실 이 메서드는 인덱스를 찾는 메서드를 찾기위해 API를 보다가 얻어 걸린거다.)
(원래 하나씩 증가시켜주려고 했다.)





(코드)



실행 시켜서 위 소스코드에 있는 마구잡이 데이터를 복사해서 입력해주면 끝이다!





(입력하는 모습)




?? 불길한 빨간글자는.. 

일단 입력해보자.




(입력 결과)



아....
빨간색 글씨는 주석처리 된거구나... (이때까지 몰랐다.)
왠지
저 카운트된 숫자들도 보니 말도 안되는 숫자고..(너무작다.)

입력이 주석처리되다니..ㅜ
(보안책에서 SQL 인젝션이라고 개념을 본적있는데, 그게 떠올랐다.)

여기서 한참 방황했다. 저 #들을 어떻게 처리해 주어야할까...
그 때 든 생각이 파일로 통째로 해서 입력하는게 어떨까 싶었다.

메모장을 키고 데이터들을 복사해서 붙여넣었다.





(메모장 파일 새성)


이 파일을 받아서 문자열로 옮긴 후 내가 생각했던대로
코드를 돌려볼 생각이다.




(코드 수정)




(결과)


오.....!!!!!!

( 공백도 문자다.)

적은 문자들을 보니 1이다. 이건 분명 적다고 할 수 있는 값이다.
equality 
가 정답이다.! :)

문제 1에서 했던것 처럼 url의 값을 변경해주었다.




(통과된 모습)




문제 2도.! 해결하였다.

: ) (뿌듯)

'WarGame > Python Challenge' 카테고리의 다른 글

Python Challenge - 5  (0) 2017.01.18
Python Challenge - 4번  (0) 2017.01.09
Python Challenge - 3번  (0) 2017.01.02
Python Challenge - 1  (0) 2017.01.01

재밌는 퀴즈(?) 같은 사이트다.
Python Challenge

0번 문제는 너무 쉬워서 패스하겠다.

1번부터 보면 아래 화면이 나온다.




K -> M
O -> Q
E -> G

알파벳을 쭉 써보고 위 세개의 규칙을 넣어보면
두칸씩 땡긴것을 확인 할 수 있다.

즉, 나머지 알파벳도 두칸씩 땡겨서 아래 분홍색 글씨를 해석하면 되는 것이다.

우선 이름이 Python Challenge인것 만큼 파이썬으로 코드를 작성해 보았다.

먼저 위 분홍색 글들은 소문자로 a 부터 z까지 범위를 보니 97부터 122였다.
유니코드 기준으로 (파이써는 유니코드이기 때문에)

2칸씩 땡겨서 변환해야하므로 유니코드 숫자에 2를 더했다.
2씩 더한 값이 122보다 크다면 26을 빼준 값, 즉 다시 a로 돌아가는 값이다.




(암호문 해석 코드)




(실행 결과)



실행 결과를 보면 url에 대하여 이 암호코드를 적용해봐라 라는 뜻이다.




(url)



url의 모습이다 여기서 map 밖에 건드릴것이 없어서

map을 코드에 대입시켜보니 ocr이라는 값이 나왔고





(답 입력)




map을 ocr로 바꾸어 주었다.





(다음 문제로 넘어가는 화면)



정답이다~ :)

'WarGame > Python Challenge' 카테고리의 다른 글

Python Challenge - 5  (0) 2017.01.18
Python Challenge - 4번  (0) 2017.01.09
Python Challenge - 3번  (0) 2017.01.02
Python Challenge - 2  (0) 2017.01.01

함수를 정의하고 내용을 입력하지 않으면 에러가 난다.

돌아가는지 확인해보고싶으면 pass를 쓰면 넘어간다.


(함수 내용이 없는 경우 에러)


(pass를 적으면 에러없이 넘어간다.)


* 파이썬에서의 함수
1. 입력된 문자열이 실수로 이루어져있는지를 판단하는 함수

def isfloat( data ):

입력 : 임의의 문자열
출력 : True of False
           - 실수로 변경가능한 문자열이라면 True
           - 그렇지 않으면 False

2. 입력된 문자열이 음수로 이루어져있는지를 판단하는 함수

def isneg( data ):

입력 : 임의의 문자열
출력 : True of False
         - 음수로 변경가능한 문자열이라면 True
         - 그렇지 않으면 False


(함수 코드)


(결과)


*라이브러리 : 이미 만들어져있는 함수이다.

* 파이썬 모듈
 - 파이썬 코드로 이루어진 파이썬 파일
 - 사용하고싶은 함수들을 하나의 파일에 만들어 두는 것이다.
   그 후 사용하고 싶으면 import한다.


 - 어디서나 import 하고 싶으면
 -> 파이썬3의 라이브러리 파일들의 경로가 따로 있다. 이 곳에 넣어둬야한다.


(내가 만든 모듈을 라이브러리에 추가한 모습)


import 방법
import 파일
from 파일 import *      -> 이렇게 적으면 모듈 이름을 안적어도 된다.
from 파일 import 특정함수    -> 특정 함수만 import할 수 있다.

왠만하면 import 파일   형식으로 하는게 좋다.
왜냐하면 두세번째로 하다가 함수 이름이 겹칠 가능성이 있을 수 있어서 그렇다.
두세번째는 편하기는 하지만 충동할 수 있다는걸 주의하고 해야한다.
보통 모듈파일에는 실행코드는 적지 않는다.
실행코드가 있다면 import 되는 순간 파일이 실행된다.

만약 모듈을 만들고
이 모듈이 잘 돌아가는지 테스트코드를 넣어볼 수 있다.

만약 실행코드를 안삭제하고 import하고 실행시키면
import 될때 모듈파일의 테스트코드가 실행된다.
만약 지우지않고 쓰고싶다면
if __name_- == "__main__":
    main()
이코드를 넣으면 이 해당파일이 단독으로 실행되면 실행되지만
import되는 경우에는 코드가 실행되지 않는다.
-> 단독으로 실행하는 경우 실행코드들이 실행되고
   import되는 경우에는 실행되지 않는다.



(모듈 파일에 테스트코드를 추가한 모습)



(모듈을 import 한 순간 테스트코드가 실행되는 모습)



(__name__ 을 모듈에 추가해서 실행시 테스트코드가 실행되지 않는 모습)



* 프로그램 작성

1) 안전한 제곱근을 구하는 함수

math 모듈에 sqrt() 함수로 제곱근을 구할 수 있다.
 - 숫자가 아니거나 음수가 입력되면 에러가된다.
 
알고리즘
1. 사용자로부터 값을 입력받는다.
 
 - 입력값의 형태는 실수여야 한다.

2. safe_sqrt 함수 인자로 입력값 전달
 3. 입력된 값이 허용범위의 값인지 판별 허용범위라면 실수로 변환 후에
    sqrt 함수를 이용해서 제곱근을 구한 후 출력
 4. 허용된 입력값의 범위가 아니라면 다시 입력받을 수 있도록 한다. 
 5. 3번으로 돌아간다.


(만들어본 코드(좌), 실행화면(우))


2)  대출 상환금 계산 프로그램

- 입력 :
 대출 원금
 대출 기간
 대출 이율

- 출력 :
 연상환금
 월상환금
 총상환금

- 연상환금 계산 공식

                   (1 + 대출 이율)^대출 기간 + 대출 원금 + 대출 이율
연상환금 = ---------------------------------------------------------------
                                  (1 + 대출 이율)^대출기간 - 1

1) 대출 원금과 대출 기간, 대출 이율을 각각 입력 받는다.
 - 대출원금과 대출 기간은 자연수의 입력만 허용하며 대출 이율은 실수 입력만 허용할 수 있도록 한다.
2) 입력값에 맞춰서 연상환금을 계산한다.
3) 연상환금과 월상환금, 총상환금을 출력
4) 프로그램을 계속 진행할 것인지를 입력받는다.
 a-1) "yes"를 입력한 경우 1)번으로 돌아가서
       대출 원금과 대출 기간, 대출 이율을 새로 입력
 b-2) no 를 입력한 경우 프로그램 종료
 4-3) yes no 이외의 값이면 새로 입력을 받는다.
* 소수점이하를 버리고 싶으면 int 형으로 형변환 하면한다.
* 반올림 하고 싶으면 round 함수를 이용하여 형변환한다.



(소수점 그대로 출력)



(소수점까지 출력되는 모습)




(작성해본 코드, 결과를 int형으로 형변환 한 모습 : 소수점 자리 버리는 모습)




(소수점 자리 버림 모습)












오늘의 주제는

* 실수는 어떻게 구분할까?
 1.4, 10.2, .... 
* 음수는 어떻게 구분할까?
 -2, -4

에서 부터 시작된다.

성적처리프로그램을 만들 던 중
입력으로 들어오는 값 중
음수, 실수(소수점자리수)를 어떻게 구분할까? 라는 문제제기가 되었다.

먼저 음수와 실수의 특징들을보면

음수일 경우
 
 -10, -2, ......  ( 맨 앞에 대쉬(-)로 시작하고 이어서 숫자가 나오는 경우 )
  
실수일 경우
 23.2    ( 숫자나오고 .(점) 문자 후 바로 숫자 )

이러한 문자열들을 구분할 수 없을까?

먼저, str.isdigit() 함수에서는 정수인지만 판별 할 수 있다.

먼저 자료 타입을 더 공부해본다.

파이썬에서 제공하는 자료 타입
 - list, tuple, set, dictionary

리스트
 - 데이터들의 순서열(sequence)
 - 리스트내의 원소들의 값을 변경 할 수 있다. *
 - 인덱스 : 0부터 시작한다.
-  표현 : [ ] 이 기호 안에 입력한다.


(리스트 예시, 값을 변경하는 모습)


튜플
 - 리스트와 거의 동일 (차이점 : 투플내 원소들을 변경할 수 없다.)
 - 문자열은 튜플이다. (문자열은 변경되지 않는다.) *
 - () 소괄호로 표시한다.
 - 문자열도 튜플이기 때문에 변경할 수 없다.


(튜플을 정의하고 출력하는 모습, 값을 변경하는 경우 에러가 발생한다.)


* 리스트나 튜플의 특징을 이용하면 음수나 실수를 구분 할 수 있다.

이러한 특징 중 내장함수들을 잘 이용해야한다.
https://docs.python.org/3/library/index.html


위의 홈페이지에 들어가보면
파이썬에 관련된 문서들을 찾아볼 수 있다.


(파이썬 공식홈페이지 참조)


순서열에서 사용가능한 연산자들
순서열 -> 문자열, 리스트, 튜플 등등
x in s  -> 순서열 검색  s 문자열 내에 x순서열이 존재하는지 체크하는 연산자
s * n   -> s 순서열을 n번 반복 (n은 숫자)
s[i]    -> s 순서열 내 i번째 원소 가리키는 표시.

s[i:j]   -> i번째에서 j번까지 잘라냄  j번을 포함하지 않는다. j번전까지 해서 잘라짐.
len(s)   -> s의 길이를 표현 
s.index   -> 순서열이 시작하는 위치
s.count   -> 얼마나 있는지 카운팅함   (안되는 경우도 있다.)


(연산자 사용 예시)


- 슬라이스 가능 -> 슬라이스는 원 자료를 변형시키는 것이 아니라
                              잘라진 새로운 자료을 만드는 것이다.

* sample = [1, 2, 3, 4, 5]
sample은 위 리스트의 주소를 가지고 있는 참조 변수이다.
그런데 슬라이스는 새로운 자료를 만드는 것이므로
슬라이스해서 입력하면 기존 자료가 변하지 않는다.  -> 그래서 튜플도 슬라이스가능한 것이다.


(참조변수로 사용되는 리스트 변수이름)


* partition을 이용해 실수를 체크해보겠다.
  -> 파티션은 기준으로 부터 3개의 튜플로 반환한다.


(str.partition(x) 사용 예시)


* 동시지정문 이용
(n, x, m) = '1.4'.partition('.')


(동시지정문으로 .partition 된 결과를 입력받는 모습)


* partition 은 문자열에서만 제공하는 메소드이다.
   다른 리스트나 이런데서 사용할 수 없다.

모듈 -> 함수를 모아둔 파일을 모듈이라고 한다.
* 파이썬에서의 함수 작성
입력에 대해 출력이 없으면 프로시져라고 부르고
            있으면 함수라고 부른다.

1. 함수(function)
 - 출력을 나타내면 함수라고한다.

2. 프로시져(procedure)
 - 입력에 대해 출력이 없으면 프로시져라고한다.

3. 메서드(method)
 - class 내에 선언된 함수를 정의하면 메서드라고 한다.

-> 결국 세개가 다 같은 맥락이다. 만드는 방법도 같다.

파이썬에서의 함수 정의
ex)
 f(x) = 2x + 10      정의
 이 함수를 파이썬에서 그대로 표현한다면
 def f(x):
  return 2* x + 10


(함수 표현)


여러개의 값을 동시에 return도 가능하다. -> 파이썬에서는 동시지정이 가능하기 때문이다.


(동시지정문으로 하나의 함수에서 여러값을 return받는 모습)


위의 기능들을가지고
isneg()  -> 음수판별
isfloat()  -> 실수판별
함수를 만들 수 있을 것이다.

다음시간에 만들어 보겠다 :)









+ Recent posts