본문 바로가기

파이썬 기초편(1) - 튜플(tuple)과 레인지(range) 본문

Programming/python

파이썬 기초편(1) - 튜플(tuple)과 레인지(range)

ksoes 2022. 6. 10. 22:49

 

 

튜플 (tuple)

tp1 = (1, 2, 3)
type(tp1)	# <class 'tuple'>

> 리스트는 [ . . . ]으로 표현하지만 튜플은 ( . . . )으로 표현한다

> 튜플 역시 리스트와 마찬가지로 파이썬이 인식하는 데이터의 한 종류이다

> 튜플 역시 리스트와 마찬가지로 하나 이상의 값을 묶는 용도로 사용된다

 

두 타입의 차이는 저장된 값을 수정할 수 있느냐 없느냐이다. 리스트는 값을 수정할 수 있지만 튜플은 값을 추가하거나 수정할 수 없다. 문자열처럼. 만약 수정하려고 하면 오류가 발생한다.

튜플은 한 번 만들어지면 그 내용을 수정하지 못한다

 

튜플을 어디다 쓸 것인가?

리스트에 값을 담아둘 수 있으니 튜플은 필요없을 것 같지만 리스트는 값을 추가하거나 수정을 할 수 있어 저장된 데이터가 누군가의 실수로 언제든지 바뀔 수 있다. 그래서 튜플로 묶어 코드에 안전성을 부여하는 것이 좋다. 튜플은 수정할 수 없는 데이터 타입이기 때문이다.

리스트일 때는 값이 수정이 되었지만 튜플일 경우에는 값의 수정이 안 된다

 

튜플 관련 함수와 연산들

len(s)	# 튜플 s의 길이(s에 저장된 값의 개수) 반환
min(s)	# 튜플 s에 저장된 값 중 가장 작은 값 반환
max(s)	# 튜플 s에 저장된 값 중 가장 큰 값 반환

 

튜플도 리스트나 문자열과 마찬가지로 객체이다. 따라서 튜플이 갖고 있는 함수들도 존재한다.

s.count(x)	# 튜플 s에 저장된 x의 개수 반환
s.index(x)	# 튜플 s에 저장된 첫 번째 x의 인덱스 값 반환

 

 

리스트를 대상으로 한 연산들 또한(in, not in, +, *, 인덱싱, 슬라이싱) 튜플을 대상으로 연산이 가능하다.

nums = (1, 2, 3, 4)
3 in nums	# True
2 not in nums	# False

# 기존의 nums의 값이 수정이 된 것이 아니라 새로운 값을 갖게 된 것이다.
nums + (4,5)	# (1, 2, 3, 4, 4, 5)
nums * 2	# (1, 2, 3, 4, 1, 2, 3, 4)
nums[:4]	# (1, 2, 3, 4)

for i in (1, 3, 5, 7, 9):
	print(i, end=' ')	# 출력: 1 3 5 7 9

 

말이 나온 김에 리스트 안에 저장된 데이터를 바꿔보자

튜플 내부의 데이터를 바꾸는 것은 불가능하지만, 리스트 내의 튜플을 바꾸는 것은 가능하다. 리스트는 변경가능한 타입의 객체이기 때문이다. frns[0] 값이 바뀐 것을 확인할 수 있다.

 

범위를 지정하는 레인지(range)

for i in range(1, 11):
	print(i, end=' ')

지금까지는 range(1, 11)를 리스트 [1,2,3,4,5,6,7,8,9,10]을 대신하는 정도로만 이해했다. 그러니 이는 range 함수의 호출이다. 그리고 이 함수가 호출되면 객체가 생성되는데, 이 객체는 다음과 같이 변수에 저장할 수 있고 또 type 함수에 전달해서 데이터형도 확인할 수 있다.

r = range(1, 100)	# range호출로 만들어진 객체를 변수 r에 담는다
type(r)			# 아래에 출력된 <class 'range'>는 전달된 값이 'range형'임을 의미한다

 

레인지가 담고 있는 정보는 "1 이상 1000미만의 정수들" 과 같은 스타일의 '값의 범위'이다. range는 범위 정보를 담고 있기 때문에 이를 대상으로 in 연산이나 not in 연산도 할 수 있다.

 

다음의 두 함수를 알면 range를 보다 유용하게 사용할 수 있다.

list(s)		# s의 내용으로 채워진 리스트를 만들어 주겠다
tuple(s)	# s의 내용으로 채워진 튜플을 만들어 주겠다

list((1, 2, 3))		# tuple -> list, [1,2,3]
list(range(1,5))	# range -> list, [1,2,3,4]
list('Hello')		# str -> list, ['H', 'e', 'l', 'l', 'o']

tuple([1, 2, 3])	# list -> tuple, (1,2,3)
tuple(range(1, 5))	# range -> tuple, (1,2,3,4)
tuple('Hello')		# str -> tuple,  ('H', 'e', 'l', 'l', 'o')
list(range(1, 10, 2))	# [1, 3, 5, 7, 9]
tuple(range(1, 10, 3))	# (1, 4, 7)

 

레인지(range) 범위 거꾸로 지정하기

range(10, 2, 1)		# range(10,2)와 동일한 것으로 10부터 1씩 증가해서 2에 가까워지는 정수는 없으므로
list(range(10, 2))	# 결과: [], 만들어진 레인지는 텅 비게 된다.
range(10, 2, -1)	# 세 번째 전달인자를 음수로 바꾸면 의미가 달라진다. 10에서 2 이전까지 값이 1씩
			# 감소하는 형태로 레인지의 범위가 형성되기 때문이다.

list(range(10, 2, -1))	# [10, 9, 8, 7, 6, 5, 4, 3]
list(range(10, 2, -2))	# [10, 8, 6, 4]
list(range(10, 2, -3))	# [10, 7, 4]

 

Comments