hojeomi blog

3-2. Pythonic Code 본문

AI/Course

3-2. Pythonic Code

호저미 2021. 1. 21. 12:45
Day 3-2.

1. split & join

In [31]:
# join

colors = ['red','yellow','blue']
a = '-'.join(colors)
a
Out[31]:
'red-yellow-blue'
In [ ]:
 
In [ ]:
 

2. list comprehension

  • 기존 리스트를 사용해서 간단히 다른 리스트를 만드는 기법
  • 포괄적인 리스트, 포함되는 리스트라는 의미로 사용됨
  • 일반적으로 for+append 보다 속도가 빠름
  • 즉, 리스트에서 사용하는 함수를 한 줄로 표현할 수 있다.
In [32]:
result = [i for i in range(10) if i > 5]  # list comprehension
result
Out[32]:
[6, 7, 8, 9]
In [33]:
w1 = "hello"
w2 = "world"

# for i in w1:
#    for j in w2:

result = [i+j for i in w1 for j in w2 if not(i==j)]  # 필터(if)는 끝에
result[:5]
Out[33]:
['hw', 'ho', 'hr', 'hl', 'hd']
In [34]:
# 2차원 -> 뒤가 먼저 작동함
# for j in w2:
#    line = []
#    for i in w1:
#        line.append(i+j)

result = [[i+j for i in w1 if not(i==j)] for j in w2]  # 필터(if)는 앞에 
result[:5]
Out[34]:
[['hw', 'ew', 'lw', 'lw', 'ow'],
 ['ho', 'eo', 'lo', 'lo'],
 ['hr', 'er', 'lr', 'lr', 'or'],
 ['hl', 'el', 'ol'],
 ['hd', 'ed', 'ld', 'ld', 'od']]
In [ ]:
 
In [ ]:
 

3. enumerate & zip

  • zip: 두 개의 리스트를 병렬적으로 추출
In [35]:
# enumerate

a = "abcd"
{v:i for i,v in enumerate(a)}
Out[35]:
{'a': 0, 'b': 1, 'c': 2, 'd': 3}
In [36]:
# zip

a = [1,2,3]
b = ['a','b','c']

[[a,b] for a,b in zip(a,b)]
Out[36]:
[[1, 'a'], [2, 'b'], [3, 'c']]
In [37]:
[c for c in zip(a,b)]  # 그냥 하면 튜플 타입으로 묶어줌
Out[37]:
[(1, 'a'), (2, 'b'), (3, 'c')]

3-a. 예제) 세 학생의 평균 점수

In [38]:
math = (100,57,89)
kor = (34,67,99)
eng = (100,32,46)

[sum(value)/3 for value in zip(math, kor, eng)]
Out[38]:
[78.0, 52.0, 78.0]

3-b. enumerate & zip 함께 쓰기

In [39]:
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')
In [40]:
list(zip(alist, blist))  # 이거에 enumerate한 것 ↑
Out[40]:
[('a1', 'b1'), ('a2', 'b2'), ('a3', 'b3')]
In [ ]:
 
In [ ]:
 

4. lambda & map & reduce

  • PEP8에서는 lambda를 지양함
  • 이유: 어려운 문법, 테스트의 어려움, 코드 해석의 어려움, 이름이 존재하지 않는 함수의 출현

  • map은 실행시점의 값을 생성, 메모리 효율적

  • reduce는 두 개씩 처리 후, 누적해서 계속 두 개씩 처리
In [43]:
# map

ex = [1,2,3,4,5]
f = lambda x: x**2

list(map(f, ex))  # ex의 값이 한 개씩, f로 들어가서, 한 개씩 반환
Out[43]:
[1, 4, 9, 16, 25]
In [44]:
# 직관적이지 않은 map을 다르게 쓰는 방법이 좋다.

[f(values) for values in ex]
Out[44]:
[1, 4, 9, 16, 25]
In [47]:
# reduce

from functools import reduce

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

5. iterable object

  • generator 개념 알기
  • 시퀀스(sequence) 자료형에서 데이터를 순서대로 출력하는 경우가 있음 -> interable object
  • 내부적으로 _iter_와 _next_가 사용됨
  • iter()와 next() 함수로 iterable 객체를 iterable object로 사용
  • iter 배우는 이유: generator를 위해
In [63]:
cities = ['jeju','daejeon']

address = iter(cities)  # 각각의 요소들이 다음 요소의 주소를 가지고 있음
print(address)
<list_iterator object at 0x000001D41C8F5B20>
In [64]:
a = next(address)  # 주소로 불러줌 -> 다음 주소로 연결
print(a)
jeju
In [65]:
next(address)
Out[65]:
'daejeon'
In [66]:
next(address)  # 한 개씩 빠지고, 다 빠지면 에러
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-66-e25ed4bf5acd> in <module>
----> 1 next(address)  # 한 개씩 빠지고, 다 빠지면 에러

StopIteration: 
In [ ]:
 
In [ ]:
 

6. generator

  • iter와 연결됨
  • 전에는 주소만 가지고 있다가 element가 사용되는 시점에 값을 메모리에 반환
  • 필요할 때만 쓰기 때문에 데이터가 많으면 시간 및 용량 효율성을 높일 수 있음
In [76]:
def generator_list(values):
    result = []
    for i in range(values):
        yield i  # yield는 호출해주는 함수
In [77]:
generator_list(5)  # 주소만 가지고 있다가,
Out[77]:
<generator object generator_list at 0x000001D41D434D60>
In [79]:
for a in generator_list(5):  # print 등 사용되는 시점에 yield를 통해 한 개씩 호출
    print(a)
0
1
2
3
4

6-a. generator comprehension

  • list comprehension과 유사한 형태로 generator형태의 list 생성
  • generator expression이라고도 불림
  • [] 대신 () 사용
  • generator에 저장된 값을 쓰기 위해서는, for 또는 list 등을 통해 불러줌
In [101]:
gen_ex = (n*n for n in range(5))
print(gen_ex)
<generator object <genexpr> at 0x000001D41D1B6580>
In [102]:
for a in gen_ex:
    print(a)
0
1
4
9
16

🎈 Question. 한 번 쓰면 사라지나?

In [103]:
for a in gen_ex:
    print(a)
In [104]:
list(gen_ex)
Out[104]:
[]
In [ ]:
 
In [ ]:
 

7. function passing arguments

  • 함수에 입력되는 arguments의 다양한 형태
    1) Keyword arguments
    2) Default arguments
    3) Variable-length arguments
In [ ]:
 

'AI > Course' 카테고리의 다른 글

Day 5-1. File / Exception / Log Handling  (0) 2021.01.22
4-1. 파이썬 OOP(객체 지향 프로그래밍)  (1) 2021.01.22
Day 3-1. Python Data Structure  (0) 2021.01.20
Day 2. 파이썬 기초 문법  (2) 2021.01.19
Day 1. 파이썬 개요  (0) 2021.01.18
Comments