immutable type : tuple, string, int, bool 등
mutable type : list, dict 등
1. immutable
def swap(a,b):
a,b=b,a
print(a,b)
n,m=1,2
swap(n,m)
print(n,m)
결과
2 1
1 2
- immutable 변수가 함수의 인자로 넘어가게 되면, 변할 수 없는 특성 때문에 변수가 갖고 있던 값을 복사하여 값을 넘겨주게 된다.
- int형 변수인 n, m이 함수 인자로 넘어간 것이 아닌 n, m 값이 a, b에 복사되어 넘어가게 된 것이다.
- 함수 안에서 a, b 값은 바뀌게 되어 출력했지만 함수를 빠져나오고 n, m은 변화가 없으므로 그대로 출력된다.
- 함수를 적용시키기 위해서는 다음과 같다.
def swap(a,b):
a,b=b,a
return a,b
n,m=1,2
n,m=swap(n,m)
print(n,m)
결과
2 1
● 문자열을 인자로 받을 때
def add_str(string):
string+='world'
input_str=input()
add_str(input_str)
print(input_str)
결과
>> hello
hello
- string은 immutable하기 때문에 함수 인자로 넘기게 되면 값을 복사하여 넘어가기 때문에 함수 안에서 어떠한 일이 일어나더라도 밖에 있는 변수에 영향을 끼치지 않는다.
- 함수 안에서의 역할을 밖에 있는 변수에 영향을 끼치고 싶다면 해당 문자열을 반환하는 함수를 추가
def add_str(string):
string+='world'
return string
input_str=input()
input_str=add_str(input_str)
print(input_str)
결과
>> hello
helloworld
2. mutable
def change(arr):
arr[0],arr[3]=arr[3],arr[0]
list_a=[1,2,3,4]
change(list_a)
print(list_a)
결과
[4, 2, 3, 1]
- list는 mutable하기 때문에 mutable한 변수를 함수 인자로 넘기게 되면 주소가 넘어가게 되기 때문에 함수 안에서 해당 인자에 주는 모든 변화가 함수 호출시 넘겼던 변수에 남기게 된다.
Q) 세 정수의 연산값
- 서로 다른 세 정수가 입력.
- 제일 큰 값과 두 번째로 큰 값을 더한 값.
- 그리고 두 번째로 큰 값과 제일 작은 값을 더한 값을 출력.
def operation(n1,n2,n3):
if n1>n2:
if n2>n3:
return n1+n2, n2+n3
else:
return n3+n1, n1+n2
elif n1>n3:
if n3>n2:
return n1+n3, n3+n2
else:
return n2+n1, n1+n3
if n2>n1:
if n2>n3:
return n2+n3, n3+n1
else:
return n3+n2, n2+n1
a,b,c=map(int,input().split())
m1, m2=operation(a,b,c)
print(m1,m2)
결과
>> 4 3 8
12 7
- 입력 값의 크기 순은 8, 4, 3 이므로 8+4, 4+3의 값이 출력된다.
Q) +, - 변경
- 정수 n을 입력.
- n개의 정수를 입력
- 음수는 양수로 양수는 음수로 변경하여 n개의 정수의 합을 출력
def plus_minus_change(arr):
for elem in range(n):
arr[elem]=arr[elem]*(-1)
n=int(input())
num_list=list(map(int,input().split()))
plus_minus_change(num_list)
print(sum(num_list))
결과
>> 5
>> -20 20 5 15 -35
15
- 함수를 적용하면 n개의 입력 값은 20 -20 -5 -15 35 이므로 이들의 합은 15가 나온다.
Q) Palindrome 판단
- 문자열을 입력
- palindrome (문자열을 뒤집었을 때도 동일한 문자열)이 맞으면 Yes. 아니면 No
- 만약 palindrome이면 같은 쌍의 개수를 출력
def palindrome(string):
isPalindrome=True
cnt=0
for i in range(len(string)//2):
if string[i]==string[len(string)-i-1]: cnt+=1
else:
isPalindrome=False
break
return isPalindrome,cnt
input_string=input()
isPalindrome,pair_count=palindrome(input_string)
if isPalindrome:
print('Yes', pair_count)
else:
print('No')
결과
>> abcba
Yes 2
- 같은 쌍의 개수는 a, b 2개이다.
>> abccba
Yes 3
- 같은 쌍의 개수는 a, b, c 3개이다.
>> abcdefg
No
- palindrome을 만족시키기 위해서는 단어를 반으로 나눠 대칭이어야 한다.
- 따라서 단어의 처음과 끝을 지정하여 같으면 조건에 성립하고, 다르면 성립하지 않는다.
- 처음 부분은 1씩 증가하고 끝 부분은 1씩 감소하여 조건에 맞는지 확인한다.
- 조건에 성립하면 쌍의 개수를 1 증가한다.
'파이썬(Python)' 카테고리의 다른 글
[Python] - 재귀 함수 : 값을 반환. return value. factorial. 각 자리 숫자합, 점화식 및 수열 (0) | 2023.01.22 |
---|---|
[Python] 재귀함수 - 값이 반환되지 않을 때, 종료 조건, 출력 위치, 대칭 문제 (0) | 2023.01.20 |
[Python] 함수 - return 반환 값을 이용한 예제 프로그램 작성 (연산, 연속 부분 수열, 날짜 및 날씨) (0) | 2023.01.04 |
[Python] 함수 - return 값 반환. 기본값 설정. asterisk (0) | 2023.01.03 |
[Python] 함수 - 기본 사용법 및 출력 (0) | 2022.12.29 |