[day-7] 함수

Joohyung Park·2024년 1월 14일
0

[모두연] 오름캠프

목록 보기
7/95
post-thumbnail

함수

Python에서 함수를 작성하는 가장 기본적인 형태는 def(): pass 이다. 'pass'는 '아무 것도 하지 않음'을 의미하는 키워드로, 함수의 본문을 작성하지 않을 경우 이를 사용할 수 있다. 실무에서는 종종 함수명과 'pass'를 먼저 적어놓고, 그 후에 함수의 본문을 작성한다고 한다.

python
def 함수명():
    pass

하지만 함수는 호출되어야만 의미가 있다. 함수 내부에 print문을 사용하는 것은 자제하는 편이 좋으며, 함수의 반환값이 없을 때 함수를 print()로 출력하면 None이 출력된다.

Python의 함수는 매우 유연하다. 함수에 기본값을 지정할 수 있고, 키워드 인자를 사용하여 함수를 호출할 수 있다.

def introduce(name, age):
    print(f"이름: {name}, 나이: {age}")

introduce(name="홍길동", age=100)

Python에서는 전역변수와 지역변수라는 개념이 있다. 또한 함수의 파라미터로 None값을 활용할 수 있다. 지역 변수를 출력하고 싶다면 locals()를, 전역 변수를 사용하고 싶다면 global을 사용하면 된다. global로 선언한 변수는 함수가 얼마나 중첩되어 있던지 간에 최상단에 있는 변수값을 바라본다.

Python에는 많은 내장 함수(built-in function)들이 있다. 그 중에서 all, any, map, filter, zip, enumerate, sorted, reversed 등이 대표적이다.

  • all: 모든 요소가 참이면 True를 반환
  • any: 요소 중 하나라도 참이면 True를 반환
  • map: 지정된 함수를 모든 요소에 적용하여 반환
  • filter: 조건 함수를 만족하는 요소만 선택하여 반환
  • zip: 여러 개의 요소를 묶어서 반환
  • enumerate: 반복 가능한 객체의 인덱스와 값을 함께 반환
  • sorted: 요소를 정렬하여 반환
  • reversed: 요소의 순서를 뒤집어 반환

과제

1. 다음 코드를 실행하면 출력되는 값을 순서대로 작성해보세요.

a = 'pithon'

def 함수1():
    def 함수2():
        print('love')
        
    print('I')
    함수2()
    return "python"
    

a = 함수1()
print(a)

2. 함수를 이용하여 계산기 프로그램을 만들어주세요.

def plus(num1, num2):
	return num1 + num2

def minus(num1, num2):
	return num1 - num2

def multiply(num1, num2):
	return num1 * num2

def divide(num1, num2):
	return num1 / num2

print(f'plus : {plus(10, 5)}')
print(f'minus : {minus(10, 5)}')
print(f'multiply : {multiply(10, 5)}')
print(f'divide : {divide(10, 5)}')

3. 2번의 해답을 이용하여 a와 b를 더한 값과 a와 b를 뺀 값을 곱하는 함수를 만들어주세요.

# 아래와 같은 값이 있다면 (2 + 3) * (2 - 3) = -5가 출력이 되어야 합니다.
a = 2
b = 3

def calc(num1, num2):
	return (num1 + num2) * (num1 - num2)
 
calc(a, b)

4. x의 n제곱을 구하는 함수를 만들어주세요.

# 재귀함수를 이용하여 만들어야하며, x은 0이 아닙니다. (x, n > 1)
def square(x, n):
    if n == 1:
        return x
    return x * square(x, n-1)

square(2, 3)

5. 이 데이터에서 licat을 출력해주세요. 단, 직접 접근은 안됩니다.

# data[1]로 접근하는 것은 안됩니다.
data = [['weniv CTO binky', 2], ['weniv CEO licat', 1], ['weniv COO mura', 2]]

filtered_data = list(filter(lambda x: 'licat' in x[0], data))   # [['weniv CEO licat', 1]]
print(filtered_data[0][0].split()[-1])

6. 다음 함수 is_palindrome를 완성하시오.

# 이 함수는 하나의 문자열을 인자로 받아, 해당 문자열이 앞으로 읽으나 뒤로 읽으나 
# 같은 단어이면 True를, 아니면 False를 반환해야 합니다.
def is_palindrome(s):
    if s == s[::-1]:
        return True
    return False

is_palindrome("hhe")

7. 리스트 numbers가 주어졌을 때, 이 리스트 내의 모든 짝수를 제거하는 코드를 작성하시오.

numbers = [2, 3, 4, 5, 6, 7, 8, 9, 10]
numbers = list(filter(lambda x:x%2==1,numbers))
print(numbers)  # 결과: [3, 5, 7, 9]

8. sorted

# sorted의 유연성
data = [
    [2, 'hello world', 30],
    [3, 'hworl', 33],
    [5, 'hello wo', 35],
    [4, 'hello w', 31],
    [6, 'hello w', 39]
]

# 1번째 문제: 첫 번째 요소의 값을 정렬하세요.
sorted(data)

# 2번째 문제: 두 번째 요소의 문자열 길이를 기준으로 정렬하세요.
sorted(data, key=lambda x:len(x[1]))
# sorted([11, 5, 7, 8, 7])를 정렬하는 것과 같습니다. 다만 숫자 값으로 반환하는 것이 아니라 object로 반환하죠.'

# 3번째 문제: 세 번째 요소 기준으로 정렬하세요.
sorted(data, key=lambda x:x[2])

# 4번째 문제: 첫번째 요소와 세 번째 요소의 차가 큰 순으로 출력해주세요.
# 예를 들어 [2, 'hello world', 30]의 경우 30 - 2 == 28입니다. 이런 차 순서대로 출력하시면 됩니다.
sorted(data, key=lambda x:x[0]-x[2])
sorted(data, key=lambda x:x[2]-x[0], reverse=True)

짤막상식

# range 타입이 생긴 이유
type(print) # 출력: builtin_function_or_method
type(max) # 출력: builtin_function_or_method
type(len) # 출력: builtin_function_or_method
type(enumerate) # 출력: type
type(range) # 출력: type
type(zip) # 출력: type
type(map) # 출력: type
type(filter) # 출력: type
type(int) # 출력: type
type(str) # 출력: type
# 2.x에서 range와 그 외 값들에 대한 히스토리
# print(range(10)) # 출력: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 메모리를 모두 차지해야 합니다.

# print(range(100000000000000000000000000000000000000))
# 메모리의 효율이 극도로 안좋아짐

# 그런데 3.x에서 range(10000000000000000000000000000)는 메모리 효율이 안좋나요?
# 시작과, 끝, 스텝값만 가지고 있기 때문에 메모리 낭비가 전혀 없습니다.

# 2.x에서도 3.x와 같은 range타입이 있었습니다. xrange문법입니다. xrange문법이 3.x되면서 range가 된겁니다.
# 2.x에서 사용가능 문법
# print(xrange(10)) # 출력: xrange(10)
# for i in xrange(10): # 출력: 순회 가능
#     print(i)

실전문제

# '숫자' 배열을 '승수' 배열과 짝지어서 승수만큼 제곱을 시켜줄 것 입니다.
숫자 = [1, 2, 3, 4, 5]
승수 = [2, 2, 2, 3, 3]

#문제
#1. 숫자의 승수를 zip으로 맵핑해서 진행하세요.
#2. 숫자를 승수만큼 제곱하여 결과값을 표현해주세요.
#3. 승수한 값이 100이상인 값을 출력하세요.
#4. 승수한 값을 모두 더하세요.
# 결과값은 다음과 같아야 합니다.
# 1. 숫자의 승수를 zip으로 맵핑해서 진행하세요.
[(1, 2), (2, 2), (3, 2), (4, 3), (5, 3)]

# 2. 숫자를 승수만큼 제곱하여 결과값을 표현해주세요.
[1, 4, 9, 64, 125]

# 3. 승수한 값이 100이상인 값을 출력하세요.
[125]

# 4. 승수한 값을 모두 더하세요
203
# 정답
숫자 = [1, 2, 3, 4, 5]
승수 = [2, 2, 2, 3, 3]

# 1
zip_list = list(zip(숫자, 승수))    # [(1, 2), (2, 2), (3, 2), (4, 3), (5, 3)]

# 2
squared_list = list(map(lambda x : x[0]**x[1], zip_list))    # [1, 4, 9, 64, 125]

# 3
filtered_list = list(filter(lambda x : x >= 100, squared_list)) # [125]

# 4
sum(squared_list)

피드백

함수의 기본 형태부터 다양한 내장 함수까지 많은 것을 배웠다. 파이썬에서 중요한 부분인 만큼 연습문제 양이나 난이도도 꽤 되었다. 그렇지만 하나하나 풀어가며 실력 상승은 확실히 된 것 같은 느낌이다. 수업 내용은 유익했지만 오늘 뭔가 피곤해서 오후에는 힘들었다… 부트캠프를 시작하고 뭐라도 해보는게 좋다는 강사님의 의견에 따라 개인 프로젝트도 해보고 스터디 지원도 했는데 오늘 결성이 되가지고 오늘 기본적인 구성에 대해 서로 의견을 나누었다. 일단은 코딩 테스트와 팀프로젝트 크게 2가지가 나왔고 1-2주 정도 팀 프로젝트를 하고 코딩 테스트를 하는 것으로 합의를 보았다. 1-2주면 그렇게 긴 시간은 아니고 실력도 부족하기에 EDA(탐색적 데이터 분석)에 집중하기로 하였다. 대부분 경험이 있어서 조금 위축되기는 하지만 비슷한 사람도 있고 하니 같이 으쌰으쌰해서 열심히 해보도록 하겠다. 추가로.. 오늘 처음으로 8인 팀이 구성이 되었는데 아직 얘기는 많이 안해봤지만 다들 경력도 있고 하셔서 많이 배우게 될 것 같다 허허..

profile
익숙해지기 위해 기록합니다

0개의 댓글