이직을 위해 첫 서류를 쓴지 2달이 조금 안되는 시간 후에 운좋게 한 회사로 이직을 하고 첫 주를 보내게 되었다.

 

사실은 B2C 서비스를 하는 회사에 가고 싶긴 했는데, 소위 말하는 '네임드' 회사들 면접을 보면서 아직 준비가 되지 않았다는 것을 온몸으로 느꼈다 ㅋㅋ..

 

이런 나를 받아주는 회사가 하나라도 있어서 새삼 느끼면서 감사한 마음으로 이직을 하게 되었는데, 사실 면접 경험이 너무 좋아서 꽤나 만족스럽다.

 

첫 주를 보내며 기존에 계시던 서버 개발자분(팀리더)의 코드를 살살 보고 있는데 응애 주니어인 나에게는 너무 수준이 높다.

 

아무래도 당분간은 이직 준비를 할 때보다 빡시게 공부해야하지 않을까 싶다.

 

그 시작으로 파이썬 코드를 이쁘게(?) 적는 스타일을 정리해보려고 한다.

 

1. Enumerate 

list의 데이터와 인덱스를 둘 다 track 해야 할 때는 range 보다 enumerate를 사용하는 것이 성능이 좋고 깔끔하다.

data = [1, 2, -4, -3]
for i in range(len(data)):
	if data[i] < 0:
    	data[i] = 0
        

data = [1, 2, -4, -3]
for idx, val in enumerate(data):
	if num < 0:
    	data[idx] = 0

 

2. List Comprehension

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

 

3. Sorted

데이터 셋을 정렬하려고 할 때 sort, sorted 중에 선택을 할 수 있다.

둘의 차이점은 sort는 기존의 데이터 셋에서 정렬이 바로 진행되고, sorted는 정렬한 데이터 셋을 반환하는 차이가 있다.

sorted 함수가 더 pythonic 하다고 한다.

'''
sort
'''

data = [1, 3, 5, 7]
data.sort()


'''
sorted
'''

data = [1, 3, 5, 7]
sorted_data = sorted(data)


'''
sorted function extra option
'''

# 내림차순
data = (3, 5, 1, 10, 9)
sorted_data = sorted(data, reverse=True)

# Custom 정렬
data = [{"name": "Max", "age": 6},
		{"name": "Lisa", "age": 20},
        {"name": "Ben", "age": 9}]

sorted_data = sorted(data, key=lambda x: x["age"])

 

4. Set

데이터 셋의 중복을 제거하는 데에는 Set이 최고다.

data = [1, 2, 2, 3, 3, 3, 4, 5, 6, 6]
unique_data = list(set(data))

 

5. Generator

generator comprehension

(syntax: (<expression> for <var> in <iterable> [if <condition>])) 으로 generator 를 생성할 수 있다.

 

genereator는 코드 실행을 lazy하게 실행한다: lazy 하게 실행한다는 것은 선언할 때 바로 코드를 실행하는 것이 아니라, 실제로 사용할 때 실행한다는 것을 의미한다.

이는 generator가 모든 값을 메모리에 담고 있지 않고 그때그때 값을 생성하는 성질을 갖고 있기 때문이다.

 

결과적으로 sum 함수를 사용할 때 list보다 훨씬 적은 메모리를 사용한다.

imort sys

data = [i for i in range(10000)]
sum(data)
print(sys.getsizeof(data), "bytes")

gen = (i for i in range(10000))
sum(gen)
print(sys.getsizeof(gen), "bytes")

'''
87632 bytes
128 bytes
'''

 

6. dict .get(), setdefault()

dict 의 key를 조회할 때 get() 을 사용하여 조회하면, 해당 key가 없을 때 오류를 발생시키는 대신 get 함수로 넘기는 디폴트 값을 가져올 수 있다.

my_dict = {"item": "ball", "price": 10}
count = my_dict.get("count", 0)
print(count)


'''
0
'''

해당 key가 dict에 있는지 없는지 애매한 경우 조건문을 사용할 필요 없이 setdefault()함수를 사용할 수 있다. 기존에 이미 존재하는 key이면 value가 변경되지 않는다.

my_dict = {'a': 1, 'b': 2}
print(my_dict)
my_dict.setdefault('b', 3)
print(my_dict)
my_dict.setdefault('c', 4)
print(my_dict)

'''
{'a': 1, 'b': 2}
{'a': 1, 'b': 2}
{'a': 1, 'b': 2, 'c': 4}
'''

 

7.  collections.Counter

list 안에 있는 특정 데이터의 개수를 알고 싶으면 반복문을 사용하는 것보다 더 좋은 방법이 있다.

from collections import Counter

data = [10, 10, 10, 5, 5, 2, 9, 9, 9, 9, 9, 9]
counter = Counter(data)
print(counter)

most_common = counter.most_common(3)  # 가장 많은 데이터 3개까지 조회
print(most_common)

print(counter[9])
print(counter[0])  # 존재하지 않는 데이터를 검색하면 0개 리턴

'''
Counter({9: 6, 10: 3, 5: 2, 2: 1})
[(9, 6), (10, 3), (5, 2)]
6
0
'''

 

8. f-Strings

string 에 변수를 넣어주는 문법이다. 굉장히 간편하다.

name = "Max"
sample_string = f"Hello {name}"

 

9. string .join()

list를 string으로 합치고 싶을 때 사용한다. list를 반복문으로 돌면서 string에 더해주는 방식보다 성능이 좋다.

list_of_string = ["Hello", "my", "friend"]

# BAD
my_string = ""
for i in list_of_strings:
	my_string += i + " "
    
# GOOD
my_string = " ".join(list)of_strings)

'''
Hello my friend
'''

 

10. merge dict

여러개의 dict를 하나로 합칠 수 있다.

d1 = {"name": "Alex", "age": 25}
d2 = {"name": "Alex", "city": "New York"}

merged_dict = {**d1, **d2}
print(merged_dict)

'''
{'name': 'Alex', 'age': 25, 'city': 'New York'}
'''

 

References

https://www.youtube.com/watch?v=8OKTAedgFYg&list=PL8LLsJ8LoL9aHISvhk4Az4Tdeuqpquboi&index=17

+ Recent posts