파이썬[5일차]

정지범·2024년 12월 10일
0

python

목록 보기
5/8
참고
참고 자료는 점프 투 파이썬으로 선택했습니다.
※스스로를 위해 정리한 참고 자료입니다.

자료형의 값을 저장하는 공간, 변수

변수는 어떻게 만들까?

  • 우리는 앞에서 이미 변수를 사용해 왔다. 다음 예와 같은 a,b,c를 '변수'라고 한다.
>>> a = 1
>>> b = "python"
>>> c = [1,2,3]
  • 변수를 만들 때는 위 예처럼 =(assignment) 기호를 사용한다.
변수_이름 = 변수에_저장할_값

다른 프로그래밍 언어인 C나 JAVA에서는 변수를 만들 때 자료형의 타입을 직접 지정해야 한다.
하지만 파이썬은 변수에 저장된 값은 스스로 판단하여 자료형의 타입을 지정하기 떄문에 더 편리하다.

변수란?

파이썬에서 사용하는 변수는 객체를 가리키는 것이라고도 말할 수 있다.
객체란 우리가 지금까지 보아 온 자료형의 데이터(값)와 같은 것을 의미하는 말이다.

a = [1,2,3]

만약 위 코드처럼 a = [1,2,3] 이라고 하면 [1, 2, 3] 값을 가지는 리스트 데이터(객체)가 자동으로 메모리에 생성되고 변수 a는 [1, 2, 3] 리스트가 저장된 메모리의 주소를 가리키게 된다.

메모리란 컴퓨터가 프로그램에서 사용하는 데이터를 기억하는 공간을 말한다.

a 변수가 가리키는 메모리의 주소는 다음과 같이 확인할 수 있다.

>>> a = [1,2,3]
>>> id(a)
4303029896

id는 변수가 가리키고 있는 객체의 주소 값을 리턴하는 파이썬의 내장 함수이다.
즉, 여기에서 필자가 만든 변수 a가 가리키는 [1, 2, 3] 리스트의 주소 값은 4303029896이라는 것을 알 수 있다.

리스트를 복사하고자 할 때

  • 다음 예를 통해 알아보자.
>>> a = [1,2,3]
>>> b = a

b 변수에 a 변수를 대입하면 어떻게 될까? b와 a는 같은 걸까?, 다른 걸까?
결론부터 말하면 b는 a와 완전히 동일하다고 할 수 있다.
다만 [1,2,3]이라는 리스트 객체를 참조하는 변수가 a 변수 1개에서 b 변수가 추가되어 2개로 늘어났다는 차이만 있을 뿐이다.

id 함수를 사용하여 이러한 사실을 확인할 수 있다.

>>> id(a)
4303029896
>>> id(b)
4303029896

id(a)의 값이 id(b)의 값과 동일하다는 것을 확인할 수 있다.
즉, a가 가리키는 대상과 b가 가리키는 대상이 동일하다는 것을 알 수 있다.
동일한 객체를 가리키고 있는지에 대해서 판단하는 파이썬 명령어 is를 다음과 같이 실행해도 역시 참을 리턴해 준다.

>>> a is b  # a와 b가 가리키는 객체가 같을까?
True

이제 다음 예를 계속 수행해 보자!

>>> a[1] = 4
>>> a
[1, 4, 3]
>>> b
[1, 4, 3]

a 리스트의 두 번째 요소를 값 4로 바꾸었더니 a만 바뀌는 것이 아니라 b도 똑같이 바꾸었다.
그 이유는 앞에서 살펴본 것처럼 a,b 모두 동일한 리스트를 가리키고 있기 때문이다.

그렇다면 b 변수를 생성할 때 a 변수의 값을 가져오면서 a와는 다른 주소를 가리키도록 만들 수 는 없을까?
다음 2가지 방법이 있다.

1.[:]이용하기

첫 번째 방법은 다음과 같이 리스트 전체를 가리키는 [:]을 사용해서 복사하는 것이다.

>>> a = [1, 2, 3]
>>> b = a[:]
>>> a[1] = 4
>>> a
[1, 4, 3]
>>> b
[1, 2, 3]

위 예에서 볼 수 있듯이 a 리스트 값을 바꾸더라도 b 리스트에는 아무런 영향이 없다.

2.copy 모듈 이용하기

두 번째 방법은 copy 모듈을 사용하는 것이다.
다음 예를 보면 from copy import copy라는 처음 보는 형태의 문장이 나온다.
여기서는 단순히 copy 함수를 쓰기 위해서 사용하는 것이라고만 알아 두자.

>>> from copy import copy
>>> a = [1, 2, 3]
>>> b = copy(a)

위 예에서 b = copy(a)는 b = a[:]과 동일하다.
두 변수의 값은 같지만, 서로 다른 객체를 가리키고 있는지 다음과 같이 확인해 보자.

>>> b is a
False

위 예에서 b is a가 False를 리턴하므로 b와 a가 가리키는 객체는 서로 다르다는 것을 알 수 있다.

copy 함수 사용하기

다음처럼 리스트 자료형의 자체 함수인 copy 함수를 사용해도 copy 모듈을 사용하는 것과 동일한 결과를 얻을 수 있다.

>>> a = [1,2,3]
>>> b = a.copy()
>>> b is a
False

변수를 만드는 여러 가지 방법

  • 다음과 같이 튜플로 a,b에 값을 대입할 수 있다.
>>> a, b = ('python', 'life')
  • 이 방법은 다음 예문과 완전히 동일하다.
>>> (a,b) = 'python', 'life'
  • 튜플 부분에서도 언급했지만, 튜플은 괄호를 생략해도 된다.

  • 다음처럼 리스트로 변수를 만들 수도 있다.
>>> [a, b] = ['python', 'life']
  • 또한 여러 개의 변수에 같은 값을 대입할 수도 있다.
>>> a = b = 'python'
  • 파이썬에서는 위 방법을 사용하여 두 변수의 값을 매우 간단하게 바꿀 수 있다.
>>> a = 3
>>> b = 5
>>> a, b = b, a
>>> a
5
>>> b
3

처음에 a에 값 3,b에는 값 5가 대입되어 있지만 a, b = b, a 문장을 수행한 후에는 그 값이 서로 바뀌었다는 것을 확인할 수 있다.



되새김 문제!

01. 홍길동 씨의 과목별 점수는 다음과 같다. 홍길동 씨의 평균 점수를 구해 보자.

국어 80 영어 75 수학 55

a = 80
b = 75
c = 55
d = (a+b+c)/3
print("%0.0f" % d) #소수점 없애기 위해 %0.0f 사용

02. 자연수 13이 홀수인지 짝수인지 판별할 수 있는 방법에 대해 말해 보자.

#2로 나누었을 때 나머지가 0이 되면 짝수 아니면 홀수!
a = 13%2
if a == 0:
    print("짝수")
else:
    print("홀수")

03. 홍길동 씨의 주민등록번호는 881120-1068234이다. 홍길동 씨의 주민등록번호를 연월일(YYYYMMDD) 부분과 그 뒤의 숫자 부분으로 나누어 출력해 보자.

a = "881120-1068234"
front = a[:6] #a[:-8]와 같음
back = a[7:] #a[-7:]와 같음
print("앞자리:", front)
print("뒷자리:", back)

04. 주민등록번호 뒷자리의 맨 첫 번째 숫자는 성별을 나타낸다. 주민등록번호에서 성별을 나타내는 숫자를 출력해 보자.

a = "881120-1068234"
Gender = a[7] #a[7:8]
if Gender == '1': #if int(Gender) == 1 과 같음
    print("남자")
else:
    print("여자")

05. 다음과 같은 문자열 a:b:c:d가 있다. 문자열의 replace 함수를 사용하여 a#b#c#d로 바꿔서 출력해 보자.

a = "a:b:c:d"
a = a.replace(":", "#")
print(a)

06. [1, 3, 5, 4, 2] 리스트를 [5, 4, 3, 2, 1]로 만들어 보자.

a = [1,3,5,4,2]
a.sort(reverse=True)
print(a)
a = [1,3,5,4,2]
a.sort()
a.reverse()
print(a)
a = [1, 3, 5, 4, 2]
a = sorted(a, reverse=True)  # 내림차순으로 정렬된 새로운 리스트 반환
print(a)
a = [1, 3, 5, 4, 2]
a = sorted(a)  # 오름차순으로 정렬 [1, 2, 3, 4, 5]
a = a[::-1]  # 슬라이싱으로 뒤집기
print(a)  # [5, 4, 3, 2, 1]

07. ['Life', 'is', 'too', 'short'] 리스트를 Life is too short 문자열로 만들어 출력해 보자.

a = ['Life', 'is', 'too', 'short']
result = ' '.join(a)
print(result)
a = ['Life', 'is', 'too', 'short']
result = f'{a[0]} {a[1]} {a[2]} {a[3]}'
print(result)
a = ['Life', 'is', 'too', 'short']
print(*a) #unpacking 기법, (공백으로 자동 연결됨)

08. (1,2,3) 튜플에 값 4를 추가하여 (1,2,3,4)를 만들어 출력해 보자.

t1 = 1,2,3
t2 = 4,
t3 = t1 + t2
print(t3)
t = (1, 2, 3)
t = list(t)  # 튜플을 리스트로 변환
t.append(4)  # 리스트에 값 추가
t = tuple(t)  # 다시 튜플로 변환
print(t)  # (1, 2, 3, 4)

09. 다음과 같은 딕셔너리 a가 있다.
>>> a = dict()
>>> a
{}
다음 중 오류가 발생하는 경우를 고르고, 그 이유를 설명해 보자.

  1. a['name'] = 'python'
  2. a[('a',)] = 'python'
  3. a[[1]] = 'python'
  4. a[250] = 'python'

답 : 3번
오류 원인: 리스트는 가변형 자료형으로, 딕셔너리의 키로 사용할 수 없습니다.
딕셔너리의 키는 반드시 불변형 자료형(immutable type)이어야 합니다.
(예: 문자열, 정수, 튜플 등)

10. 딕셔너리 a에서 'B'에 해당되는 값을 추출해 보자.

a = {'A':90, 'B':80, 'C':70}

a = {'A':90, 'B':80, 'C':70}
print(a.get('B'))
a = {'A':90, 'B':80, 'C':70}
result = a.pop('B')
print(result)

11. a 리스트에서 중복 숫자를 제거해 보자.

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

a = [1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5]  # 중복 요소가 있는 리스트
seta = set(a)  # 리스트를 집합(set)으로 변환하여 중복 제거
b = list(seta)  # 다시 리스트로 변환
print(b)
  • 집합(set)은 순서를 보장하지 않으므로, 순서를 유지하면서 중복을 제거하려면 다음과 같이 처리할 수 있습니다.
a = [1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5]
b = list(dict.fromkeys(a))  # 딕셔너리는 입력 순서를 유지하며 중복 제거
print(b)

12. 파이썬은 다음처럼 동일한 값에 여러 개의 변수를 선언할 수 있다. 다음과 같이 a, b 변수를 선언한 후 a의 두 번째 요 솟값을 변경하면 b 값은 어떻게 될까? 그리고 이런 결과가 오는 이유에 대해 설명해 보자.

>>> a = b = [1, 2, 3]
>>> a[1] = 4
>>> print(b)
  • [1, 4, 3]이 출력된다.
    • 이유는 a와 b 변수는 모두 동일한 [1, 2, 3]이라는 리스트 객체를 가리키고 있기 때문이다.



출처 및 참고문헌

https://wikidocs.net/180351

profile
안녕하세요

0개의 댓글