TIL - assert, readline, 파이썬 리스트

손찬호·2024년 3월 22일
0

TIL

목록 보기
1/21
post-thumbnail

assert 함수란?

조건문을 설정하고 조건에 해당되지 않으면 에러를 발생하는 함수

assert함수를 쓰는 이유?

알고리즘 문제풀이를 할 때, 입력값이 의도된 형식인지 확인할 수 있다.
예를 들어 나눗셈을 하는 함수를 만들때 분모가 0이라면 에러를 발생하도록 할 수 있다.

assert 예제

정수형인 분자,분모를 각각 나누는 함수를 작성하는데
분모가 0인 경우 에러 메시지를 출력하도록 assert를 사용했다.

파이썬

assert 검증하는 조건문, 조건이 맞지 않을 시 출력할 메시지

def divide(numerator, denominator):
    # 입력값이 정수가 아니라면 에러를 발생시킨다.
    assert type(numerator) == int, "Numerator must be an integer"
    assert type(denominator) == int, "Denominator must be an integer"
    
    # 분모가 0이라면 에러를 발생시킨다.
    assert denominator != 0, "Denominator cannot be zero"
    
    return numerator/denominator

print(divide(10, 0))
    

C/C++

assert (검증할 조건문)

#include <iostream>
#include <cassert>
int divide(int numerator, int denominator) {
	// 분모가 0이 아니면 에러 발생
	assert(denominator != 0);
	return (double)numerator/denominator;
}

int main() {
	std::cout << divide(10, 0) << std::endl;
	return 0;
}

빠른 입력 readline

일반적으로 python에서 데이터를 입력받는 경우 사용하는 여러 메서드들이 있다.
그 중에서 가장 기본적인게 input()인데
가장 빠른 메서드는 아니다 보니 알고리즘 문제를 푸는데 빠른 입력이 되지 않아
종종 시간초과의 원인이 되기도 한다.
그래서 보다 빠른 입력 메서드를 사용하는데 그게 바로 sys.stdin.readline이다.
매번 입력을 받을 때마다 input대신 sys.stdin.readline을 쳐도 되지만
초기에 할당을 해주면 input()을 써도 sys.stdin.readline()을 쓰는 걸로 인지할 수 있다.

input보다 readline이 빠른 이유는?

여러가지 이유가 있지만 가장 핵심적인 이유는
입력받은 데이터를 가져오는 주기가 다르다.
input은 입력할 때 타이핑 누를 때마다 버퍼에 저장한다면
sys.stdin.readline은 입력이 완료된 후에 한 번에 가져와 버퍼에 저장합니다.
그래서 입력하는 값이 많아질 수록 readline이 더 빨라진다.

더 자세한 비교는 아래 글에서 확인할 수 있다.
https://www.geeksforgeeks.org/difference-between-input-and-sys-stdin-readline/

사용 예제

import sys

input = sys.stdin.readline
text = input()
print("입력값은 "+text+"입니다")
=> input()을 사용해도 sys.stdin.readline을 한 걸로 인식된다. 

주의할 점 1

변수에 단축어로 할당할 때 괄호를 2번쓰지 않도록 주의하자.

import sys

# 올바른 예시
input = sys.stdin.readline
text = input()

# 잘못된 예시
input = sys.stdin.readline()
text = input()

주의할 점 2

줄바꿈 문자를 필요한 경우 제거할 것
input()와 달리 sys.stdin.readline()의 경우
줄바꿈 문자를 같이 저장하게된다.
그래서 "A"를 입력하면 "A\n"으로 저장하게 되는데
replace()메서드를 사용해 "\n"을 제거할 수 있다.

import sys

input = sys.stdin.readline
value = input()
print("value 출력값:")
print(value)
print('value.replace("\\n\",\"\") 출력값:')
print(value.replace("\n",""))

리스트 원소 형변환 - python

알고리즘 문제를 풀다보니 문자열 리스트를 정수형 리스트로 변환할 일이 생겼다.
알고리즘 테스트에서 생각이 나지 않는 경우를 대비해서
여러가지 방법을 정리해 기록하고자한다.

예) string_list를 int_list로 변환하기

string_list = ['1','2','3','4']
int_list = [1,2,3,4]

방법 1 - 리스트 표현식 사용

# 방법 1 - 리스트 표현식 사용
char_list = ['1','2','3','4']
int_list = [int(char) for char in char_list]
print(list)

파이썬만의 리스트 표현식에 익숙하다면 무난하게 사용할 수 있는 방법이다.

방법 2 - map 사용

# 방법 2 - map 함수 사용
char_list = ['1','2','3','4']
int_list = list(map(int, char_list))
print(int_list)

다른 언어에서 map메서드를 자주 사용했다면 익숙한 방법이다.
파이썬에서 map메서드의 결과는 map객체를 반환하므로
list()로 리스트 형태로 변환해주자.

방법 3 - 반복문 사용

# 방법 3 - 반복문 사용 
char_list = ['1','2','3','4']
int_list = []
for char in char_list:
	int_list.append(int(char))
print(int_list)

간단하게 for문으로 리스트의 원소를 하나씩 꺼내 정수로 변환해
새로운 리스트에 추가하는 방법이다.

물론 이외에도 다양한 방법이 있지만
주로 생각나는 3가지를 적어봤다.

리스트에서 특정값만 제거하기 - 파이썬

파이썬에서 특정값만 제외하고 리스트를 만들고자 했다.
예를 들어서 [1,2,3,4,1]이라는 리스트가 있을 때
순서에 상관없이, 중복 여부에 상관없이 제거하면
[2,3,4]가 되도록 하고 싶었다.
위에서 한 것처럼 리스트 표현식을 이용해서 조건문을 적용해 새로운 리스트를 만들면 되었다.

nums = [1,2,3,4,1]
nums = [i for i in nums if i!=1]
print(nums)
profile
매일 1%씩 성장하려는 주니어 개발자입니다.

0개의 댓글

관련 채용 정보