[Pythonic Code]
- 파이썬 스타일의 코딩기법이다.
- 파이썬 특유의 문법을 활용하여 효율적인 코드를 작성 가능하다.
- 고급 코드를 작성할 수록 더 많이 필요해진다.
* 주요 기법
split and join
list comprehension
enumerate and zip
map and reduce
asterisk
* Why Pythonic Code?
- 다른 코드에 대한 이해도 향상(많은 개발자들이 Pythonic Code 스타일로 코딩)
- 단순히 for문 + append 하는 것보다 코드도 짧고 빠르다
* 참고할 서적
- Fluent Python
- Effective Python(파이썬 코딩의 기술)
- 파이썬 클린코드
# General Code(Pythonic Code X)
colors = ['red','blue','green','yellow']
result = ''
for s in colors:
result += s
result
#출력
# 'redbluegreenyellow'
아래와 비교했을때 General Code가 더 코드가 긴 것을 볼 수 있다.
# Pythonic Code Ex1
colors = ['red','blue','green','yellow']
result = ''.join(colors) #띄어쓰기 없이 붙여라
result
#출력
# 'redbluegreenyellow'
# Pythonic Code Ex2
colors = ['red','blue','green','yellow']
result = '^^'.join(colors) #^^ 붙여라
result
#출력
# 'red^^blue^^green^^yellow'
a) Split
- string type 의 값을 설정한 기준에 맞추어 나누어준다.
- string.split('ref') : ref 는 string을 끊어주는 기준점이 된다.
- 띄어쓰기가 포함된 경우 특정 ref에 맞춰 split 하면 띄어쓰기도 같이 따라서 온다.
# Split Ex
items = 'zero one two three'.split()
print(items)
#['zero', 'one', 'two', 'three']
example = 'python,java,javascript'
example.split(',')
#['python', 'java', 'javascript']
a,b,c = example.split(',')
print(a,b,c)
#출력
# python java javascript
# Split Ex
example = 'python, java, javascript' #띄어쓰기도 같이 split
for content in example.split(','):
print(content.strip())
#출력
# python
# java
# javascript
b) Join
- string type 의 값을 합쳐서 하나의 string 으로 반환한다.
- 'ref'.join(list) : list안에 있는 string 들을 ref를 사이에 두고 합친다.
# Join Ex
colors = ['red','blue','green','yellow']
result = ''.join(colors) #띄어쓰기 없이 붙여라
result
#출력
# 'redbluegreenyellow'
colors = ['red','blue','green','yellow']
result = '\n'.join(colors)
result
#출력
# 'red\nblue\ngreen\nyellow'
c) List Comprehension
- 기존 list를 사용하여 간단히 다른 list 를 만드는 기법이다.
- 포괄적인 list, 즉 포함되는 리스트라는 의미로 사용
- 파이썬에서 많이 사용된다.
- 단순 for문 + append 기법보다 빠르다.
- [] 안에 list 를 형성할 조건(for문, if문 활용)들을 넣어준다.
* for - if 문이 들어갈 때,
a) if만 들어가면 for문 쓰고 if문
b) if-else문 둘다 들어가면 if문 쓰고 for 문
# General 'for + append' and List Comprehension
#General
result = []
for i in range(10):
result.append(i)
result
#출력
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
#List Comprehension
result = [i for i in range(10)]
result
#출력
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# List Comprehension EX
result = [i for i in range(10) if i%2==0]
result
#출력
# [0, 2, 4, 6, 8]
word1 = '12378' # or 'hello'
word2 = '6486' # or 'world'
result = [i+j for i in word1 for j in word2]
result
#출력
['16',
'14',
'18',
'16',
'26',
'24',
'28',
'26',
'36',
'34',
'38',
'36',
'76',
'74',
'78',
'76',
'86',
'84',
'88',
'86']
# List Comprehension EX
case_1 = ['a','b','c']
case_2 = ['D','E','A']
result = [i+j for i in case_1 for j in case_2]
result
#출력
# ['aD', 'aE', 'aA', 'bD', 'bE', 'bA', 'cD', 'cE', 'cA']
case_1 = ['a','b','c']
case_2 = ['D','E','c']
result = [j+i for i in case_1 for j in case_2 if not(i==j)]
print(result)
#출력
# ['Da', 'Ea', 'ca', 'Db', 'Eb', 'cb', 'Dc', 'Ec']
result.sort() #문자 순서로 정렬해준다.
#출력
# ['Da', 'Db', 'Dc', 'Ea', 'Eb', 'Ec', 'ca', 'cb']
# List Comprehension + split
words = 'The quick brown fox jumps over the lazy dog'.split()
print(words)
stuff = [[w.upper(), w.lower(), len(w)] for w in words]
print(stuff)
for i in stuff:
print(i)
#출력
['The', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog']
[['THE', 'the', 3], ['QUICK', 'quick', 5], ['BROWN', 'brown', 5], ['FOX', 'fox', 3], ['JUMPS', 'jumps', 5], ['OVER', 'over', 4], ['THE', 'the', 3], ['LAZY', 'lazy', 4], ['DOG', 'dog', 3]]
['THE', 'the', 3]
['QUICK', 'quick', 5]
['BROWN', 'brown', 5]
['FOX', 'fox', 3]
['JUMPS', 'jumps', 5]
['OVER', 'over', 4]
['THE', 'the', 3]
['LAZY', 'lazy', 4]
['DOG', 'dog', 3]
# List Comprehension : 뒤에 loop를 먼저 돌게 하기
case_1 = ['A','B','C']
case_2 = ['D','E','A']
result1 = [ i+j for i in case_1 for j in case_2] # i loop first
result2 = [ [i+j for i in case_1] for j in case_2] # j loop first
print(result1)
print(result2)
#출력
# ['AD', 'AE', 'AA', 'BD', 'BE', 'BA', 'CD', 'CE', 'CA']
# [['AD', 'BD', 'CD'], ['AE', 'BE', 'CE'], ['AA', 'BA', 'CA']]
# List Comprehension 속도 비교
def list_comprehension():
result = [ i for i in range(1000)]
def general_list():
result = []
for i in range(1000):
result.append(i)
%timeit general_list()
%timeit list_comprehension()
#출력
# 68 µs ± 1.26 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
# 40.2 µs ± 1.2 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
d) Enumerate
- enumerate : 열거하다
- list의 element를 추출할때 번호와 함께 추출한다.
- enumerate(string) : string 문자 하나하나를 index + char 로 packing
- enumerate(list) : list의 index + data 를 packing
- dictionary type으로도 가져올 수 있다.
# Enumerate Ex
for i,v in enumerate(['tic','tac','toe']):
print(i,v)
#출력
0 tic
1 tac
2 toe
for i,v in enumerate('ABC'): # or list type : ['A','B','C']
print("{0}\t{1}".format(i,v)) # '\t' : tap
#출력
0 A
1 B
2 C
# Enumerate Ex
#list type
my_list = ['a','b','c','d']
list(enumerate(my_list))
#출력
# [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
# dict type
my_str = 'ABCD'
{i:v for i,v in enumerate(my_str)}
#출력
# {0: 'A', 1: 'B', 2: 'C', 3: 'D'}
# Enumerate + List Comprehension
text = 'Samsung Group is a South Korean Multinational conglomerate headquartered '
[ [i,v] for i,v in enumerate(text.split())]
#출력
[[0, 'Samsung'],
[1, 'Group'],
[2, 'is'],
[3, 'a'],
[4, 'South'],
[5, 'Korean'],
[6, 'Multinational'],
[7, 'conglomerate'],
[8, 'headquartered']]
# Enumerate + Dict type
text = 'Samsung Group is a South Korean Multinational conglomerate headquartered '
{i:v.lower() for i,v in enumerate(text.split())}
#출력
{0: 'samsung',
1: 'group',
2: 'is',
3: 'a',
4: 'south',
5: 'korean',
6: 'multinational',
7: 'conglomerate',
8: 'headquartered'}
e) Zip
- zip : 묶어주다
- 두 개의 list 값을 병렬적으로 추출한다.
- zip(list1, list2) : list1과 list2 의 같은 위치의 데이터 끼리 묶는다.
# Zip Ex
alist = ['a1','a2','a3']
blist = ['b1','b2','b3']
for a,b in zip(alist,blist):
print(a,b)
#출력
a1 b1
a2 b2
a3 b3
a,b,c = zip((1,2,3),(10,20,30),(100,200,300)) #각 튜플의 같은 인덱스끼리 묶음
print(a,b,c)
#출력
# (1, 10, 100) (2, 20, 200) (3, 30, 300)
# Zip + List Comprehension
[[a,b] for a,b in zip(alist,blist)]
#출력
# [['a1', 'b1'], ['a2', 'b2'], ['a3', 'b3']]
[sum(x) for x in zip((1,2,3),(10,20,30),(100,200,300))]
#출력
# [111, 222, 333]
# Zip + List Comprehension + Tuple
[(a,b) for a,b in zip(alist,blist)]
#출력
# [('a1', 'b1'), ('a2', 'b2'), ('a3', 'b3')]
alist = ['a1','a2','a3']
blist = ['b1','b2','b3']
for i, values in enumerate(zip(alist,blist)):
print(i,values)
#출력
0 ('a1', 'b1')
1 ('a2', 'b2')
2 ('a3', 'b3')
이상 Pythonic Code Step1 끝!
Step2에서는 Lambda and MapReduce, Iterator and Generator, Asterisk 에 대해서 정리하려고 한다.
끗!
'Python > Pythonic Code' 카테고리의 다른 글
Pythonic Code #3 (Linear Algebra_vector and matrix) (0) | 2023.04.03 |
---|---|
Pythonic Code #2 (lambda, mapreduce, iterator, generator, asterisk) (0) | 2023.04.02 |