*함수 사용 이유: 코드 재활용
🍋인수(argument): 전달되는 값
🍋매개 변수(parameter): 함수 헤더에서 인수를 전달받는 변수
Note: 여러 개의 값 반환하기
파이썬에서는 함수가 여러 개의 값을 반환할 수 있다. 다음과 같은 형식을 사용한다.
def get_input():
return 2, 3
x, y = get_input() #x는 2이고 y는 3이다
Note: 함수의 몸체를 나중에 작성하고 싶을 때
팡썬에서 함수의 헤더만 결정하고 몸체는 나중에 작성하고 싶은 경우에는 pass 키워드 사용 가능
def sub():
pass
🔑함수 안에서는 정의되지 않은 다른 함수를 호출해도 된다.
🔑함수이름: 동사+명사 형태가 좋음 ex) get_area
🔑매개변수의 개수와 인수의 개수는 일치해야 한다.
🔑매개변수를 일반변수로 사용하지 않는 것이 좋다.
⚠매개 변수를 변경한다고 해서 인수가 변경되지 않는다.
def set_radius(radius):
radius=100
return
r=20
set_radius(r)
print(r)
만약 변수를 함수의 인수로 보내면 변수의 값이 매 변수로 복사된다. 따라서 맥 변수를 변경한다고 해서 인수가 변경되지는 않는다.
위의 코드에서 변수 r의 값이 함수 안의 radius로 전달된다. 함수 안에서 radius를 변경한다고 해서 변수 r이 변경되지는 않는다. 변수 r의 값만 전달되는 것이고 변수 r이 직접 함수로 전달되지는 않는다. 하지만 만약 리스트가 전달되다면 리스트는 원본이 직접 전달된다. 따라서 함수 안에서 리스트를 변경하면 원본 리스트가 변경된다.
이 점 주의하기!!
파이썬에서 함수의 매개변수는 함수 호출 시에 제공되는 인수의 값을 복사해서 받습니다. 이것은 '값에 의한 호출'이라고도 불리는데, 이는 함수 내부에서 매개변수를 수정하더라도 원래의 인수는 변하지 않는다는 것을 의미합니다.
하지만 이것은 단순한 숫자, 문자열, 튜플 등 불변 타입에 대해서만 완전히 사실입니다. 만약 함수의 매개변수가 리스트, 딕셔너리, 클래스 객체 등과 같은 가변 타입인 경우, 함수 내에서 이 매개변수를 변경하면 원래의 인수도 변경됩니다. 이는 파이썬이 가변 타입에 대해서는 참조에 의한 호출을 사용하기 때문입니다.
다음은 예시 코드입니다:
def change_num(num):
num = 10
print(f"In function: {num}")
def change_list(lst):
lst.append(100)
print(f"In function: {lst}")
x = 5
change_num(x)
print(f"After function: {x}")
y = [1, 2, 3]
change_list(y)
print(f"After function: {y}")
이 코드를 실행하면 다음과 같은 결과를 얻습니다:
In function: 10
After function: 5
In function: [1, 2, 3, 100]
After function: [1, 2, 3, 100]
change_num 함수 내에서 num은 변경되지만, 함수가 끝난 후의 x는 원래의 값인 5를 유지합니다. 반면에 change_list 함수 내에서 lst를 변경하면, 함수가 끝난 후의 y도 변경됩니다. 이는 y가 가변 타입인 리스트를 참조하기 때문입니다.
Q. 파이썬에서 가변 리스트를 참조한다는 게 무슨 말일까?
가변 타입이 리스트를 참조한다는 것은 리스트와 같은 가변 타입이 메모리 상의 특정 위치, 즉 주소를 참조한다는 것을 의미합니다.
파이썬에서 리스트, 딕셔너리, 집합, 클래스 객체 등의 가변 타입은 생성될 때 메모리 상의 특정 위치에 저장됩니다. 변수가 이러한 객체를 가리킬 때, 변수는 그 객체의 메모리 주소를 참조하게 됩니다. 따라서 함수에 리스트와 같은 가변 타입을 매개변수로 전달하면, 매개변수는 원래 변수가 참조하던 메모리 주소를 복사하여 받습니다. 이 매개변수를 변경하면, 그 변경사항은 원래의 메모리 주소에 반영되므로 원래의 변수도 변경된 상태를 보게 됩니다.
이와 대조적으로, 숫자나 문자열과 같은 불변 타입은 값을 직접 복사하여 전달합니다. 따라서 함수 내에서 이러한 매개변수를 변경하더라도 원래의 변수에는 영향을 미치지 않습니다.
다음은 가변 타입을 참조하는 예시입니다:
def add_element(lst):
lst.append(100)
x = [1, 2, 3]
add_element(x)
print(x) # [1, 2, 3, 100]
🍋디폴트 인수(default argument): 함수의 매개 변수가 가지는 기본값
def greet(name, msg="별일없죠?"):
print("안녕", name+','+msg)
greet("영희")
#실행결과: 안녕 영희, 별일없죠?
greet() 함수를 호출할 때, 만약 msg로 값이 전달되지 않으면 자동으로 "별일없죠?"란 문자열로 가정한다.
🍋키워드 인수(keyword argument): 인수들 앞에 키워드를 두어서 인수들을 구분
🍋위치 인수(positional argument): 기본 인수 전달 방식
->키워드 인수를 사용할 때는 인수들이 어떤 순서로 전달되어도 상관없다.
->위치 인수와 키워드 인수가 섞일 수 있지만, 반드시 위치 인수가 키워드 인수 앞에 나와야 한다.
파이썬에서 함수를 호출할 때 사용하는 인수(arguments)에는 크게 두 가지 종류가 있습니다: 위치 인수(positional arguments)와 키워드 인수(keyword arguments).
**위치 인수(positional arguments)**는 함수를 호출할 때 인수를 순서대로 제공하는 방식입니다. 함수 정의에서 매개변수의 순서와 일치하는 순서로 인수를 제공해야 합니다.
예를 들어, 다음과 같은 함수가 있다고 가정해 봅시다:
def greet(name, greeting):
print(f"{greeting}, {name}!")
위치 인수를 사용하여 이 함수를 호출하면 다음과 같습니다:
greet("Alice", "Hello")
이 경우, "Alice"는 name 매개변수에, "Hello"는 greeting 매개변수에 전달됩니다.
**키워드 인수(keyword arguments)**는 함수를 호출할 때 매개변수의 이름을 명시적으로 지정하여 인수를 제공하는 방식입니다. 이를 통해 인수의 순서를 자유롭게 바꿀 수 있습니다.
위의 함수를 키워드 인수를 사용하여 호출하면 다음과 같습니다:
greet(greeting="Hello", name="Alice")
이 경우에도 "Alice"는 name 매개변수에, "Hello"는 greeting 매개변수에 전달됩니다. 하지만 키워드 인수를 사용하면 인수의 순서를 바꾸어도 됩니다:
greet(name="Alice", greeting="Hello")
위치 인수와 키워드 인수는 함께 사용할 수도 있습니다. 단, 위치 인수가 먼저 오고 그 뒤에 키워드 인수가 와야 합니다.
변수 앞에 *의 의미
: 변수 앞에 *이 붙으면 "시퀀스를 푼다"라고 생각하면 된다.
🍋가변 인수(variable arguments): 개수 모를 때 사용 가능한 인수
파이썬은 *args를 사용하여 가변 길이 인수를 함수에 전달하지만 키워드 인수를 전달하는 데 사용할 수 없다.
이 문제를 해결하기 위해 파이썬은 **kwargs라는 분법을 제공!
파이썬에서는 가변 인수(variable arguments)를 사용하여 임의의 개수의 인수를 함수에 전달할 수 있습니다. 가변 인수를 사용하면, 함수를 호출할 때 필요한 만큼의 인수를 제공할 수 있습니다.
파이썬에서는 두 가지의 가변 인수를 지원합니다: *args와 **kwargs.
*args: 위치 인수를 임의의 개수만큼 받을 수 있게 합니다. 함수 내부에서는 args를 튜플로 처리합니다.
def add(*numbers):
total = 0
for number in numbers:
total += number
return total
print(add(1, 2, 3, 4)) # 10
print(add(1, 2, 3)) # 6
이 경우, add 함수는 임의의 개수의 인수를 받아 합을 계산하고 반환합니다. *numbers는 제공된 모든 위치 인수를 튜플로 묶습니다.
- **kwargs: 키워드 인수를 임의의 개수만큼 받을 수 있게 합니다. 함수 내부에서는 kwargs를 딕셔너리로 처리합니다.
예제:
def introduce(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
introduce(name="Alice", age=25, hobby="reading")
이 경우, introduce 함수는 임의의 개수의 키워드 인수를 받아 각각을 출력합니다. **kwargs는 제공된 모든 키워드 인수를 딕셔너리로 묶습니다.
*args와 **kwargs는 동시에 사용할 수 있지만, *args가 먼저 와야 합니다. 또한, args와 kwargs라는 이름은 필수는 아니지만, 일반적으로 이러한 이름이 관례적으로 사용됩니다.
Q. 변수 앞에 *이 붙었다는 것은 무슨 의미일까?
파이썬에서 변수 앞에 *를 붙이는 것은 주로 두 가지 상황에서 사용됩니다.
- 함수 정의에서 가변 인수를 나타내는 경우: 함수를 정의할 때, 매개변수 앞에 *를 붙이면 해당 함수가 임의의 개수의 위치 인수를 받을 수 있음을 의미합니다. 이 경우, 함수 내부에서는 해당 매개변수를 튜플로 처리합니다.
def my_function(*args):
for arg in args:
print(arg)
my_function('Hello', 'World', '!')
위 예제에서 my_function은 임의의 개수의 인수를 받을 수 있습니다. my_function('Hello', 'World', '!')를 호출하면 출력은 다음과 같습니다.
Hello
World
!
2. 시퀀스를 개별 요소로 풀어내는 경우 (unpacking): 리스트, 튜플, 문자열 등의 시퀀스 타입의 데이터 앞에 *를 붙이면, 해당 시퀀스를 개별 요소로 풀어낼 수 있습니다.
numbers = [1, 2, 3, 4, 5]
print(*numbers)
위 예제에서 print(*numbers)를 실행하면, numbers 리스트가 개별 요소로 풀어져서 print(1, 2, 3, 4, 5)와 같이 동작합니다. 따라서 출력은 다음과 같습니다.
1 2 3 4 5
따라서 변수 앞에 *를 붙이는 것은 함수의 매개변수가 가변적이거나, 시퀀스를 개별 요소로 풀어내고자 할 때 사용됩니다.
LAB: 이분법
#Lab: 이분법
#함수 정의
def f(x):
return (x**2-x-1)
def bisection_method(a, b, error):
if f(a)*f(b)>0:
print("구간에서 근을 찾을 수 없습니다.")
else:
while (b-a)/2.0>error: #오차를 계산한다
midpoint=(a+b)/2.0 #중점 계산
if f(midpoint)==0:
return (midpoint)
elif f(a)*f(midpoint)<0:
b=midpoint
else:
a=midpoint
return (midpoint)
answer=bisection_method(1,2,0.0001)
print("x**2-x-1의 근:", answer)
이 코드는 이분법(bisection method)을 사용하여 함수 f(x) = x^2 - x - 1의 근을 찾는 것입니다. 이분법은 주어진 구간에서 함수의 값이 0이 되는 지점, 즉 근을 찾는 수치 해석적 방법입니다.
먼저, f(x) 함수는 입력된 x 값에 대해 x^2 - x - 1을 계산하여 반환합니다.
bisection_method(a, b, error) 함수는 이분법을 사용하여 a와 b 사이의 구간에서 f(x)의 근을 찾습니다. error는 근을 찾을 때 허용되는 오차 범위를 나타냅니다.
이분법은 다음과 같은 단계로 진행됩니다:
- 먼저, a와 b에서 f(x)의 값이 서로 다른 부호를 가지는지 확인합니다. 만약 같은 부호를 가진다면, 그 구간에는 근이 존재하지 않을 수 있으므로, "구간에서 근을 찾을 수 없습니다."라는 메시지를 출력하고 함수를 종료합니다.
- a와 b에서 f(x)의 값이 서로 다른 부호를 가진다면, 이분법을 시작합니다. 이때, a와 b의 중점을 계산하고, 그 중점에서 f(x)의 값이 0인지 확인합니다. 만약 0이라면, 중점이 근이므로 중점을 반환하고 함수를 종료합니다.
- 중점에서 f(x)의 값이 0이 아니라면, a에서 f(x)의 값과 중점에서 f(x)의 값이 서로 다른 부호를 가지는지 확인합니다. 만약 다른 부호를 가진다면, 근은 a와 중점 사이에 있을 것이므로, b를 중점으로 업데이트합니다.
- 만약 a에서 f(x)의 값과 중점에서 f(x)의 값이 같은 부호를 가진다면, 근은 중점과 b 사이에 있을 것이므로, a를 중점으로 업데이트합니다.
- 이렇게 a와 b를 업데이트하면서 구간을 반으로 줄여나가며 근을 찾습니다. 이 과정은 b와 a의 차이가 error보다 클 동안 계속됩니다.
마지막으로, 이 함수를 호출하여 f(x) = x^2 - x - 1의 근을 찾고, 그 근을 출력합니다. 이때, 찾는 구간은 1과 2 사이이며, 허용되는 오차는 0.0001입니다.
따라서, 이 코드는 이분법을 사용하여 f(x) = x^2 - x - 1의 근을 찾아 출력하는 것입니다. 이분법은 주어진 구간을 반으로 계속해서 나누어가면서 근을 찾는 방법이므로, 계산 오차가 허용 범위 내로 충분히 줄어들 때까지 계속해서 반복됩니다.
값 반환하기
🔑파이썬에서 return문이 처리되면 함수가 즉시 종료됨
🔑일부 프로그래머는 함수에서 예외적인 경우를 처리하는 데 이 기능을 사용한다.
def get_area(radius):
if radius<0: #반지름이 0인 경우 처리
return 0
return 3.14*radius**2 #정상적인 경우
위의 코드에서 get_area()를 호출할 때 radius에 음수값이 전달되면 함수는 0을 반환하고 0이 아니 때만, 원의 면적을 계산
⛔값 반환할 때 주의점: 하나의 경우에서만 값을 반환하면 안 된다. 모든 경우에서 값을 반환해야 한다.
def get_area(radius):
if radius>0:
return 3.14*radius**2
radius가 음수일 때는 아무 것도 반환되지 않는다.
컴파일러는 이것을 오류라고 보고하지 않는다.
다만 이런 경우에는 None이라고 하는 특수한 값을 반환한다.
-> 올바르게 고친 코드
def get_area(radius):
if radius>0:
area=3.14*radius**2
else:
area=0
return area
#반환값을 변수에 저장하였다가 맨 나중에 변수를 반환
여러 개의 값 반환하기
파이썬을 제외한 다른 프로그래밍 언어에서는 함수가 항상 하나의 값만을 반환함
따라서 여러 값을 반환하는 것이 필요한 함수는 다른 방법을 생각해야 함
파이썬에서는 함수가 하나 이상의 값도 반환 가능
def sub():
return 1, 2, 3
a, b, c = sub()
print(a, b, c)
-> return 1, 2, 3은 return (1, 2, 3)과 같다.
1, 2, 3은 튜플 (1, 2, 3)과 마찬가지
값을 반환하지 않는 함수
대부분의 함수는 값을 반환하지만 때로는 값을 반환하지 않는 함수도 있음
이런 함수도 가끔 필요함
값을 반환하지 않는다고 해서 일을 하지 않는 것이 아님
파이썬에서 함수는 값을 반환하지 않아도 됩니다. 이런 종류의 함수를 보통 "프로시저(procedure)" 또는 "void 함수"라고 부르기도 합니다.
값을 반환하지 않는 함수는 대개 부작용(side effect)를 수행하기 위해 사용됩니다. 예를 들어, 함수가 어떤 값을 계산해서 반환하는 대신에, 화면에 어떤 내용을 출력하거나, 전역 변수의 상태를 변경하거나, 파일에 데이터를 쓰는 등의 작업을 수행할 수 있습니다.
다음은 값을 반환하지 않는 함수의 예입니다:
def print_greeting(name):
print(f"Hello, {name}!")
이 함수는 인자로 주어진 이름을 사용하여 인사말을 화면에 출력합니다. 이 함수는 명시적으로 값을 반환하지 않으며, 이 함수를 호출한 결과를 변수에 할당하려고 하면, 그 값은 None이 됩니다.
result = print_greeting("Alice")
print(result) # 출력: None
None은 파이썬에서 "아무 값도 없음"을 나타내는 특별한 값입니다. 함수에서 명시적으로 값을 반환하지 않으면, 파이썬은 자동으로 None을 반환합니다. 그래서 print_greeting 함수의 결과는 None이 됩니다.
Q. 유용한 반환 값이 없으면 수식에서 사용 불가능한가?
함수가 반환 값을 제공하지 않으면, 그 함수의 결과를 다른 수식의 일부로 사용하는 것은 일반적으로 불가능합니다. 이는 함수의 반환 값이 None인 경우를 포함합니다.
예를 들어, 다음과 같은 함수를 고려해봅시다:
def print_greeting(name):
print(f"Hello, {name}!")
이 함수는 명시적으로 값을 반환하지 않으므로, 파이썬은 자동으로 None을 반환합니다. 이 경우, 다음과 같이 이 함수를 다른 수식의 일부로 사용하려고 하면 문제가 발생합니다:
x = print_greeting("Alice") + 1 # 오류 발생!
이 코드는 오류를 발생시킵니다. 왜냐하면 print_greeting("Alice")의 반환 값은 None이고, None에 숫자를 더하는 것은 허용되지 않기 때문입니다.
따라서, 함수가 유용한 값을 반환하지 않으면 그 함수의 결과를 다른 수식의 일부로 사용하는 것은 일반적으로 불가능합니다. 하지만, 이런 함수들은 종종 부작용(예: 화면에 출력하는 것, 파일에 쓰는 것 등)을 수행하기 위해 사용됩니다.
Q. "끝에 도달하기 전에 함수에서 반환하려면 반환값 없이 return 문을 사용한다." 이 말 이해 안 가. 무슨 말이야?
이 문장은 함수의 실행을 조기에 종료하고 싶을 때 return 문을 사용할 수 있다는 것을 설명하고 있습니다.
일반적으로 함수는 모든 명령문을 실행한 후에 종료되거나, return 문을 만나면 종료됩니다. return 문 뒤에 반환값을 지정하면, 그 값이 함수의 호출자에게 반환되며 함수의 실행이 종료됩니다.
하지만 때때로, 함수를 즉시 종료하고 싶지만 특정 값을 반환하고 싶지 않을 때가 있습니다. 이럴 때는 return 문만 사용하고 반환값을 지정하지 않을 수 있습니다. 이렇게 하면 함수는 즉시 종료되고, 반환값은 None이 됩니다.
예를 들어, 다음 함수는 숫자가 양수인지 확인하고, 양수이면 그 숫자를 그대로 반환합니다. 그러나 숫자가 0이나 음수라면, 함수는 즉시 종료되고 None을 반환합니다.
def get_positive_number(num):
if num <= 0:
return # 여기서 함수가 종료되고, 반환값은 None이 됩니다.
return num # 숫자가 양수라면, 그 숫자를 반환합니다.
위 함수를 사용하면 다음과 같이 됩니다:
print(get_positive_number(5)) # 출력: 5
print(get_positive_number(-1)) # 출력: None
따라서 "끝에 도달하기 전에 함수에서 반환하려면 반환값 없이 return 문을 사용한다"는, 함수를 즉시 종료하려면 return 문을 사용하고, 그 경우 반환값은 None이라는 것을 의미합니다.
LAB: 여러 개의 값 반환
#LAB: 여러 개의 값 반환
def get_info():
name=input("이름: ")
age=int(input("나이: "))
return name, age #2개의 값 반환
st_name, st_age = get_info() #반환된 값을 풀어서 변수에 저장
print("이름은", st_name, "이고 나이는", st_age, "살입니다.")
이 부분은 파이썬의 튜플 언패킹(tuple unpacking) 기능을 사용하고 있습니다.
get_info() 함수는 이름과 나이 두 가지 값을 반환합니다. 이 두 가지 값을 반환할 때, 파이썬은 이들을 튜플(tuple)로 묶어서 반환합니다. 따라서 get_info() 함수의 반환 값은 실제로는 두 요소를 가진 튜플입니다.
그런데 파이썬은 튜플 언패킹이라는 기능을 제공합니다. 이 기능을 사용하면, 튜플의 각 요소를 별도의 변수에 바로 할당할 수 있습니다. 이렇게 하면 튜플의 요소를 한 번에 여러 변수에 할당할 수 있어 매우 편리합니다.
st_name, st_age = get_info() 이라는 코드는 튜플 언패킹을 사용하여 get_info() 함수의 반환 값을 두 개의 변수, st_name과 st_age에 각각 할당하는 것입니다.
따라서 get_info() 함수가 반환하는 이름은 st_name에, 나이는 st_age에 저장됩니다. 그리고 이 값들은 그 다음 줄에서 출력됩니다.
이러한 튜플 언패킹 기능은 함수가 여러 값을 한 번에 반환해야 하는 경우에 매우 유용합니다.
튜플 언패킹 예시 코드
# 튜플 생성
my_tuple = ("Apple", "Banana", "Cherry")
# 튜플 언패킹
fruit1, fruit2, fruit3 = my_tuple
print(fruit1) # 출력: Apple
print(fruit2) # 출력: Banana
print(fruit3) # 출력: Cherry
이 예제에서, 우리는 "Apple", "Banana", "Cherry"라는 세 개의 요소를 가진 튜플 my_tuple을 생성했습니다.
그리고 나서 튜플 언패킹을 사용하여 my_tuple의 세 요소를 각각 fruit1, fruit2, fruit3라는 세 변수에 할당했습니다.
이렇게 튜플 언패킹을 사용하면, 튜플의 요소를 여러 변수에 한 번에 할당할 수 있어 매우 편리합니다.
이 기능은 함수가 여러 값을 한 번에 반환할 때 특히 유용합니다.
함수를 사용하는 이유
🖍 소스코드의 중복성 제거
🖍 한 번 제작되 함수는 다른 프로그램 제작할 때도 사용 가능
🖍 복잡한 문제를 단순한 부분으로 분해 가능
💡구조화 프로그래밍
: 큰 작업을 계속 나누어서 설계하는 기법
나누어진 부분이 너무 간단해서 함수로 구현될 수 있을 때까지 나눔
🔑각 함수들은 특징적이 한 가지 작업(기능)만을 맡아야 한다.
🔑가독성 증가
🔑함수 음만 보아도 어떤 작업인지를 대략 알 수가 있어서 소스 코드를 다른 사람이 읽기가 쉬워짐
순환 호출
🍋순환(recursion): 어떤 알고리즘이나 함수가 자기 자신을 호출하여 문제를 해결하는 프로그래밍 기법
사용 예: 컴퓨터에서 팡찾는 경우(디렉토리 순환 탐색), 프랙탈 이용하여 그림그리기, 팩토리얼 구하기
팩토리얼 구하기 예제
def factorial(n):
if n==1:
return 1
else:
return n*factorial(n-1)
def factorial(n):
if n==1:
return (1)
else:
return n*factorial(n-1)
n=eval(input("정수를 입력하시오: "))
print(n, "!= ", factorial(n))
🔦파이썬 eval()함수 역할
eval() 함수는 파이썬의 내장 함수로, 문자열로 된 파이썬 표현식을 평가(evaluate)하고 그 결과를 반환합니다.
input() 함수는 사용자로부터 입력을 받아서 문자열로 반환하는 함수입니다. 따라서 input("정수를 입력하시오: ")의 반환 값은 사용자가 입력한 숫자지만, 이 값은 문자열 형태로 반환됩니다.
이 때 eval() 함수를 사용하면, 이 문자열을 숫자로 변환할 수 있습니다. 예를 들어, 사용자가 "123"을 입력하면, input() 함수는 "123"이라는 문자열을 반환하지만, eval("123")은 123이라는 정수를 반환합니다.
따라서 eval(input("정수를 입력하시오: ")) 코드는 사용자로부터 숫자를 입력받아서 그 값을 정수로 변환하는 역할을 합니다.
그러나 eval() 함수는 임의의 파이썬 표현식을 실행할 수 있으므로, 사용자로부터 입력을 직접 받아서 eval() 함수에 전달하는 것은 보안상 위험할 수 있습니다. 사용자가 예상치 못한 코드를 입력하여 프로그램을 공격할 수 있기 때문입니다. 따라서 일반적으로 int() 함수를 사용하여 사용자 입력을 안전하게 정수로 변환하는 것이 좋습니다. 예를 들어, int(input("정수를 입력하시오: "))와 같이 사용할 수 있습니다.
🔦eval()과 int()의 차이점
eval() 함수와 int() 함수는 모두 문자열을 정수로 변환할 수 있지만, 두 함수는 아주 중요한 차이점이 있습니다.
- int() 함수는 문자열을 정수로 변환하는 데에만 사용됩니다. 예를 들어, "123"이라는 문자열을 123이라는 정수로 변환할 수 있습니다. 문자열이 정수로 변환할 수 없는 형태라면, int() 함수는 오류를 발생시킵니다.
- eval() 함수는 문자열로 된 파이썬 표현식을 평가하고 그 결과를 반환합니다. 따라서 eval() 함수는 문자열을 정수로 변환하는 데에도 사용할 수 있지만, 더 복잡한 표현식도 처리할 수 있습니다. 예를 들어, eval("123 + 456")은 123 + 456이라는 표현식을 평가하여 579를 반환합니다.
그러나 eval() 함수의 이런 특성은 보안상의 위험을 수반합니다. eval() 함수는 사용자로부터 임의의 코드를 받아서 실행할 수 있으므로, 악의적인 사용자가 이를 이용하여 프로그램을 공격할 수 있습니다. 따라서 일반적으로는 사용자 입력을 처리할 때 int() 함수를 사용하는 것이 더 안전합니다.
변수의 범위
🍋지역 변수(local variable): 함수 안에서 생성되는 변수
🔑지역 변수는 함수가 종료되면 사라짐
🔑함수 외부에서 사용하려고 하면 오류 발생
🔑함수마다 동일한 이름 사용 가능
def myfunc():
x=100
print(x)
myfunc()
🍋전역 변수(global variable): 함수 외부에서 생성되는 변수
-프로그램 어디에서나 사용 가능
gx=100
def myfunc():
print(gx)
myfunc()
print(gx)
🔖함수 안에서 전역 변수 변경하기
함수 안에서 전역 변수 값은 변경 안 됨
바꾸려면 전역 변수 앞에 global 붙여서 값 변경하기
gx=100
def myfunc():
global gx
gx=200
print(gx)
myfunc()
print(gx)
'프로그래밍 > Python' 카테고리의 다른 글
| 📔파워 유저를 위한 파이썬 Express 07. 파이썬 자료구조 2(튜플, 딕셔너리, 세트, 문자열) (0) | 2023.05.27 |
|---|---|
| 📔파워 유저를 위한 파이썬 Express 06. 파이썬 자료구조 1(리스트) (0) | 2023.05.19 |
| 파이썬 문자열 출력(2) (0) | 2023.05.03 |
| 파이썬 줄바꿈 없애서 출력하기 (0) | 2023.05.01 |
| 파이썬 print문 통해서 숫자 변수 출력법 (0) | 2023.04.25 |