스마트한 개발 공부/Python

[Python] 코팅테스트 할 때 사용하면 좋은 coding 스킬

스마트한지노 2021. 5. 26. 22:37
728x90
반응형

 

python 수업을 듣다가 문득 문제해결 수업에서 배운 유용한 coding 스킬들이 생각이 나서 글을 적게 되었다. 이때 나는 python 왕 초보였기 때문에 초보분들이 사용하기에는 정말 좋을 것이다.

1. List comprehension (여러 줄로 쓰여진 리스트 코드 짥게 쓰기)

 

 

 

list를 만들 때 보통 변수를 선언하고 그 안에 리스트를 넣는다.

예를 들면

data= []
for i in range(10):
	data.append(i*i)
print (data)

 

이런식으로 많이 만든다. 하지만 코딩을 하다보면 최대한 깔끔하게 만들고 싶은 강박관념이 생길 것이다. 

data = [i*i for i in range(10)] 

 

이렇게 간단하게 변경할 수 있다. 
if 문이 들어가는 list 생성 코드를 바꿀 때도 유용하다. 

data= []
for i in range(10):
 	if i % 2 == 1:
    	data.append(i*i)
print (data)

홀수의 제곱 수를 리스트에 추가하는 위와 같은 코드도 

data = [i*i for i in range(10) if i % 2 == 1]

이와 같이 한 줄로 표현할 수 있다.

2. Lambda functions 

Lambda function 은 또 여러 줄로 표현되는 함수를 짧게 표현할 때 사용된다.  
lambda 함수를 사용하는 형식은 아래와 같다. 
lambda <parametes> : <expression to return>

>>func = lambda : 1
>>func()
1
>>func = lambad a,b : a + b
>>>func(10,20)
30

 

3. Packing / Unpacking

여러 개의 데이터를 묶어 변수에 대입하는 것을 packing 이라고 한다. 

>>>numbers = (1, 2, 3)
>>>print (numbers)
1 2 3

 

다만, 이렇게 묶은 데이터를 다른 변수에 나눠서 할당해야 할 때도 있는데, 이를 unpacking이라고 한다. 

>>>a,b,c = numbers
>>>print (a,b,c)
1 2 3

이때 asterisk (*)을 사용해서 편리하게 각 요소들을 대입할 수 있다.

*은  크게 2가지 용도로 사용된다.
      1. Passing all the items in an iterable as function arguments.
      2. Receiving multiple items through a variable-length argument list.

>>>t = tuple(range(5))
>>>a, b, *c = t
>>>print (a, b, c)
0, 1, [2, 3, 4]

5개의 요소에서 a, b에 하나씩 할당을 한 뒤에 남은 요소 전체를 c 에 담아 할당한다.
그러면 이걸 왜 쓰는걸까?
요소가 많은 경우에 이 방법이 매우 유용하다. 
예를 들어서 오늘 과일을 팔아서 얻은 총 수입을 계산하려고 할 때 아래와 같은 수식을 사용하면 sell에 있는 요소를 하나씩 불러서 함수에 넣어야한다.

def today_sale(banana, tomato, apple):
	return (banana * 1000 + tomato * 2000 + apple *1500)
sell = (10, 20 ,30)
today_sale(sell[0],sell[1],sell[2])

이러한 작업을  *을 쓴다면 

 today_sale(*sell)

이처럼 간단하게 사용할 수 있다. *가 알아서 요소들을 하나씩 불러와 대입해준다. 
다만, 요소의 크기기 똑같은 경우에만 사용할 수 있다. 

4. input() 값 간단하게 받아오기

이건 사실,,,알고리즘 문제를 풀다가 교수님께서 항상 n = 10^6 인지 n = 10^12 이었는지 기억이 잘 안 나는데 쨌든 overtime 나게 하려고 엄청나게 빡세게 하셨다. 
이런 경우에는 일반적으로 input()을 받아서 list를 만들면 여기서 이미 overtime이 난다. 
코딩하시는 분들은 믿기 어려우실 수도 있겠지만....진짜 이런식으로 짜서 input 값을 받았다.

from sys import stdin
f = {}
g = {}

n = int(input())
for i in range(n):
    str = stdin.readline().rstrip('\n').split(" ")
    f[str[0]]=str[1]

n = int(input())
for i in range(n):
    str = stdin.readline().rstrip('\n').split(" ")
    g[str[0]]=str[1]

str = stdin.readline().rstrip('\n').split(" ")

좀 더 빠르고 편하게 input 값을 받으려면 이렇게 코드를 짜면 간편하다. 

Test input   Python code
7 data = int(input())
19 25 38 data = [ int(x) for x in input().split() ]
-> data = [19, 25, 38]
2 7 12
33 54
get_data = lambda : [ int(x) for x in input().split() ]
data1 = get_data()
data2 = get_data()
-> data1 = [2, 7, 12]
    data2 = [33, 54]

Note :

  • 여기서 input()은 sys.stdin.readline()으로 해도 된다.
  • input() 값은 text line을 "\r\n" or "\n" 으로 반환한다.

물론 input 값이 어떻게 들어오는지와 어떻게 받아서 저장하는지는 상황에 따라 다르겠지만, 위와 같은 방식을 기초로 코드를 짜면 편할 것이다.

728x90
반응형