[Python]Pythonic Code
Pythonic Code
- 파이썬 특유의 문법을 활용하여 효율적으로 코드를 구현하는것
split
- string type을 "기준 값"으로 변경하여 list의 형태로 반환
numbers = "1 2 3"
num_list = numbers.split() #default는 빈칸
print(num_list)
['1', '2', '3']
split을 활용한 unpacking
one, two, three = "1 2 3".split()
print(one, two, three)
1 2 3
join
- string으로 구성된 list를 합쳐 하나의 string으로 반환
hello = ["안", "녕", "하", "세", "요"]
hello = "".join(hello)
print(hello)
안녕하세요
list comprehension
- 기존 list를 사용하여 간단히 다른 list를 만드는 기법
- 파이썬에서 가장 많이 사용되는 기법 중 하나
- 일반적으로 for + append 보다 속도가 빠름
조건문과 list comprehension
nums = [i for i in range(10) if i%2 == 0]
print(nums)
[0, 2, 4, 6, 8]
for 중첩 list comprehension
nums = "123"
words = "abc"
new = [num + word for num in nums for word in words]
print(new)
['1a', '1b', '1c', '2a', '2b', '2c', '3a', '3b', '3c']
list comprehension 2차원 list
nums = "123"
words = "abc"
new = [[num+word for word in words]for num in nums]
print(new)
[['1a', '1b', '1c'], ['2a', '2b', '2c'], ['3a', '3b', '3c']]
enumerate
- list의 element를 추출할 때 번호를 붙여서 추출
for문과 enumerate 를 사용하여 list의 있는 index와 값을 unpacking
for i, v in enumerate(["a", "b", "c"]):
print(i, v)
0 a
1 b
2 c
zip
- 리스트의 element를 같은 인덱스 끼리 묶어줌
nums = [1, 2, 3]
words = ["a", "b", "c"]
kors = ["가", "나", "다"]
for num, word, kor in zip(nums, words, kors):
print(num, word, kor)
1 a 가
2 b 나
3 c 다
- tuple의 같은 index 끼리 묶음
nums = (1, 2, 3)
words = ("a", "b", "c")
kors = ("가", "나", "다")
a, b, c = zip(nums, words, kors)
print(a, b, c)
(1, 'a', '가') (2, 'b', '나') (3, 'c', '다')
lambda
- 함수의 이름 없이, 함수처럼 쓸 수 있는 익명함수
- PEP 8 에서는 lambda의 사용을 권장하지 않지만 여전히 많이 쓰인다.
f = lambda x: x / 2
print(f(4))
2.0
map
- 시퀀스형 데이터가 있을 때 함수를 각각 맵핑해줌
- iteration을 생성시키는 것이여서 list를 붙여줘야 사용 가능
f = lambda x: x*2
f1 = list(map(f, "hi"))
print(f1)
['hh', 'ii']
f1 = [word*2 for word in "hi"]
print(f1)
['hh', 'ii']
위는 동일한 역활을 수행하는 코드이지만 두번째 코드가 훨씬 직관적이고 이해하기가 쉽다.
reduce
- map function과 달리 list에 똑같은 함수를 적용해서 통합
from functools import reduce
print(reduce(lambda x, y: x+y, [1, 10, 100, 1000]))
1111
x, y = 1, 10 -> x+y = 11 이고 x=11
x, y = 11, 100 -> x+y = 111 이고 x=111
x, y = 111, 1000 -> x+y= 1111 이고 x = 1111
코드의 직관성이 떨어져 python3에서는 권장하지 않지만 다양한 머신러닝 코드에서 여전히 사용중이다. map과 reduce는 대용량의 데이터를 handling할 때 많이 사용된다.
generator
- iterable object를 특수한 형태로 사용해주는 함수
- element가 사용되는 시점에 값을 메모리에 반환
- yeild를 사용해 한번에 하나의 element만 반환
- 일반적인 iterator에 비해 훨씬 작은 메모리 사용
- 큰데이터, 파일 데이터를 처리할 때 generator 사용 고려
def generator_list(nums):
for num in range(nums):
yield num
a = generator_list(10)
for i in a: #for문을 이용해야 출력가능
print(i)
0
1
2
3
4
5
6
7
8
9
generator comprehension(generator expression)
gen = (n*n for n in [1, 2, 3, 4])
for i in gen:
print(i)
1
4
9
16
from sys import getsizeof
gen_1 = (n for n in range(100))
list_1 = [n for n in range(100)]
print(getsizeof(gen_1))
print(getsizeof(list_1))
112
920
메모리 사용 용량이 다른것을 볼 수 있다.
function passing arguments
- 1.keyword arguments
- 2.Default arguments
- 3.Variable-length arguments
keyword arguments - 함수에 입력되는 parameter의 변수명을 사용해서 arguments를 넘김
def add(x, y):
return x+y
add(y=10, x=1)
11
Default arguments - parameter의 기본 값을 사용, 입력하지 않을 경우 기본값 출력
def add(x, y=10):
return x+y
print(add(1, 11))
print(add(1))
12
11
Variable-length arguments(가변인자)
- 개수가 정해지지 않은 변수를 함수의 parameter로 사용하는 법
- keyword arguments와 함께, argument추가가 가능
- 입력된 값은 tuple type으로 반환됨
- 가변인자는 오직 한 개만맨 마지막 parameter 위치에 가능
def args(*args):
a, b, c = args
print(a, b, c)
args(1, 2, 3)
1 2 3
Keyword variable-length arguments(키워드 가변인자)
- parameter 이름을 따로 지정하지 않고 입력하는 방법
- 입력된 갑슨 dict type으로 반환
- 키워드 가변인자는 오직 한개만 기본 가변인자 다음에 사용
def kwargs(**kwargs):
print(kwargs)
kwargs(one=1, two=2, three=3)
{'one': 1, 'two': 2, 'three': 3}
def args_kwargs(one, two, *args, **kwargs):
print(one, two)
print(sum(args))
print(kwargs)
args_kwargs(1, 2, 1, 1, 1, 1, ten=10, hund=100)
1 2
4
{'ten': 10, 'hund': 100}
asterisk unpacking container
- tuple, dict, list, str 등 자료형에 들어가 있는 값을 unpacking
- 함수의 입력값, zip 등에 유용하게 사용가능
def aster(a, *args):
print(a)
for i in args:
print(i)
aster(1, (10, 100, 1000))
1
(10, 100, 1000)
aster(1, *(10, 100, 1000)) #aster(1, 10, 100, 1000)과 동일
1
10
100
1000
aster(1, 10, 100, 1000)
1
10
100
1000
def aster_2(a, b, c, d):
print(a, b, c, d)
data = {"c": 3, "d": 4, "b": 2}
aster_2(1, **data)
1 2 3 4
Author And Source
이 문제에 관하여([Python]Pythonic Code), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@skkumin/PythonPythonic-Code저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)