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
: 요소의 순서를 뒤집어 반환a = 'pithon'
def 함수1():
def 함수2():
print('love')
print('I')
함수2()
return "python"
a = 함수1()
print(a)
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)}')
# 아래와 같은 값이 있다면 (2 + 3) * (2 - 3) = -5가 출력이 되어야 합니다.
a = 2
b = 3
def calc(num1, num2):
return (num1 + num2) * (num1 - num2)
calc(a, b)
# 재귀함수를 이용하여 만들어야하며, x은 0이 아닙니다. (x, n > 1)
def square(x, n):
if n == 1:
return x
return x * square(x, n-1)
square(2, 3)
# 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])
# 이 함수는 하나의 문자열을 인자로 받아, 해당 문자열이 앞으로 읽으나 뒤로 읽으나
# 같은 단어이면 True를, 아니면 False를 반환해야 합니다.
def is_palindrome(s):
if s == s[::-1]:
return True
return False
is_palindrome("hhe")
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]
# 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인 팀이 구성이 되었는데 아직 얘기는 많이 안해봤지만 다들 경력도 있고 하셔서 많이 배우게 될 것 같다 허허..