* 출판사 문의 결과 11번 문제에 이상이 있어 다음 쇄부터 문제 자체를 뺀다고 합니다.

 

연습문제

1. 객체지향과 관련된 설명입니다. 거리가 가장 먼 것을 하나 고르세요.

① 자바, C++ 등에서도 사용되는 개념이다.

② 클래스라는 핵심적인 단어를 사용한다.

속성은 색상, 속도 등 자동차의 상태를 표현한다.

기능은 변수 형태로 표현한다.

 

더보기

답 : 4

해설 : 기능은 메서드로 구현되며 객체의 상태를 나타내는 속성을 변수 형태로 표현한다.

 

2. 다음은 자동차의 클래스로 만든 코드입니다. 메소드에서 틀린 부분 2곳을 찾아서 맞게 고치세요.

class Car :
	color = ""
    speed = 0
    
    def upSpeed(value) :
    	speed += value

 

더보기

답 :

class Car :
	color = ""
    speed = 0
    
    def upSpeed(self, value) :
    	self.speed += value

 

 

3. 다음은 생성자에 대한 설명입니다. 거리가 먼 것을 모두 고르세요.

① 인스턴스가 생성되면 자동으로 호출되는 메서드이다.

② 생성자의 이름은 __initilaize()__로 사용한다.

생성자는 반드시 클래스 안에 1개 이상 코드로 작성해야 한다.

생성자는 여러 개 만들 수 있다.

 

더보기

답 : 2, 3

해설 : 2번 생성자의 이름은 __init__로 사용한다.

3번 생성자는 클래스 안에 작성하지 않아도 기본 생성자가 호출된다.

 

4. 속도를 50으로 초기화하는 클래스의 생성자 코드입니다. 빈칸을 채우세요.

class Horse :
	speed = 0
    [
    
                     ]

 

더보기

답 :

def __init__(self) :
	self.speed = 50

 

5. 인스턴스 변수와 클래스 변수에 대한 설명입니다. 거리가 먼 것을 모두 고르세요.

① 클래스 변수를 선언할 때는 static을 앞에 붙인다.

② 인스턴스 변수와 클래스 변수는 선언하는 시점에는 구분할 수 없다.

인스턴스 변수는 'self.변수명' 형식으로 사용한다.

클래스 변수는 아무 것도 붙이지 않고 '변수명' 형식으로 사용한다.

 

더보기

답 :  1, 4

해설 : 1번 클래스 변수를 선언할 때는 static을 앞에 붙이지 않아도 된다.

4번 클래스 변수는 '클래스명.클래스변수명', '인스턴스명.클래스변수명' 형식으로 사용한다. 

 

6. 다음은 클래스의 상속과 관련된 코드입니다. 코드의 실행 결과를 고르세요.

class Car :
    def method(self) :
        print("슈퍼 클래스")

class Sedan(Car) :
    def method(self) :
        print("서브 클래스")
    
myCar = Car()
mySedan = Sedan()
myCar.method()
mySedan.method()

① 서브 클래스

② 슈퍼 클래스

③ 슈퍼 클래스 서브 클래스

④ 서브 클래스 슈퍼 클래스

 

더보기

답 : 3

 

7. Car의 상속을 받는 RVCar 클래스를 정의하는 코드입니다. 빈칸을 채우세요.

class Car :
	speed = 0
    
    def upSpeed(self, value) :
        self.speed = self.speed + value

[          ] :
    seatNum = 0
    
    def getSeatNum(self) :
        return self.seatNum

 

더보기

답 : class RVCar(Car)

 

8. super( ) 메서드에 대한 설명입니다. 가장 옳은 설명을 고르세요.

① 클래스 메서드와 관련된다.

② 오버라이딩된 메서드에서 슈퍼 클래스의 메서드를 호출할 때 사용한다.

③ 'super.메서드( )' 형식으로 슈퍼 클래스의 메서드를 사용한다.

④ 'super.속성' 형식으로 슈퍼 클래스의 속성을 사용한다.

 

더보기

답 : 2번

해설 : 1번 super() 메서드는 클래스 메서드와 직접적인 관련이 없으며, 주로 상속 관계에서 부모 클래스의 메서드를 호출하는 용도로 사용된다.

3번  'super( ).메서드( )' 형식으로 슈퍼 클래스의 메서드를 사용한다.

4번 'super( ).속성' 형식으로 슈퍼 클래스의 속성을 사용한다.

 

9. 다음 각 설명을 보기 중에서 고르세요.

__repr__(), __le__(), __add__(), __del__(), __lt__(), __gt__(), __ge__(), __eq__(), __ne__()

(1) 인스턴스 사이의 비교 연산자(!=)가 사용될 때 호출되는 메서드다.

(2) 소멸자라고 부르며 인스턴스가 제거될 때는 자동으로 호출된다.

(3) 인스턴스 사이의 덧셈 작업이 일어나면 실행되는 메서드다.

(4) 인스턴스를 print( ) 함수를 이용해 출력할 때 실행되는 메서드다.

(5) 인스턴스 사이의 비교 연산자(<=)가 사용될 때 호출되는 메서드다.

 

더보기

답 : (1) __ne__(), (2) __del__(), (3) __add__(), (4) __repr__(), (5) __le__()

 

10. 다음은 파이썬의 추상 메서드를 위한 코드입니다. 빈칸에 들어갈 것을 고르세요.

class SuperClass :
    def method(self) :
        [          ]

class SubClass(SuperClass) :
    pass

sub = SubClass()
sub.method()

① raise ImplementedError( )

raise NotImplemented( )

raise Implemented( )

raise NotImplementedError( )

 

더보기

답 : 4

 

11. 다음 멀티 프로세싱 코드의 빈 부분을 채우세요.

import multiprocessing
import time

class RunningHorse :
    horseName = ''
    def  __init__(self, name) :
        self.horseName = name

    def runHorse(self) :
        for _ in range(0, 3) :
            horseStr = self.horseName + '~~ 달립니다.\n'
            print(horseStr, end = '')
            time.sleep(0.1) # 0.1초 멈춤

## 메인 코드 부분 ##
if __name__ == "__main__" :
    horse1 = [     ①     ]('@얼룩말')
    horse2 = [     ②     ]('#조랑말')

    mp1 = [     ③     ](target = horse1.runHorse)
    mp2 = [     ④     ](target = horse2.runHorse)

    mp1.start()
    mp2.start()

    mp1.join()
    mp2.join()

 

더보기

답 : RunningHorse, ② RunningHorse, ③ multiprocessing.Process, ④ multiprocessing.Process

 

12. 다음은 멀티 스레드를 위한 코드입니다. 빈칸에 들어갈 코드를 채우세요.

import threading
import time

class RunningHorse :
    horseName = ''
    def  __init__(self, name) :
        self.horseName = name
    def runHorse(self) :
        for _ in range(0, 3) :
            print(self.horseName)
            time.sleep(0.1)

horse1 = [     ①     ]('@얼룩말')
horse2 = [     ①     ]('#조랑말')
thead1 = threading.Thread(target = horse1.[     ②     ])
thead2 = threading.Thread(target = horse2.[     ②     ])
thead1.[     ③     ]()
thead2.[     ③     ]()

 

더보기

답 : RunningHorse, runHorse, start

 

13. [응용예제 02]를 수정해서 <Delete> 키를 누르면 마지막 원부터 제거되고, <BackSpace> 키를 누르면 마지막 사각형부터 제거되도록 하세요.

힌트 Backspace 키의 이벤트는 <BackSpace>이고, Delete 키의 이벤트는 <Delete>다

더보기

답 :

from tkinter import *
import math
import random


## 클래스 선언
class Shape:  # 슈퍼 클래스
    color, width = '', 0
    shX1, shY1, shX2, shY2 = [0] * 4  # 도형을 포함하는 두 점

    def drawShape(self):  # 추상 메소드
        raise NotImplementedError()


class Rectangle(Shape):  # 서브 클래스
    objects = None  # 사각형 선분 리스트

    def __init__(self, x1, y1, x2, y2, c, w):
        self.shX1 = x1
        self.shY1 = y1
        self.shX2 = x2
        self.shY2 = y2
        self.color = c
        self.width = w
        self.drawShape()

    def __del__(self):  # 사각형의 4개 선분을 제거함
        for obj in self.objects:
            canvas.delete(obj)

    def drawShape(self):  # 네모 그리기로 재정의
        sx1 = self.shX1;
        sy1 = self.shY1;
        sx2 = self.shX2;
        sy2 = self.shY2
        squreList = []
        squreList.append(canvas.create_line(sx1, sy1, sx1, sy2, fill=self.color, width=self.width))
        squreList.append(canvas.create_line(sx1, sy2, sx2, sy2, fill=self.color, width=self.width))
        squreList.append(canvas.create_line(sx2, sy2, sx2, sy1, fill=self.color, width=self.width))
        squreList.append(canvas.create_line(sx2, sy1, sx1, sy1, fill=self.color, width=self.width))
        self.objects = squreList  # 선분 리스트(=사각형)을 objects에 넣음.


class Circle(Shape):  # 서브 클래스
    objects = None

    def __init__(self, x1, y1, x2, y2, c, w):
        self.shX1 = x1
        self.shY1 = y1
        self.shX2 = x2
        self.shY2 = y2
        self.color = c
        self.width = w
        self.drawShape()

    def __del__(self):  # 원은 객체 1개만 제거
        canvas.delete(self.objects)

    def drawShape(self):  # 원형 그리기로 재정의
        sx1 = self.shX1;
        sy1 = self.shY1;
        sx2 = self.shX2;
        sy2 = self.shY2
        self.objects = canvas.create_oval(sx1, sy1, sx2, sy2, outline=self.color, width=self.width)


## 함수 정의 부분
def getColor():  # 임의의 색상 선택
    r = random.randrange(16, 256)  # 16진수로 변환시 0~A는 제외
    g = random.randrange(16, 256)
    b = random.randrange(16, 256)
    return "#" + hex(r)[2:] + hex(g)[2:] + hex(b)[2:]  # '#rrggbb' 형태로 만듬


def getWidth():  # 임의의 펜 두께 선택
    return random.randrange(1, 9)


## 이벤트 함수 정의 부분
def startDrawRect(event):
    global x1, y1, x2, y2, shapes
    x1 = event.x
    y1 = event.y


def endDrawRect(event):
    global x1, y1, x2, y2, shapes
    x2 = event.x
    y2 = event.y
    rect = Rectangle(x1, y1, x2, y2, getColor(), getWidth())  # 사각형 생성
    shapes.append(rect)  # 전체 도형 리스트에 추가


def startDrawCircle(event):
    global x1, y1, x2, y2, shapes
    x1 = event.x
    y1 = event.y


def endDrawCircle(event):
    global x1, y1, x2, y2, shapes
    x2 = event.x
    y2 = event.y
    cir = Circle(x1, y1, x2, y2, getColor(), getWidth())  # 원 생성
    shapes.append(cir)  # 전체 도형 리스트에 추가


def deleteObject(event, objType):  # 마지막 그린 원제거
    global shapes
    if len(shapes) != 0:  # 화면에 도형이 있으면 마지막 도형 제거
        for i in range(len(shapes) - 1, -1, -1):
            strObj = str(shapes[i])
            if strObj.find(objType) != -1:  # 원 또는 사각형 객체 확인
                del (shapes[i])
                break


def deleteCircle(event, objType):  # 마지막 그린 원제거
    global shapes
    if len(shapes) != 0:  # 화면에 도형이 있으면 마지막 도형 제거
        for i in range(len(shapes) - 1, -1, -1):
            strObj = str(shapes[i])
            if strObj.find(objType) != -1:  # 원 객체 확인
                del (shapes[i])
                break


def deleteRectangle(event, objType):  # 마지막 그린 사각형 제거
    global shapes
    if len(shapes) != 0:  # 화면에 도형이 있으면 마지막 도형 제거
        for i in range(len(shapes) - 1, -1, -1):
            strObj = str(shapes[i])
            if strObj.find(objType) != -1:  # 사각형 객체 확인
                del (shapes[i])
                break


## 전역  변수 선언
shapes = []  # 화면에 그려진 전체 도형 리스트
window = None
canvas = None
x1, y1, x2, y2 = None, None, None, None  # 클릭한 두 지점의 X, Y

## 메인 코드 부분 ##
if __name__ == "__main__":
    window = Tk()
    window.title("연습 문제")
    canvas = Canvas(window, height=300, width=300)

    window.bind("<Delete>", lambda event: deleteCircle(event, 'Circle'))
    window.bind("<BackSpace>", lambda event: deleteRectangle(event, 'Rectangle'))

    canvas.bind("<Button-1>", startDrawRect)
    canvas.bind("<ButtonRelease-1>", endDrawRect)

    canvas.bind("<Button-3>", startDrawCircle)
    canvas.bind("<ButtonRelease-3>", endDrawCircle)

    canvas.pack()
    window.mainloop()

 

 

*주의사항 : 제가 직접 푼 것이므로 틀린 부분이 있을 수 있습니다. 오타나 틀린 부분 지적 환영!

연습문제

1. 다음 보기를 입력과 관련된 함수와 출력과 관련된 함수로 분류하세요.

input(), print(), write(), read(), readline(), writeline(), readlines()

 

더보기

답 :

입력과 관련된 함수 : input(), read(), readline(), readlines()

출력과 관련된 함수 : print(), write(), writeline()

 

2. 다음은 파일의 처리단계입니다. 순서대로 나열한 것이 맞는 것을 고르세요.

A. 파일 열기
B. 파일 쓰기
C. 파일 읽기
D. 파일 닫기

① A -> C -> B -> D

A -> C -> D -> B

D -> C -> B -> A

A -> D -> B -> C

 

더보기

답 : 1

 

3. 파일의 열기 모드에 대한 설명입니다. 거리가 먼 것을 모두 고르세요.

① 생략하면 쓰기 모드가 기본으로 설정된다.

② r+는 읽기/쓰기 겸용 모드다

a는 쓰기 모드이다. 기존 파일이 있으면 삭제하고 새로 만든다.

④ t는 텍스트 모드다.

b는 이진 파일 모드다.

⑥ tb는 텍스트 파일 겸 이진 파일 모드 공용이다.

 

더보기

답 : 1, 3, 6

해설 : 1번 생략하면 읽기 모드가 기본으로 설정된다. 3번 기존 파일을 삭제하지 않고 파일 끝에 이어서 쓴다. 6번 tb는 없는 모드이다.

 

4. 다음은 data1.txt 파일에서 1개 행만 읽어서 출력하는 코드입니다. 빈칸을 채우세요.

inFp = [     ①     ]("C:/Temp/data1.txt", "r")

inStr = inFp.[     ②     ]()
print(inStr, end = "")

inFp.[     ③     ]()

 

더보기

답 : ① open, ② readline, ③ close

 

5. 파일이 있는지 확인하는 함수를 다음 중에서 고르세요.

① os.path.file(파일명)

os.path.isfile(파일명)

os.path.place(파일명)

os.path.exists(파일명)

 

더보기

답 : 4

 

6. 다음은 파일을 복사하는 코드입니다. 빈칸을 채우세요.

inFp = open("C:/Windows/win.ini", "r")
outFp = open("C:/Temp/data3.txt", "w")

inList = [     ①     ]
for inStr in inList :
    [     ②     ]

inFp.close()
outFp.close()

 

더보기

답 : inFp.readlines(), outFp.writelines(inStr)

 

7. 글자에 대응하는 고유한 숫자를 알려주는 함수와 숫자에 해당하는 글자를 알려주는 함수의 짝으로 옳은 것을 고르세요.

① number( ), char( )

order( ), character( )

ocp( ), ch( )

ord( ), chr( )

 

더보기

답 : 4

 

8. 각 설명에 맞는 os, os.path, shutil 모듈의 함수를 쓰세요.

(1) 파일 복사

(2) 디렉터리 복사

(3) 디렉터리 생성

(4) 디렉터리 삭제

(5) 폴더 여부 확인

(6) 파일 삭제

 

더보기

답 : (1) shutil.copy, (2) shutil.copytree, (3) os.mkdir, (4) shutil.rmtree, (5) os.path.isdir, (6) os.remove

 

9. 다음 각 함수의 의미를 보기에서 고르세요.

파일 복사, 디렉터리 복사, 디렉터리 생성, 디렉터리 삭제, 폴더여부 확인, 파일 삭제

(1) shutil.rmtree( )

(2) os.path.isdir( )

(3) os.remove( )

(4) shutil.copy( )

(5) shutil.copytree( )

(6) os.mkdir( )

 

더보기

답 : (1) 디렉터리 삭제, (2) 폴더여부 확인, (3) 파일 삭제, (4) 파일 복사, (5) 디렉터리 복사, (6) 디렉터리 생성

 

10. try~except 문에서 사용하는 예외 종류를 설명한 것입니다. 예외를 쓰세요.

(1) 존재하지 않는 변수에 접근할 때

(2) 파일 처리에서 오류가 발생할 때

(3) 실행에서 오류가 발생할 때

(4) 딕셔너리에 키가 없을 때

 

더보기

답 : (1) NameError, (2) IOError, (3) RuntimeError, (4) KeyError

 

11. 다음은 파일이 없을 때 또는 0으로 나눌 때 예외 처리를 하는 코드입니다. 빈칸을 채우세요.

try :
	infp = open("c:/nofile", "r")
    value = 100 / 0
[     ①     ]:
	print("파일 입출력 오류 입니다.")
{     ②     ]:
	print("0으로 나눴습니다.")
    
print("프로그램 종료!")

 

더보기

답 : ① except IOError, ② except ZeroDivisionError

 

12. [응용예제 02]를 수정해서 다음의 기능을 구현하세요.

 ·마우스 왼쪽 버튼을 누르면 10씩 화면이 밝아진다.

 ·마우스 오른쪽 버튼을 누르면 10씩 화면이 어두워진다.

 ·마우스 가운데 버튼을 누르면 화면이 반전된다. (또 누르면 원래 화면)

 

더보기

답 :

from tkinter import *
from tkinter.filedialog import *
from tkinter.simpledialog import *
import os.path
import math

## 함수 선언 부분 ##
def  loadImage(fname) :
    global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename

    inImage=[]
    fsize = os.path.getsize(fname)              # 파일의 크기
    XSIZE = YSIZE = int(math.sqrt(fsize))      # 정방형으로 가정하고 크기 구함
    
    fp = open(fname, 'rb')   

    for i in range(0, XSIZE) :
        tmpList = []
        for k in range(0, YSIZE) :
            data = int(ord(fp.read(1)))
            tmpList.append(data)
        inImage.append(tmpList)

    fp.close()

def displayImage(image) :
    global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename
    rgbString = ""
    for i in range(0, XSIZE) :
        tmpString = ""
        for k in range(0, YSIZE) :
            data = image[i][k]
            tmpString += "#%02x%02x%02x " % (data, data, data) # x 뒤에 한칸 공백
        rgbString += "{" + tmpString +  "} " # } 뒤에 한칸 공백
    paper.put(rgbString)

def func_open() :
    global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename

    filename = askopenfilename(parent = window, filetypes = (("RAW 파일", "*.raw"),  ("모든 파일", "*.*")))
    if filename == '' : # 대화상자에서 취소를 눌렀으면
        return
    
    if canvas != None : # 기존에 열린 적이 있으면 제거
        canvas.destroy()

     # 파일 --> 메모리
    loadImage(filename)
    
    window.geometry(str(XSIZE) + 'x' + str(YSIZE)) # 윈도창 크기
    canvas = Canvas(window, height = XSIZE, width = YSIZE)
    paper = PhotoImage(width = XSIZE, height = YSIZE)
    canvas.create_image( (XSIZE / 2, YSIZE / 2), image = paper, state = "normal")
   
    # 메모리 --> 화면 
    displayImage(inImage)
    
    canvas.pack()

def func_exit() :
    window.quit()
    window.destroy()

def brightPhoto(event) :
    global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename, addValue
    addValue += 10

    for i  in range(0, XSIZE) :
        for k in range(0, YSIZE) :
            data = inImage[i][k] + addValue
            if  data > 255 :
                newData = 255
            elif data < 0 :
                newData = 0
            else :
                newData = data
            inImage[i][k] = newData

    displayImage(inImage)

def darkPhoto(event) :
    global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename, addValue
    addValue -= 10
    for i in range(0, XSIZE) :
        for k in range(0, YSIZE) :
            data = inImage[i][k] + addValue
            if  data > 255 :
                newData = 255
            elif data < 0 :
                newData = 0
            else :
                newData = data
            inImage[i][k] = newData

    displayImage(inImage)

def reversePhoto(event) :
    global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename

    for  i  in  range(0, XSIZE) :
        for  k  in  range(0, YSIZE) :
            data = inImage[i][k]
            newData = 255 - data
            inImage[i][k] = newData

    displayImage(inImage)

## 전역 변수 선언 부분 ##
window = None
canvas = None
XSIZE, YSIZE=0, 0
inImage = []    # 2차원 리스트 (메모리)
filename = '' # 파일이름 (전역 변수)
addValue = 0

## 메인 코드 부분 ##
if __name__ == "__main__" :
    window=Tk()
    window.title("연습문제")

    # 메뉴 추가
    mainMenu = Menu(window)
    window.config(menu=mainMenu)
    fileMenu = Menu(mainMenu)
    mainMenu.add_cascade(label="파일", menu=fileMenu)
    fileMenu.add_command(label="파일 열기", command=func_open)
    fileMenu.add_separator()
    fileMenu.add_command(label="프로그램 종료", command=func_exit)

    window.bind("<Button-1>", brightPhoto)
    window.bind("<Button-2>", reversePhoto)
    window.bind("<Button-3>", darkPhoto)

    window.mainloop()

 

 

*주의사항 : 제가 직접 푼 것이므로 틀린 부분이 있을 수 있습니다. 오타나 틀린 부분 지적 환영!

*Self Study는 공식홈페이지 자료실에 답이 나와있기 때문에 이번 글부터 따로 개시 하지 않겠습니다. 

 

연습문제

1. 다음 그림과 같은 윈도창이 나오는 코드입니다. 빈 부분을 보기에서 고르세요.

input, resizable, button, size, geometry, mainloop, title, pack, print, view
from tkinter import *

window = Tk()
window.[     ①     ]("연습 문제")
window.[     ②     ]("400x100")
window.[     ③     ](width = FALSE, height = FALSE)

label1 = Label(window, text = "COOKBOOK~~ Python을 학습중…", font = ("궁서체", 15), fg = "red")
label1.[     ④     ]();

window.[     ⑤     ]()

 

더보기

답 : ① title, ② geometry, ③ resizable, ④ pack, ⑤ mainloop

 

2. 다음은 버튼을 누르면 작동하는 코드입니다. 코드의 빈 부분에 들어갈 것을 고르세요.

*2번과 4번 항목 오탈자

from tkinter import *
from tkinter import messagebox

def click_button() :
	messagebox.showinfo("버튼", "버튼을 눌렀어요.")

window = Tk()
button1 = Button(window, text = "여기를 클릭", [          ])
button1.pack();

window.mainloop()

① command = click_button( )

② execute = click_button( )

command = click_button

execute = click_button( )

 

더보기

답 : 3번

 

3. 다음은 라디오 버튼 중 어떤 것을 클릭했는지 알려주는 코드입니다. 빈 부분에 들어갈 내용을 채우세요.

from tkinter import *
window = Tk()

def rdo_change() :
	if [     ①     ] == 1 :
		label1.configure(text = "벤츠")
	else :
		label1.configure(text = "포르쉐")
        
var = [     ②     ]
rdo1 = Radiobutton(window, text = "벤츠", variable = [     ③     ], value = 1, 이후 생략…)
rdo2 = Radiobutton(window, text = "포르쉐", variable = [     ③     ], value = 2, 이후 생략…)
label1 = Label(window, text = "선택한 차량", fg = "red")

rdo1.pack()
rdo2.pack()
label1.pack()

window.mainloop()

 

더보기

답 : ① var.get(), ② IntVar(), ③ var

 

4. 코드를 실행하면 다음 각 항에 해당하는 결과가 나오기 위해서 빈 곳에 무엇을 채워야 할지 쓰세요. (빈 칸 3곳이 모두 동일한 내용임)

from tkinter import *
window = Tk()

button1 = Button(window, text = "버튼1")
button2 = Button(window, text = "버튼2")
button3 = Button(window, text = "버튼3")

button1.pack(side = [          ])
button2.pack(side = [          ])
button3.pack(side = [          ])

window.mainloop()

(1)

(2)

(3)

(4)

더보기

답 : (1) LEFT, (2) RIGHT, (3) TOP, (4) BOTTOM

 

5. 다음은 <이전>, <다음> 버튼을 클릭하면 배열(9개 문자열)의 내용으로 글자가 바뀌는 코드입니다. 빈 부분을 채우세요. 단, 마지막 글자에서 <다음>을 클릭하면 다시 첫 번째 글자가, 첫 번째 글자에서 <이전>을 클릭하면 마지막 글자가 나오도록 하세요.

from tkinter import *
from time import *

fnameList = ["jeju1.gif", "jeju2.gif", "jeju3.gif", "jeju4.gif", "jeju5.gif", "jeju6.gif", "jeju7.gif", "jeju8.gif", "jeju9.gif"]
num = 0

def clickNext() :
    global num
         
         ①     
         
    pLabel.configure(text = fnameList[num])
    
def clickPrev() :
    global num
    
         ①
         
    pLabel.configure(text = fnameList[num])
    
window = Tk()
window.geometry("700x100")
btnPrev = Button(window, text = "<< 이전", command = clickPrev)
btnNext = Button(window, text = "다음 >>", command = clickNext)
pLabel = Label(window, text = "파일명", font = ("궁서체", 20), fg = "blue")
btnPrev.place(x = 150, y = 10)
btnNext.place(x = 500, y = 10)
pLabel.place(x = 300, y = 10)
window.mainloop()

 

더보기

답 :

num += 1
ifnum > 8 :
	num = 0
num -= 1
if num > 0 :
	num = 8

 

6. 다음은 마우스 이벤트 코드와 설명의 짝입니다. 거리가 먼 것을 모두 고르세요.

① <Button> : 모든 버튼의 공통 클릭할 때

<Button-2> : 오른쪽 버튼을 클릭할 때

<ButtonRelease-1> : 왼쪽 버튼을 떼었을 때

<ButtonDouble-1> : 왼쪽 버튼을 더블클릭할 때

<ButtonDrag-1> : 왼쪽 버튼을 드래그할 때

<Enter> : 위젯 위로 마우스 커서가 올라갈 때

 

더보기

답 : 2, 4, 5

해설 : 2번 가운데 버튼을 클릭할 때, 4번 <Double-Button-1>, 5번 <B1-Motion>

 

7. 다음은 마우스를 클릭하면 마우스의 클릭한 좌표가 메시지창으로 나오는 코드입니다. 빈 부분에 들어갈 코드를 고르세요.

 

from tkinter import *

def clickMouse(event) :
	


window = Tk()
window.geometry("400x400")
label1 = Label(window, text = "이곳이 바뀜")
window.bind("<Button>", clickMouse)
label1.pack(expand = 1, anchor = CENTER)
window.mainloop()

① txt = str(event.y) + "," + str(event.x) + "에서 클릭됨"
    window.configure(text = txt)

txt = str(mouse.y) + "," + str(mouse.x) + "에서 클릭됨"
    label1.configure(text = txt)

txt = str(event.y) + "," + str(event.x) + "에서 클릭됨"
    label1.configure(text = txt)

txt = str(event.y) + "," + str(event.x) + "에서 클릭됨"
    label1.chage(text = txt)

 

더보기

답 : 3

 

8. 다음 중 키보드 이벤트의 키가 아닌 것을 하나 고르세요.

① <Enter>

② <BackSpace>

③ <Tab>

④ <Shift_L>

<Escape>

<End>

 

더보기

답 : 1

 

9. 그림과 같은 메뉴가 나오도록 코드의 빈 부분을 채우세요.

from tkinter import *
window = Tk()
totalMenu = Menu(window)
window.config(menu = totalMenu)
upMenu = Menu(totalMenu)



window.mainloop()

 

더보기

답 :

totalMenu.add_cascade(label = "상위 메뉴", menu = upMenu)
upMenu.add_command(label = "하위메뉴1")
upMenu.add_separator()
upMenu.add_command(label = "하위메뉴2")

 

10. [프로그램 2]에 화살표 위쪽 키를 누르면 확대되고, 화살표 아래쪽 키를 누르면 축소되는 기능을 추가하세요.

힌트 PhotoImage의 확대 및 축소는 다음과 같이 함수를 활용한다.

photo = photo.zoom(확대배수, 확대배수) # 확대
photo = photo.subsample(축소배수, 축소배수) # 축소

 

 

 

더보기

답 :

from tkinter import *
from tkinter.filedialog import *

## 함수 선언 부분 ##
def func_open() :
    global photo
    filename = askopenfilename(parent = window, filetypes = (("GIF 파일", "*.gif"), ("모든 파일", "*.*")))
    photo = PhotoImage(file = filename)
    pLabel.configure(image = photo)
    pLabel.image = photo

def func_exit() :
    window.quit()
    window.destroy()

def func_zs(event) :
    if event.keycode == 38 :
        zoomphoto = photo.zoom(2, 2) # 확대
        pLabel.configure(image = zoomphoto)
        pLabel.image = zoomphoto
    elif event.keycode == 40 :
        subsamplephoto = photo.subsample(2, 2) # 축소
        pLabel.configure(image = subsamplephoto)
        pLabel.image = subsamplephoto

## 메인 코드 부분 ##
window = Tk()
window.geometry("500x500")
window.title("명화 감상하기")

photo = PhotoImage()
pLabel = Label(window, image = photo)
pLabel.pack(expand = 1, anchor = CENTER)

mainMenu = Menu(window)
window.config(menu = mainMenu)
fileMenu = Menu(mainMenu)
mainMenu.add_cascade(label = "파일", menu = fileMenu)
fileMenu.add_command(label = "파일 열기", command = func_open)
fileMenu.add_separator()
fileMenu.add_command(label = "프로그램 종료", command = func_exit)

window.bind("<Up>", func_zs)
window.bind("<Down>", func_zs)

window.mainloop()

 

 

*주의사항 : 제가 직접 푼 것이므로 틀린 부분이 있을 수 있습니다. 오타나 틀린 부분 지적 환영!

Self Study

9-1 Code09-03.py를 수정해서 커피 종류를 아메리카노, 카페라떼, 카푸치노, 에스프레소 중 하나를 선택할 수 있도록 하자. 그리고 로제, 리사, 지수, 제니라는 손님 4명의 주문을 받아 보자.

출력 결과
로제씨, 어떤 커피 드릴까요?(1:아메리카노, 2:카페라떼, 3:카푸치노, 4:에스프레소) 4
#1. (자동으로) 뜨거운 물을 준비한다.
#2. (자동으로) 종이컵을 준비한다.
#3. (자동으로) 에스프레소를 탄다.
#4. (자동으로) 물을 붓는다.
#5. (자동으로) 스푼으로 젓는다.
로제씨~ 커피 여기 있습니다.
… 생략 …

 

더보기

답 :

## 전역 변수 선언 부분 ##
coffee = 0

## 함수 선언 부분 ##
def coffee_machine(button) :
    print()
    print("#1. (자동으로) 뜨거운 물을 준비한다.");
    print("#2. (자동으로) 종이컵을 준비한다.");

    if coffee == 1 :
        print("#3. (자동으로) 아메리카노를 탄다.")
    elif coffee == 2 :
        print("#3. (자동으로) 카페라떼를 탄다.")
    elif coffee == 3 :
        print("#3. (자동으로) 카푸치노를 탄다.")
    else :
        print("#3. (자동으로) 에스프레소를 탄다.")

    print("#4. (자동으로) 물을 붓는다.");
    print("#5. (자동으로) 스푼으로 젓는다.");
    print()
        
## 메인 코드 부분 ##
coffee = int(input("로제씨, 어떤 커피 드릴까요?(1:아메리카노, 2:카페라떼, 3:카푸치노, 4:에스프레소)"))
coffee_machine(coffee)
print("로제씨~ 커피 여기 있습니다.")

coffee = int(input("리사씨, 어떤 커피 드릴까요?(1:아메리카노, 2:카페라떼, 3:카푸치노, 4:에스프레소)"))
coffee_machine(coffee)
print("리사씨~ 커피 여기 있습니다.")

coffee = int(input("지수씨, 어떤 커피 드릴까요?(1:아메리카노, 2:카페라떼, 3:카푸치노, 4:에스프레소)"))
coffee_machine(coffee)
print("지수씨~ 커피 여기 있습니다.")

coffee = int(input("제니씨, 어떤 커피 드릴까요?(1:아메리카노, 2:카페라떼, 3:카푸치노, 4:에스프레소)"))
coffee_machine(coffee)
print("제니씨~ 커피 여기 있습니다.")

 

9-2 Code09-05.py에 다음 기능을 추가해 보자.

① 숫자1, 연산자, 숫자2 순서로 입력받는다.

② 제곱(**) 연산자를 추가한다.

③ 0으로 나누려고 하면 메시지를 출력하고 계산되지 않도록 한다.

 

힌트 메인 코드 부분에 if~else 문을 활용한다.

출력 결과
첫 번째 수를 입력하세요 : 2
계산을 입력하세요(+, -, *, /, **) : ** 
두 번째 수를 입력하세요 : 4
## 계산기 : 2 ** 4 = 16
출력 결과
첫 번째 수를 입력하세요 : 8
계산을 입력하세요(+, -, *, /, **) : /
두 번째 수를 입력하세요 : 0
0으로는 나누면 안 됩니다.ㅠㅠ

 

더보기

답 :

## 함수 선언 부분 ##
def calc(v1, v2, op) :
    result = 0
    if op == '+' :
        result = v1 + v2
    elif op == '-' :
        result = v1 + v2
    elif op == '*' :
        result = v1 * v2
    elif op == '/' :
        result = v1 / v2
    elif op == '**' :
        result = v1 ** v2

    return result

## 전역 변수 선언 부분 ##
res = 0
var1, var2, oper = 0, 0, ""

## 메인 코드 부분 ##
var1 = int(input("첫 번째 수를 입력하세요 : "))
oper = input("계산을 입력하세요(+, -, *, /, **) : ")
var2 = int(input("두 번째 수를 입력하세요 : "))

if var2 == 0 :
    print("0으로는 나누면 안 됩니다.ㅠㅠ")

res = calc(var1, var2, oper)

print("## 계산기 : %d %s %d = %d"%(var1, oper, var2, res))

 

9-3 Code09-11.py에서 2에서 10개까지 몇 개를 매개변수로 사용하든지 합계를 구하도록 para_func() 함수를 수정해 보자.

출력 결과
매개변수가 2개인 함수를 호출한 결과 ==> 30

매개변수가 10개인 함수를 호출한 결과 ==> 550

 

더보기

답 :

## 함수 선언 부분 ##
def para_func(v1, v2, v3 = 0, v4 = 0, v5 = 0, v6 = 0, v7 = 0, v8 = 0, v9 = 0, v10 = 0) :
    result = 0
    result = v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9 + v10
    return result

## 전역 변수 선언 부분 ##
hap = 0

## 메인 코드 부분 ##
hap = para_func(10, 20)
print("매개변수가 2개인 함수를 호출한 결과 ==> %d" % hap)
hap = para_func(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
print("매개변수가 10개인 함수를 호출한 결과 ==> %d" % hap)

 

연습문제

1. 다음 함수의 설명 중, 거리가 먼 것을 모두 고르세요.

① 함수는 뒤에 함수명( ) 처럼 뒤에 괄호 또는 함수명[ ] 처럼 뒤에 대괄호가 붙는다.

② print("값") 처럼 괄호 안에 데이터를 전달할 수 있다.

③ 파이썬은 자체 함수는 제공하지 않지만, 필요시 사용자가 직접 만들어서 사용할 수 있다.

④ 함수의 사용을 위해서 내부 작동을 꼭 알아야 할 필요는 없다. 함수에 전달하는 값과 어떤 작동만 하는지 정도만 알면 함수의 사용에는 문제가 없다.

 

더보기

답 : 1, 3

해설 : 1번 함수명[ ] 처럼 대괄호가 붙는 것은 리스트나 배열이다. 3번 파이썬은 자체 함수를 제공하고 있다.

 

2. 다음 빈칸에 들어갈 것을 쓰세요.

함수는 [      ①     ]를 입력받은 후에, 그 [     ①     ]를 가공해서 [      ②     ]을 돌려줍니다. 커피 자판기의 예를 들면 동전 및 버튼 입력이 [      ①     ]이고, 그 결과 나오는 커피가 [     ②     ]입니다.

 

더보기

답 : ① 매개변수     ② 반환값

 

3. 다음 코드에서 빈칸을 채우세요.

def plus(     ①     ) :
	result = 0
    result = v1 + v2 + v3
    [     ②     ]
    
   hap = plus(100, 200, 300)
   print(hap)

 

더보기

답 : ① v1, v2, v3     ② return result

 

4. 다음에서 출력되는 값을 예상해 보세요.

def f1() :
    print(var)

    
def f2() :
    var = 10
    print(var)

    
var = 100
f1()
f2()

 

더보기

답 : 100, 10

 

5. 함수의 반환값에 관련된 내용입니다. 거리가 먼 것을 모두 고르세요.

① 반환값은 반드시 1개 이상 있어야 한다.

② 반환값은 2개일 수도 있다.

③ 반환값이 2개일 경우, 두 반환값의 형식은 동일해야 한다.

④ 반환값이 3개일 경우, 내부적으로 리스트로 묶여서 반환된다.

⑤ 반환값의 개수와 매개변수의 개수는 연관이 없다.

 

더보기

답 : 1, 4

해설 : 1번 반환값을 가지지 않을 수도 있다. 4번 튜플이나 여러 개의 변수로 개별적으로 반환될 수 있다.

 

6. pass 예약어의 의미를 가장 잘 설명한 것을 고르세요.

① 동일한 내용을 반복한다는 의미이다.

② 이후의 코드를 모두 건너뛴다는 의미이다.

③ 그냥 아무것도 하지 않고 비워 놓을 때 사용한다.

④ if 문에서만 사용한다.

 

더보기

답 : 3

 

7. 함수의 매개변수와 관련된 설명입니다. 거리가 먼 것을 모두 고르세요.

① 매개변수는 1개 이상은 있어야 한다.

② 매개변수는 2개일 수도 있다.

③ 매개변수가 2개일 경우, 두 매개변수의 형식은 동일해야 한다.

④ 매개변수가 2개 이상일 경우, 반환값도 2개 이상이어야 한다.

매개변수는 이름만 다르면 개수가 많아도 상관없다.

 

더보기

답 : 1, 3, 4, 5

해설 : 1번 매개변수를 가지지 않을 수도 있다. 3번 매개변수는 각각 독립적으로 자신의 형식을 가질 수 있다. 4번 매개변수의 개수와 반환값의 개수는 연관 없다. 반환값이 없을 수도, 하나일 수도 있다. 5번 매개변수의 이름과 개수가 일치하지 않으면 오류가 발생한다.

 

8. 다음은 3개의 매개변수 중 기본값을 2개 설정하는 코드입니다. 빈칸을 채우세요.

*메일 문의 결과 기본값 2개가 아니라 3개가 맞다고 합니다.

실행 결과
매개변수 없이 호출 ==> 6
매개변수가 1개로 호출 ==> 6
매개변수가 2개로 호출 ==> 6
매개변수가 3개로 호출 ==> 6
def myFunc(     ):
    ret = p1 + p2 + p3
    return ret

print("매개변수 없이 호출 ==> ", myFunc())
print("매개변수가 1개로 호출 ==> ", myFunc(1))
print("매개변수가 2개로 호출 ==> ", myFunc(1, 2))
print("매개변수가 3개로 호출 ==> ", myFunc(1, 2, 3))

 

더보기

답 : p1 = 1, p2 = 2, p3 = 3

 

9. 다음은 모듈 및 패키지에 대한 설명입니다. 거리가 먼 것을 모두 고르세요.

① 모듈은 함수들의 집합으로 볼 수 있다.

② 파이썬은 자체 모듈을 제공하지 않지만, 필요하면 직접 모듈을 만들어서 사용할 수 있다.

③ mod.py 파일을 임포트하려면 import mod 문을 사용하면 된다.

④ 모듈 안의 함수를 호출할 때는 '모듈명[함수명]' 형식을 사용한다.

패키지는 모듈을 모아 놓은 것으로 파일의 형태로 제공된다.

⑥ 패키지는 주로 'from 패키지명. 모듈명 import 함수명'을 사용한다.

 

더보기

답 : 2, 4

해설 : 2번 파이썬은 자체 모듈을 제공하고 있다. 4번 모듈 안의 함수를 호출할 때는 '모듈명.함수명'형식을 사용한다.

 

10. 다음 코드는 오류가 발생합니다. 오류가 발생하는 행을 고르고, 그 이유를 간단히 설명하세요.

def func1(v1,v2) :
    def func2(num1, num2) :
        return num1 + num2
    return func2(v1, v2)

print(func1(100, 200))
print(func2(100, 200))

 

더보기

답 : 7행 print(func2(100, 200)), fuc2 함수가 내부에서 정의되었기 때문이다.

해설 : func2 함수는 func1함수의 지역 범위에만 존재한다. func2 함수를 사용하려면 func1 함수 내에서 호출하거나 전역으로 정의해야한다.

 

11. 1부터 100까지의 합계(=5050)을 구하는 재귀 함수를 사용한 코드입니다. 재귀 함수의 빈칸을 완성하세요.

def addNumber(num) :
    
    
    
    
print(addNumber(100))

 

더보기

답 :

if num <= 1 :
    return num
else :
    return num + addNumber(num-1)

 

12. 재귀 호출 함수를 이용해서 입력한 10진수를 2진수/8진수/16진수로 변환하는 코드를 작성하세요. 재귀 호출 함수는 2진수로 변환하는 base2(숫자), 8진수로 변환하는 base8(숫자), 16진수로 변환하는 base16(숫자) 등 3개 함수를 작성하세요.

실행 결과
10 진수 입력 -->

2진수 : 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
8진수 : 7 7 7 7 7
16진수 : 7 F F F

 

더보기

답 :

def base2(num):
    if num == 0:
        return ''
    else:
        return base2(num // 2) + str(num % 2)

def base8(num):
    if num == 0:
        return ''
    else:
        return base8(num // 8) + str(num % 8)

def base16(num):
    hex_chars = "0123456789ABCDEF"
    if num == 0:
        return ''
    else:
        return base16(num // 16) + hex_chars[num % 16]

dec = int(input("10진수 입력 --> "))

bin = base2(dec)
oct = base8(dec)
hex = base16(dec)

print("2진수: ", bin)
print("8진수: ", oct)
print("16진수: ", hex)

 

 

*주의사항 : 제가 직접 푼 것이므로 틀린 부분이 있을 수 있습니다. 오타나 틀린 부분 지적 환영!

+ Recent posts