def func():
    if (condition_1):
        if (condition_2):
            if (condition_3):
                # Code
            else:
                # Code
        else:
            # Code
    else:
        #Code

이런 식의 if문 중첩 코드를 본 적이 있고 초심자라면 누구나 한 번은 작성해 보았을 것이다.

하지만 이렇게 작성하면 가독성도 떨어질 뿐더러, 나중에 다시 보면 기억이 나지 않는다. 주석의 중요성

이런 경우에 사용하는 코드 최적화 기법은 아니지만, 유용했던 if문 one-liners 기법을 정리한다.

(위의 코드를 최적화하기 위해서는 not을 사용해서 코드를 정리해야 한다.)

 

이제 정리할 One-Liners 기법은 간단한 if문을 정리하는 방법이다.

if, if-else, if-elif-else의 경우에 따라 간단하게 정리했다.

(One-Liners  기법에는 if만 있지는 않다. comprehension 같은 것도 전부 One-Liners라고 부른다.)

 

# General Code
if a == 1:
    print(a)


# One-line Code
if a == 1: print(a)

예외가 없는 단일 if문은 일반적인 방법이나 One-line이나 크게 차이가 없다.

마치 C에서 if문 단일 문장은 중괄호 { }를 사용하지 않고 바로 옆에 적는 것과 비슷한 느낌이다.

단지 저런 간단한 if를 여러 줄에 걸쳐 작성할 필요가 없다는 거다.

 

# General Code
if a == 1:
    print(1)
else:
    print(0)

# One-line Code: <결과> = A if <조건식> else B
print(1) if a == 1 else print(0)

"<결과> = A if <조건식> else B"라고 거창하게 적어놓았지만 이렇게까지 쓸 필요도 없다.
print(1) if a == 1 else print(0)

위의 코드를 읽어보자.

1을 출력해라, 만약 a가 1이라면, 아니라면 0을 출력해라.

너무나 자연스러운 읽기 방식 그대로 적용되었다. 차이점이라고는 if 뒤에 콜론(:)이 없다는 것.

 

주의할 점은 break, continue, pass, retrun과 같은 명령어를 사용하려면 One-line으로는 안 된다.

가령 break if a == 0 else continue라는 식이 있다고 가정해보자.

인터프리터가 break를 보는 순간 뒤의 코드는 해석하지 않고 곧바로 종료할 것이다.

이런 경우에는 여러 줄에 걸쳐서 작성해주자.

 

# General Code
a = -1
if a == 1:
    print(1)
elif a == -1:
    print(-1)
else:
    print(0)
    
    
# One-line Code
a = -1
print(1) if a == 1 else print(-1) if a == -1 else print(0)

조건(elif) 개수가 많은 식이라면, 그리고 그냥 if-elif-else라면 일반적으로 적는 것이 가독성이 더 좋다.

개인적으로 if-else의 One-Line은 즐겨쓰지만, if-elif-else는 잘 사용하지는 않는다.

 

천천히 읽어보면 그렇게 어렵지 않다. 약간 Excel에서 다중 if문을 사용하는 느낌이 든다.

print(1) if a == 1 else print(-1) if a== -1 else print(0)

1을 출력해라, a가 1이라면, 아니면 -1을 출력해라 a가 -1이라면 그것도 아니라면 0을 출력해라.

elif가 사라지고 if else if else 형식으로 변한 것이 특징이다.

 

이런 One-line은 의미가 있나 싶다.

하지만 그건 내 생각이고 의미가 있기에 존재할 것이라 생각한다.

하지만 이러한 것도 있다하고 알아는 둬야 한다고 생각한다.

(실제로는 사용하지 않고, Code Refactoring할 때 사용할지도?)

'Computer Science > 파이썬(Python)' 카테고리의 다른 글

Python f string format  (0) 2023.04.01
Python zip  (0) 2023.03.30
Python enumerate  (0) 2023.03.28
Python time module  (0) 2023.03.27
Python pass vs continue  (0) 2023.03.27
lst = [ ... ]

for i in range(N):
    print(lst[i])		# Case 1
    print(i, lst[i])		# Case 2
    
cnt = 0
for i in lst:
    print(i)			# Case 3
    print(cnt, i)		# Case 4
    cnt += 1

파이썬을 사용하여 반복문을 작성할 때 보통 위와 같은코드를 사용한다. 

Case 1과 2처럼 범위를 설정하여 그 인덱스를 통해 배열의 값을 출력하기도 하고,

Case 3과 4처럼 범위 대신 iterable 객체를 사용해 직접 요소를 출력하기도 한다.

이때 해당 인덱스와 값을 출력하기 위해서는 Case 2나 4처럼 조금은 번거로운 방법을 사용해야 한다.

이것을 Python 내장 함수인 enumerate로 해결할 수 있다.

 

items = ["Fir", "Sec", "Thi"]

for val in enumerate(items):
    print(val)
    
'''
(0, 'Fir') 
(1, 'Sec') 
(2, 'Thi') 
'''

enumerate 함수는 열거 객체를 돌려준다. // enumerate(iterable, start=0)

쉽게 말하면 반복 가능한(iterable) 객체의 인덱스와 값을, 튜플 형태로 반환해주는 함수이다.

이때 인덱스 시작 번호는 start 매개변수로 설정해줄 수 있다.

 

# Case 1
items = ["Fir", "Sec", "Thi"]

for val in enumerate(items):
    print(list(val))
    
'''
[0, 'Fir']
[1, 'Sec']
[2, 'Thi']
'''

# Case 2
items = ["Fir", "Sec", "Thi"]

for index, item in enumerate(items, start = 100):
    print(index, item)
    
'''
100, 'Fir'
101, 'Sec'
102, 'Thi'
'''

Case 1처럼 튜플을 리스트로 바꿔 사용할 수도 있다.

Case 2처럼 unpacking하여 인덱스와 값을 각각 받아들여 출력하는 형태도 가능하다.

이때 start로 100 값을 넣어주니 100부터 값을 세어나가는 것을 볼 수 있다.

앞으로 인덱스와 값을 사용할 일이 있다면 enumerate 함수를 사용해보자

 

 

고민을 시작한 문제 출처 : https://www.acmicpc.net/problem/16139

참고한 문서 자료 : https://docs.python.org/ko/3/library/functions.html#enumerate

'Computer Science > 파이썬(Python)' 카테고리의 다른 글

Python f string format  (0) 2023.04.01
Python zip  (0) 2023.03.30
Python if comprehension  (0) 2023.03.28
Python time module  (0) 2023.03.27
Python pass vs continue  (0) 2023.03.27
import time

start = time.time()

''' do something '''

end = time.time()

print(end - start)

알고리즘 공부나 파이썬 코딩 테스트들의 교재를 공부하다보면 위와 같은 코드가 종종 보인다.

time 모듈을 사용하여 자신의 코드가 얼마나 걸리는지 확인해 보라는 의미이다.

코딩 테스트가 아니더라도 시간복잡도 측면에서 내 코드가 얼마나 걸리는지는 중요한 안건이다.

그렇기에 시간이 얼마나 걸리는지 확인하는 시도는 매우 훌륭하다.

 

하지만 위와 같은 방식은 조금 잘못됐다.

time.time()은 말그대로 지금 시각을 입력받는 것이지 코드가 얼마나 걸리는지가 아니다.

아주 사소한 차이지만 다르다.

 

import time

# Using perf_counter()
start = time.perf_counter()
''' do something '''
end = time.perf_counter()
print(end - start)

# Using prcess_time()
start = time.process_time()
''' do something '''
end = time.process_time()
print(end - start)

time()보다는 perf_counter()나 process_time()이 더 정확하다.

perf_counter()의 경우 프로그램 전체의 실행시간으로 계산한다.
process_time()의 경우 프로그램이 실제 프로세싱(처리)된 시간으로 계산한다.

 

어떤 차이냐면 sleep(sometimes)을 생각하면 된다.

perf_counter()는 프로그램 실행시간을 계산하기 때문에 sleep()으로 쉰 시간도 포함한다.

하지만 process_time()은 실제 프로세싱 시간을 계산하기 때문에 포함하지 않는다.

자신의 코드 상태를 보고 적절히 골라서 사용하면 된다.

모르겠다 싶으면 perf_counter()로 계산하자.

 

 

고민을 시작한 영상 출처 : mCoding's Youtube 5:22, https://www.youtube.com/watch?v=qUeud6DvOWI

'Computer Science > 파이썬(Python)' 카테고리의 다른 글

Python f string format  (0) 2023.04.01
Python zip  (0) 2023.03.30
Python if comprehension  (0) 2023.03.28
Python enumerate  (0) 2023.03.28
Python pass vs continue  (0) 2023.03.27
# Using pass
for _ in range(3):
    print("TEST", end=" ")
    pass
    print("PASS")
'''
TEST PASS
TEST PASS
TEST PASS
'''
    
# Using continue
for _ in range(3):
    print("TEST", end=" ")
    continue
    print("CONTINUE")
'''
TEST TEST TEST
'''

정리하자면 pass는 말그대로 지나가 다음 코드도 실행하지만,

continue는 뒤의 코드는 생략한 채로 다음 loop를 향해 간다.

 

def func(var):
    try:
        var += 1
    except:
        pass
        
    return var

실제 상황에서 pass를 쓸 일이 있을지는 아직까지는 모르겠다.

하지만 위와 같이 try except 구문에서 예외가 발생했을 때 사용하기도 한다.

pass를 사용하여 error로 프로그램이 종료하는 것을 무시할 수 있다.

 

 

고민을 시작한 영상 출처 : mCoding's Youtube 3:23, https://www.youtube.com/watch?v=qUeud6DvOWI 

'Computer Science > 파이썬(Python)' 카테고리의 다른 글

Python f string format  (0) 2023.04.01
Python zip  (0) 2023.03.30
Python if comprehension  (0) 2023.03.28
Python enumerate  (0) 2023.03.28
Python time module  (0) 2023.03.27

+ Recent posts