Professional Documents
Culture Documents
• IDLE을 실행한다.
* 파이썬 예약어
# 삼중 따옴표로 특정 영역 주석 처리 예시
"""a = 1
b=5
print(a+b)"""
a=2
b=6
print(a+b)
006 자료형 개념 배우기
1. int _data = 1 # 정수 선언 1. 수치형 자료 (1~3번째 줄)
2. float _data = 3.14 # 실수 선언
• 정수형 상수: -1, 0, 1 과 같은 경우
3. complex_data = 1+5j # 복소수 선언 • 실수형 상수: -0.7, 2.1 등과 같이 분수로 표현할 수 있는 유리수
와 π(원주율), 2 와 같은 무리수를 포함하는 실수
4. str _data1 = 'I love Python' # 문자열 선언 (영문) • 복소수형 상수: 실수부 + 허수부로 되어 있는 복소수
5. str _data2 = "반갑습니다." # 문자열 선언 (한글)
각 변수에 정수형 상수 1, 실수형 상수 3.14, 복소수형 상수 1+5j를 대입한
6. list _data = [1, 2, 3] # 리스트 선언 예. 파이썬에서 허수부는 j로 표현함
7. tuple _data = (1, 2, 3) # 튜플 선언
2. 문자열 자료 (4~5번째 줄)
8. dict _data = {0:'False', 1:'True'} # 사전 선언
문자열 자료의 선언 방법으로는 4라인처럼 ‘ ’로 둘러싸인 문자열을 변수
에 대입하는 방법과, 5라인과 같이 “ ”로 둘러싸인 문자열을 변수에 대입
하는 방법이 있음
5. 사전 자료 (8번째 줄)
200
I love Python
['a', 'b', 'c']
a
{'b': 98, 'a': 97}
97
008 들여쓰기 개념 배우기
1. listdata = ['a', 'b', 'c'] 파이썬은 들여쓰기(indentation)로 괄호 { }를 대신함.
5. else:
6. print('a가 listdata에 존재하지 않습니다.') 실행 코드가 한 라인일 경우
if 'a' in listdata: print('a가 listdata에 있습니다.')
1~2번째 줄 : 변수 x, y에 각각 1, 2를 대입
• 문자열
• 리스트나 튜플
• 사전
• range( )
• 그 외 반복 가능한 객체
012 for문 개념 배우기 ② (for~continue~break)
1. scope = [1, 2, 3, 4, 5] for 반복문 안에서 continue를 만나면 이후 코드는 수행하지 않고 다
2. for x in scope: 음 반복문을 수행하게 되며, break를 만나면 for 반복문을 탈출하게
3. print(x) 됨.
4. if x < 3:
for 변수 in 범위:
5. continue …
continue # 다음 반복문 수행
6. else: …
break # for 반복문 탈출
7. break
scope = [1, 2, 3, 4, 5]
for x in scope:
print(x)
if x >= 3:
break
013 for문 개념 배우기 ③ (for~else)
1. scope = [1, 2, 3,] for 반복문이 break에 의해 중단됨이 없이 정상적으로 모두 실행되
2. for x in scope: 어야만 특정 코드를 실행하게 할 경우 for ~ else를 사용함.
3. print(x)
for 변수 in 범위:
4. break 반복 실행 코드
else:
5. else: for 구문이 모두 실행되었을 때 실행할 코드
6. print('Perfect')
else:로의 진입은 for 반복문에서 break 등에 의해 중간에 중단됨이
없이 정상적으로 실행이 다 되었을 경우
1
2
3
Perfect
014 while문 개념 배우기 (while~continue~break)
1. x=0 기본 while 구문
2. while x < 10:
while 조건:
3. x = x+1 반복 실행 코드
continue # while 구문 처음으로 이동하여 반복문 계속
4. if x < 3: …
break # while 구문을 탈출함
5. continue
6. print(x)
7. if x > 7: 1~2번째 줄 : x의 초기값을 0으로 설정하고, 변수 x의 값이 10보다 작
8. break 으면 while 반복문을 계속 수행함. x의 초기값이 0이므로 while의 조
건이 참이 되며 while 구문으로 진입하게 됨.
5. else:
6. val = 'I love Python'
Val = None으로 선언한 경우, val은 아무런 값도 가지지 않는 변수이
므로 이 변수로는 아무것도 할 수 없음.
변수 c2에 대입 → c2의 값은 2 + 3j
결과
1.0
7.0
(2+3j)
019 대입 연산자 이해하기(=)
1. a=1 =(등호) : 변수에 값을 대입하는데 사용되는 기호
2. b=2 파이썬을 포함한 컴퓨터 프로그래밍 언어에서 =는
3. ret = a+b
= 왼쪽의 변수에 = 오른쪽의 값을 대입한다는 의미
4. print('a와 b를 더한 값은 ', end='')
5. print(ret, end='')
1~2번째 줄 : 변수 a와 b에 각각 정수형 상수 1과 2를 대입
6. print('입니다.')
3번째 줄 : 변수 ret에 a와 b를 더한 값을 대입.
변수 a와 b의 값이 각각 1과 2이므로 ret은 3
결과
a와 b를 더한 값은 3입니다.
020 사칙 연산자 이해하기
1. a=2 1~2번째 줄 : 변수 a와 b에 각각 정수형 상수 2와 4를 대입
2. b=4 3번째 줄 : 정수형 자료 a와 b를 더한 값을 변수 ret1에 대입
3. ret1 = a+b # ret1 = 2+4 = 6
4번째 줄 : 정수형 자료 a에서 b를 뺀 값을 변수 ret2에 대입
4. ret2 = a–b # ret2 = 2–4 = -2
5번째 줄 : 정수형 자료 a와 b를 곱한 값을 변수 ret3에 대입
5. ret3 = a*b # ret3 = 2*4 = 8
6번째 줄 : 정수형 자료 a에서 b를 나눈 값을 변수 ret4에 대입
6. ret4 = a/b # ret4 = 2/4 = 0.5
7. ret5 = a**b # ret5 = 2**4 = 16 파이썬 3은 나눗셈의 경우 실수형으로 결과를 리턴
두 값을 곱함
3. a -= 5 # a = a-5, a의 값은 -4
4. a *= 2 # a = a*2, a의 값은 -8
어떤변수와어떤값을사칙연산한결과를다시동일한변수에대입할때
5. a /= 4 # a = a/4, a의 값은 -2.0
a += 1
a에 1을 더한 결과를 다시 a에 대입.
a에 5를 뺀 결과를 다시 a에 대입하고,
a에 2를 곱한 값을 a에 대입
a의 최종값은 -2.0
022 True와 False 이해하기
1. a = True 파이썬에서 참과 거짓을 나타내는 상수 :
2. b = False True와 False True는 1, False는 0
3. print(a == 1) # True가 출력됨
4. print(b != 0) # False가 출력됨
1~2번째 줄 : a에 True, b에 False를 대입
while True:
(무한 반복 실행 코드)
…
if 조건 == True: # 조건이 만족하면 무한루프를 탈출함
break
023 관계 연산자 이해하기
1. x = 1; y = 2 파이썬에서 사용 가능한 관계 연산자
2. str1 = 'abc'; str2 = 'python' A == B A와 B가 같으면 참
3. print(x == y) # False가 출력됨 A != B A와 B가 다르면 참
A<B A가 B보다 작으면 참
4. print(x != y) # True가 출력됨
A <= B A가 B보다 작거나 같으면 참
5. print(str1 == str2) # False가 출력됨
A>B A가 B보다 크면 참
6. print(str2 == 'python') # True가 출력됨 A >= B A가 B보다 크거나 같으면 참
7. print(str1 < str2) # True가 출력됨
1~2번째 줄 : x, y에 각각 정수형 상수1과 2를 대입하고,
A and B A와 B가 모두 참이면 참
A or B A, B 중 하나 이상이 참이면 참
not A A 논리값의 반대
025 비트 연산자 이해하기
1비트 : 0또는 1로만 표현될 수 있는 데이터 단위. 1비트는 두 개의 값만 표시 가능하므로 1비트로 나타낼 수 있는 경우의 수는 두 가지
Ex. 문자 ‘a’와 문자 ‘b’의 비트간 연산 : ‘a’의 각 비트들과 ‘b’의 각 비트들을 자릿수에 맞게 비트별로 연산을 독립적으로 수행한다는 의미
1바이트를 2진수로 표현하면 8자리 숫자가 되기 때문에 편의상 1바이트를 표현할 때 두 자리 16진수로 표현함.
상위 4비트 : 1바이트를 이루는 8비트에서 왼쪽 4비트 / 하위 4비트 : 오른쪽 4비트 => 각각 16진수로 대응시켜 나타냄.
025 비트 연산자 이해하기
1. bit1 = 0x61 1~2번째 줄 : bit1과 bit2에 각각 16진수 61, 62를 대입
2. bit2 = 0x62 3번째 줄 : 0110 0001 & 0110 0010을 연산하면 0110 0000 (16진
3. print(hex(bit1 & bit2)) # 0x60이 출력됨 수로 60)
4. print(hex(bit1 | bit2)) # 0x63이 출력됨 4번째 줄 : 0110 0001 | 0110 0010을 연산하면 0110 0011 (16진
수로 63)
5. print(hex(bit1 ^ bit2)) # 0x3 이 출력됨
5번째 줄 : 0110 0001 ^ 0110 0010을 연산하면 0000 0011 (16진
6. print(hex(bit1 >> 1)) # 0x30이 출력됨
수로 3, 배타적 논리합 XOR은 두 개의 비트값이 다른 경우에는 1, 같
7. print(hex(bit1 << 2)) # 0x184가 출력됨 은 경우에는 0)
1번째 줄 : strdata는 알파벳 ‘a’, ‘b’, ‘c’, ‘d’, ‘e’가 순서대로 나열되어
있는 문자열을 담고 있는 변수
시퀀스 자료형의 특성
ret4에 대입
033 문자열 이해하기
1. strdata1 = '나는 파이썬 프로그래머다' # 문자열 선언 방법 1 문자열 : 문자나 기호가 순서로 나열되어 있는 시퀀스 자료
2. strdata2 = "You are a programmer" # 문자열 선언 방법 2
3. strdata3 = """I love # 문자열 선언 방법 3
1번째 줄 : ' '를 이용해 '나는 파이썬 프로그래머다' 문자열 정의
4. python. You love
2번째 줄 : " "를 이용해 "You are a programmer"라는 문자열 정의
5. python too!
4~6번째 줄 : """ """를 이용해 문자열 정의.
6. """
7. strdata4 = "My son's name is John" # " " 안에서 ' 사용하기 7번째 줄 : 문자열에 '이 포함되어 있으면 " "를 이용해 선언
8. strdata5 = '문자열 "abc"의 길이는 3입니다.' # ' ' 안에서 " 사용 8번째 줄 : 문자열에 "이 포함되어 있으면 ' '를 이용해 선언
하기
034 문자열 포맷팅 이해하기
1. txt1 = '자바'; txt2 = '파이썬' 3번째 줄 : 두 개의 포맷 문자열 %s 부분에 실제적인 값을 대입하려
2. num1 = 5; num2 = 10 면 %(첫 번째 %s에 대입할 문자열, 두 번째 %에 대입할
3. print('나는 %s보다 %s에 더 익숙합니다.' %(txt1, txt2)) 문자열)을 뒤에 추가
4. print('%s은 %s보다 %d배 더 쉽습니다.' %(txt2, txt1, num1))
4번째 줄 : 포맷 문자열 %s %s %d에 각각 txt2, txt1, num1이 대입
5. print('%d + %d = %d' %(num1, num2, num1+num2))
6. print('작년 세계 경제 성장률은 전년에 비해 %d%% 포인트 증가 5번째 줄 : 포맷 문자열 %d %d %d에 각각 num1, num2,
했다.' %num1)
num1+num2가 대입
자주 사용하는 포맷 문자열
%s 문자열에 대응됨
%c 문자나 기호 한 개에 대응됨
%f 실수에 대응됨
%d 정수에 대응됨
자주 사용되는 이스케이프 문자
\n 문자열에 대응됨
\t 문자나 기호 한 개에 대응됨
\\ 정수에 대응됨
5. print(list1) # [6, 2, 3, 4, 5]가 출력됨 리스트 ['a', 'b', 'c'] 5개의 요소를 가지는 리스트
6. def myfunc( ): 4~5번째 줄 : list1[0]에 6을 대입하고 list1을 출력하면 list1의
7. print('안녕하세요')
첫 번째 요소가 6으로 변경되어 [6, 2, 3, 4, 5]가 표시됨
8. list4 = [1, 2, myfunc]
6~9번째 줄 : myfunc( )라는 함수를 정의.
9. list4[2]( ) # '안녕하세요' 가 출력됨
list4는 정수 1, 2, 함수 myfunc를 요소로 가지는 리스트
037 튜플 이해하기(( ))
1. tuple1 = (1, 2, 3, 4, 5) 1~3번째 줄 : 튜플은 리스트와 마찬가지로 임의의 객체를 요소로
2. tuple2 = ('a', 'b', 'c') 가질 수 있는 시퀀스 자료형
3. tuple3 = (1, 'a', 'abc', [1, 2, 3, 4, 5], ['a', 'b', 'c'])
4번째 줄 : tuple1[0]의 값을 6으로 대입하여 변경하고자 하면
4. tuple1[0] = 6
다음과 같은 오류가 발생(튜플 요소 값 변경 불가)
5.
6. def myfunc( ): TypeError: 'tuple' object does not support item assignment
7. print('안녕하세요')
8. 9~10번째 줄 : 오류가 발생한 4라인을 삭제하거나 주석 처리하고
3. dict1['d'] = 4
4. print(dict1) # {'a':1, 'b':2', 'c':3, 'd':4}가 출력되
나 순서가 틀릴 수 있음 1번째 줄 : 요소가 'a':1, 'b':2, 'c':3인 사전 dict1을 선언
사용했던 len( )을 사용
039 함수이해하기(def)
함수 :특정 목적을 가진 코드의 집합이며 독립적으로 호출될 수 있는 것
def 함수이름( ):
코드들 함수이름( )
return (또는 생략)
039 함수 이해하기(def)
1. def add_number(n1, n2): 1~3번째 줄 : 인자 n1, n2를 더한 값을 리턴
2. ret = n1+n2 5~6번째 줄 : 인자 t1, t2를 더한 값을 출력하며, 리턴값은 없음
3. return ret
8~9번째 줄 : add_number 함수는 인자로 입력된 10과 15를 더하고
4.
이 값을 리턴하며, 리턴값을 ans로 둠
5. def add_txt(t1, t2):
10~12번째 줄 : 인자 자리에 text1, text2를 대입
6. print(t1+t2)
7.
add_txt 함수는 이 두 문자열을 연결한 결과를 출력
6.
func2는 미정 키워드 인자 kwargs를 출력하는 함수
7. def func1(*args):
8. print(args) 13~14번째 줄 : 3, 5, 1, 5와 같이 네 개의 값을 인자로 함수에 전달하
9. 면 args에 이 값들을 (3, 5, 1, 5)와 같이 튜플로 담아 함수 내부에서
10. def func2(width, height, **kwargs):
처리
11. print(kwargs)
12. 15~16번째 줄 : func2에 width, height외에 키워드 인자로
13. func1( ) # 빈 튜플 ( )이 출력됨 depth=50, color='blue' 를 추가하여 호출하면 **kwargs는
14. func1(3, 5, 1, 5) # (3, 5, 1, 5)가 출력됨 depth=50, color='blue'를 전달받고, func2 함수 내부에서 kwargs
15. func2(10, 20) # 빈 사전 { }이 출력됨 는 {'depth':50, 'color':'blue'}와 같은 사전 자료가 됨
16. func2(10, 20, depth=50, color='blue') # {'depth':50,
'color':'blue'} 이 출력됨
041 지역변수와 전역변수 이해하기(global)
1. param = 10
지역변수 : 함수 내에서만 유효한 변수, 함수 내부에서 선언
2. strdata = '전역변수'
3.
전역변수 : 코드 전반에 걸쳐 유효한 변수, 함수 바깥에서 선언
4. def func1( ):
5. strdata = '지역변수'
6. print(strdata) 1~2번째 줄 : param과 strdata를 각각 10, ‘전역변수’로 선언
7.
4~6번째 줄 : func1( ) 내에서 strdata에 ‘지역변수’ 문자열을 대입
8. def func2(param):
9. param = 1 8~9번째 줄 : 인자이름 param은 전역변수와 이름이 같지만
10.
func2( ) 내에서만 유효한 지역변수로 취급, 처리
11. def func3( ):
12. global param 11~13번째 줄 : func3( ) 내부에서 global param으로 전역변수로
13. param = 50 선언된 param을 사용할 것임을 명시
14.
15. func1( ) # '지역변수'가 출력됨 15~16번째 줄 : func1( )을 호출하면 func1( ) 내에서 선언된
16. print(strdata) # '전역변수'가 출력됨 지역변수 strdata의 값인 ‘지역변수’를 출력
17. print(param) # 10이 출력됨
18. func2(param) 17~19번째 줄 : func2( )의 인자로 전역변수 param을 대입하여
19. print(param) # 10이 출력됨 호출하면 func2( )는 이를 자신의 인자인 param에 대입
20. func3( )
21. print(param) # 50이 출력됨 20~21번째 줄 : 전역변수 param의 값을 50으로 변경하는 함수
042 함수 리턴값 이해하기(return)
1. def reverse(x, y, z): 1~2번째 줄 : reverse( )는 3개의 인자를 가지고 있으며,
2. return z, y, x 이 함수는 인자의 순서를 바꾸어 리턴
3.
4~5번째 줄 : 숫자 1, 2, 3을 reverse( )의 인자로 전달하여 호출하고
4. ret = reverse(1, 2, 3)
그 결과값을 ret으로 둠
5. print(ret) # (3, 2, 1)이 출력됨
7~8번째 줄 : r1, r2, r3에 각각 'c', 'b', 'a'가 리턴값으로 대입됨
6.
우리 코드로 임포트함
reverse( )를 호출
045 파이썬 모듈 임포트 이해하기 ① (import)
1. import time # 파이썬 내장 모듈인 time을 임포트함 모듈을 임포트하는 방법
2. import mylib # 내가 작성한 mylib 모듈을 임포트함 import 모듈이름
3. import mypackage.mylib # mypackage에 있는 mylib 모듈을 Import 패키지이름.모듈이름
임포트함
4. 존재하지 않는 모듈을 임포트했을 경우
5. time.sleep(1) # time 모듈의 sleep 함수를 이용해 1초간 정지 ImportError: No module named '모듈이름'
3.
mypackage.mylib.reverse( )와 동일하게 취급
048 파일 열고 닫기(open, close)
1. f1 = open('text.txt', 'r') open(파일이름, 모드)
r 또는 rt 텍스트 모드로 읽기
w 또는 wt 텍스트 모드로 쓰기
a 또는 at 텍스트 모드로 파일 마지막에 추가하기
rb 바이너리 모드로 읽기
wb 바이너리 모드로 쓰기
ab 바이너리 모드로 파일 마지막에 추가하기
049 클래스 이해하기(class)
1. class MyClass: class 클래스 이름:
클래스 멤버 정의
2. var = '안녕하세요' 클래스 메소드 정의
3. def sayHello(self):
4. print(self.var)
2번째 줄 : 클래스 멤버는 클래스 메소드 밖에서 정의되는 변수
5.
3~4번째 줄 : 클래스 메소드는 클래스 내에서 정의되는 함수.
6. obj = MyClass( ) # MyClass 인스턴스 객체 생성
7. print(obj.var) # '안녕하세요'가 출력됨 첫 번째 인자가 반드시 self로 시작
8. obj.sayHello( ) # '안녕하세요'가 출력됨 6번째 줄 : MyClass를 인스턴스 객체로 만들기 위해서는 MyClass( )
self.클래스 멤버 이용
050 클래스 멤버와 인스턴스 멤버 이해하기
1. class MyClass: 클래스에서 선언되는 변수는 ‘클래스 멤버’와 ‘인스턴스 멤버’
2. var = '안녕하세요!!' self.var # 클래스 메소드 내에서 var를 참조할 경우
3. def sayHello(self): MyClass.var # 클래스 밖에서 클래스 이름만으로 참조할 경우
obj.var # MyClass의 인스턴스 객체 obj에서 var를 참조할 경우
4. param1 = '안녕'
5. self.param2 = '하이'
2번째 줄 : MyClass 내에서 var라는 이름의 변수를 선언
6. print(param1) # '안녕'이 출력됨
7. print(self.var) # '안녕하세요'가 출력됨 3~7번째 줄 : sayHello( )는 param1의 값과 클래스 멤버인 var의
화면에 메시지를 출력
실행되는 부분
안녕하세요.
예외가 발생했습니다!
무조건 실행하는 코드
058 예외처리 이해하기 ④ (try~except Exception as e)
1. try: 파이썬은 발생 가능한 예외에 대해 exception 객체로 미리 정의해둠
2. print(param) https://docs.python.org/3/library/exceptions.html #bltin-
3. except Exception as e: exceptions
이름으로 접근할 수 있게 해줌
결과
당신이 입력한 값은 <안녕하세요 파이썬>입니다.
061 자료형 확인하기(type)
1. numdata = 57 - 파이썬의 자료형은 하나의 클래스로 취급됨
2. strdata = '파이썬' - 코드를 작성하다가 변수이름만 보고 어떤 자료형인지 확인해야 할
3. listdata = [1, 2, 3]
경우 파이썬 내장함수인 type( )을 활용
4. dictdata = {'a':1, 'b':2}
5.
결과
6. def func( ):
<class 'int'>
7. print('안녕하세요.')
<class 'str'>
8. <class 'list'>
<class 'dict'>
9. print(type(numdata)) <class 'function'>
10. print(type(strdata))
11. print(type(listdata))
12. print(type(dictdata))
13. print(type(func))
062 나눗셈에서 나머지만 구하기(%)
1. a = 11113 나누기 연산
2. 2: b = 23 수학식 파이썬 코드
결과
<11113/23>는 몫이 <483>, 나머지가 <4>입니다.
064 10진수를 16진수로 변환하기(hex)
1. h1 = hex(97) # h1은 문자열 '0x61' 파이썬 내장함수 hex( ) : 인자로 입력된 10진수 정수를 16진수로 변
환해서 문자열로 리턴
2. h2 = hex(98) # h2는 문자열 '0x62'
3. ret1 = h1 +h2 1~2번째 줄 : 파이썬 내장함수 hex( )는 10진수 97과 98을 16진수로
5. o1 = int(onum); o2 = int(ostr, 8) # o2 = int(ostr, 0)로도 가능 그리고 16진수로 된 숫자와 문자열을 선언하고 int( )를 이용해 10진
수로 변환하는 코드
6. h1 = int(hnum); h2 = int(hstr, 16) # h2 = int(hstr, 0)로도 가능
7. print(b1); print(b2) 4~6번째 줄 : int( )의 두 번째 인자로 0을 지정하면 첫 번째 인자의
8. print(o1); print(o2) 문자열 그대로 숫자로 변환하고 10진수로 변환한 결과를 리턴
9. print(h1); print(h2)
7~9번째 줄 : 모든 결과는 240
067 절대값 구하기(abs)
1. abs1 = abs(-3) # 정수의 절대값 파이썬 내장함수 abs( )는 인자로 입력된 값의 절대값을 리턴.
2. abs2 = abs(-5.72) # 실수의 절대값 만약 복소수가 인자로 입력되면 복소수의 크기를 리턴.
3. abs3 = abs(3+4j) # 복소수의 절대값
복소수 a+bi의 크기는 a2+b2
4. print(abs1) # 3이 출력됨
5. print(abs2) # 5.72가 출력됨
1~6번째 줄 : 정수 -3, 실수 -5.72, 복소수 3+4j의 절대값을 구함.
6. print(abs3) # 5.0이 출력됨
각각의 절대값들은 3, 5.72, 5.0
068 반올림수 구하기(round)
1. ret1 = round(1118) # 소수점 첫째자리에서 반올림해줌 round( ) : 인자로 입력된 수치형 자료를 지정된 자리수에서
2. ret2 = round(16.554) # 소수점 첫째자리에서 반올림해줌 반올림한 결과를 리턴
3. ret3 = round(1118, -1) # 1자리에서 반올림해줌
4. ret4 = round(16.554, 2) # 소수점 셋째자리에서 반올림해줌
1번째 줄 : 디폴트로 round( )는 입력된 숫자의 소수점 첫째자리에
5. print(ret1) # 1118
서 반올림한 수를 리턴
6. print(ret2) # 17
7. print(ret3) # 1120 2번째 줄 : 16.554를 소수점 첫째자리에서 반올림
17이 됨
변환되었음을 알 수 있음
071 정수 리스트에서 소수만 걸러내기(filter)
1. def getPrime(x): filter( ) : 리스트와 같이 반복 가능한 자료에서 특정 조건을 만족하
2. for i in range(2, x-1): 는 값만을 편리하게 추출할 수 있는 방법을 제공
3. if x%i == 0:
filter( )의 첫 번째 인자는 특정조건의 값을 추출하는 함수가 입력되
4. break
며, 두 번째 인자는 리스트와 같은 반복 가능한 자료가 입력됨
5. else:
6. return x
7. 1~6번째 줄 : getPrime( ) 함수는 인자로 입력된 x의 값이 소수인지
체크하고 소수일 경우에만 값을 리턴. 여기서 사용된 range( )는 순
8. listdata = [117, 119, 1113, 11113, 11119] 차적인 정수 리스트를 만드는 함수
9. ret = filter(getPrime, listdata)
8번째 줄 : 5개의 정수를 요소로 가지는 리스트를 정의
10. print(list(ret)) # [11113, 11119]가 출력됨
9~10번째 줄 : filter( )의 첫 번째 인자는 소수를 추출하는 함수인
getPrime을, 두 번째 인자는 반복 가능한 자료인 리스트를 입력.
결과
[11113, 11119]
072 최대값, 최소값 구하기(max, min)
1. listdata = [9.96, 1.27, 5.07, 6.45, 8.38, 9.29, 4.93, 7.73, 3.71, max( ), min( ) : 인자로 입력된 자료에서 최대, 최소값을 구해주는
0.93]
함수
2. maxval = max(listdata)
3. minval = min(listdata)
4. print(maxval) # 9.96이 출력됨 1번째 줄 : 숫자가 요소인 리스트 자료 listdata를 정의
5. print(minval) # 0.93이 출력됨
2~5번째 줄 : listdata의 요소 중 최대값을 maxval,
6.
최소값을 minval에 지정하고 이 값들을 출력
7. txt = 'Alotofthingsoccureachday'
8. maxval = max(txt) 7번째 줄 : 문자열 txt를 정의
16진수로 표현하면 6b
0x6b 0 1 1 0 1 1 0 1
0x0b>>4 0 0 0 0 0 1 1 0
075 문자열에서 특정 위치의 문자 얻기
1. txt1 = 'A tale that was not right' 1번째 줄 : 영문으로 된 문자열 txt1을 정의
2. txt2 = '이 또한 지나가리라.' 2번째 줄 : 한글로 된 문자열 txt2를 정의
3. print(txt1[5]) # 'e'가 출력됨
3번째 줄 : 영문으로 된 문자열 txt1의 6번째 문자를 출력
4. print(txt2[-2]) # '라'가 출력됨
4번째 줄 : 한글로 된 문자열 txt2의 끝에서 2번째 문자를 출력
076 문자열에서 지정한 구간의 문자열 얻기
1. txt1 = 'A tale that was not right' 3번째 줄 : 영문으로 된 문자열 txt1의 3번째부터 7번째 미만까지
2. txt2 = '이 또한 지나가리라.' 문자열을 화면에 출력
3. print(txt1[3:7]) # 'ale '이 출력됨
4번째 줄 : txt1의 처음부터 6번째 미만까지 문자열을 출력
4. print(txt1[:6]) # 'A tale'이 출력됨
5번째 줄 : 한글로 된 문자열 txt2에서 끝에서 4번째부터 마지막
5. print(txt2[-4:]) # '가리라.'가 출력됨
문자까지 문자열을 출력
응용 코드 구현
txt = 'python'
for i in range(len(text)):
print(txt[:i+1])
결과
p
py
pyt
pyth
pytho
python
077 문자열에서 홀수 번째 문자만 출력하기
1. txt = 'aAbBcCdDeEfFgGhHiIjJkK' 2번째 줄 : txt[::2]는 문자열 txt의 처음부터 끝까지 스텝 2로
2. ret = txt[::2] 슬라이싱하라는 의미.
3. print(ret) # 'abcdefghijk' 가 출력됨
txt의 첫 번째 문자인 a를 추출하고 두 번째 문자인 A를
ret = txt[1::2]
078 문자열을 거꾸로 만들기
1. txt = 'abcdefghijk' 2번째 줄 : 문자열 txt의 처음부터 끝까지 스텝 -1로 슬라이싱
2. ret = txt[::-1]
3. print(ret) # 'kjihgfedcba' 가 출력됨
역순으로 홀수 번째 문자만 추출하여 문자열을 만들 경우
ret = txt[::-2]
ret = txt[-2::-2]
079 두 개의 문자열 합치기(+)
1. filename = input('저장할 파일이름을 입력하세요: ') 1번째 줄 : input( ) 함수를 이용해 사용자로부터 저장할 파일이름을
2. filename = filename + '.jpg' 입력받아 filename에 지정
3. display_msg = '당신이 저장한 파일은 <' + filename + '>입니다.'
2번째 줄 : 사용자가 입력한 문자열 뒤에 ‘.jpg’를 연결
4. print(display_msg)
3번째 줄 : 사용자에게 피드백을 주기 위한 메시지를 생성
결과
여러분, 파이팅!파이팅!파이팅!~!
081 문자열에서 특정 문자가 있는지 확인하기(in)
1. msg = input('임의의 문장을 입력하세요: ') 1번째 줄 : 임의의 문장을 사용자로부터 입력받음
2. if 'a' in msg: 2번째 줄 : 문자 ‘a’가 사용자가 입력한 문장에 있는지 체크.
3. print('당신이 입력한 문장에는 a가 있습니다.')
'a' in msg는 msg에 문자 ‘a’가 한 개라도 있으면 참이고
4. else:
한 개도 없으면 거짓
5. print('당신이 입력한 문장에는 a가 없습니다.')
msglen = len(msg.encode( ))
알 수 있음
084 문자열이 알파벳인지 검사하기(isalpha)
1. txt1 = 'A' isalpha( ) : 주어진 문자열이 사람의 언어 문자로만 구성되어 있
2. txt2 = '안녕' 는지를 확인. 문자열의 모든 요소가 사람의 언어 문자
3. txt3 = 'Warcraft Three'
로만 구성되어 있으면 True를 리턴하고 아니면 False를
4. txt4 = '3PO'
리턴
5. ret1 = txt1.isalpha( )
6. ret2 = txt2.isalpha( )
7. ret3 = txt3.isalpha( ) 5번째 줄 : txt1은 알파벳 한글자로 된 ‘A’이므로 ret1의 값은 True
9. print(ret1) # True가 출력됨 7번째 줄 : 사이에 띄어쓰기 기호인 공백(space)이 들어가 있으므로
10. print(ret2) # True가 출력됨 ret3은 False
11. print(ret3) # False가 출력됨
8번째 줄 : txt4에는 숫자 3이 포함되어 있으므로 ret4는 False
12. print(ret4) # False가 출력됨
085 문자열이 숫자인지 검사하기(isdigit)
1. txt1 = '010-1234-5678' isdigit( ) 메소드 : 문자열을 구성하는 요소가 모두 숫자인지 체크하
고 True 또는 False를 리턴
2. txt2 = 'R2D2'
3. txt3 = '1212'
4. ret1 = txt1.isdigit( ) 4번째 줄 : txt1에는 숫자 이외에 하이픈 ‘-’이 포함되어 있으므로
5. ret2 = txt2.isalnum ( ) 5번째 줄 : txt2에는 마침표 ‘.’와 하이픈 ‘-’이 들어가 있으므로 ret2의
값은 False
6. ret3 = txt3.isalnum ( )
7. print(ret1) # False가 출력됨 6번째 줄 : txt3은 모두 문자와 숫자로만 구성되어 있으므로 ret3의
값은 True
8. print(ret2) # False가 출력됨
9. print(ret3) # True가 출력됨
087 문자열에서 대소문자 변환하기(upper, lower)
1. txt = 'A lot of Things occur each day.' upper( ) 메소드 : 문자열에 있는 모든 알파벳을 대문자로 변환한
2. ret1 = txt.upper( ) 결과를 리턴
3. ret2 = txt.lower( )
lower( ) 메소드 : 문자열에 있는 모든 알파벳을 소문자로 변환한
4. print(ret1)
결과를 리턴
5. print(ret2)
upper( )와 lower( )는 원본 문자열을 변경시키지 않음
결과
A LOT OF THINGS OCCUR EACH DAY.
a lot of things occur each day.
088 문자열에서 좌우 공백 제거하기(istrip, rstrip, strip)
1. txt = ' 양쪽에 공백이 있는 문자열입니다. ' 2번째 줄 : 문자열 객체의 lstrip( ) 메소드는 문자열에 존재하는
2. ret1 = txt.lstrip( ) 왼쪽 공백을 제거한 후 결과를 리턴
3. ret2 = txt.rstrip( )
3번째 줄 : 문자열 객체의 rstrip( ) 메소드는 문자열에 존재하는
4. ret3 = txt.strip( )
오른쪽 공백을 제거한 후 결과를 리턴
5. print('<'+txt+'>')
4번째 줄 : 문자열 객체의 strip( ) 메소드는 문자열에 존재하는
6. print('<'+ret1+'>')
7. print('<'+ret2+'>') 왼쪽, 오른쪽 공백을 모두 제거한 후 결과를 리턴
8. print('<'+ret3+'>')
결과
< 양쪽에 공백이 있는 문자열입니다. >
<양쪽에 공백이 있는 문자열입니다. >
< 양쪽에 공백이 있는 문자열입니다.>
<양쪽에 공백이 있는 문자열입니다.>
089 문자열을 수치형 자료로 변환하기(int, float)
1. numstr = input('숫자를 입력하세요: ') - 파일에 기록되어 있는 숫자나 사용자로부터 입력받은 숫자는 문자
열로 처리됨
2. try:
3. num = int(numstr) - 파이썬 내장함수 int( )와 float( )를 사용하면 문자열로 된 숫자를
않은 문자열이 입력되면 오류 발생
4. numstr1 = str(num1)
1~2번째 줄 : num1은 정수형 자료 1234,
5. numstr2 = str(num2)
num2는 실수형 자료 3.14로 정의
6. print('num1을 문자열로 변환한 값은 "%s"입니다.' %numstr1)
7. print('num2를 문자열로 변환한 값은 "%s"입니다.' %numstr2) 4~5번째 줄 : 파이썬 내장함수 str( )을 이용해 num1과 num2를
결과
num1을 문자열로 변환한 값은 "1234"입니다.
num2를 문자열로 변환한 값은 "3.14"입니다.
091 문자열에 있는 문자(열) 개수 구하기(count)
1. txt = 'A lot of things occur each day, every day.' count( ) 메소드 : 문자열에서 특정 문자의 개수를 리턴
2. word_count1 = txt.count('o')
3. word_count2 = txt.count('day')
4. word_count3 = txt.count(' ')
2번째 줄 : txt에 존재하는 알파벳 ‘o’의 개수를 구함
5. print(word_count1) # 3이 출력됨
3번째 줄 : txt에 존재하는 단어 ‘day’의 개수를 구함
6. print(word_count2) # 2가 출력됨
7. print(word_count3) # 8이 출력됨 4번째 줄 : txt에 존재하는 공백의 개수를 구함.
offset2로 둠
세미콜론을 변수 bond로 둠
6. ret1 = 'I' == u_txt[0] 73 32 108 111 118 101 32 112 121 116 104 111 110
ret2는 False
097 바이트 객체를 문자열로 바꾸기(decode)
1. b_txt = b'A lot of things occur each day.' decode( ) 메소드 : 바이트 객체를 유니코드 문자열로 변환
2. u_txt = b _txt.decode( )
3. print(u _txt)
1번째 줄 : b_txt를 바이트 객체 문자열로 정의합니다.
변환
ret = 0
for i in range(10):
ret += (i+1)
100 리스트에서 특정 위치의 요소 얻기
1. listdata = [1, 2, 'a', 'b', 'c', [4, 5, 6]] 1번째 줄 : 다양한 요소로 구성되어 있는 리스트를 listdata에 정의
2. val1 = listdata[1] 2번째 줄 : listdata[1]은 listdata의 2번째 요소, val1의 값은 2
3. val2 = listdata[3]
3번째 줄 : listdata[3]은 listdata의 4번째 요소, val2의 값은 ‘b’
4. val3 = listdata[5][1]
4번째 줄 : listdata[5]는 listdata의 6번째 요소,
5. print(val1) # 2가 출력됨
listdata의 6번째 요소는 [4, 5, 6]인 리스트
6. print(val2) # 'b'가 출력됨
7. print(val3) # 5가 출력됨
101 리스트에서 특정 요소의 위치 구하기(index)
1. solarsys = ['태양', '수성', '금성', '지구', '화성', '목성', '토성', '천왕 index( ) 메소드 : 리스트에서 요소의 값을 알고 있을 때
성', '해왕성', '지구']
그 요소가 최초로 나타나는위치의 인덱스를 리턴
2. planet = '지구'
3. pos = solarsys.index(planet)
4. print('%s은(는) 태양계에서 %d번째에 위치하고 있습니 1번째 줄 : solarsys를 태양계 구성 천체를 요소로 하는 리스트로
다.' %(planet, pos))
정의. 리스트에서 ‘지구’를 ‘해왕성’ 다음에 삽입
5. pos = solarsys.index(planet, 5)
2~3번째 줄 : solarsys 요소 중 ‘지구’가 위치하는 인덱스를 구함.
6. print('%s은(는) 태양계에서 %d번째에 위치하고 있습니
다.' %(planet, pos)) index( )는 리스트의 처음부터 찾기 시작하여 찾고자
4. print('태양계의 암석형 행성: ', end='');print(rock_planets) 3번째 줄 : solarsys의 4번째 요소부터 끝까지 슬라이싱하여 만든 새
로운 리스트를 gas_planets으로 둠
5. print('태양계의 가스형 행성: ', end='');print(gas_planets)
4~5번째 줄 : rock_planets과 gas_planets을 출력
결과
태양계의 암석형 행성: ['수성', '금성', '지구']
태양계의 가스형 행성: ['화성', '토성', '목성', '천왕성', '해왕성']
104 리스트에서 짝수 번째 요소만 추출하기
1. listdata = list(range(1, 21)) 1번째 줄 : 1에서 20까지 순차적인 정수 리스트를 생성하고 변수
listdata로 지정
2. evenlist = listdata[1::2]
3. print(evenlist) 2번째 줄 : listdata의 두 번째 요소부터 끝까지 스텝 2로 슬라이싱
결과
결과
[4, 3, 2, 1, 0]
106 리스트 요소 순서를 역순으로 만들기 ② (reversed)
1. listdata = list(range(5)) reversed( ) : 인자로 입력된 시퀀스 자료형의 요소 순서를 역순으로
새로운 시퀀스 자료형을 만들어 리턴
2. ret1 = reversed(listdata)
3. print('원본 리스트 ', end='');print(listdata);
4. print('역순 리스트 ', end='');print(list(ret1)) 1번째 줄 : listdata를 0에서 4까지 순차적인 정수 리스트로 정의
화면에 출력
새로운 리스트를 만듦
결과
원본 리스트 [0, 1, 2, 3, 4]
역순 리스트 [4, 3, 2, 1, 0]
슬라이싱 이용 [4, 3, 2, 1, 0]
107 리스트 합치기(+)
1. listdata1 = ['a', 'b', 'c', 'd', 'e'] 1~2번째 줄 : 두 개의 리스트 ['a', 'b', 'c', 'd', 'e']와 ['f ', 'g', 'h', 'i', 'j']를
2. listdata2 = ['f', 'g', 'h', 'i', 'j'] 변수 listdata1, listdata2에 각각 대입
3. listdata3 = listdata1 + listdata2
3번째 줄 : listdata1와 listdata2를 연결하여 만들어지는 리스트를
4. listdata4 = listdata2 + listdata1
listdata3으로 둠
5. print(listdata3) # ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']가 출력됨
4번째 줄 : listdata2와 listdata1을 연결하여 만들어지는 리스트를
6. print(listdata4) # ['f', 'g', 'h', 'i', 'j', 'a', 'b', 'c', 'd', 'e']가 출력됨
listdata4로 둠
결과
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
['f', 'g', 'h', 'i', 'j', 'a', 'b', 'c', 'd', 'e']
108 리스트 반복하기(*)
1. listdata = list(range(3)) list*2 = list + list
2. ret = listdata*3
3. print(ret) # [0, 1, 2, 0, 1, 2, 0, 1, 2]가 출력됨
1번째 줄 : listdata를 [0, 1, 2]로 정의
결과
[0, 1, 2, 0, 1, 2, 0, 1, 2]
109 리스트에 요소 추가하기(append)
1. listdata = [ ] append( ) : 인자로 입력된 값을 리스트의 맨 마지막 요소로 추가
2. for i in range(3):
3. txt = input('리스트에 추가할 값을 입력하세요[%d/3]:
1번째 줄 : 빈 리스트를 listdata로 정의
' %(i+1))
4. listdata.append(txt) 2~3번째 줄 : 사용자로부터 값을 3번 입력받기 위해
listdata를 화면에 출력
결과(12, 14, 18 입력 시)
리스트에 추가할 값을 입력하세요[1/3]: 12
['12']
리스트에 추가할 값을 입력하세요[2/3]: 14
['12', '14']
리스트에 추가할 값을 입력하세요[3/3]: 18
['12', '14', '18']
110 리스트의 특정 위치에 요소 삽입하기(insert)
1. solarsys = ['태양', '수성', '금성', '지구', '화성', '목성', '토성', '천왕 insert( ) : 리스트의 특정 위치에 새로운 요소를 삽입
성', '해왕성']
2. pos = solarsys.index('목성')
1번째 줄 : 태양계 구성 천체를 리스트 solarsys로 정의
3. solarsys.insert(pos, '소행성')
4. print(solarsys) 2번째 줄 : solarsys에서 ‘목성’의 인덱스를 구하여 pos로 둠
결과
['태양', '수성', '금성', '지구', '화성', '소행성', '목성', '토성', '천왕성', '해왕성']
111 리스트의 특정 위치의 요소 제거하기(del)
1. solarsys = ['태양', '수성', '금성', '지구', '화성', '목성', '토성', '천왕 1번째 줄 : 태양계 구성 천체를 리스트 solarsys로 정의
성', '해왕성']
2~3번째 줄 : solarsys의 인덱스가 0인 첫 번째 요소인 ‘태양’을
2. del solarsys[0]
solarsys로부터 제거
3. print(solarsys)
4. del solarsys[-2] ['수성', '금성', '지구', '화성', '목성', '토성', '천왕성', '해왕성']
5. print(solarsys)
결과
2번째 줄 : solarsys[1:3]을 제거
3번 요소 미만까지를 의미
결과
개수는 각각 3과 1
116 리스트 제거하기(del)
1. listdata = [2, 2, 1, 3, 8, 5, 7, 6, 3, 6, 2, 3, 9, 4, 4] 1번째 줄 : 정수를 요소로 하는 리스트를 listdata로 정의
2. del listdata 2번째 줄 : del listdata는 listdata를 메모리에서 제거함
3. print(listdata)
3번째 줄 : listdata 자체가 메모리에서 제거 → listdata는 코드에서
존재하지 않는 변수
namelist.sort(reverse=True)
결과(listdata.sort(reverse=True))
ret2를 출력
결과
['Mary', 'Sams', 'Aimy', 'Tom', "Michale', 'Bob', 'Kelly']
['Aimy', 'Bob', 'Kelly', 'Mary', 'Michale', 'Sams', 'Tom']
['Tom', 'Sams', 'Michale', 'Mary', 'Kelly', 'Bob', 'Aimy']
119 리스트 요소 무작위로 섞기(shuffle)
1. from random import shuffle 1번째 줄 : random 모듈의 shuffle( )을 임포트
2. 3번째 줄 : 1부터 10까지 순차적인 정수 리스트를 listdata로 정의
3. listdata = list(range(1, 11))
4~6번째 줄 : for문을 이용하여 listdata를 shuffle( )로 무작위로 섞은
4. for i in range(3):
결과를 3번 출력
5. shuffle(listdata)
6. print(listdata) # 출력 결과는 실행할 때마다 달라짐
결과
[3, 9, 6, 8, 4, 10, 1, 2, 5, 7]
[7, 5, 4, 2, 3, 10, 9, 6, 8, 1]
[9, 8, 4, 7, 1, 2, 3, 10, 6, 5]
120 리스트의 모든 요소를 인덱스와 쌍으로 추출하기(enumerate)
1. solarsys = ['태양', '수성', '금성', '지구', '화성', '목성', '토성', '천왕 enumerate( ) : 시퀀스 자료형을 인자로 받아 각 요소를 인덱스와
성', '해왕성']
함께 쌍으로 추출할 수 있는 반복 가능 자료 enumerate 객체를 리턴
2. ret = list(enumerate(solarsys))
3. print(ret)
4. 1번째 줄 : 태양계 구성 천체를 리스트 solarsys로 정의
5. for i, body in enumerate(solarsys): 2번째 줄 : solarsys의 enumerate 객체를 생성하고 list( )를 이용해
6. print('태양계의 %d번째 천체: %s' %(i, body)) 리스트로 변환
결과 [(0, '태양'), (1, '수성'), (2, '금성'), (3, '지구'), (4, '화성'), (5, '목성'), (6,
'토성'), (7, '천왕성'), (8, '해왕성')]
합을 구하려고 할 경우 TypeError 오류 발생
122 리스트 요소가 모두 참인지 확인하기(all, any)
1. listdata1 = [0, 1, 2, 3, 4] - 리스트의 모든 요소가 참인지 또는 모든 요소가 거짓인지 판단해야 하는
경우 사용
2. listdata2 = [True, True, True]
3. listdata3 = ['', [ ], ( ), { }, None, False] all( ) : 인자로 입력되는 리스트의 모든 요소가 참인 경우에만
5. print(any(listdata1)) # True가 출력됨 any( ) : 인자로 입력되는 리스트의 모든 요소가 거짓인 경우에만
6. print(all(listdata2)) # True가 출력됨 False를 리턴
7. print(any(listdata2)) # True가 출력됨
모두 거짓을 의미하는 값
8. print(all(listdata3)) # False가 출력됨
• 숫자 0
9. print(any(listdata3)) # False가 출력됨
• 빈 문자열 ‘’, “”
• 빈 리스트 [ ]
• 빈 튜플 ( )
• 빈 사전 { }
• None
결과
{'수성': 'Mercury', '지구': 'Earth', '천왕성': 'Uranus', '목성': 'Jupiter', '해왕성':
'Neptune', '토성':
'Saturn', '화성': 'Mars', '태양': 'Sun', '금성': 'Venus'}
124 사전의 특정 요소값 변경하기
1. names = {'Mary':10999, 'Sams':2111, 'Aimy':9778, 'Tom':20245, val의 값을 val2로 변경하는 방법
2. 'Michale':27115, 'Bob':5887, 'Kelly':7855} dict[k] = val2
3. names['Aimy'] = 10000
4. print(names)
1~2번째 줄 : 사전 자료 names를 정의
{'Aimy': 10000, 'Michale': 27115, 'Tom': 20245, 'Bob': 5887, 'Mary': 10999,
'Sams': 2111,
'Kelly': 7855}
125 사전의 특정 요소 제거하기(del)
1. names = {'Mary':10999, 'Sams':2111, 'Aimy':9778, 'Tom':20245, 사전 dict에서 특정 요소 k:val을 제거하는 방법
2. 'Michale':27115, 'Bob':5887, 'Kelly':7855} del dict[k]
3. del names['Sams']
4. print(names)
1~2번째 줄 : 사전 자료 names를 정의
4번째 줄 : names를 출력
결과
{'Aimy': 9778, 'Michale': 27115, 'Tom': 20245, 'Bob': 5887, 'Mary': 10999,
'Kelly': 7855}
126 사전의 모든 요소 제거하기(clear)
1. names = {'Mary':10999, 'Sams':2111, 'Aimy':9778, 'Tom':20245, clear( ) : 사전의 모든 요소를 제거하여 빈 사전으로 만들 때 사용
2. 'Michale':27115, 'Bob':5887, 'Kelly':7855}
3. names.clear( )
1~2번째 줄 : 이름이 키이고 출생아 수가 값인 사전 자료 names를
4. print(names)
정의
만듦
key_list = list(names.keys( ))
6. vals _list = list(vals) dict_values([9778, 27115, 20245, 5887, 10999, 2111, 7855])
리스트로 변환
결과
출생아 수 총계: 83990
129 사전 요소를 모두 추출하기(items)
1. names = {'Mary':10999, 'Sams':2111, 'Aimy':9778, 'Tom':20245, 1~2번째 줄 : 이름이 키이고 출생아 수가 값인 사전 자료 names를
2. 'Michale':27115, 'Bob':5887, 'Kelly':7855} 정의
3. items = names.items( )
3~4번째 줄 : names.items( )는 names의 모든 요소를 추출하여
4. print(items)
dict_items 사전 뷰 객체로 리턴
5.
dict_items 객체를 items에 대입하고 출력
6. for item in items:
7. print(item) 결과
결과
('Mary', 10999)
('Michale', 27115)
('Bob', 5887)
('Sams', 2111)
('Kelly', 7855)
('Tom', 20245)
('Aimy', 9778)
130 사전에 특정 키가 존재하는지 확인하기(in)
1. names = {'Mary':10999, 'Sams':2111, 'Aimy':9778, 'Tom':20245, 사전 dict에 k가 키로 있는지 확인하는 방법
2. 'Michale':27115, 'Bob':5887, 'Kelly':7855} k in dict
3. k = input('이름을 입력하세요: ')
4. if k in names:
1~2번째 줄 : 이름이 키이고 출생아 수가 값인 사전 자료 names를
5. print('이름이 <%s>인 출생아 수는 <%d>명입니다.' %(k,
names[k])) 정의
6. else: 3번째 줄 : 사용자로부터 이름을 입력받고 그 값을 변수 k에 대입
7. print('자료에 <%s>인 이름이 존재하지 않습니다.' %k)
4~5번째 줄 : k가 사전 자료 names의 키로 존재하면,
키와 이 키에 대응하는 값을 출력
그에 대한 메시지를 출력
결과
이름이 <Michale>인 출생아 수는 <27115>명입니다.
131 사전 정렬하기(sorted)
1. names = {'Mary':10999, 'Sams':2111, 'Aimy':9778, 'Tom':20245, sorted( ) : 사전 자료를 인자로 입력받아 정렬
2. 'Michale':27115, 'Bob':5887, 'Kelly':7855} 사전을 인자로 입력하면 기본적으로 사전의 키를
3. ret1 = sorted(names)
오름차 순으로 정렬한 결과를 리스트로 리턴
4. print(ret1)
5.
3~4번째 줄 : sorted(names)는 names의 키를 오름차순으로
6. def f1(x):
7. return x[0] 정렬하여 리스트로 리턴. ret1을 출력
[('Sams', 2111), ('Bob', 5887), ('Kelly', 7855), ('Aimy', 9778), ('Mary', 10999),
('Tom', 20245),
('Michale', 27115)]
결과
결과(‘가’를 입력했을 때)
ValueError를 발생
결과(정수 114입력)
결과
3. print(ret) # 4가 출력됨
2개의 인자를 받고 이를 더한 결과를 리턴하는 lambda 함수
4.
lambda x, y: x+y
5. funcs = [lambda x: x+'.pptx', lambda x: x+'.docx']
1~3번째 줄 : 2개의 인자 x, y를 더하는 lambda 함수를 add로 정의
6. ret1 = funcs[0]('Intro')
7. ret2 = funcs[1]('Report') add(1, 3)은 1과 3을 더한 결과를 리턴. ret에 대입하고 화면에 출력
결과
결과
000020 동화약품
000040 S&T모터스
000050 경방
000060 메리츠화재
000070 삼양사
000071 삼양사우
000100 유한양행
000101 유한양행우
…
104110 신성ENG
104120 신성FA
104700 한국철강
105560 KB금융
107590 미원에스씨
138 텍스트 파일을 한줄씩 읽고 출력하기 ① (readline)
1. f = open('stockcode.txt', 'r') 1번째 줄 : 파일을 텍스트 읽기 모드로 오픈하고 파일 객체를 f로 둠
2. line _num = 1 2번째 줄 : 라인 넘버를 표시하기 위해 line_num 변수를 이용
3. line = f.readline( )
3번째 줄 : stockcode.txt의 첫 한 줄을 읽고 변수 line에 대입
4. while line:
4번째 줄 : line의 값이 빈 문자열일 때까지 while 루프를 반복
5. print('%d %s' %(line_num, line), end='')
5번째 줄 : 읽은 한 줄을 라인 넘버와 함께 화면에 출력
6. line = f.readline( )
7. line _num += 1 6~7번째 줄 : readline( )으로 그 다음줄을 읽어 line에 대입하고 라인
넘버를 1 증가. line이 빈 문자열일 때까지 5~7라인을 반복
8. f.close( )
결과
0 000020 동화약품
1 000040 S&T모터스
2 000050 경방
3 000060 메리츠화재
4 000070 삼양사
5 000071 삼양사우
6 000100 유한양행
7 000101 유한양행우
…
922 104110 신성ENG
923 104120 신성FA
924 104700 한국철강
925 105560 KB금융
926 107590 미원에스씨
139 텍스트 파일을 한줄씩 읽고 출력하기 ② (readlines)
1. f = open('stockcode.txt', 'r') readlines( ) : 텍스트 파일의 끝까지 한 줄씩 읽어 각 줄을 요소로
2. lines = f.readlines( ) 하는 리스트로 리턴
3. for line _num, line in enumerate(lines):
4. print('%d %s' %(line_num+1, line), end='')
1번째 줄 : 파일을 텍스트 읽기 모드로 오픈하고 객체를 f에 대입
5. f.close( )
2번째 줄 : 텍스트 파일의 모든 내용을 한 줄씩 한꺼번에 읽고
10. 기록
11. f = open('mydata.txt', 'w')
12. f.writelines(data)
13. f.close( )
142 텍스트 파일 복사하기(read, write)
1. f = open('stockcode.txt', 'r') 1~2번째 줄 : 원본 파일을 텍스트 읽기 모드로 오픈하고 파일 객체를
2. h = open('stockcode_copy.txt', 'w') f로 둠. 원본 파일의 복사본이 될 파일을 텍스트 쓰기
3.
모드로 오픈하고 파일 객체를 h로 둠
4. data = f.read( )
4~5번째 줄 : f.read( )로 stockcode.txt의 모든 내용을 읽고 그 내용을
5. h.write(data)
data로 둠. h.write( )로 data를 기록
6.
8. h.close( )
143 바이너리 파일 복사하기(read, write)
1. bufsize = 1024 1번째 줄 : bufsize를 1024로 정의
2. f = open('img_sample.jpg', 'rb') 2~3번째 줄 : img_sample.jpg를 바이너리 읽기 모드로 오픈하고
3. h = open('img_sample_copy.jpg', 'wb')
파일 객체를 f로 둠. img_sample.jpg의 복사본이 될
4.
img_sample_copy.jpg를 바이너리 쓰기 모드로 오픈하고
5. data = f.read(bufsize)
파일 객체를 h로 둠
6. while data:
7. h.write(data) 5번째 줄 : img_sample.jpg 파일의 내용을 bufsize인 1024바이트만큼
data로 둠
144 파일을 열고 자동으로 닫기(with~as)
1. with open('stockcode.txt', 'r') as f: 파일 열고 닫기의 기본적인 방법
2. for line_num, line in enumerate(f.readlines( )): f = open('stockcode.txt', 'r')
… 파일 처리 코드 …
3. print('%d %s' %(line _num+1, line), end='') f.close( )
with open( ) as
8. print('File Name: %s \tFile Size: %d' %(file1, file_size1)) 5번째 줄 : getsize(file1)은 프로그램이 구동되는 디렉터리에 있는
해당 파일의 크기를 얻음
결과
File Name: stockcode.txt File Size: 16339
File Name: d:/devlab/py200/img_sample.jpg File Size: 170005
147 파일 삭제하기(os.remove)
1. from os import remove 존재하는 파일을 삭제하려면 os 모듈의 remove( )를 이용
받음
FileExistsError가 발생
목록을 리스트로 리턴
['stockcode.txt', 'stockcode2.txt']
151 현재 디렉터리 확인하고 바꾸기(os.getcwd, os.chdir)
1. import os 1번째 줄 : os 모듈을 임포트
2. 3번째 줄 : os.getcwd( )로 현재 디렉터리를 얻고 이를 pdir로 두고
3. pdir = os.getcwd( ); print(pdir)
화면에 경로를 출력
4. os.chdir('..'); print(os.getcwd( ))
4번째 줄 : os.chdir('..')은 현재 작업 디렉터리의 부모 디렉터리로
5. os.chdir(pdir); print(os.getcwd( ))
이동
디렉터리를 변경
결과
D:\devlab\py200
D:\devlab
D:\devlab\py200
152 디렉터리 생성하기(os.mkdir)
1. import os 1번째 줄 : os 모듈을 임포트
2. 2번째 줄 : 사용자로부터 생성할 디렉터리 이름을 입력받음
3. newfolder = input('새로 생성할 디렉터리 이름을 입력하세요: ')
4~8번째 줄 : 사용자가 입력한 디렉터리가 이미 존재하거나
4. try:
경로 이름이 잘못된 경우에는 ok.mkdir( )이 오류를
5. os.mkdir(newfolder)
발생하므로 오류 내용을 출력
6. print('[%s] 디렉터리를 새로 생성했습니다.' %newfolder)
7. except Exception as e: 유효한 디렉터리 이름을 입력하면 디렉터리를 생성
8. print(e) 하고 메시지를 출력
153 디렉터리 제거하기(os.rmdir)
1. import os 1번째 줄 : os 모듈을 임포트
2. 3~4번째 줄 : 삭제할 디렉터리 이름을 지정하고 사용자에게 삭제할
3. target _folder = 'tmp' 것인지 확인
5. if k == 'y':
6. try: 만약 디렉터리가 존재하지 않거나 디렉터리가 비어있지 않는
7. os.rmdir(target_folder)
오류가 발생하면 try~except를 이용해 오류 내용을 출력하고
8. print('[%s] 디렉터리를 삭제했습니다.' %target_folder)
프로그램을 정상 종료함
9. except Exception as e:
10. print(e)
154 하위 디렉터리 및 파일 전체 삭제하기(shutil.rmtree)
1. import shutil shutil 모듈의 rmtree( ) : 인자로 입력된 경로에 해당하는 디렉터리
2. import os 와 하위 디렉터리 및 모든 파일들을 일괄적으로 삭제
3.
4. dir _name = input('새로 생성할 디렉터리 이름을 입력하세요: ') 1~2번째 줄 : os 모듈과 os.path 모듈의 exists( )를 임포트
8. with open(logfile, 'a') as f: 8~9번째 줄 : test.log 파일을 텍스트 추가 모드로 열고 log를 파일의
9. f.writelines(log) 마지막에 추가
10. 11번째 줄 : writelog( )를 이용하여 문자열을 로그파일에 로깅
11. writelog(logfile, '첫 번째 로깅 문장입니다.')
생성된 test.log 파일을 텍스트 에디터로 열기
5. t = localtime( ) 구하고 이를 t에 대입
6. today = '%d-%d-%d' %(t.tm_year, t.tm _mon, t.tm _mday) 오늘 날짜를 t.tm_year, t.tm_mon, t.tm_mday 값을
7. week = weekdays[t.tm_wday]
이용해 문자열로 구성
8.
7번째 줄 : t.tm_wday가 weekdays의 인덱스로 입력
9. print('[%s] 오늘은 [%s]입니다.' %(today, week))
결과
8. print('1에서 백만까지 더한 결과: %d' %ret) 6~7번째 줄 : 1에서 백만까지 더하는 루틴을 for 구문을 이용해 구현
8. ret += text[0]
9. 결과 (‘안녕하세요. 내 이름은 홍길동입니다.’를 입력)
10. print(ret)
녕하세요. 내 이름은 홍길동입니다.안
163 URL에서 호스트 도메인 추출하기
1. url = 1번째 줄 : 인터넷 주소창에 입력하는 형식의 URL을 url로 둠
'http://news.naver.com/main/read.nhn?mode=LSD&mid=sh
m&sid1= 4번째 줄 : url.split( )으로 url을 ‘/’로 구분한 결과를 tmp로 둠
2. 105&oid=028&aid=0002334601'
3. 1번째 줄 : 인터넷 주소창에 입력하는 형식의 URL을 url로 둠
4. tmp = url.split('?')
4번째 줄 : url.split( )으로 url을 ‘?’로 구분한 결과를 tmp로 둠
5. queries = tmp[1].split('&')
5번째 줄 : tmp[1]은 url의 ‘?’ 다음의 문자열
6. for query in queries:
tmp[1]을 ‘&’로 구분한 결과를 queries로 둠
7. print(query)
6~7번째 줄 : queries의 모든 요소를 화면에 출력
결과
mode=LSD
mid=shm
sid1=105
oid=028
aid=0002334601
165 스택 구현하기(append, pop)
1. mystack = [ ]
스택(stack) : 나중에 저장된 자료가 먼저 추출될 수 있도록 되어 있
2.
는 나열 구조
3. def putdata(data):
4. global mystack
5. mystack.append(data)
1번째 줄 : 빈 리스트를 mystack으로 둠
6.
12.
popdata( )로 구현
13. putdata('데이터1')
17. print('<스택상태>: ', end=''); print(mystack) 19~23번째 줄 : popdata( )를 호출. while문을 이용해 ret이 None일
18.
→ 구하고자 하는 단어 개수 = tmp의 크기
결과
단어수: [213]
168 파일에서 특정 단어 개수 계산하기
1. def countWord(filename, word): 2~4번째 줄 : 파일을 텍스트 읽기 모드로 열고 내용을 읽어 text로
2. with open(filename, 'r') as f: 두고 text를 모두 소문자로 변환
3. text = f.read( )
5번째 줄 : text.find(word)로 text에서 word가 최초로 나타나는
4. text = text.lower( )
위치를 구하여 pos에 대입
5. pos = text.find(word)
6~10번째 줄 : while 문의 조건을 만족하면 count를 1 증가
6. count = 0
7. while pos != -1: text.find(word, pos+1)로 찾은 word의 위치 다음부터
12. word = input('mydata.txt에서 개수를 구할 단어를 입력하세요: ') 13번째 줄 : word를 소문자로 변환
13. word = word.lower( ) 14~15번째 줄 : countWord( )를 호출하고 결과를 화면에 출력
14. ret = countWord('mydata.txt', word)
[how]의 개수: 2
15. print('[%s]의 개수: %d' %(word, ret))
169 파일에서 특정 문자열 교체하기
1. t1 = input('찾을 단어를 입력하세요: ') 1~2번째 줄 : ‘mydata.txt’ 파일에서 찾아서 변경할 단어를 각각
2. t2 = input('변경할 단어를 입력하세요: ') 입력받아 t1, t2로둠
3.
4~5번째 줄 : ‘mydata.txt’를 텍스트 읽기 모드, ‘mydata2.txt’를
4. with open('mydata.txt', 'r') as f:
쓰기 모드로 오픈, 각각 파일 핸들을 f, h로 둠
5. with open('mydata2.txt', 'w') as h:
6~8번째 줄 : ‘mydata.txt’ 파일의 내용을 모두 읽어 text로 두고,
6. text = f.read( )
7. text = text.replace(t1, t2) text.replace(t1, t2)로 text에 등장하는 t1을 t2로 모두
9.
결과
<!doctype html>
<!--[if lt IE 7]> <html class="no-js ie6 lt-ie7 lt-ie8 lt-ie9"> <![endif]-->
<!--[if IE 7]> <html class="no-js ie7 lt-ie8 lt-ie9"> <![endif]-->
<!--[if IE 8]> <html class="no-js ie8 lt-ie9"> <![endif]-->
<!--[if gt IE 8]> <!--><html class="no-js" lang="en" dir="ltr"> <!--<![endif]--
>
(생략)
<script type="text/javascript" src="/static/js/plugins/getComputedStyle-
min.js"
charset="utf-8"></script>
<![endif]-->
</body>
</html>
171 URL에 접속하여 HTML 페이지를 파일로 저장하기
1. from urllib.request import urlopen 1번째 줄 : urllib.request 모듈의 urlopen( )을 임포트
2. 3번째 줄 : 파이썬 공식 홈페이지 URL을 url 변수에 정의
3. url = 'https://www.python.org/'
4번째 줄 : urlopen(url)로 오픈하고 핸들을 f로 둠
4. with urlopen(url) as f:
5번째 줄 : f.read( )는 url로부터 해당 리소스 데이터를 바이트
5. doc = f.read( ).decode( )
스트림으로 읽어옴. f.read( ).decode( )로 바이트 스트림을
6. with open('pythonhome.html', 'w') as h:
7. h.writelines(doc) 텍스트로 변환하고 doc으로 둠
doc = f.read( )
with open('pythonhome.html', 'wb') as h:
h.write(doc)
172 인터넷에 있는 이미지를 내 PC로 저장하기
1. from urllib.request import urlopen 1번째 줄 : urllib.request 모듈의 urlopen( )을 임포트
2. 3번째 줄 : 이미지 파일의 URL을 imgurl로 둠
3. imgurl = 'http://www.epaiai.com/img_sample.jpg'
4번째 줄 : 이미지 이름을 imgurl로부터 분리하고 imgname으로 둠
4. imgname = imgurl.split('/')[-1]
5번째 줄 : URL이 잘못된 경우 프로그램이 비정상적으로 종료되지
5. try:
않도록 try~except로 감싸줌
6. with urlopen(imgurl) as f:
7. with open(imgname, 'wb') as h: 6~9번째 줄 : imgurl을 오픈하고 imgname을 바이너리 쓰기 모드로
하고 프로그램을 정상 종료
173 인터넷에 있는 대용량 파일을 내 PC로 저장하기
1. from urllib.request import urlopen 1번째 줄 : urllib.request 모듈의 urlopen( )을 임포트
2. 3번째 줄 : BUFSIZE를 256KB로 설정
3. BUFSIZE = 256*1024
5번째 줄 : URL을 fileurl로 지정
4.
6번째 줄 : fileurl에서 파일이름 부분만 추출하여 filename으로 둠
5. fileurl = 'https://www.python.org/ftp/python/3.5.2/python-
3.5.2.exe' 8~9번째 줄 : fileurl을 오픈, filename을 바이너리 쓰기 모드로 오픈
6. filename = fileurl.split('/')[-1] 각 파일 핸들을 f, h로 둠
7. try:
10~13번째 줄 : fileurl을 BUFSIZE만큼 읽어 buf로 지정하고
8. with urlopen(fileurl) as f:
while문으로 진입. filename에 buf로 지정된 데이터
9. with open(filename, 'wb') as h:
저장, fileurl에서 다시 BUFSIZE만큼 읽고 buf로 두는
10. buf = f.read(BUFSIZE)
반복 수행. while 구문을 벗어나면 fileurl의 모든
11. while buf:
12. h.write(buf) 데이터가 로컬 파일로 저장
8. extractZip('files.zip')
179 로또 번호 추출기 만들기
1. from random import shuffle 1~2번째 줄 : random 모듈의shuffle( )과time 모듈의sleep( )을임포트
2. from time import sleep 4번째 줄 : 사용자로부터 로또 게임수를 입력받고 gamenum에 지정
3.
6번째 줄 : 입력한 게임 횟수만큼 for 구문을 반복
4. gamenum = input('로또 게임 횟수를 입력하세요: ')
7~8번째 줄 : balls는 1에서 45까지 정수를요소로하는 리스트로정의
5.
9번째 줄 : 6번 반복하여 숫자를 추출
6. for i in range(int(gamenum)):
7. balls = [x+1 for x in range(45)] 10~12번째 줄 : shuffle( )로 balls를 무작위로 섞고 pop( )으로
커플1: [로미오]-[원더우먼]
커플2: [심봉사]-[아라치]
커플3: [마루치]-[줄리엣]
커플4: [이몽룡]-[뺑덕]
커플5: [슈퍼맨]-[성춘향]
181 데이터 처리 ❶ 연도별 출생아 수 계산하기
1. def countBirths( ): 데이터 다운링크 https://catalog.data.gov/dataset/baby-names-
from-social-security-card-applications-national-level-data
2. ret = [ ]
3. for y in range(1880, 2015): 1번째 줄 : 연도별로 저장된 출생아 이름과 출생아 수 데이터 파일을
모두 읽고 연도별로 출생아 수만 더한 결과를 csv 파일로 저장하는
4. count = 0 함수
5. filename = 'names/yob%d.txt' %y 2번째 줄 : 튜플이 요소인 리스트로 구성될 변수
6. with open(filename, 'r') as f:
3~5번째 줄 : for문을 이용해 순차적으로 파일이름을 구성.
7. data = f.readlines( )
count는 연도별 출생아 수를 위한 변수
8. for d in data:
6~13번째 줄 : 연도별 데이터 파일을 텍스트 읽기 모드로 오픈하고
9. if d[-1] == '\n':
10. d = d[:-1] readlines( )로 모든 데이터를 읽어 data로 둠
28. print(data) 한 줄씩 기록
29. f.write(data)
183 데이터 처리 ❸ 연도별 인기있는 상위 10개 성별 출생아 이름 구하기
1. from os.path import exists
2.
3. def getTop10BabyName(year):
4. nameF = { }
5. nameM = { }
6.
7. filename = 'names/yob%s.txt' %year
8. if not exists(filename):
9. print('[%s] 파일이 존재하지 않습니다.' %filename)
10. return None
11.
12. with open(filename, 'r') as f:
13. data = f.readlines( )
14. for d in data:
15. if d[-1] == '\n':
16. d = d[:-1]
17.
18. tmp = d.split(',')
19. name = tmp[0]
20. sex = tmp[1]
21. birth = tmp[2]
22.
183 데이터 처리 ❸ 연도별 인기있는 상위 10개 성별 출생아 이름 구하기
23. if sex == 'F':
24. ret = nameF
25. else:
26. ret = nameM
27.
28. if name in ret:
29. ret[name] += int(birth)
30. else:
31. ret[name] = int(birth)
32.
33. retF = sorted(nameF.items( ), key=lambda x:x[1], reverse=True)
34. retM = sorted(nameM.items( ), key=lambda x:x[1], reverse=True)
35.
36. for i, name in enumerate(retF):
37. if i > 9:
38. break
39. print('TOP _%d 여자아기이름: %s' %(i+1, name))
40.
41. for i, name in enumerate(retM):
42. if i > 9:
43. break
44. print('TOP_%d 남자아기이름: %s' %(i+1, name))
45.
46. y = input('인기순 상위10개 이름을 알고 싶은 출생년도를 입력하세요(예:2001): ')
47. getTop10BabyName(y)
183 데이터 처리 ❸ 연도별 인기있는 상위 10개 성별 출생아 이름 구하기
1번째 줄 : os.path 모듈의 exists( )를 임포트
3번째 줄 : year에 해당하는 연도에 태어난 1위에서 10위까지 각 출생아 수와 함께 화면에 출력하는 코드
7~10번째 줄 : 함수 인자로 전달받은 year에 해당하는 데이터 파일이름을 구성. 해당 파일이 존재하는지 확인
23~26번째 줄 : sex의 값이 ‘F’이면 사전 nameF를 ret으로 두고, sex의 값이 ‘F’가 아니면 사전 nameM을 ret으로 둠
28~31번째 줄 : name이 ret의 키로 존재하면 ret[name]의 값에 birth의 정수형 값을 더하고 존재하지 않으면 name:int(birth)를 추가
[01/Oct/2016 :13 :55 :36 웹서버가 응답한 시간. +0900은 협정 세계시(UTC) 기준 +9시
5. for log in logs: +0900] 간을 의미함
“GET /apache_pb.gif
6. log = log.split( ) HTTP/1.0”
클라이언트의 요청줄(Request Line)
3~4번째 줄 : access_log를 텍스트 읽기 모드로 오픈하고 readlines( )로 로그파일의 모든 내용을 라인 단위로 읽어 리스트로 저장
9~12번째 줄 : servicebyte가 숫자로 구성되었는지 확인하고 servicebyte를 정수형으로 변환한 후 변수 servicebyte에 재지정
14~17번째 줄 : ip가 사전 services의 키로 존재하지 않으면 services에 ip:servicebyte를 새로운 요소로 추가.
19번째 줄 : for 구문을 모두 반복하면 services는 IP가 키, 해당 IP에 제공한 서비스 용량이 값인 사전으로 구성.
10번째 줄 : initGame( )에서 초기화 된 전역변수 30번째 줄 : 게임 화면의 가로 크기를 pad_width, 세로 크기를
while 루프를 빠져나올 수 있도록 해주는 플래그 31번째 줄 : 게임 화면의 타이틀 바에 ‘MyGalaga’라는 이름을 표시
13번째 줄 : ongame이 False가 될 때까지 while 루프를 반복 32번째 줄 : pygame.time.Clock( )은 초당 프레임 수를 설정할 수 있는
색상으로 채움
20번째 줄 : 게임 화면을 다시 그림
20~21번째 줄 : 전투기의 위치 x, y값
45~48번째 줄 : x값이 0보다 작아지게 되면 0으로 고정시켜서 전투기가 게임 화면 왼쪽 바깥으로 나가지 않게 하고,
반대로 x값이 게임화면의 오른쪽 끝에서 전투기 이미지의 가로 크기를 뺀 값보다 커지지 않도록 함
63번째 줄 : 이미지 파일을 읽고 이 이미지 객체를 변수 fighter에 지정. 인자로 지정된 이미지 파일을 읽어 이를 처리할 수 있는 핸들러 객체를 리턴
190 간단한 슈팅게임 만들기 ❸ 적 날아오게 하기
1. import pygame
2. import random
3.
4. # 게임에 사용되는 전역변수 정의
5. BLACK = (0, 0, 0)
6. pad_width = 480
7. pad_height = 640
8. fight _width = 36
9. fight _height = 38
10. enemy_width = 26
11. enemy_height = 20
12.
13. # 게임에 등장하는 객체를 드로잉
14. def drawObject(obj, x, y):
15. global gamepad
16. gamepad.blit(obj, (x,y))
17.
18. # 게임 실행 메인 함수
19. def runGame( ):
20. global gamepad, clock, fighter, enemy
21.
22. # 전투기 초기 위치 설정
23. x = pad _width*0.45
24. y = pad _height*0.9
25. x_change = 0
26.
27. # 적 초기 위치 설정
28. enemy_x = random.randrange(0, pad_width-enemy_width)
29. enemy_y = 0
190 간단한 슈팅게임 만들기 ❸ 적 날아오게 하기
30. enemy_speed = 3
31.
32. ongame = False
33. while not ongame:
34. for event in pygame.event.get( ):
35. if event.type == pygame.QUIT:
36. ongame = True
37.
38. if event.type == pygame.KEYDOWN:
39. if event.key == pygame.K_LEFT:
40. x_change -= 5
41.
42. elif event.key == pygame.K_RIGHT:
43. x_change += 5
44.
45. if event.type == pygame.KEYUP:
46. if event.key == pygame.K _LEFT or event.key == pygame.K_RIGHT:
47. x_change = 0
48.
49. gamepad.fill(BLACK)
50.
51. # 전투기의 위치 재조정
52. x += x _change
53. if x < 0:
54. x=0
55. elif x > pad _width - fight_width:
56. x = pad _width - fight_width
57.
58. drawObject(fighter, x, y)
190 간단한 슈팅게임 만들기 ❸ 적 날아오게 하기
60. # 적을 아래로 움직임
61. enemy_y += enemy_speed
62. if enemy_y > pad_height:
63. enemy_y = 0
64. enemy_x = random.randrange(0, pad_width-enemy_width)
65.
66. drawObject(enemy, enemy_x, enemy_y)
67.
68. pygame.display.update( )
69. clock.tick(60)
70.
71. pygame.quit( )
72.
73. # 게임 초기화 함수
74. def initGame( ):
75. global gamepad, clock, fighter, enemy
76.
77. pygame.init( )
78. gamepad = pygame.display.set_mode((pad_width, pad_height))
79. pygame.display.set _caption('MyGalaga')
80. fighter = pygame.image.load('fighter.png')
81. enemy = pygame.image.load('enemy.png')
82. clock = pygame.time.Clock( )
83.
84. initGame( )
85. runGame( )
190 간단한 슈팅게임 만들기 ❸ 적 날아오게 하기
10~11번째 줄 : 적 이미지의 가로, 세로 크기를 각각 지정
179: pygame.init( )
181: pygame.display.set_caption('MyGalaga')
186:
187: initGame( )
188: runGame( )
192 간단한 슈팅게임 만들기 ❺ 게임규칙 적용하기
3번째 줄 : time 모듈의 sleep( )을 임포트
23~27번째 줄 : count에 해당하는 숫자를 게임 화면의 오른쪽 상단에 폰트 크기 20의 빨간색 글씨로 나타내는 함수
30~38번째 줄 : text를 폰트 크기 80의 빨간색 글씨로 게임화면 정중앙에 표시하고 2초 이후 runGame( )을 호출하여 게임을 재시작하는 함수
127~131번째 줄 : 전투기 무기가 적을 격추했으면 bullet_xy에서 격추한 무기 좌표를 제거하여 화면에서 무기가 사라지게 함
네트워크 소켓의 종류
socketserver.TCPServer 클래스
TCP 프로토콜을 사용하는 서버를 구현할 때 활용하는 socketserver의 클래스입니다.
socketserver.UDPServer 클래스
UDP 프로토콜을 사용하는 서버를 구현할 때 활용하는 socketserver의 클래스입니다.
6번째 줄 : socketserver.BaseRequestHandler 클래스를 상속받은 클래스이며, socketserver. TCPServer 객체를 생성할 때 인자로 입력됨
14~15번째 줄 : 클라이언트가 요청한 파일이 서버가 구동되는 디렉터리에 존재하지 않으면 handle( )을 빠져나옴
17~25번째 줄 : 전송을 시작한다는 메시지를 출력하고 해당 파일을 오픈한 후 1024바이트씩 읽어 클라이언트로 데이터를 전송
13~16번째 줄 : 서버로부터 1024바이트만큼 수신한 데이터를 data로 둠. 수신되는 데이터가 없으면 오류 메시지를 출력하고 리턴
18~25번째 줄 : download 디렉터리에 filename으로 지정된 파일을 바이너리 쓰기 모드로 오픈하고 파일 핸들러를 f로 둠
13~15번째 줄 : self.users의 키로 username이 존재하면 이미 등록된 사용자라는 메시지를 클라이언트로 전송하고 None을 리턴
22~25번째 줄 : 채팅 서버에 접속한 모든 클라이언트에 새로운 사용자가 입장하였다는 메시지를 전송하고 사용자 수를 출력
59번째 줄 : registerUsername( )을 호출하여 사용자 ID를 클라이언트로 요청하여 전달받고 사용자를 채팅 서버에 등록하는 과정을 수행
60~66번째 줄 : 클라이언트로부터 메시지를 수신하여 msg로 지정. msg에 내용이 있으면 서버 화면에 메시지를 출력.
71~72번째 줄 : while 구문을 빠져나오면 해당 클라이언트가 접속 종료되었다는 메시지를 서버 화면에 출력하고 사용자 ID를 제거
75~80번째 줄 : 클라이언트가 최초 접속하면 로그인 ID를 요청하는 메시지를 클라이언트로 전송. 좌우 공백을 username.strip( )
89~95번째 줄 : ChatingServer 클래스를 이용해 서버 객체를 생성. 사용자가 Ctrl+ C 를 누르면 서버를 셧다운하고 종료
7번째 줄 : rcvMsg(sock)은 runChat( )에서 스레드로 구동되며 채팅 서버로부터 메시지를 수신받아 출력. sock은 채팅 서버와 연결된 TCP 소켓
8번째 줄 : 무한 루프
17번째 줄 : runChat( )은 소켓을 생성하고 채팅 서버에 연결한 후 rcvMsg( )를 스레드로 구동하고 사용자로부터 메시지를 입력받아
채팅 서버로 전송하는 함수
20번째 줄 : rcvMsg( ) 함수를 독립적으로 실행 가능한 스레드로 만들고, 함수 인자로 sock을 넘겨줌