서론
세상에는 다양한 규칙들이 존재합니다.
세계 전체에서 통용되는 것과, 우리집에서만 통용되는 것.
원래 모든 곳에서는 통하지만 한 곳에서는 통하지 않는 것에는
어떤 것들이 있을까요?
아마도 여러가지가 있을 수 있겠죠?
먼저 세계에서 통용되는 국제법과 우리집에서만 통용되는
집안 규칙이 있다고 가정합니다.
국제법은 '국가와 국가 사이의 관계',
'평화와 전쟁에 대한 모두가 인정할 수 있는 규칙',
'인류 모두를 위해 정하는 환경'이나 '에너지'에 관한 어떤 것,
'역사와 문화재를 보존하기 위한 회합' 등을 정합니다.
반대로 우리집에서만 통하는 규칙은 '운동화는 언제 세탁해야 하는지',
'집안일은 누가누가 어떤 것을 할지', '제사나 잔치는 언제할 지',
'종교장소는 어떤 곳으로 갈지' 등이 우리집 안에서만 통용될 것입니다.
아마 우리집은 청소를 제가 하는데, 다른집은 청소를 아버지가 한다고해서
이 부분을 지적하는 것은 안되겠죠?
다만 그 집안에서는 훌륭히 작용하는 규칙일 것입니다.
이렇게 모두에게 통하는 것이 전역 변수, 폐쇄적인 한 곳에서만
통하는 것이 지역 변수라고 할 수 있겠습니다.
다만 집안에서도 우리는 국제법을 지켜야 하지만,
파이썬 안에서 일정한 함수에서는 지역 변수만 통하고,
전역 변수는 통하지 않는다는 점이 큰 차이점입니다.
def 함수에서 사용할 변수를 만드는 방식에 대해서 알아보고,
유용하게 사용할 수 있는 함수들을 알아보겠습니다.
전역 변수와 지역 변수의 차이
함수 안에서 정의한 변수는 함수 안에서만 사용할 수 있습니다.
국제법과 같은 변수를 전역 변수라고 합니다. 이것은 함수에서 정의하기 전
파이썬에서 전체적으로 사용할 수 있습니다.
반대로 우리집 규칙 같은 변수를 지역 변수라고 합니다. 이것은 해당 함수안에서
선언하면 그 속에서만 돌아가는 것입니다.
a = 5 # 전역 변수
먼저 5라는 값을 가진 전역변수 a와
def func1():
a = 1 # 지역 변수. func1()에서만 사용
print("a =",a)
1이라는 값을 가진 a가 있는 func1이라는 함수를 작성했습니다.
이해를 돕기 위해 "a = "이라는 문자열을 필자가 따로 추가했습니다.
이렇게 하면 a는 어떤것이 출력될까요?
5
하지만 func1()에서는 어떻게 출력될까요?
a = 1
이렇게 함수에서 따로 설정해준 변수가 출력되게 됩니다.
이제 지역변수를 2로 바꿔보겠습니다.
def func2():
a = 2 # 지역 변수. func2()에서만 사용
print("a =",a)
func2()
2
func2에서는 이전과 다른 숫자가 출력되게 됩니다.
이번에는 다시 전역변수를 출력해보겠습니다.
def func3():
print("a =",a)
func3()
a = 5
그냥 설정하지 않고 a를 출력하면, 맨 처음 설정했던
5가 반환되게 됩니다.
하지만 전역변수를 바꿀 수도 있습니다.
바로 global 입니다.
def func4():
global a # 함수 내에서 전역 변수 변경을 위해 선언합니다
a = 4 # 전역 변수의 값 변경
print("a =",a)
a는 어떻게 됬을까요? 4로 바뀌었을까요?
func4()
a = 4
좋습니다. 4로 바뀌었죠.
다시 한번 봐볼까요?
a = 5 # a 는 5입니다?
func3() # 함수 func3() 호출
func4() # 함수 func4() 호출
func3() # 함수 func3() 다시 호출
a = 5
a = 4
a = 4
func3에서 5로 바뀌었죠?
하지만 func4에서 4로 바뀌었죠?
BOOM!💥💥💥
다시 func3에서 5가 되었습니다.
차이가 보이시나요?
다시 뒤로 돌아가보겠습니다.
func1() # 함수 func1() 호출
func2() # 함수 func2() 호출
print("전역 변수 a=",a) #전역 변수 출력
a = 1
a = 2
전역 변수 a= 4
func1에서는 따로 설정한 1이 출력되고,
func2에서는 수정한 2가 출력됬죠?
마지막으로 전역변수는 최근에 수정된 4가 출력됩니다.
다음은 함수를 한줄에 모두 표현할 수 있는 람다 함수 입니다.
단거리 경주에서 1등과 꼴등이 같은 공간에 있는 시간이 있을까요?
앞서거나 뒷서거나 하지 않고 한줄로 말이죠.
시작점에선 모두 같은 자리에 서있습니다.
그리고 3,2,1...땅!
람다(lambdda) 함수
아무래도 def 함수를 배운지는 얼마 안됬지만, 좀 더 직관적으로 하고싶어집니다.
더 줄일 수 있을까요?
(lambda <인자>:<인자 활용 수행 코드>(<인자>)
물론이죠. 한줄안에 모든 것을 서술하는 람다 함수의 구조를 보세요
인자가 줄을 띄우고 따로 서술해주지 않아도 한꺼번에 드러납니다.
제곱을 반환하는 함수를 만들어보겠습니다.
(lambda x : x**2) (3)
인수로는 3을 입력했습니다.
9
잘 출력되는 것을 볼 수 있습니다.
람다 함수는 변수에 할당한 후에 인자를 호출해서 사용합니다.
mySquare = lambda x : x**2
mySquare(10)
100
10을 입력한 경우입니다.
다시 5를 입력해보겠습니다.
mySquare(5)
25
다른 경우도 진행해보겠습니다.
e = lambda e : e**5
e(2)
32
람다함수의 변수, 자기 자신이 등장하는 것도 가능합니다!
y = lambda y : y + 3 - y*y
y(3)
-3
여러개의 인자를 받아 사용하는 것도 가능합니다.
mySimpleFunc = lambda x,y,z : 9*x + 7*y + 2*z
mySimpleFunc(1,2,3)
29
자 람다함수까지 확인해보았습니다.
이번엔 몇 가지 유용한 내장 함수들을 알아보겠습니다.
유용한 내장 함수
형 변환 함수
정수형으로 변환하는 방법입니다.
[int(0.123), int(3.51456), int(-1.31234567), int(0.124124125111000)]
[0, 3, -1, 0]
int를 사용하면 소수점 이하는 버려집니다
(반올림이 아니라 아예 소수점 이하를 삭제함)
문자열을 정수형으로 변환할수도 있습니다.
[int('1234'), int('1'),int('-9021')]
[1234, 1, -9021]
자. 성공적으로 바뀌었네요.
정수형은 해보았으니, 이번엔 실수형으로 변환해봅시다.
[float(0), float(123), float(-567.89)]
[0.0, 123.0, -567.89]
문자열을 실수형으로 변환합니다.
[float('10'), float('0.123'), float('-456.89')]
[10.0, 0.123, -456.89]
이번엔 문자형입니다.
[str(123), str(45678), str(-987)]
['123', '45678', '-987']
[str(2+1), str(345.567), str(-5.142)]
['3', '345.567', '-5.142']
좋습니다. 잘 반환되네요.
지금까지는 정수형, 실수형, 문자형을 리스트로 반환했죠?
이번에는 자료형을 변화시키는 방법을 제시해보겠습니다.
모두 리스트, 튜플, 세트형은 기억하셔야 될겁니다.
리스트는 [ ] 로, 튜플은 ( ) 로, 세트는 { } 로 묶이는
각각 다른 자료형이었습니다.
먼저, 데이터 제작 🚗🚗🚗
list_data = ['abc', 1, 2, 2,3,'def']
tuple_data = ('abc',1,2,2,3,'def')
set_data = {'abc',1,2,2,3,'def'} # 세트는 중복을 허용하지 않습니다. 순서가 정해지지 않습니다.
타입 확인
[type(list_data), type(tuple_data), type(set_data)]
[list, tuple, set]
리스트, 튜플, 세트형으로 변환하는 방법은
특별한 것이 없습니다.
각 자료형을 앞에 써주고 ( ) 괄호로 묶어주시면 됩니다.
리스트로 변환합니다.
print("리스트로 변환 : ", list(tuple_data), list(set_data))
리스트로 변환 : ['abc', 1, 2, 2, 3, 'def'] [1, 2, 3, 'def', 'abc']
튜플로 변환합니다.
print("리스트로 변환 : ",tuple(list_data), tuple(set_data))
리스트로 변환 : ('abc', 1, 2, 2, 3, 'def') (1, 2, 3, 'abc', 'def')
세트로 변환하겠습니다.
print("세트로 변환 : ", set(list_data), set(tuple_data))
세트로 변환 : {1, 2, 3, 'abc', 'def'} {1, 2, 3, 'abc', 'def'}
BOOL 함수
참/거짓값을 반환하는 BOOL함수도 있었습니다.
숫자를 인자로 bool 함수 호출합니다.
bool(0) # 인자 : 숫자 0
False
bool(1) # 인자 : 양의 정수
True
bool(-10) # 인자 : 음의 정수
True
bool(5.12) # 인자 : 양의 실수
True
bool(-3.24) # 인자 : 음의 실수
True
먼저, 숫자 0은 false로 반환하고,
그 이외의 양의 정수와 실수, 음의 정수와 실수는
모두 True로 반환합니다.
bool('a') #인자 : 문자열 'a'
True
bool(' ') #인자 : 빈 문자열
True
bool('') #인자 : 문자열 없음
False
이 부분은 아예 문자가 존재하지 않습니다.
bool(None) #인자 : None : "아무겂도 없다(blank)"
False
bool('')
False
문자열의 경우, 문자열이 없거나, None인 경우
False를 반환합니다.
빈 문자열 ' ' 이거나 문자열이 있으면 True를 반환하죠.
리스트, 튜플, 세트를 인자로 bool 함수 호출하는 경우입니다
myFriends = []
bool(myFriends) # 인자 : 항목이 없는 빈 리스트
False
myFriends = ['James', 'Robert', 'Lisa','Mary']
bool(myFriends) # 인자 : 항목이 있는 리스트
True
myplace = ()
bool(myplace) # 인자 : 항목이 없는 빈 튜플
False
myplace = ("dongdaemoon","namsan","DDP")
bool(myplace) # 인자 : 항목이 있는 튜플
True
mysauce = {}
bool(mysauce) # 인자 : 항목이 없는 빈 세트
False
mysauce = {"ketchap","mustard"}
bool(mysauce) # 인자 : 항목이 있는 세트
True
요약하자면 인자가 전혀 없으면 False,
인자가 조금이라도 있으면 True를 반환한다는 점입니다.
모두 공통의 규칙을 갖습니다.
bool 함수의 활용
이러한 성질을 활용해서, if함수와 결합해
True면 주어진 이름을 반환하고, false면
이름이 없다고 반환하는 함수를 제작해보겠습니다.
def print_name(name):
if bool(name):
print("입력된 이름 :",name)
else :
print("이름이 존재하지 않습니다.")
입력한 경우
print_name("토르 오딘슨")
입력된 이름 : 토르 오딘슨
입력하지 않는 경우
print_name('')
이름이 존재하지 않습니다.
이처럼 잘 입력되는 것을 볼 수 있습니다.
이번엔 최대와 최솟값을 구하는 방법입니다.
최솟값과 최댓값을 구하는 함수
myNum = [10, 5, 12, 0, 3, 5.5, 99.5, 42]
[min(myNum), max(myNum)]
[0, 99.5]
min과 max를 사용합니다.
숫자만 되냐구요? 의외로 문자인 알파벳이나
한글도 지원합니다!
myStr = 'zxyabc'
[min(myStr), max(myStr)]
['a', 'z']
튜플과 세트에서 활용합니다.
myNum = (10, 5, 12, 0, 3.5, 99.5, 42)
[min(myNum), max(myStr)]
[0, 'z']
다양한 경우를 볼 수 있습니다.
myNum = {'zbc', '하', '나', 'Bbc'}
[min(myNum), max(myNum)] #대문자>소문자>알파벳>한글 순으로 순서가 결정됩니다
['Bbc', '하']
절대값과 합계를 구하는 함수
절대값, 그래프의 영점에서 그 숫자까지의 거리를
나타내는 말이죠? 즉 양수나 음수를 구분하지 않습니다.
이번엔 실수의 절대값과 합계 함수를 봐보겠습니다.
매우 쉽습니다.
[abs(10), abs(-10)]
[10, 10]
[abs(2.45), abs(-2.45)]
[abs(2.45), abs(-2.45)]
이렇듯, abs를 사용합니다.
합계를 구하는 함수는 엑셀은 물론, 다양한 곳에서
사용하는 sum과 똑같습니다.
sumList = [1,2,3,4,5,6,7,8,9,10]
sum(sumList)
55
응용 버전
sum([abs(10),abs(-10)])
20
항목의 개수를 구하는 함수
이번엔 항목이나 문자열의 갯수를 구하는 함수를
보겠습니다.
len('ab cd') #문자열
len([1,2,3,4,5,6,7,8]) #리스트
len((1,2,3,4,5,6,7,8)) #튜플
len({1:'tom',2:'tim',3:'ho'}) #딕셔너리
자. 문자열은 a,b,c,d 그리고 공백까지 인식합니다.
리스트, 튜플은 항목을 하나하나 세고요.
딕셔너리는 어떻게 될까요?
5
8
8
3
각 value값의 갯수를 반환하게 됩니다.
좋습니다.
마지막으로 지금까지 배워본 것을 모두 활용해서
복잡다단한 내장 함수를 만들어보겠습니다.
내장 함수의 활용
1) 먼저, sum, len 등을 사용하지 않은 경우
scores = [90, 80, 95, 85, 100] # 과목별 시험 점수
score_sum = 0 # 총점 계산을 위한 초깃값 설정
subject_num = 0 # 과목수 계산을 위한 초깃값 설정(평균 구할때 사용)
for score in scores:
score_sum = score_sum + score # 과목별 점수 총합 만들기
subject_num = subject_num + 1 # 과목수 계산
average = score_sum / subject_num # 평균(총점 / 과목수) 구하기
print("총점:{0}, 평균:{1}".format(score_sum,average)) # 정답
총점:450, 평균:90.0
인수명은 따로 설정한 것이고, 실제로 sum이 사용된 것은 아닙니다.
2) 모두 사용했을 경우
독특하게도, 파이썬에는 평균을 구하는 avg나 average와 같은
평균함수가 없다고 합니다. 아마 합계/갯수로 구하는 수리적방법이
있기 때문에 굳이 넣을 이유가 없어진 것 같습니다.
그래서 합계값과 리스트의 갯수(len)를 세고,
이를 나누는 방법으로 진행합니다.
scores = [90, 80, 95, 85, 100]
print("총점 : {0}, 평균:{1}".format(sum(scores),sum(scores)/len(scores)))
총점 : 450, 평균:90.0
잘 나왔습니다👍🥳
이번엔 최하 점수(최솟값), 최고 점수(max)값을 도출해보겠습니다.
print("최하 점수:{0}, 최고 점수:{1}".format(min(scores), max(scores)))
최하 점수:80, 최고 점수:100
이번에도 문제 없군요.
더 다양한 함수의 종류는 파이썬의 공식 홈페이지에서 제공한
파이썬 위키에서 더 많이 찾아볼 수 있답니다!
https://docs.python.org/3/library/functions.html
이상입니다.
다음 시간에는 객체와 클래스의 개념, 여러 메서드에 대해서
확인해보는 시간을 갖겠습니다(빠른 시일 내에 업로드 예정)
다음단계 배우기 : https://astart.tistory.com/14
'Programming Language > Python' 카테고리의 다른 글
파이썬_기초단계 알아보기_ep.8 클래스가 복사가! 된다고! (4) | 2022.12.05 |
---|---|
파이썬_기초단계 알아보기_ep.7 오리눈과 오리눈 집게. 객체&클래스 (2) | 2022.12.03 |
파이썬_기초단계 알아보기_ep.5 역시 수학은 어려워 (0) | 2022.12.02 |
파이썬_기초단계 알아보기_ep.4 인풋이 좋아야 아웃풋이 좋죠! (0) | 2022.12.01 |
파이썬_기초단계 알아보기_ep.3 만나려면 조건이 맞아야지 (0) | 2022.11.23 |