What is Pythonic Code??

Pythonic Code는 간단하게, 파이썬 특유의 문법을 활용하여 효율적으로 코드를 표현하는 기법을 말한다.

파이썬스러운 코드라고 할 수 있겠다.

그렇다면 파이썬스러운 코드라는 것이 뭘까?

예를 들어 여러 단어들을 합쳐서 하나의 문자열로 만들고 싶을 때 다음과 같이 코드를 짤 수 있다.

colors = ['red', 'green', 'blue']
for s in colors :
  result += s

이것은 파이썬의 join() 함수로 간단하게 처리할 수 있다.

colors = ['red', 'green', 'blue']
result = ''.join(colors)

“Life is short, You need Python”

간단하고 편리하다.

Split

items = 'zero one two three'.split()

print(items)

# ['zero', 'one', 'two', 'three']

example = 'python,jquery,javascript'

print(example.split(","))

# ['python', 'jquery', 'javascript']

# 리스트에 있는 각 값을 a,b,c,변수로 unpacking

a, b, c = example.split(",")

example = 'cs50.gachon.edu'

# .을 기준으로 문자열 나누기 unpacking

subdomain, domain, tld = example.split(".")

List Comprehension

기존의 리스트를 사용하여 간단히 다른 리스트를 만드는 기법이다.

예를 들어 일반적인 방식으론 다음과 같이 작성할 것이다.

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

그러나… 만약 다음과 같이 작성한다면?

result = [i for i in range(10)]

한줄이면 끝난다.

일반적인 방식보다 빠르다.

이런 뉘앙스의 코드를 리스트 컴프리핸션이라고 한다.

응용해서 특정 조건에 맞는 것들만 리스트에 추가하고 싶을 때(필터링)는 다음과 같이 리스트 컴프리핸션을 응용해서 쓸 수 있다.

result = [i for i in range(10) if i % 2 == 0]

짝수들만 리스트 안에 들어가게 된다. 모든 값이 0이고 길이가 prices인 리스트를 만들고 싶을 때answer = [0] * len(prices)

word_1 = "Hello"
word_2 = "World"

# Nested for loop
#이러면 모든 알파벳의 조합을 만들 수 있다.
result = [i+j for i in word_1 for j in word_2]

printr(result)

case_1 = ["A", "B", "C"]
case_2 = ["D", "E", "A"]

result = [i+j for i in case_1 for j in case_2]
print(result)

# 필터추가 만약 i 와 j가 같다면 리스트에 포함하지 않는다.
result = [i+j for i in case_1 for j in case_2 if not(i==j)]
result.sort()

print(result)
# 이런식으로 안에 대괄호를 넣어 감싸주면 2차원 리스트가 생성된다.
words = 'The quick brown fox jumps over the lazy dog'.split()
print(words)

stuff = [[w.upper(), w.lower(), len(w)] for w in words]

for i in stuff:
    print(i)

Enumerate & Zip

Enumberate는 리스트의 각 요소들을 추출할 때 인덱스도 같이 추출한다.

Zip은 두 개의 List값을 병렬적으로 추출한다.

alist = ['a1', 'a2', 'a3']
blist = ['b1', 'b2', 'b3']

for i, (a, b) in enumerate(zip(alist, blist)):
    print(i, a, b)

mylist = ["a", "b", "c", "d"]
list(enumerate(mylist))

# 문장을 List로 만들고 list의 index와 값을 unpacking하여 dict로 저장
{i:j for i, j enumerate('python is easy peasy, lemon squeezy'.split())}

Lambda & MapReduce

람다 함수란 함수 이름 없이 함수처럼 사용할 수 있는 익명핫무를 말한다.

수학의 람다 대수에서 유래했다.

일반적인 함수라면 다음과 같다.

def f(x, y):
  return x + y
print(f(1, 4))

만약 람다 함수를 사용한다면 다음과 같다.

f = lambda x, y: x + y
print(f(1, 4))

Map이란 시퀀스형 자료형 각 요소에 동일한 동작을 수행하는 함수이다.

예를 들어 다음과 같은 리스트에서 map함수를 사용하면 이렇다.

ex = [1, 2, 3, 4, 5]
f = lambda x: x ** 2
print(list(map(f, ex)))

f함수가 각 엘리먼트를 돌며 ** 2 연산을 수행한다.

따라서 [1, 4, 9, 16, 25]가 출력된다.

만약 map만 사용해서 출력하려고 한다면 메모리 주소값이 출력되니 결과를 출력하기 원한다면 list()로 감싸주어야 한다.

ex = [1, 2, 3, 4, 5]
f = lambda x, y: x + y
print(list(map(f, ex, ex)))

위와 같이 사용한다면 zip을 사용하는 것과 같은 효과를 낸다.

Reduce란 map과 달리 list에 똑같은 함수를 적용해서 통합하는 것이다.

다른 프로그래밍언어, 예를 들어 자바스크립트의 reduce와 같은 개념이다.

from functools import reduce
print(reduce(lambda x, y: x + y, [1, 2, 3, 4, 5]))
# 15

x에는 이전 값이 들어가고 y에는 현재 값이 들어가서 15라는 값은 1+2+3+4+5가 되어 15가 출력된다.

이를 이용해서 팩토리얼을 구해보면 이렇다.

def factorial(n):
  return reduce(
    lambda x, y: x*y, range(1, n+1)
  )

factorial(5) # 120

그러나 코드의 직관성이 떨어져서 잘 쓰이지 않는다.