python: tuple / lamda

1

압축 Python

목록 보기
8/11
post-thumbnail

튜플

리스트와 비슷한 구조의 자료형. 한 번 정해진 값을 외부에서 수정할 수 없다.

구조

tuple_a = (data, data1, data2, ...)

# list와 마찬가지로 인덱스를 통해 접근할 수 있다
tuple_a[0]
tuple_a[1]
tuple_a[2]
...

# 하지만 요소 접근 연산자를 통해 값을 수정하는 것은 불가능하다
tuple_a[2] = 0
>>
Traceback (most recent call last)
TypeError: 'tuple' object does not support item assignment

# 값을 바꾸려면 직접 바꿔야 한다
tuple_a = (data, data1, dota2, ...)

튜플의 요소를 하나만 가지고 선언할 때
tuple_a = (1,)
반드시 끝에 ,를 붙여줘야 한다

특징

  • 괄호 없이도 선언할 수 있다
  • 값을 바꿀 수 없다
  • 여러 개의 값을 RETURN 할 수 있게 해준다

튜플의 신기한 점 몇 개를 알아두자.

tuple_test = 10, 20, 30, 40
# 그냥 나열해준 거지만 이게 튜플이 된다

print(tuple_test)
>>
(10, 20, 30, 40)

a, b, c = 10, 20, 30
# 마찬가지로 오른쪽에 나열해놓은 10, 20, 30이 묶여서 (10, 20, 30) 즉, 튜플이 된다

print(a)
print(b)
print(c)
>>
10
20
30

변수의 값도 너무 쉽게 바꿔준다. 로직을 파괴하는 수준.

a, b = 10, 20
a, b = b, a
print("a:",a)
print("b:",b)
>>
a: 20
b: 10

충격적이다.

함수의 RETURN 시에도 쏠쏠하다.

def test():
	return (10, 20)
    # 이렇게 튜를로 리턴하고 값을 받으면
    
a, b = test()

print("a:", a)
print("b:", b)
>>
a: 10
b: 20

a = test()
print("a:", a)
a: (10, 20)

나눠 주면 나눠 주는 대로
퍼주면 퍼주는 대로
알아서 잘 먹는 것을 볼 수 있다.


람다(lambda)

함수의 일종이다. 매개변수로 함수 그 자체를 받는 것이 특징이다.
기능 자체를 매개변수로 하는 것이다.

코드를 보면서 이해하는 게 빠르다.

# call_x_time 함수는, 매개변수로 함수와 횟수를 받는다
def call_x_times(func, 횟수):
	# 횟수 만큼 반복문을 시행하는데
	for i in range(횟수):
    	# 그 내용은 매개변수로 받은 함수의 실행이다
        func()
        
def hello():
    print("hello world!")

# hello() 함수의 기능을 3회 반복
call_x_times(hello, 3)
>>
hello world!
hello world!
hello world!

위와 같이 사용한다.
객체와 객체를 적절하게 연결해주는 역할을 하는 것 같다.

filter()함수

  • 함수를 매개변수로 사용하는 대표적인 내장 함수
  • filter()는 '리스트의 요소'를 함수에 넣고, 리턴된 값이 True인 것들로 새로운 리스트를 구성해준다

내장 함수 == 표준 함수 == Built-in 함수: Python 설치 시 기본적으로 내장된 함수

무슨 말인지 잘 모르겠다. 코드로 본다.

# 매개변수의 값이 3보다 작으면 리턴하는 함수
def under_3(item):
    return item < 3

# 리스트 
list_a = [1, 2, 3, 4, 5]

# filter()함수에서 under_3 함수와 list_a 데이터를 매개변수로 받음
output_filter = filter(under_3, list_a)
# list_a의 요소 하나하나를 under_3()함수에 넣고 돌린 후 그 리턴값들을 다시 리스트로 반환

print(output_filter)
list(output_filter)
>>
<filter object at 0x107c4ada0>
[1, 2]
  • filter()의 두 번째 매개함수에 List가 아니라 Tuple을 넣을 수도 있다
  • filter()에서 첫 번째 매개변수로 받는 함수에서 처리 가능한 자료형이라면 처리해 준다
  • 자료의 요소 하나하나를 넣는다는 점에 주의한다

map() 함수

  • 함수를 매개변수로 사용하는 대표적인 표준 함수
  • map()은 '리스트의 요소'를 함수에 넣고 리턴된 값이 True인 것들으로 새로운 리스트를 구성해준다
# 매개변수를 받아서 제곱하여 반환하는 함수
def power(item):
    return item * item

# 리스트 
list_a = [1, 2, 3, 4, 5]

# map()함수는 리스트를 power()함수에 넣고 돌린다
output_a = map(power, list_a)
# power()함수에서 반환하는 값들 중 True인 것들로 새로운 리스트를 만들어 반환한다

print(output_a)
list(output_a)
>>
<map object at 0x10768da50>
Out[27]:
[1, 4, 9, 16, 25]
  • filter()와 마찬가지로 Tuple 자료형을 넣어도 동일한 결과를 얻을 수 있다

람다 함수를 약간 싸가지 없게(?) 사용하는 방법도 있다.
아래와 같다.
'인라인 람다'라고 부른다.

list_input = [1, 2, 3, 4, 5]

# 따로 람다 함수를 정의하지 않고 함수의 내부에 정의
# map()함수의 첫 번째 파라미터에 람다 함수 자체를 넣었다
# 두 번째 파라미터에서 들어오는 리스트의 요소요소를 바로 앞에 넣겠다는 뜻
output = map(lambda number: number * number, list_input)

print(output)
list(output)
>>
<map object at 0x10768ea40>
Out[30]:
[1, 4, 9, 16, 25]

위와 같은 코드 형태에서 함수의 매개변수가 되는 함수를 '콜백 함수(callback function)'라고 부른다

두 함수 모두 <함수이름 object at 주소>형태의 객체를 만들어내는 것을 볼 수 있다.
얘를 제너레이터라고 부른다.

iterator - generator 차이점은?

여기에 기가 막히게 설명이 잘 되어 있다

iteratorgenerator
returnyield
한꺼번에 반환반환 후 호출 위치
다시 호출되어 반환
반복

  • 메모리를 사용하는 방식
0 0 0 0 0 0 0 0
이터레이터
제너레이터 제너레이터 제너레이터 제너레이터 제너레이터 제너레이터 제너레이터 제너레이터
  • 둘 다 next()를 사용해 차례대로 데이터를 꺼내는 것은 동일하다

다음은 radom()함수의 응용부터 계속

0개의 댓글