📍Function
일정한 작업을 수행하는 코드블럭
즉, input과 output이 있는 구조
함수를 사용하는 이유
def 함수명(parameter):
문장1
문장2
...
문장N
return 리턴값
Input parameter가 없을 수도 혹은 return 값이 없을 수고 있다
return 값은 함수에서 해당 함수를 호출한 주체에게 output을 보내주는 것
1 혹은 그 이하이면 소수가 아니다
if (n <= 1):
return False
2 와 3은 소수 이다
if (n <= 3):
return True
2 나 3으로 나누어 떨이지면 소수가 아니다
if (n % 2 == 0 or n % 3 == 0):
return False
i = 5
while(i * i <= n):
if (n % i == 0 or n % (i + 2) == 0) :
return False
i = i + 6
return True
소수 계산을 여러번 반복 해서 해야 한다면 위의 코드를 여러번 중복되게 사용해야 하는데 그러면 코드의 양도 많아지고 복잡해져 코드의 가독성도 떨어진다
그럴 땐 아래 처럼!!
is_eleven_prime = is_prime(11)
print(f"11 is prime? {is_eleven_prime}")
is_ten_prime = is_prime(10)
print(f"10 is prime? {is_ten_prime}")
Keyword arguments 방식으로 parameter 값을 전해주면 실제 parameter 순서가 바뀌어도 된다.
parameter 순서에 맞추어 값을 함수에 넘기는 경우, 실수로 값이 바뀌어도 알기가 힘들다는 단점이 있지만 keyword arguments는 parameter 이름에 맞추어서 값을 함수에 넘기기 때문에 실수로 값이 바뀔 확률이 상대적으로 적다.
다만, 여기서 중요한것은 positional arguments 부분은 순서를 지켜줘야 한다는 것!
예를 들어, 아래 코드처럼 함수를 호출하면 error가 납니다. 에러가 나는 이유는 keyword argument가 positional argument 보다 더 앞으로 위치되어 함수가 호출되었기 때문입니다. Positional arguments는 순서를 지켜주어야 하는데 순서가 틀렸기 때문에 에러가 나는것입니다.
def yummy(my_name, fav_food):
print(f"{my_name} loves {fav_food}")
yummy(your_name = "정지민", "낙곱새")
Traceback (most recent call last):
File "python", line 1
SyntaxError: positional argument follows keyword argument
함수의 parameter에 default 값을 정의해 줄 수 있고 값이 넘겨지 않은 경우 default 값이 자동으로 넘겨짐!
조심해야 할점
default 값이 정의된 parameter가 default 값이 정의 되지 않은 parameter보다 먼저 위치해 있으면 안된다!! 만일 default value parameter를 non-default value parameter 앞에 선언하면 syntax error가 납니다.
def yummy(my_name="정지민", fav_food):
print(f"{my_name} loves {fav_food}")
Traceback (most recent call last):
File "python", line 1
SyntaxError: non-default argument follows default argument
yummy함수의 parameter값 2개를 입력받아야 되는데 my_name 에는 이미 default값이 있으니 fav_food 값만 받아오면 되는 상황에서 값을 1개 주면 fav_food가 아닌 제일 처음에 쓴 my_name에 넣으려고 하기 때문에 정작 fav_food는 공석이 된다
1.위치인수
: 함수를 호출할 때 전달되는 값이 매개변수에 순서대로 전달되는 인수를 의미
def number(a,b,c):
print(a,b,c)
number(1,2,3)
1,2,3이 a,b,c에 전달됨
2.가변인수
: 인수의 개수가 변할 수 있다는 의미
함수 호출시 인수의 개수를 다양하게 바꿔가며 사용할 수 있다.
def find_sum(*args):
sum = 0
for i in args:
sum += i
print('sum: {0}'.format(sum))
주의해야할 점!
def func_param_with_var_args(name, *args, age):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
func_param_with_var_args("정우성", "01012341234", "seoul", 20)
->errer
Traceback (most recent call last):
File "main.py", line 31, in func_param_with_var_args("정우성", "01012341234", "seoul", 20)
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
def func_param_with_var_args(name, *args, age):
위 처럼 가변인수를 parameter 중 중간에 써버리면 어디까지가 *args고 어디부터가 age값인지 알기어렵다
def func_param_with_var_args(name, age,*args ):
이렇게 가변인수를 마지막에 넣어주면
def func_param_with_var_args(name, age,*args):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
func_param_with_var_args("정우성", "01012341234", "seoul", 20)
< paramter 인자 순서>
일반 인자 -> default 일반 인자 -> 가변 인자 -> Keyword-Only 인자 -> 키워드 가변 인자
def func_param_with_kwargs(name, age, address=0, **kwargs):
print("name=",end=""), print(name)
print("age=",end=""), print(age)
print("kwargs=",end=""), print(kwargs)
print("address=",end=""), print(address)
func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")
가변 인수와 마찬가지로 가변 키워드 인수도 마지막에 넣어줘야한다!
만약 가변인수와 가변 키워드 인수가 모두 들어있을 경우!!
def mixed_params(name="아이유", *args, age, **kwargs, address):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
print("kwargs=",end=""), print(kwargs)
print("address=",end=""), print(address)
mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
File "main.py", line 16
def mixed_params(name="아이유", *args, age, **kwargs, address):
^
SyntaxError: invalid syntax
위에서 말한 것 처럼
일반 인자 -> default 일반 인자 -> 가변 인자 -> Keyword-Only 인자 -> 키워드 가변 인자
이 순서대로 써야함!
여기서 address는 keyword_Only !!
즉,
일반 인자age -> default 일반 인자name="아이유" -> 가변 인자*args -> Keyword-Only 인자address-> 키워드 가변 인자**kwargs
def mixed_params(age, name="아이유", *args, address,**kwargs):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
print("kwargs=",end=""), print(kwargs)
print("address=",end=""), print(address)
mixed_params(20, "정우성", "01012341234", "male" ,address="seoul",mobile="01012341234")
📍'*' 단독사용하기
다른 인자들과 다른게 입력받는 인자는 아니고 positional arguments를 무제한으로 허용하지 않고 '*'까지의 인자들만 나타낸 후
Keyword-Only 인자
혹은**kwarg
가 바로 다음에 올수 있도록 하기위해 사용(위치 인수의 출력을 제어하는 바리게이트?)
#지금 까지 공부한 것
def qqq(arg, kwarg=None, *args, kwarg2=None, **kwargs):
print(arg, kwarg, args, kwarg2, kwargs)
qqq(1, 2, 3, 4, 5, kwarg2="kwarg2", hello="hello", hi="hi")
#1 2 (3, 4, 5) kwarg2 {'hello': 'hello', 'hi': 'hi'}
#'*'사용해보기
```python
def qqq(a, b, *, c,d, kwarg2=None, **kwargs):
print(a,b,c,d, kwarg2, kwargs)
qqq(1,2,3,4,hello="hello", hi="hi" )
error
Traceback (most recent call last):
File "main.py", line 4, in<module>
qqq(1,2,3,4,hello="hello", hi="hi" )
TypeError: qqq() takes 2 positional arguments but 4 were given
#positional arguments를 2개만 받아 올 수있지만 넌 4개나 받아왔다
👉지금까지 공부한 내용으로 보면 위 함수는
a -> 1
b -> 2
c -> 3
d -> 4
이렇게 대입되어야하지만 a,b 뒤에 *
을 사용하여 키워드 전용 인수들을 나타내게 되어있기 때문에 c,d 는 자동으로 keyword-only 인자가 되었다.
def qqq(a, b, *, c,d, kwarg2=None, **kwargs):
print(a,b,c,d, kwarg2, kwargs)
qqq(1,2,c=3,d=4,hello="hello", hi="hi" )
#1 2 3 4 None {'hello': 'hello', 'hi': 'hi'}