AI TECH

[1주차] Python&Math : Generator, Asterisk, 가변인자

prefer_all 2022. 9. 20. 12:03

3-2 Pythonic Code

 

Split & Join

>>> items = 'zero one two three'.split() # 빈칸을 기준으로 문자열 나누기
>>> print (items)
['zero', 'one', 'two', 'three']


>>> example = 'python,java,javascript' # ","을 기준으로 문자열 나누기
>>> a, b, c = example.split(",")
# 리스트에 있는 각 값을 a,b,c 변수로 unpacking
>>> colors = ['red', 'blue', 'green', 'yellow']

>>> result = ''.join(colors)
>>> result
'redbluegreenyellow'

>>> result = ' '.join(colors) # 연결 시 빈칸 1칸으로 연결
>>> result
'red blue green yellow'

>>> result = ', '.join(colors) # 연결 시 ", "으로 연결
>>> result
'red, blue, green, yellow'

 

Iterable Object

- iter() 와 next() 함수로 iterable 객체를 iterator object로 사용

cities = ["Seoul", "Busan", "Jeju"] 
iter_obj = iter(cities) 
print(next(iter_obj)) #Seoul
print(next(iter_obj)) #Busan
print(next(iter_obj)) #Jeju

next를 사용해 값을 보는 거임. iter_obj는 메모리 주소만 가지고 있음

 

 

Generator

- iterable object를 특수한 형태로 사용해주는 함수

- 정보를 저장만 하고 있다가 element가 사용되는 시점에 값을 메모리에 반환 :

yield를 사용해 한번에 하나의 element만 반환함

def general_list(value):
    result = []
    for i in range(value):
    	result.append(i)
    return result
    
def generator_list(value):
    result = []
    for i in range(value):
        yield i

for a in generator_list(5):
    print(a)
'''
0
1
2
3
4
'''

iterator보다 적은 메모리 용량 사용

 

Generator Comprehension

- list comprehension과 유사한 형태로 generator형태의 list 생성

- generator expression 이라는 이름으로도 부름

- [ ] 대신 ( ) 를 사용하여 표현

gen_ex = (n*n for n in range(500)) 
print(type(g))
- list 타입의 데이터를 반환해주는 함수는 generator로 만들어라!
: 읽기 쉬운 장점, 중간 과정에서 loop 이 중단될 수 있을 때!
- 큰 데이터를 처리할 때는 generator expression을 고려하라! : 데이터가 커도 처리의 어려움이 없음
- 파일 데이터를 처리할 때도 generator를 쓰자

 

 

Asterisk

- 흔히 알고 있는 * 를 의미함

- 단순 곱셈, 제곱연산, 가변 인자 활용 등 다양하게 사용됨

# [1] *args
def asterisk_test(a, *args):
    print(a, args) # 1 (2, 3, 4, 5, 6)
    print(type(args)) # <class 'tuple'>
asterisk_test(1,2,3,4,5,6)

# [2] **kargs
def asterisk_test(a, **kargs):
    print(a, kargs) # 1 {'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
    print(type(kargs)) # <class 'dict'>
asterisk_test(1, b=2, c=3, d=4, e=5, f=6)

 

- *를 앞에 붙이면 풀리면서 들어간다 (뒤에서 계속)

print(*["1","2","3"])
# 1 2 3 4

 

 

가변인자 Variable-length asterisk

- 개수가 정해지지 않은 변수를 함수의 parameter로 사용하는 법

- 입력된 값은 tuple type으로 사용할 수 있음

- 가변인자는 오직 한 개만 맨 마지막 parameter 위치에 사용가능

def asterisk_test(a, b, *args):
    return a+b+sum(args)
print(asterisk_test(1, 2, 3, 4)) #10

 

키워드 가변인자 Keyword

- Parameter 이름을 따로 지정하지 않고 입력하는 방법

- asterisk(*) 두개를 사용하여 함수의 parameter를 표시함

- 입력된 값은 dict type으로 사용할 수 있음

- 가변인자는 오직 한 개만 기존 가변인자 다음에 사용

def kwargs_test_1(**kwargs):
    print(kwargs)
    
kwargs_test_1(first = 3, second = 2, thrid = 1)
# {'first': 3, 'second': 2, 'thrid': 1}
def kwargs_test_2(**kwargs):
    print(kwargs)
    print("First value is {first}".format(**kwargs))
    print("Second value is {second}".format(**kwargs))
    print("Third value is {third}".format(**kwargs))
    
kwargs_test_2(first = 3, second = 2, third = 1, fourth = 4)
'''
{'first': 3, 'second': 2, 'third': 1, 'fourth': 4}
First value is 3
Second value is 2
Third value is 1
'''
def kwargs_test_3(one,two, *args, **kwargs):
    print(one) #3
    print(two) #4
    print(args) #(5, 6, 7, 8, 9)
    print(one+two+sum(args))
    print(kwargs)
    
kwargs_test_3(3,4,5,6,7,8,9, first=1, second=2, third=3, fourh = 4)

 

Asterisk - unpacking a container

def asterisk_test(a, *args): # 언패킹 의미가 아님. 여러 개 가변인자 받는다는 의미
    print(a, args) # args는 tuple 형태로 묶인 값이 들어가게 됨
    print(type(args)) # 셋 다 <class 'tuple'>
     
asterisk_test(1, *(2,3,4,5,6)) # !! ()앞에 *가 있어서 풀려서 들어감
#1 (2, 3, 4, 5, 6)

asterisk_test(1, (2,3,4,5,6)) #1 ((2, 3, 4, 5, 6),) # 안 풀렸을 때
asterisk_test(1, 2,3,4,5,6) #1 (2, 3, 4, 5, 6)
def asterisk_test(a, *args):
    print(a, *args) # *args 쭉 풀린 상태로
    
asterisk_test(1, *(2,3,4,5,6)) # !! ()앞에 *가 있어서 풀려서 들어감
# 1 2 3 4 5 6
asterisk_test(1, (2,3,4,5,6)) # 안 풀렸을 때
# 1 (2, 3, 4, 5, 6)
asterisk_test(1, 2,3,4,5,6) # 1 2 3 4 5 6
def asterisk_test2(a, args):
    print(a, *args) # 풀려있음
    print(a, args) # 안 풀려있음
    
asterisk_test2(1, (2,3,4,5,6))
'''
1 2 3 4 5 6
1 (2, 3, 4, 5, 6)
'''

 

 

복습

def asterisk_test(a, *args):
    print(a, *args) # 풀려있음
    print(a, args) # 안 풀려있음
    
asterisk_test(1, *(2,3,4,5,6))
'''
1 2 3 4 5 6
1 (2, 3, 4, 5, 6)
'''

asterisk_test(1, (2,3,4,5,6))
'''
1 (2, 3, 4, 5, 6)
1 ((2, 3, 4, 5, 6),)
'''

asterisk_test(1, 2,3,4,5,6)
'''
1 2 3 4 5 6
1 (2, 3, 4, 5, 6)
'''

 

 

예제

a, b, c = ([1,2], [3,4], [5,6])
print(a,b,c) # [1, 2] [3, 4] [5, 6]

data = ([1,2], [3,4], [5,6])
print(*data) # [1, 2] [3, 4] [5, 6]
def test(a,b,c):
    print(a,b,c)

data = {"b":1, "c":2}
test(5, **data) # **data는 j=1, a=2가 되게함
# 5 1 2

 

2차원 리스트에서 언패킹을 이용하기

ex = ([1,2], [3,4], [5,6])
for v in zip(ex):
    print(v)
'''
([1, 2],)
([3, 4],)
([5, 6],)
'''

for v in zip(*ex):
    print(v)
'''
(1, 3, 5)
(2, 4, 6)
'''

'AI TECH' 카테고리의 다른 글

[2주차] Pytorch 프로젝트  (0) 2022.09.26
[2주차] PyTorch  (0) 2022.09.26
CNN의 역전파  (0) 2022.09.22
[1주차] Python&Math  (0) 2022.09.20
Logistic Regression  (0) 2022.07.27