zero-base 취업스쿨/스터디노트/2주차/파이썬 기초 #7

Sea Yoon·2023년 8월 9일

파이썬 기초,중급

목록 보기
7/8
post-thumbnail

텍스트파일닫기(with ~ as 문)

  • 텍스트파일의 순서중 마지막으로 파일을 닫기(close)를 꼭 해주어야 하는데 이 코드가 계속 중복되는 것을 피하기 위해 with~ as 구문이 있다. (개발자들은 어떻게해서든 더 효율적인 방법을 찾나보다^^)

  • with ~ as 를 쓰면 코드블럭 이후 자동으로 close되니 주로 쓰이는 편이고 with ~ as 구문을 쓰는걸 권장한다.

  • 지난시간에 특정 단어를 변경해주는 코드를 다시 가져와서 with ~as 구문으로 바꿔보면 아래와 같다. 우선 변경 전 코드이다.

    file = open('/Users/seayoon/Desktop/제로베이스취업스쿨/test.txt','w')
    writing = file.write(' 클래스 내에 정의된 함수를 메서드라고 부른다고 했습니다. 그리고 메서드의 첫 번째 인자는 항상 self여야 한다고 했습니다. 하지만 메서드의 첫 번째 인자가 항상 self여야 한다는 것은 사실 틀린 말입니다. 이번 절에서는 파이썬 클래스에서 self의 정체를 확실히 이해해 봅시다.')
    file.close()
    file = open('/Users/seayoon/Desktop/제로베이스취업스쿨/test.txt','r')
    reading = file.read()
    print(reading)
    changedWord = reading.replace('self','셀프')
    print(changedWord)
    file.close()
    file = open('/Users/seayoon/Desktop/제로베이스취업스쿨/test.txt','w')
    file.write(changedWord)
    file.close()
  • file.close()가 계속 중복되어 있는것을 볼 수 있다.

    with open('/Users/seayoon/Desktop/제로베이스취업스쿨/test.txt','w') as file:
        writing = file.write(' 클래스 내에 정의된 함수를 메서드라고 부른다고 했습니다. 그리고 메서드의 첫 번째 인자는 항상 self여야 한다고 했습니다. 하지만 메서드의 첫 번째 인자가 항상 self여야 한다는 것은 사실 틀린 말입니다. 이번 절에서는 파이썬 클래스에서 self의 정체를 확실히 이해해 봅시다.')
    with open('/Users/seayoon/Desktop/제로베이스취업스쿨/test.txt','r') as file:
        reading = file.read()
        print(reading)
        changedWord = reading.replace('self','셀프')
        print(changedWord)
    with open('/Users/seayoon/Desktop/제로베이스취업스쿨/test.txt','w') as file:
        file.write(changedWord)
  • with~as 구문으로 바꿔주니 코드도 간결해진 모습이다
    중요한것은 with~as다음에 세미콜론을 잊지말아야하고 그다음줄에
    코드블록을 쓸때 들여쓰기가 중요하다는 것이다!

  • 확실히 위의 코드보다 가독성이 좋아진것을 볼 수 있다.

writelines()

  • writelines()는 리스트 또는 튜플 데이터를 파일에 쓰기 위한 함수 이다.
languages = ['c/c++', 'java', 'c#', 'python', 'javasript']
path = '/Users/seayoon/Desktop/제로베이스취업스쿨/'
for item in languages:
    with open(path + 'test.txt','a') as file:
        file.write(item)
        file.write('\n')
  • 위 코드에서 languages 라는 리스트를 파일에 'a'(덮어쓰기)모드로 작성한것을 알 수 있다. 이 경우 for 문을 이용하여 리스트 안의 요소를 하나씩 꺼내서 작성하고 있다.
    이를 아래와 같이 writelines 함수를 이용하면 더 간략하게 변경할 수 있다.
languages = ['c/c++', 'java', 'c#', 'python', 'javascript']
path = '/Users/seayoon/Desktop/제로베이스취업스쿨/'
with open(path + 'test.txt','a') as file:
    file.writelines(item + '\n' for item in languages)
  • for문은 없어지고 파일을 open하고 바로 writelines를 써서 리스트 안의 요소를 작성하였다.

  • 실행결과

readlines()

  • 파일의 모든 데이터를 (통째로) 읽어서 리스트 형태로 반환한다.
    path = '/Users/seayoon/Desktop/제로베이스취업스쿨/'
    with open(path + 'test.txt','r') as file:
        result = file.readlines()
    print(result)
    #실행결과 
    ['c/c++\n', 'java\n', 'c#\n', 'python\n', 'javascript\n']

readline()

  • 한 행을 하나씩 읽어서 문자열로 반환 한다.
  • 위에서 만든 languages 리스트 파일을 가지고 아래와 같이 작업하였다.
  • while 문을 넣어서 파일의 한행이 비어있지 않다면 다시 코드가 돌아가게 만들어서 한줄씩읽어서 문자열로 반환하게 만든 코드이다.
    path = '/Users/seayoon/Desktop/제로베이스취업스쿨/'
    with open(path + 'test.txt','r') as file:
        result = file.readline()
        while result != '':
            print(result, end='')
            result = file.readline()
    #실행결과 
    c/c++
    java
    c#
    python
    javascript

파이썬 중급 연습문제 풀이1#

#1.산술 연산 계산기를 함수를 이용해서 만들어보자

  • 참고로 아래 코드는 문제를 보고 처음에 작성한 잘못된 코드이다. (어마어마한 오류가 있음)

    def add():
        print(f'{n1} + {n2} = {n1 + n2}')
    def sub():
        print(f'{n1} - {n2} = {n1 - n2}')
    def mul():
        print(f'{n1} * {n2} = {n1 * n2}')
    def div():
        print(f'{n1} / {n2} = {n1 / n2}')
    def rem():
        print(f'{n1} % {n2} = {n1 % n2}')
    def quo():
        print(f'{n1} // {n2} = {n1 // n2}')
    def squ():
        print(f'{n1} ** {n2} = {n1 ** n2}')
    inputNum = int(input('1.덧셈 2.뺄셈 3.곱셈 4.나눗셈 5.나머지 6.몫 7.제곱근 8.종료'))
    while inputNum != 8:
        n1 = int(input('첫번째 숫자 입력:'))
        n2 = int(input('두번째 숫자 입력:'))
        if inputNum == 1:
            print(add())
        elif inputNum == 2:
            print(sub())
        elif inputNum == 3:
            print(mul())
        elif inputNum == 4:
            print(div())
        elif inputNum == 5:
            print(rem())
        elif inputNum == 6:
            print(quo())
        elif inputNum == 7:
            print(squ())
    else:
        print('Bye~')
    #실행결과 
    1.덧셈 2.뺄셈 3.곱셈 4.나눗셈 5.나머지 6.7.제곱근 8.종료5
    첫번째 숫자 입력:1
    두번째 숫자 입력:5
    1 % 5 = 1
    None
  • 나는 이 문제를 풀고 파이썬의 함수부분으로 다시돌아가 개념을 다시 자세히 익히기로 마음먹었다.

  • 위 코드의 문제는 함수라는 개념을 제대로 익히지 못한 코드라는 것이다. 오류를 뜯어보면 코드를 실행했을 때 정상적으로 돌아가는 것 같지만 맨아래 None이라는 문자도 같이 뜨게 된다. 이것은 함수의 return값을 정하지 않아 None값이 반환된것이다.

  • 파이썬 함수를 다시 공부해보자!
    파이썬 함수의 형식은 다음과 같다

    def 함수 이름(매개변수):
    실행할 문장
    실행할 문장
    ...
    return 반환값

  • 함수의 형식은 항상 넣어주는 입력과 빠져나오는 출력이 공존해야 한다는 것! 이때 입력하는 부분이 바로 매개변수이고 출력하는 부분이 바로 파이썬 return이 되는 것이다.

  • 그렇다면 return되어 반환한 값은 어디로 가느냐. 바로 def 으로 정의한 함수를 호출한 곳으로 간다.

  • 그럼 위 작성한 코드를 다시 살펴보면 아주 잘못됬다는 것을 알 수 가 있다. 함수에 대한 return값이 없으며 매개변수 또한 지정해주지 않은 것을 알 수 있다. 다시 수정해보면 아래와 같다.

    def add(n1,n2):
        return n1 + n2
    def sub(n1,n2):
        return n1 - n2
    def mul(n1,n2):
        return n1 * n2
    def div(n1,n2):
        return n1 / n2
    def rem(n1,n2):
        return n1 % n2
    def quo(n1,n2):
        return n1 // n2
    def squ(n1,n2):
        return n1 ** n2
    inputNum = int(input('1.덧셈 2.뺄셈 3.곱셈 4.나눗셈 5.나머지 6.몫 7.제곱근 8.종료'))
    while inputNum == 8:
        print('bye~')
        break
    else:
        n1 = int(input('첫번째 숫자 입력:'))
        n2 = int(input('두번째 숫자 입력:'))
        if inputNum == 1:
            print(f'{n1} + {n2} = {add(n1,n2)}')
        elif inputNum == 2:
            print(f'{n1} - {n2} = {sub(n1,n2)}')
        elif inputNum == 3:
            print(f'{n1} * {n2} = {mul(n1,n2)}')
        elif inputNum == 4:
            print(f'{n1} / {n2} = {div(n1,n2)}')
        elif inputNum == 5:
            print(f'{n1} % {n2} = {rem(n1,n2)}')
        elif inputNum == 6:
            print(f'{n1} // {n2} = {quo(n1,n2)}')
        elif inputNum == 7:
            print(f'{n1} ** {n2} = {squ(n1,n2)}')

오늘의 짧막한 후기😄

지난주부터 숨가쁘게 파이썬 기초(print('hello world') 부터 중급과정까지 강의는 모두 들었다. 그런데 짧은 기간에 많은 개념을 한번에 익히다보니 문제가 많은것같다.

특히 문제를 보고 스스로 코드를 짜고나서 내가 얼마나 기초개념이 다져지지 않았는지 깨닫게 되었다.

오늘은 파이썬 중급에 대한 연습문제를 풀어보았는데 '함수' 부분부터 개념이 부실해서 코드를 짤때 '내멋대로'푼 것 같았다. 다시 강의를 들었고 개념을 복습한 다음 코드를 다시 한번 풀었더니 정상적으로 코드가 작동하였다.

확실히 강의를 듣고 이해했다고 넘기는것이 아니라 계속해서 그 개념을 복습해야 머릿속에서 정리가 될 것 같다.

profile
우직한 거북이

2개의 댓글

comment-user-thumbnail
2023년 8월 9일

개발자로서 성장하는 데 큰 도움이 된 글이었습니다. 감사합니다.

1개의 답글