[Python]Pythonic Code

Surf in Data·2022년 4월 3일
0

python

목록 보기
3/15
post-thumbnail

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
profile
study blog

0개의 댓글