오늘은 set, function에 대해서 배워보겠습니다. 앞에서 배운 내용들은 기초적인 개념이었습니다. 이제 함수에 대해서 제대로 배웠다면 다른 사람들에게 파이썬 공부했다고 말해도 될 정도로 많이 어려운 내용입니다. 함수 자체의 개념은 쉽지만 활용하는 것이 어렵다고 합니다. 그러면 이제 시작하도록 하겠습니다.
목차 | |
1. | set |
2. | function |
3. | 예제 문제 풀이 |
4. | 느낀점 |
1. set
set의 경우에는 리스트와는 다른게 순서라는 게 없습니다. 정확하게는 요소의 번지가 없다라고 생각하시면 되겠습니다.
따라서 중복 요소를 허용 하지 않습니다. 그렇다는 것은 인덱싱, 슬라이싱을 하지 못합니다.
◎ 교집합(& or intersection)
s1 = set([1,2,3,4,5,6])
s2 = set([4,5,6,7,8,9])
print(s1 & s2)
print(s1.intersection(s2))
◎ 합집합(| or union)
s1 = set([1,2,3,4,5,6])
s2 = set([4,5,6,7,8,9])
print(s1 | s2)
print(s1.union)
◎ 차집합(- or difference)
s1 = set([1,2,3,4,5,6])
s2 = set([4,5,6,7,8,9])
print(s1 - s2)
print(s1.difference(s2))
◎ 추가, 여러 개 추가, 삭제
s1 = set([1,2,3,4,5,6])
s2 = set([4,5,6,7,8,9])
# 추가 add()
s1.add(10)
print(s1)
# 여러 개 추가 update()
s1.update([1,2])
print(s1)
# 삭제 remove() - 하나만 가능
s1.remove(6)
print(s1)
2. function
function(= method)는 입력(input)값을 주어 처리(process)를 거쳐 출력(output)을 하는 작은 기능입니다.
- 사용 방법
'''
def 함수명(매개변수):
수행말 문장
...
return 값
'''
- 예시
def add1(a,b): # 리턴이 없는 케이스
print(a+b)
def add(a,b): # 더하기
sum = a + b
return sum
def sub(a,b): # 빼기
return a - b
def mul(a,b): # 곱하기
return a*b
def div(a,b): # 나누기
return a/b
문제 하나를 풀어보면서 function에 대해 이해해보도록 하겠습니다.
- 계산기 만들기
( 두 수를 하나씩 입력받고, 연산자를 입력받아 결과를 출력하기)
def add(a,b):
return a+b
def sub(a,b):
return a-b
def mul(a,b):
return a*b
먼저 더하기, 빼기, 곱하기에 대한 함수를 만듭니다.
# 나누기 / 0으로 나누면 error
def div(a,b):
if b == 0:
b = 1 # return "error"
else:
return a/b
나누기의 경우에는 0으로 수학적으로 나눌 수 없기 때문에 코딩에서도 error가 됩니다.
나머지도 다 정리하자면
print("계산기(a와 b에 숫자 입력, 연산자에 기호 입력)")
while True:
n1 = int(input("a >> "))
n2 = int(input("b >> "))
n3 = input("연산자(+ - * /) >> ")
if n3 == '+':
print("계산 결과: %d %c %d = %d" % (n1, n3, n2, add(n1, n2)))
elif n3 == '-':
print("계산 결과: %d %c %d = %d" % (n1, n3, n2, sub(n1, n2)))
elif n3 == '*':
print("계산 결과: %d %c %d = %d" % (n1, n3, n2, mul(n1, n2)))
elif n3 == '/':
if n2 != 0:
print("계산 결과: %d %c %d = %d" % (n1, n3, n2, div(n1, n2)))
else:
print("0으로 나눌 수는 없습니다.")
else:
print("연산자를 잘못 입력하셨습니다.")
이렇게 됩니다.
◎ args
만약에 매개변수의 입력값이 많이 필요할 때는 어떻게 해야할까요?
그럴 때는 함수에 'args'를 추가하면 됩니다.
def add(*args):
sum = 0
for i in args:
sum += i
return sum
print(add(1,2,3,4,5))
print(add(1,2,3,4,5,6,7,8))
print(add(10,20,30,40))
그렇다면 문제 3개를 풀어보면서 함수를 잘 활용해보는 연습을 해보겠습니다.
- 숫자 하나를 입력받아 그 수가 짝수인지 홀수인지 출력하시오.
def num(n):
if n % 2 == 0:
return "짝수"
else:
return "홀수"
n = int(input("n의 값은? >> "))
print(num(n))
짝수인지 홀수인지 물어보는 문제는 저번에도 풀어봤으니 쉽게 할 수 있습니다.
- 숫자 하나를 입력받아 그 수의 약수를 출력하시오.
(약수: 나누어 떨어지는 수의 집합, ex: 6의 약수는 1,2,3,6)
def num1(n):
test = list()
for i in range(1,n+1):
if n % i == 0:
test.append(i)
return test
n = int(input("n의 값은? >> "))
print("%d의 약수: %s" % (n, num1(n)))
약수라는 것은 짝수처럼 나누었을 때 나머지가 0이어야 합니다.
또한 약수의 범위는 1 ~ 자기자신이라고 생각하시면 됩니다.
- 숫자 하나를 입력받아 그 숫자가 소수인지 아닌지 출력하시오.
(소수: 1과 자기자신의 수를 제외한 나머지 수는 나누어 떨어지지 않는 수, ex: 2,3,5,7,11,13)
def num2(n):
m = 0
for i in range(2,n):
if n % i == 0:
m += 1
if m >= 1:
return "합성수"
return "소수"
소수의 경우에는 약수를 구하는 것처럼 하시면 됩니다. 다만 1과 자기자신은 어짜피 약수이니 계산할 필요가 없습니다.
그러면 2부터 변수 바로 전까지만 약수를 구할 때처럼 계산해서 분류하면 됩니다.
3. 예제 문제
◎ 1. 로또 만들기
(공식 국내 로또의 당첨 기준의 등위결정방법을 기준으로 합니다.)
◎ 2. 입력값을 1~100까지 입력했을 때 소수와 합성수를 분류하여 출력하시오.
◎ 1번 정답
import random
s1 = set() # 사용자 번호 (6)
while len(s1) != 6:
num = random.randint(1,10)
s1.add(num)
#print(s1)
# random.sample(리스트, 개수)
l = random.sample(range(1,10), 7)
# 당첨번호의 번호를 랜덤으로 생성 (6개 + 1개)
# 1 2 3 4 5 6 + 7(보너스 번호)
lotto = set(l[:6])
#print(l)
bonus = l[6]
#print(bonus)
print(s1 & lotto)
print(bonus in s1) # True / False
lottoCount = len(s1 & lotto)
if lottoCount == 6:
print("1등")
elif lottoCount == 5 and bonus in s1 == True:
print("2등")
elif lottoCount == 5:
print("3등")
elif lottoCount == 4:
print("4등")
elif lottoCount == 3:
print("5등")
else:
print("x")
◎ 2번 정답
def num2(n):
m = 0
for i in range(2,n):
if n % i == 0: # 1과 자기자신의 수를 제외한 숫자로 나눌 때 나머지가 0
m += 1
if m >= 1:
return 1 # 합성수
return 0 # 소수
test1 = list()
test2 = list()
for i in range(2,101):
if num2(i) == 0:
test1.append(i)
elif num2(i) == 1:
test2.append(i)
print("소수: %s" % test1)
print("합성수: %s" % test2)
len()를 활용할 수도 있습니다.
def prime(n):
list = []
for i in range(2,n):
if n % i == 0: # 1과 자기자신의 수를 제외한 숫자로 나눌 때 나머지가 0
list.append(i)
if list.append(i) == 0:
return '소수'
return '합성수'
prime_list = []
prime2_list = []
for i in range(2,101):
if prime(i) == '소수':
prime_list.append(i)
elif prime(i) == '합성수':
prime2_list.append(i)
4. 느낀점
로또를 만들 때 2등의 조건을 어떻게 만들고 출력해야 할지 가늠이 안 잡혀서 막막했다. 나중에 풀이 과정을 알게 되면서 저번에 배운 in을 활용한다는 생각을 못했었기에 막혔다는 것을 알게 되었다. 다음부터는 문제를 풀 때 기초적인 개념과 연관지으며, 차근차근 풀어나가야 해야 하다는 것을 알게 되었다.
'Python' 카테고리의 다른 글
Python 기초(File, Class) - AWS 풀스택 과정 (예습) 5일차 (0) | 2024.07.06 |
---|---|
Python 기초(List, Dictionary) - AWS 풀스택 과정 (예습) 3일차 (0) | 2024.07.04 |
Python 기초(For, While) - AWS 풀스택 과정 (예습) 2일차 (0) | 2024.07.02 |
Python 설정 및 기초(변수, 문자열, IF) - AWS 풀스택 과정 (예습) 1일차 (0) | 2024.07.02 |