20.함수에서 화면 출력값과 반환값은 독립적인 존재이다. 같은게 아니다.
예)
print("안녕하세요")는 "안녕하세요"를 반환하는 게 아닙니다.
그냥 화면에 보여주는 겁니다.
반환값은 None이다.
예)
def greet():
print("안녕하세요")
result = greet()
print(result)
를 실행하면 결과값은;
안녕하세요
None
이다.
파이선 자체는 우항을 먼저 계산(=실행)하고 좌항으로 넘어가기 때문에
20-1.greet()이라는 함수를 실행함.
20-2.결과로 안녕하세요 가 '화면에'출력됨
20-3. 하지만 반환값은 None임. 즉 우항은 None이 됨
20-4 이제 result = None 이니 "None"을 result에 대입함
20-5. print(result)는 print("None") 이 됨.
20-6. 그에 따라 화면에 None이 출력됨.
21. 함수에 반환값의 표현이 없으면(= result 언급이 없으면) result None이 생략된 것과 같다.
예.
def greet():
print("안녕하세요")
는
def greet():
print("안녕하세요")
return None
와 같다.
22. 즉, 반환값은 default이고, print는 그에 딸린 곁다리다.
다시말해, 함수는 반환값을 무조건 도출하고,(그렇다고 자동으로 화면에 출력되지는 않음.)
그 반환값이 return으로 명시가 안되어있으면 기본값처럼 None이 반환값으로 출력된다.
예1.
def b():
return "안녕하세요"
에서 b()을 실행하면 아무것도 안뜨고
print(b())을 실행하면 "안녕하세요"가 뜬다
예2:
def greet():
print("안녕하세요")
print(greet())
실행 순서는 이렇습니다.
22-1.greet() 실행
22-2.함수 안의 print("안녕하세요") 실행
22-3.화면에 안녕하세요 출력
22-4.greet()는 return이 없으므로 None 반환
22-5.바깥의 print(...)가 그 None을 출력
그래서 최종 출력은:
안녕하세요
None
23. 틀린 문제:
def test():
return "A"
print("B")
이면
print(test())로 화면에 출력되는 값은?
return을 만나면 함수가 종료되어서 A만 출력된다.
(정리 필요)
24.
self는 지금 사용하는 객체다
first_book.summary()를 호출하면 self는 first_book이다. second_book.summary()를 호출하면 self는 second_book이다. 메서드를 정의할 때는 첫 매개변수에 self를 적지만 호출할 때는 Python이 현재 객체를 전달한다.
self.title은 현재 책 객체의 제목이다.
first_book.title과 second_book.title은 서로 다른 객체에 저장된 값이다.
summary()는 값을 출력하지 않고 반환하므로 다른 코드에서도 결과를 사용할 수 있다.
관련 데이터와 그 데이터를 다루는 동작을 객체 안에 모으는 것을 캡슐화라고 한다. 이 예제의 title은 일반 속성이므로 first_book.title = "수정"처럼 객체 밖에서 직접 바꿀 수 있다. 바뀐 제목은 첫 번째 책의 summary()에만 반영된다.
25.
class Counter:
created_count = 0
#클래스 속성임. 모든 counter 클래스는 이 것을 가진다.
def __init__(self, start: int = 0) -> None:
self.value = start
#이거는 인스턴스 속성임. 인스턴스에 뭔가를 하겠다.
인스턴스 속성은 init 함수 내에서 정의됨
Counter.created_count += 1
def increment(self) -> None:
self.value += 1
first = Counter()
second = Counter(start=10)
first.increment()
first.increment()
second.increment()
26.
def increment(self):
self.value += 1
self.value += 1는 value라는 속성 값에 +1을 한다는 뜻
27.
class Task:
def __init__(self, title: str) -> None:
self.title = title
self.done = False
'self.done = False'는 초기값을 False로 한다는 뜻.
'self.title = title' 에서 좌측title은 .title로 속성 문법이고, 우측title은 title 자체로 변수의 문법이다.
그래서 이름이 title로 같아도 다른 객체로 구분한다.
28.
조건 표현식 또는 삼항 연산자(ternary expression):
일반적인 if문과는 조금 다른 문법
<보통의 if문>
if self.done:
status = "완료"
else:
status = "진행 중"
<(이걸 한 줄로 줄여 쓴 것이 바로)조건 표현식>
atus = "완료" if self.done else "진행 중"