본문 바로가기

Programming/Python

2. Python _ 조건문, 반복문, 파일 읽고 쓰기, 클래스 Class, 객체지향프로그래밍

이 포스팅은 점프 투 파이썬을 다시 정독하면서 파이썬의 기초적이지만 매번 찾아보거나 몰랐던 부분을 정리하기 위한 목적으로 작성되었습니다.


if/for/while

요즘 파이썬 커뮤니티에서 들여쓰기 할 때, 탭(tap)보다 공백 4개사용을 권장한다.
일단 둘을 혼용해서 쓰면 당연히 안됨. 근데 난 탭이 아직 좋다...

조건문에서 아무 일도 하지 않게 설정하고 싶다면? pass를 쓰면 된다.

수행할 문장이 한 줄이면 그냥 한줄에 적어버려도 됨.
ex) if 'money' in pocket: pass
else: print('내가 살게')

while문에서 while문을 빠져나가고 싶다면 break
fore, while문을 빠져나가고 싶진 않은데 처음으로 가게 하려면 continue를 쓴다.

print(a, end=" ")로 해주면 줄 바꿈이 일어나지 않고 한칸씩 띄워준다.

리스트 안에 for문 포함하기.
[표현식 for 항목 in 반복 가능 객체 if 조건] (if 조건은 생략할 수 있다)
ex) result = [num*3 for num in a if num %2 == 0]
ex2) result = [x*y for x in range(2,10) for y in range(1,10)]

입력값이 몇 개가 될지 모를 때
여러 개의 입력값 받을 때: def sum(*args): 와 같이 변수 앞에 * 을 붙이면 입력값을 전부 모아 튜플로 만들어준다.
따라서 sum(1,2,3)을 입력하면 args는 (1,2,3)이 된다.
def sum_mul(choice, *args)와 같이 제일 처음에 choice를 받고 그 다음에 여러개를 입력받아서 쓸 수도 있음.

return을 함수를 빠져나가는 방법으로도 사용할 수 있다.

입력인수에 초깃값 미리 설정하기
def say_myself(name, old, man=True): 처럼 설정이 가능하다. 이 때 뒤에 위치시키는 걸 잊지 말자.

함수 안에서 함수 밖의 변수를 변경하는 방법
1. return 이용하기: 함수의 결과값을 다시 함수 밖의 변수에 대입하기.
2. global 이용하기: 함수 안의 global은 함수 밖의 변수를 직접 사용하겠다는 뜻이다. 하지만 안 좋은 습관.


파일 읽고 쓰기
파일생성 : f=open("Jiwan/new.txt","w") \n f.close()
파일객체 =  open(파일이름, 파일 열기 모드)
파일 열기 모드: r-읽기, w-쓰기, a-파일 마지막에 새로운 내용 추가)
w - f.write()
r - f.readline() (첫번째 줄을 읽는다.)
while True: line = f.readline() (모두 다 읽는다.)
f.readlines() (각각의 줄을 리스트형태로 반환한다.)
f.read() (파일 내용 전체를 문자열로 리턴한다)

파일을 열고 나면 항상 f.close()를 활용하여 꺼주는 게 좋지만 with로 자동화할 수 있다.
with open("jiwan.txt", "w") as f:
    f.write(@@@@)
with를 벗어나는 순간 f가 자동으로 close된다.

sys모듈을 사용하면 입력인수를 명령행창(터미널)에서 줄 수도 있다. 
import sys
args = sys.argv[1:]
for i in args: print(i)


클래스 Class

객체와 인스턴스의 차이.
클래스에 의해 만들어진 객체를 인스턴스라고 함.
인스턴스는 어떤 특정 객체가 어떤 클래스의 객체인지 설명해주는 말.
바둑이는 인스턴스보다는 객체라는 말이 어울리고, 바둑이는 개의 객체보다는 개의 인스턴스다 라는 말이 훨씬 잘 어울림.

껍질뿐인 클래스 만들기: class Simple: pass

클래스에서 self에 대한 이해
class Service안에 def sum(self, a, b): return a+b 가 있다고 하자. 
여기서 self는 호출한 instance를 가리킨다.
따라서 pey라는 인스턴스에서 sum을 호출하였다면 pey.sum(1,1)처럼 호출하여도 self로 pey를 인식하게 된다.
일종의 class의 id 인증 같은 개념이다.
따라서 클래스 내 함수의 첫 번째 인수는 무조건  self로 사용해야 인스턴스의 함수로 사용할 수 있다.

인스턴스 내 함수에서 정의한 self.변수는 인스턴스 내의 함수들 사이에서 전역 변수처럼 사용된다.(내 뇌피셜)

__init__이란 무엇인가? (constructor)
인스턴스 만들 때 항상 실행되는 함수이다. Service class안에
def __init__ (self, name):
    self.name = name
으로 설정 후, pey=Service("홍길동")로 호출하면 자동으로 별도의 name 지정 함수를 사용하지 않아도 인스턴스의 name을 홍길동으로 저장.

클래스의 상속 (Inheritance)
class 상속받을 클래스명(상속할 클래스명) ex) class HouseKim(HousePark):

상속받는 클래스의 모든 기능을 그대로 상속받을 수 있다.

상속하는 클래스의 메서드와 이름은 같지만 내용이 다르게 만들고 싶다면 그냥 동일한 이름의 함수를 상속받을 클래스 내에 생성 후 구현하면 된다.
이 때, 상속받을 클래스의 함수를 따르게 되며 이를 오버라이딩이라 한다.

__add__ 등을 활용하여 연산자(+,-,*,/,...) 역시 오버로딩할 수 있다. 이때 객체끼리는 해당 연산자에 대하여 새롭게 정의된 연산자 함수를 따르게 된다.
이때 두 인스턴스의 이름이 pey, juliet이라면 def __add__(self, other):로 정의하였다 하더라도 pey.add(juliet)이 아닌 pey+juliet으로 실행할 수 있다.