[표현식 for 변수 in 반복대상 if 조건문]
ex-1)
result = [] for i in range(1, 5): result.append(i)컴프리헨션으로 작성하면?
result = [i for i in range(1, 5)]ex-2)
result3 = [] for i in range(1, 6): if i % 2 ==0: result3.append(i**2)컴프리헨션으로 작성하면?
result3 = [i**2 for i in range(1, 6) if i % 2 ==0]
{키표현식: 값표현식 for 변수 in 반복대상 if 조건}ex-1) 리스트 항목을 키로 넣어보자
students = ['철수', '영희', '유선'] {student: 0 for student in students} # {'철수': 0, '영희': 0, '유선': 0}ex-2) 단어의 길이를 값으로 넣어보자
words = ['python', 'data', 'ai'] length = {w: len(w) for w in words}ex-) 단어의 길이가 3 이상인 단어만 딕셔너리 형태로 만든다면?
words = ['python', 'data', 'ai'] length = {w: len(w) for w in words if len(w) >= 3}
[주로 사용하는 경우]
키 컴프리헨션을 반대로 정석 for 문으로 작성해보자.
names = ['ha', 'yh', 'jh'] re = {i: name for i, name in enumerate(names)}dic = {} for idx, n in enumerate(names): dic[idx] = n
{값 for 변수 in 자료}ex) names = ['ha', 'yh', 'yh', 'Ha', 'jh'] unique ={name.lower() for name in names}
ex) 컴프리헨션으로 작성해보자
for i in range(2, 10): for j in range(1, 10): print(f'{i} x {j} = {i*j}')li = [f'{i} x {j} = {i*j}' for i in range(2, 10) for j in range(1, 10)] for i in li: print(i)
try:
# 문제가 생길 수 있는 코드
# 범위 확인
# 조건문
# 다시 입력해주세요
except:
# 문제가 생겼을 때의 처리 코드
else: (선택)
# 예외가 발생하지 않았을 때 실행하는 코드
finally: (선택)
# 예외가 있건 없건 무조건 실행하는 코드
ex)
def gugudan(n): try: # 경우 따지기 # 범위 확인 if not isinstance(n, int): # n이라는 값이 int냐 아니냐 raise TypeError('정수 숫자만 입력해주세요.') if not (2 <= n <= 9): # raise: 발생시켜라 raise ValueError('2~9까지 숫자를 입력해주세요.') for i in range(1, 10): print(f'{n} x {i} = {n * i}') except ValueError: print(f'[범위 오류] {ValueError}') # 범위 오류가 위에서 발생하면 여기로 와서 오류를 발생시킴 except TypeError as te: # 약어를 사용해서 줄일수도 있다. print(f'[타입 오류] {te}')
주의!
if not isinstance()보다if not (2 <= n <= 9)를 먼저 작성하면 어떻게 될까?
위 코드 처럼 숫자의 범위를 따지는 코드가 먼저 작성된 상태에서 만약
gugudan('10')과 같이 정수가 아닌 값이 들어올 경우 첫번째 조건문에서ValueError가 아니라TypeError가 발생함. 첫번째 조건문에서 문자를 숫자와 범위 비교를 할 수 없기에 파이썬 내부 에러가 발생하는데 이 경우 발생하는 에러가TypeError이다.
그렇기에 범위에 대한 예외 처리보다 타입에 대한 예외 처리를 먼저 해주는 것이 좋다.
추가로 아래처럼 단순 예외 경우만 설정할 경우 의도와 다르게 작동할 수 있다.(문자열을 반복 출력함)