[N421] Python 활용

쥬쥬스·2023년 3월 24일
0

section4

목록 보기
6/15
에러가 진짜 해결이 안될 때 
1. 제일 나중에 수정했던 코드 제거해서 문제가 없는지 확인
2. 오류가 발생한 부분 계속 좁히기

1. 디버깅(Debugging)

기본 이동

continue : 다음 중단점을 찾아 이동
list : 주변 11줄의 코드 출력
step : 다음 문장으로 이동
- 다음 문장이 A함수라면 A함수 내부에서 추가 탐색을 진행
- A 함수 call부터 시작
next : 다음 문장으로 이동
- 다음 문장이 A함수라면 A함수의 return값을 반환
- 내부로 들어가지 않음
- 함수가 있어도 넘어감

2. 함수(Function)

매개변수 vs 인수

매개변수(parameter) : 함수를 호출할 때 인수로 전달된 값을 함수 내부에서 사용할 수 있게 해주는 변수
인수(argument) : 함수를 호출할 때 함수에 전달하는 입력값
rf : https://plan2018.tistory.com/202

함수 정의 기본구조

인수

  1. 필드 인수 : 일반적으로 적는 형태
  2. 키워드 인수
  • 인수를 str 형태로 넣는 것이 아니라 이름을 정해주는 것
  • 명시해주면 순서를 지켜서 값을 넣지 않아도 됨
  1. 기본 인수 : 인수의 기본값을 넣어주는 것

함수 문법

def 함수_이름 (파라미터):
	"함수 문서"
    함수 내용
    retun [표현식]

return : 함수에서 어떤 결과 값을 반환하고자 사용
print : 값을 출력해주고자 사용
++ pass : 공간만 차지하고 문법상 오류가 나지 않도록 사용

3. Class

class가 인스턴스화 된다 = class를 정의하고 사용하겠다는 순간에 메모리 탑재. 그 순간을 말한다. like 붕어빵

class도 하나의 틀
함수를 사용하는 것처럼 코드를 다시 작성하는 것을 줄이기 위해 사용합니다.

용어 정리

객체

  • 생성자 : 어떤 값을 class가 생성될때 필요한 값을 초기화해주는 것
  • 데코레이터 : 함수를 구현할 때 공통되는 부분을 합쳐두고 싶을 때 사용하는 것

함수, 클래스, 데코레이터 모두 코드의 재사용성을 줄이기 위해 사용.
코드의 군더더기 ↓

상속

부모 클래스의 내용(속성,메서드)을 물려받는 자식 클래스가 갖게 되는 것

오버라이딩

클래스 상속시 부모 클래스에서 정의한 메서드(함수)를 자식 클래스에서 변경하는 것

클래스 생성

기본으로 클래스 생성

class person:
	person_a = "김도영"

# 클래스 속성 접근
person.person_a #->'김도영'

클래스 내에 함수를 선언
클래스 내에서 작동하게 되는 함수들은 메서드(method)

class person: 
    person_a = "김도영"
        
    def print_person():
      print("NCT")

# 클래스 내의 함수 접근
person.print_person() #->NCT

self

인스턴스에서도 활용 가능한 함수를 만들기 위해 'self'사용
self는 다른 키워드로 작성해도 가능함

class person: 
    person_a = "김도영"
        
    def print_person():
      print("NCT")

NCT_a = person()
NCT_a.print_person()

이렇게 정의 했을 때는
TypeError: print_person() takes 0 positional arguments but 1 was given 에러가 난다.
파라미터 설정이 안되어있어 필수 인수가 0이라 불일치 현상이 발생했기 때문이다.

따라서

class person: 
    person_a = "김도영"
        
    def print_person(nct): # nct대신 self로 넣어줘도 됨
      print("NCT")

NCT_a = person()
NCT_a.print_person() #-> nct출력

생성자 함수

클래스가 인스턴스화(instantiate) 될 때 사용

class person:
    def __init__(self, person_a = "김도영"):
        self.person_a = person_a

NCT_a = person()
print(NCT_a.person_a) #-> 김도영

인스턴스마다의 속성이지 클래스 전체에 대한 속성X
클래스 자체에서 속성에 접근은 어려움

person.person_a # Attribute에러

클래스 특별 메소드

1. @property

  • 클래스를 만들고 해당 클래스 특성들을 설정해줌
  • 클래스 특성들을 생성할 때, self를 통해서 생성해줄 수도 있지만 여러 변수가 연결되거나 특별히 관리가 필요한 경우등 ,,, 이러한 상황들에서는 따로 함수로 작동하는 방식으로 관리가능
class Person:
	def __init__(self, first_name, last_name):
		self.first_name = first_name
		self.last_name = last_name

	def full_name(self):
		return self.first_name + ' ' + self.last_name
fred = Person('이', '도영')

fred.first_name = '김'

print(fred.first_name) #=> '김'
print(fred.full_name()) #=> '김 도영'
# full_name() 함수로 접근

클래스의 특성이 아닌 하나의 메소드로 접근해야함

class Person:
	def __init__(self, first_name, last_name):
		self.first_name = first_name
		self.last_name = last_name

	@property
	def full_name(self):
		return self.first_name + ' ' + self.last_name
fred = Person('이', '도영')

fred.first_name = '김'

print(fred.first_name) #=> '김'
print(fred.full_name) #=> '김 도영'
# 클래스의 특성처럼 접근

2. getter, setter

  • getter : 어떤 것을 가져오는 것
  • setter : 값을 설정해주는 행동
class Person:
	def __init__(self, first_name, last_name):
		self.first_name = first_name
		self.last_name = last_name

	@property # getter에 해당
	def full_name(self):
		return self.first_name + ' ' + self.last_name
		
	@full_name.setter # setter에 해당
	def full_name(self, new_full_name):
		first_name, last_name = new_full_name.split()
		self.first_name = first_name
		self.last_name = last_name
nct_a = Person('김', '도영')

print(nct_a.first_name) # 김
print(nct_a.full_name) # 김 도영

# setter가 있기때문에 황인준이 출력 가능
# 없으면 김도영으로 계속 출력
nct_a.full_name = '황 인준'

print(nct_a.first_name) # 황
print(nct_a.last_name) # 인준
print(nct_a.full_name) # 황 인준

데코레이터

  • 기존 함수가 있을 때, 장식해주는 것
  • 함수들마다 공통적으로 사용하는 부분을 구현해두는 것
def first_deco(func): # func 는 실행할 함수입니다.
    def first(): # 실행할 함수를 감싸는(wrap) 함수입니다.
        print("first")
        func()
    return first #first 함수를 return합니다

@first_deco
def my():
    print("my 라는 함수입니다.")

@first_deco
def mine():
    print("mine 이라는 함수입니다.")

@first_deco
def iam():
    print("iam 이라는 함수입니다.")

my()
mine()
iam()

함수에 인수가 있을 때

def first_last_deco(func): # func 는 실행할 함수입니다.
    def first_last(*args, **kwargs): # 실행할 함수를 감싸는(wrap) 함수입니다.
        print("first")
        func(*args, **kwargs)
        print("last")
    return first_last

@first_last_deco
def you(name):
    print(f"{name}! Hello")

데코레이터 사용 이유

  1. 코드의 재사용을 줄이기 위해
  2. 대규모 소프트웨어를 개발할 때 사용하기 위해

파이썬rf : https://velog.io/@lupin7?tag=python


🍕 오늘의 회고

우와! 생각보다 더 어렵다! 파이썬은 쉽다면 쉽고 어렵다면 어렵다는 말이 이제야 이해가 된다. ㅎㅋㅎㅋ 난 손만 담궜던 수준이었음ㅠ 쥬륵.... 용어들이 제대로 잡혀있지 않으니까 이해가 두배는 어렵다. 과제는 어떻게 한담? 시도도 못했음 아직....힝입니다!!!!!!!

profile
느려도... 꾸준히.....🐌

0개의 댓글