[스파르타 내배캠 ai 3기] 파이썬 (5)

_포카칩·2022년 9월 18일

4.파이썬 심화

가. try/exception을 활용한 에러 처리

1)파이썬에서는 try/except 문법을 사용해 에러가 발생하면 처리 가능

  • number = 'num'

try #구문 안에서 에러가 발생할 경우 except로 넘어감
number = int(number) #'num'을 숫자로 바꾸는 과정에서 에러 발생
print(number)
except: #에러가 발생했을 때 처리
print(f"{number}은(는) 숫자가 아닙니다.")
만약 number에 num대신에 숫자가 들어가면 정상 출력. 문자면 정상출력 안됨.

  • 그런데 이럴 경우 어디에서 에러가 났는지 확인하기 어려우므로 에러 종류에 따라 다른 로직 처리를 해야함.
    number = input()
    try:
       int(number)
       10 / number
    except ValueError: # int로 변환하는 과정에서 에러가 발생했을 떄
       print(f"{number}은(는) 숫자가 아닙니다.")
    except ZeroDivisionError: # 0으로 나누면서 에러가 발생했을 때
       print("0으로는 나눌수 없습니다.")
    except Exception as e: # 위에서 정의하지 않은 에러가 발생했을 때(권장하지 않음)
       print(f"예상하지 못한 에러가 발생했습니다. error : {e}"
    #except 문법 또한 if / elif와 같이 연달아서 작성할 수 있습니다.
    '''

나. stacktrace의 이해

1)stacktrace는 파이썬 뿐만아니라 대부분의 개발 언어에서 사용되는 개념

에러가 발생했을 때 에러가 발생한 위치를 찾아내기 위해 호출된 함수의 목록을 보여주고 개발자는 stacktrace를 따라가며 에러가 발생한 위치를 추적할 수 있음.

  • import traceback
    try~
    except:
    traceback.print_exc()
    하면 출력됨.

    2)예제코드

def 집까지_걸어가기():
    print(error) # 선언되지 않은 변수를 호출했기 때문에 에러 발생

def 버스_탑승():
    집까지_걸어가기()

def 환승():
    버스_탑승()

def 지하철_탑승():
    환승()

def 퇴근하기():
    지하철_탑승()

퇴근하기()

"""
Traceback (most recent call last):
  File "sample.py", line 17, in <module>
    퇴근하기()
  File "sample.py", line 15, in 퇴근하기
    지하철_탑승()
  File "sample.py", line 12, in 지하철_탑승
    환승()
  File "sample.py", line 9, in 환승
    버스_탑승()
  File "sample.py", line 5, in 버스_탑승
    집까지_걸어가기()
  File "sample.py", line 2, in 집까지_걸어가기
    print(error)
NameError: name 'error' is not defined. Did you mean: 'OSError'?
"""

다. 축약식(Comprehension)

1)축약식

  • 축약식은 긴코드를 간략히, 남용할 경우 가독성 떨어짐.
    list, set, tuple, dict 자료형이 축약식 지원.
    기본적인 구조 동일, 어떤 괄호기호를 사용하는지, 어떤 형태로 사용하는지에 따라 저장되는 자료형 달라짐.
    축약식은 모두 동일한 구조를 가지고 있으므로 하나를 익히면 다 쓸 수 있음.

2) list, tuple, set 축약식 활용법

#기본적인 활용
#[list에 담길 값 for 요소 in list]
  numbers = [x for x in range(5)] #[0,1,2,3,4]
#조건문은 축약식 뒷부분에 작성, 축약식이 True이면 list에 담김.
  even_numbers = [x for x in range(10) if x%2==0] #[0,2,4,6,8]
  #아래와 같이 활용 가능
  people = [
   ("lee", 32),
    ("kim", 23),
    ("park", 27),
    ("hong", 29),
    ("kang", 26)
  ]
  
  average_age = sum([x[1] for x in people]) / len(people)
  #list 축약식의 []를 ()혹은{}로 바꿔주면 tuple, set축약식 사용 가능.

3) dictionary 축약식 활용법

# dictionary 축약식의 구조는 list와 동일하지만, key / value 형태로 지정해야 합니다.
people = [
  ("lee", 32, "man"),
  ("kim", 23, "man"),
  ("park", 27, "woman"),
  ("hong", 29, "man"),
  ("kang", 26, "woman")
]

people = {name: {"age": age, "gender": gender} for name, age, gender in people}
print(people)

# result print
"""
{
  'lee': {'age': 32,
           'gender': 'man'},
  'kim': {'age': 23,
           'gender': 'man'},
  'park': {'age': 27,
           'gender': 'woman'},
  'hong': {'age': 29,
           'gender': 'man'},
  'kang': {'age': 26,
           'gender': 'woman'}
}
"""

dict명 = {key : value for key,value in dict명}
*이 때 value가 dict가 될 수 도 있음.
dict = {name : {"age":age, "gender":gender} for name, age, gender in people}

라. lambda / map / filter / sort 활용하기

1)lambda 함수란?

파이썬에서 lambda함수는 다른말로 익명함수라고 불림
lambda함수는 주로 map / filter / sort 와 함께사용.

2)map 함수 활용

  • map은 함수와 리스트를 인자로 받아 리스트의 요소들로 함수를 호출함.
    string_number=["1","2","3"]
    integer_number=list(map(int, string_numbers))
    print(integer_numbers) # [1,2,3]

  • map 함수를 사용하지 않는 경우 아래와 같이 구현
    string_numbers = ["1","2","3"]
    integer_numbers=[]

    for i in string_numbers:
    intger_numbers.append(int(i))

    print(integer_numbers) #[1,2,3]

  • list 축약식으로도 동일한 기능 구현 가능
    string_numbers = ["1","2","3"]
    integer_numbers=[int(x) for x in string_numbers]
    print(integer_numbers) #[1,2,3]

  • map 함수와 lambda 함수를 함께 사용하면 더 다채로운 기능 구현
    numbers = [1,2,3,4]
    double_numbers = list(map(lambda x:x*2, numbers))
    print(double_numbers) #[2,4,6,8]

3)filter 함수 활용

  • filter 함수는 map과 유사한 구조를 가지고 있으며, 조건이 참인경우 저장.
    numbers = [1, 2, 3, 4, 5, 6, 7, 8]
    even_numbers = list(filter(lambda x: x%2 == 0, numbers))
    print(even_numbers) # [2, 4, 6, 8]
  • filter 함수 또한 list의 축약식으로 동일한 기능 구현 가능
    numbers = [1, 2, 3, 4, 5, 6, 7, 8]

even_numbers = [x for x in numbers if x%2 == 0]
print(even_numbers) # [2, 4, 6, 8]

4)sort 함수 활용

  • sort 함수는 list를 순서대로 정렬
    numbers = [5, 3, 2, 4, 6, 1]
    numbers.sort()
    print(numbers) # [1, 2, 3, 4, 5, 6]
  • sort와 lambda 함수를 같이 사용하면 복잡한 구조의 list도 정렬
    people = [
    ("lee", 32,100),
    ("kim", 23,80),
    ("park", 27,50),
    ("hong", 29,10),
    ("kang", 26,40)
    ]
    #나이순으로 정렬
    people.sort(key=lambda x:x[1])
    #성적순으로 정렬
    people.sort(key=lambda x:x[2])
profile
I love pocachip.

0개의 댓글