python 오답 노트

asda주asda·2022년 1월 15일
0

Python

목록 보기
6/31

breakpoint(중단점)는 디버깅(에러를 잡아나가는 과정)에 아주 효율적으로 사용할 수가 있다. 파이참에서 단축키는 Shift+ F9 이다.
한 단계씩 변수의 값이 변화되는 과정을 살펴보기 위해서는 F7번을 눌러가면서 확인하면서 디버깅을 할 수 있다.

소수 출력

문제: 소수들의 총합을 반복문을 통해 구한다. 이때 총합이 2000을 넘을 시 반복문을 중단하고 그 때의 총합을 출력하라.
강사가 문제 설명을 못한다.

나의 답

number = 1 # 늘어나는 수
count = 1 # 소수의 개수
total = 5 # 소수들의 합
yesDecimal= 0 # 소수 확인용 2면 소수

print("시작")
while True:
    if total>=2000:
        print("total값: ",total)
        break
    yesDecimal = 0
    number +=1
    for x in range(1,number+1):
        if number%x == 0:
            yesDecimal +=1
    if yesDecimal == 2:
        print("'%s'번째 소수: %s" %(count, number))
        total += number
        count +=1
print("2000을 넘기기전 소수값: %s"%(total-number))

강사의 답

강사는 2000이하의 소수값을 모두 구하고 그 총합을 구한다.

start_num = 0
num =0
hap = 0
lastData =0

for num in range(2, 2001):
    for start_num in range(2, num+1):
        if num % start_num==0:
            break
    if num == start_num:
        print("소수:",start_num)
        hap += start_num
        print("합계: ",hap)
        lastData = start_num
        print("마지막 소수의 값: ",lastData)
        print("=======================")

위의 기억해야할 것은 start_num의 루프변수가 유지가 된다는 것이다.

10장 - 자료구조

파일의 텍스트를 읽고, 단어 종류의 개수 출력

# 출력 결과:
# 입력된 파일 이름: text.txt
# 사용된 단어의 개수

# text.txt
All's well that ends well.
Bad news travels faast.
Well begun is half done.
Birds of a feather flock together.

# main.px
def change_word(word):
    result = ''
    for i in word:
        # 만일 받은 단어의 하나의 문자가 영어라면(기호 제거)
        if i.isalpha():
            result += i
    # 단어를 소문자로 하여 반환
    return result.lower()

# 파일의 내용을 세트에 저장한다.
def update_set(text, fp):
    for str in fp:
        # 한 줄을 공백을 기준으로 나누어서 리스트로 반환시킨다.
        words = str.split()
        # 단어에 붙어 있는 기호(. ,)와 대문자를 소문자로 바꾼다.
        # 그 후 그 단어를 세트 text에 저장한다.
        for word in words:
            text.add(change_word(word))

def main():
    # 종류를 따지므로 set의 자료형태를 만든다.
    file_name = input("입력된 파일의 이름: ")
    text = set()
    fp = open(file_name, mode='r', encoding='UTF-8')
    # 파일의 내용을 읽어 세트에 저장한다.
    update_set(text, fp)

    print("사용된 단어의 개수: ",len(text))
    print("사용된 단어: ",text)
    # 열었던 파일을 닫는다.
    fp.close()

if __name__ == '__main__':
    main()

위의 문제를 풀다가 막혔던 부분이 있다. 나름 잘했던 부분은 파일에서 읽은 문장을 split으로 나눠서 세트에 저장까지는 했다는 점이다. 그리고 막혔다.

먼저 띄어쓰기를 기준으로 나누는 split()을 썻지만 마침표(.), 쉼표(,)가 세트에 함께 묶어져 출력되었다. 이를 해결하고자 import re를 이용하고 해봤으나, 잘 되지 않았다.
강사님 처럼 split을 이용해 반환된 단어들의 리스트들을 다시 for문을 이용하여 한 단어 한 단어씩 검수를 한 뒤에 세트에 저장해야 함을 몰랐다. isalpha() 쓰잘때기 없을 꺼라 생각했는데, 이런식으로 쓰이는줄은 몰랐다.

계산기 만들기

나의 답

from tkinter import *

def oneAdd():
    global result
    result += '1'
    result_text.set(result)

def twoAdd():
    global result
    result += '2'
    result_text.set(result)

def threeAdd():
    global result
    result += '3'
    result_text.set(result)

def fourAdd():
    global result
    result += '4'
    result_text.set(result)

def fiveAdd():
    global result
    result += '5'
    result_text.set(result)

def sixAdd():
    global result
    result += '6'
    result_text.set(result)

def sevenAdd():
    global result
    result += '7'
    result_text.set(result)

def eightAdd():
    global result
    result += '8'
    result_text.set(result)

def nineAdd():
    global result
    result += '9'
    result_text.set(result)

def zeroAdd():
    global result
    result += '0'
    result_text.set(result)

def dotAdd():
    global result
    result += '.'
    result_text.set(result)

def plusAdd():
    global result
    result += '+'
    result_text.set(result)

def minusAdd():
    global result
    result += '-'
    result_text.set(result)

def multiAdd():
    global result
    result += '*'
    result_text.set(result)

def divAdd():
    global result
    result += '/'
    result_text.set(result)

def cancle_button():
    global result
    result = ''
    result_text.set(result)

def calcul():
    global result
    answer = round(eval(result),2)
    result += '='
    result +=  str(answer)
    result_text.set(result)

window = Tk()
window.title('calculator')

mainLabel = Label(window, text='계산기', font='굴림체 10 bold', width=20)
mainLabel.pack(side=TOP)

result = ''
result_text = StringVar()
resultLabel =  Label(window, bg='orange', width=36, textvariable=result_text)
resultLabel.pack(side=TOP)

number_frame = Frame(window, width=30)
number_frame.pack()

div = Button(number_frame, text='/', width=6, command=divAdd)
div.grid(row=0, column=3, sticky=W)

cancle = Button(number_frame, text='C', width=6, command=cancle_button)
cancle.grid(row=0, column=4, sticky=W)

multi = Button(number_frame, text='*', width=6, command=multiAdd)
multi.grid(row=1, column=3, sticky=W)

minus = Button(number_frame, text='-', width=6, command=minusAdd)
minus.grid(row=2, column=3, sticky=W)

plus = Button(number_frame, text='+', width=6, command=plusAdd)
plus.grid(row=3, column=3, sticky=W)

equl = Button(number_frame, text='=', width=6, command=calcul)
equl.grid(row=3, column=2, sticky=W)

dot = Button(number_frame, text='.', width=6, command= dotAdd)
dot.grid(row=3, column=1, sticky=W)

zero = Button(number_frame, text='0', width=6, command= zeroAdd)
zero.grid(row=3, column=0, sticky=W)

one = Button(number_frame, text='1', width=6, command= oneAdd)
one.grid(row=2, column=0, sticky=W)

two = Button(number_frame, text='2', width=6, command= twoAdd)
two.grid(row=2, column=1, sticky=W)

three = Button(number_frame, text='3', width=6, command= threeAdd)
three.grid(row=2, column=2, sticky=W)

four = Button(number_frame, text='4', width=6, command= fourAdd)
four.grid(row=1, column=0, sticky=W)

five = Button(number_frame, text='5', width=6, command= fiveAdd)
five.grid(row=1, column=1, sticky=W)

six = Button(number_frame, text='6', width=6, command= sixAdd)
six.grid(row=1, column=2, sticky=W)

seven = Button(number_frame, text='7', width=6, command= sevenAdd)
seven.grid(row=0, column=0, sticky=W)

eight = Button(number_frame, text='8', width=6, command= eightAdd)
eight.grid(row=0, column=1, sticky=W)

nine = Button(number_frame, text='9', width=6, command= nineAdd)
nine.grid(row=0, column=2, sticky=W)


window.mainloop()

아이 부끄러웡. 아이 부끄러

강사 답

# 계산기 프로그램 만들기

from tkinter import *

window = Tk()
window.title("계산기")

display = Entry(window, width=33, bg='yellow')
# 사용자로부터 수식을 입력받고 계산 결과를 보여주는 엔트리 위젯을 여려 병합으로 처리
display.grid(row = 0, column= 0, columnspan=5)

# 버튼에 표식될텍스트를 리스트로 값 설정
button_list = [
    '7','8','9','/','C',
    '4','5','6','*','',
    '3','2','1','-','',
    '0','.','=','+','',
]

row_index = 1
col_index = 0

# 버튼을 생성해서 리스트에 있는 값을 표식
# 17개의 버튼에 전부 이벤트 처리를 해야하는데, 하나의 함수를 정의해서 람다식으로 호출만 하게끔 작성함
# lambda t=button_text: click(t) 코드를 일반코드로 바꾸면 아래와 같다.
# def process(t= button_text)
#   click(t)
for button_text in button_list:
    Button(window, text=button_text, width=5, command=lambda t=button_text: click(t)).grid(row=row_index, column=col_index)
    col_index +=1
    if col_index > 4:
        row_index += 1
        col_index = 0

# 함수 정의
def click(key):
    # 매개변수 key 값이 = 이라면 계산을 하라는 의미
    if key == '=':
        # eval 함수는 문자열의 계산식을 계산해줘서 값을 반환해준다.
        result = eval(display.get())
        s = str(result)
        display.insert(END, '=' + s)
    elif key =='C':
        display.delete(0, END)
    else:
        display.insert(END, key)

window.mainloop()

20장 람다식

product_menu = [
    (1, '재킷', 5, 120000),
    (2, '셔츠', 6, 24000),
    (3, '바지', 3, 50000),
    (4, '코트', 6, 300000),
]

result = list(map(lambda x:(x[0], x[2]*x[3]), product_menu))
print(result)

0개의 댓글

관련 채용 정보