파이썬에서 함수 호출할때 인자(argument)를 전달하는 방법에는 2가지
위치인자(Positional Arguments)와 키워드 인자(Keyword Arguments)로 나뉩니다.
- 위치 인자(Positional Arguments)
함수 호출시 전달하는 인자가 함수 정의의 매개변수(parameter)의 위치에 따라 매핑되는 방식
즉, 인자의 순서가 함수 정의에서 매개변수의 순서와 일치해야함
def greet(name, age):
print(f"Hello, {name}. You are {age} years old.")
위에서 함수는 name과 age라는 두 개의 parameter를 받아 인사말과 나이를 출력한다.
위 함수를 위치인자를 사용하면 다음과 같다.
greet("Alice",30)
위 함수는 name에 "Alice"라는 값이, 그리고 age에 30이라는 값이 매핑되어 함수가 실행됨.
- 키워드 인자(Keyword Arguments)
키워드 인자는 함수 호출시 인자의 이름을 지정하여 함수 정의에서 해당 이름과 매핑되도록 전달하는 방식 이를 통해 인자의 순서를 신경쓰지 않고 명확하게 어떤 값이 해당하는 지 지정가능
greet(age=30, name="Alice")
이렇게 키워드 인자를 사용하면 인자의 순서와 상관없이 명확하게 지정 가능
파이썬에서는 위치인자와 키워드 인자 혼합 사용도 가능하지만, 키워드 인자를 사용하려면 위치인자가 먼저 나와야함.
greet("Bob",age=25)
위 호출시 name에 "Bob"이라는 인자가 먼저 왔고, age에는 키워드 인자로 25가 전달됨.
하지만, 이렇게 위치 인자와 키워드 인자를 혼합해서 사용하는 방식은 지양하는게 좋다.

햇갈린다 포지션은 위치기반 키워드는 지정식!
def mul(x,y,/): # /는 포지션 인자만 받겠다는 표시
return x * y
mul(x=4,y=5)
TypeError: mul() got some positional-only arguments passed as keyword arguments
포지션 전용 인자(positional-only arguments)로 설정된 파라미터에 키워드 인자(keyword arguments)로 값을 전달해서, 포지션 인자로 mul(4, 5)만 기입시 정상 출력
mul(4, 5) # 올바른 호출 방법 (위치 인자로 전달)
or
함수정의에서 / 기호를 제거하면 포지션 전용이 아니라서 정상 출력
def mul(x, y): # 포지션 전용이 아님
return x * y
mul(x=4, y=5) # 키워드 인자로 호출 가능
포지션 전용 인자를 쓰는 이유
def only_keyword(*,x,y): # 키워드 인자만 받겠다
return x + y
only_keyword(x=1,y=2)
only_keyword(1,2)
TypeError: only_keyword() takes 0 positional arguments but 2 were given
위와 반대로 키워드 인자만 받아야 작동하므로,
def only_keyword(*,x,y): # 키워드 인자만 받겠다
return x + y
only_keyword(x=1,y=2)
위처럼 수정하거나 def only_keyword(x,y) 사용 "*" 제거
def mix_fun(a,b,/,h,i,,x,y): #a,b,/ 는 포지션 ,x,y는 키워드
print(a-b)
print(h-i)
print(x*y)
mix_fun( 파라미터 )
def mix_fun(a,b,/,h,i,*,x,y): #a,b,/ 는 포지션 *,x,y는 키워드
print(a-b)
print(h-i)
print(x*y)
mix_fun(3,4,3,4,x=3,y=4)
#출력
-1
-1
12
d = dict(a=1,b=2,c=3) #딕셔너리 생성
vo = d.items() # d.items() 딕셔너리의 (key,value)쌍을 반환하는 view 객체 생성
for kv in vo: # 첫 번째 for 루프
print(kv) # 키 값 출력 kv = keyvalue 표현
d['a'] = d['a'] + 3 # 값 수정 # 'a'키값을 3증가 (a:4)
d['c'] += 2 # 'c'의 값 2증가 (c:5)
for kv in vo:
print(kv) # 키, 값 출력
출력
('a', 1)
('b', 2)
('c', 3) #첫 번째 for 루프에서 여기까지 출력
('a', 4)
('b', 2)
('c', 5) #두 번째 루프에서 변경된 값이 여기까지 출력
d1 = dict(a=1,b=2,c=3)
d2 ={}
for k,v in d1.items():
d2[k] = v*2
print(d2)
#컴프리 헨션으로 채우시오.
d2 = { } ## d1의 값을 두 배 늘린 딕셔너리 생성
print(d2)

컴프리헨션 원리
d2 = [k for v in v*2]
d1 = dict(a=1,b=2,c=3)
d2 = {k: v * 2 for k, v in d1.items()} # k: d1의 키값 유지 v*2 밸류값은 2배
print(d2)
출력값
{'a':2, 'b':4, 'c':6}
map(function, iterable)
map() 함수는 iterable의 각 요소에 대해 function 함수를 적용한 결과를 새로운 iterator로 반환합니다. 이때, function 함수는 각 요소를 인자로 받아서 처리하며, 함수의 반환값이 새로운 iterator의 각 요소가 됩니다.
예제
def square(x):
return x**2
numbers = [1, 2, 3, 4, 5]
squared_numbers = map(square, numbers)
print(list(squared_numbers)) # [1, 4, 9, 16, 25]
map 함수를 사용하는 이유
파이썬의 내장 함수 filter() 함수는 iterable한 객체, 리스트와 같은 자료들을 필터링하는 역할을 하는데 여기서 필터링이란 특정 조건에 맞는 요소들만 출력한다는 의미입니다.
filter() 함수 기본 형태 : filter(function, iterable)
num_list = [10, 20, 30, 40, 50, 60, 70, 80]
for n in num_list :
if n > 40 :
filter_list.append(n)
print(filter_list)
>>> [50, 60, 70, 80]
필터를 사용했을때
num_list = [10, 20, 30, 40, 50, 60, 70, 80]
filter_list = list(filter(lambda n : n > 40, num_list))
print(filter_list)
>>> [50, 60, 70, 80]
st1 = [1,2,3]
st2 = [3,2,1]
st3 = list(map(sum,st1,st2)) # 함수에 파라미터가 두개 있을 경우
st3 # 출력[4, 4, 4]
# 두 개의 파라미터를 받아 더하는 sum 함수 정의
def sum(a, b):
return a + b
# 입력 리스트
st1 = [1, 2, 3]
st2 = [3, 2, 1]
# map을 사용하여 각 요소를 더한 새로운 리스트 생성
st3 = list(map(sum, st1, st2))
print(st3) # 출력: [4, 4, 4]
s1 = ['one', 'two','three']
ref = list(map(함수,s1))
print(ref)
출력
#['eno', 'owt', 'eerht']
# 문자열을 뒤집는 함수 정의
def reverse_string(s):
return s[::-1]
# 입력 리스트
s1 = ['one', 'two', 'three']
# map 함수로 리스트 요소에 reverse_string 함수를 적용
ref = list(map(reverse_string, s1))
# 결과 출력
print(ref) # ['eno', 'owt', 'eerht']
users = [{'mail': 'gregorythomas@gmail.com', 'name': 'Brett Holland', 'gender': 'M'},
{'mail': 'hintoncynthia@hotmail.com', 'name': 'Madison Martinez', 'gender': 'F'}]
# 주어진 데이터
users = [
{'mail': 'gregorythomas@gmail.com', 'name': 'Brett Holland', 'gender': 'M'},
{'mail': 'hintoncynthia@hotmail.com', 'name': 'Madison Martinez', 'gender': 'F'}
]
# filter 함수를 사용하여 gender가 'M'인 사람의 이름만 추출
male_users = list(filter(lambda user: user['gender'] == 'M', users))
#lamda 함수가 user 딕셔너리의 gender키가 'M'인지 확인
male_names = [user['name'] for user in male_users]
print(male_names) # 출력: ['Brett Holland']
동일작업을 List Comprehension
```python
male_names = [user['name'] for user in users if user['gender'] == 'M']
print(male_names) # 출력: ['Brett Holland']
# 주어진 데이터
users = [
{'mail': 'gregorythomas@gmail.com', 'name': 'Brett Holland', 'gender': 'M'},
{'mail': 'hintoncynthia@hotmail.com', 'name': 'Madison Martinez', 'gender': 'F'}
]
# filter 함수를 사용하여 gender가 'F'인 사람의 이름만 추출
fmale_users = list(filter(lambda user: user['gender'] == 'F', users))
#lamda 함수가 user 딕셔너리의 gender키가 'F'인지 확인
fmale_names = [user['name'] for user in fmale_users]
print(fmale_names) # 출력: ['Madison Martienez']
nums = (1,2,3,4,5)
first, *others, last = nums
패킹(Unpacking)이란?
언패킹은 리스트, 튜플 등의 자료구조를 개별 변수에 할당하는 기능입니다. * 연산자는 여러 요소를 리스트로 묶어서 변수에 할당하는 역할을 합니다.
print(first) # 출력: 1
print(others) # 출력: [2, 3, 4]
print(last) # 출력: 5
14 .함수에서 단독으로 쓰일때와 , 변수명 쓰일때의 차이는?
Python 함수에서 는 여러 요소를 한꺼번에 처리할 수 있도록 해주는 강력한 문법입니다. 하지만 의 사용 방식에 따라 의미가 달라집니다. 여기서는 단독 사용과 변수명 사용의 차이를 설명하겠습니다.
Python 함수에서 는 여러 요소를 한꺼번에 처리할 수 있도록 해주는 강력한 문법입니다. 하지만 의 사용 방식에 따라 의미가 달라집니다. 여기서는 단독 사용과 변수명 사용의 차이를 설명하겠습니다.
def example_func(a, b, *, c, d):
print(f"a: {a}, b: {b}, c: {c}, d: {d}")
# 호출 시 반드시 c, d는 키워드 인자로 전달
example_func(1, 2, c=3, d=4) # 출력: a: 1, b: 2, c: 3, d: 4
# 오류 발생: c, d가 위치 인자로 전달됨
# example_func(1, 2, 3, 4) # TypeError 발생
def example_func(*args):
print(f"args: {args}")
example_func(1, 2, 3, 4) # 출력: args: (1, 2, 3, 4)
*args는 가변 인자로, 함수 호출 시 입력된 여러 개의 위치 인자를 튜플 형태로 받습니다.
example_func(1, 2, 3, 4)를 호출하면 args는 (1, 2, 3, 4)라는 튜플이 됩니다.
c = Circle(10)
c.get_area() # 314
rec = Rectangle(10)
rec.get_area() # 100
import math
# 원 클래스
class Circle:
def __init__(self, radius):
self.radius = radius #radius 반지름
# 원의 면적 계산
def get_area(self):
return math.pi * (self.radius ** 2)
#원의 면적은 3.14* r^2 math.pi 사용하면 더 정확한 파이값 가능
# 사각형 클래스
class Rectangle:
def __init__(self, side):
self.side = side
# 사각형의 면적 계산
def get_area(self):
return self.side ** 2 # 정사각형의 면적: 한 변의 길이의 제곱
# 객체 생성 및 테스트
c = Circle(10)
print(f"원의 면적: {c.get_area():.2f}") # 출력: 원의 면적: 314.16 (소수점 2자리까지)
rec = Rectangle(10)
print(f"사각형의 면적: {rec.get_area()}") # 출력: 사각형의 면적: 100
세줄요약:
1.결과 데이터 반환을 위해 filter 와 컴프리 헨션으로 효율적 코딩 가능하다.
2.언패킹 하는 케이스는 튜플로 함수 호출 할때 이다.
3.함수 파라미터에서 단독으로 쓰일때와 파라미터명 으로 쓰일때를 구분하자