1. 함수
입력값을 가지고 어떤 일을 수행한 수 그 결과물을 내어 놓는 것
함수를 사용하는 이유
- 반복되는 부분이 있을 경우, '반복적으로 사용되는 가치 있는 부분'을 한 뭉치로 묶어 '어떤 입력값을 주었을 때 어떤 결괏값을 리턴해 준다라는 식의 함수로 작성하는 것이다.
1) 구조
def 함수_이름(매개변수) :
수행할_문장1
수행할_문장2
- def는 함수를 만들 때 사용하는 예약어
- 함수 이름은 함수를 만드는 사림이 임의로 만들 수 있음
- 매개변수는 이 함수에 입력으로 전달되는 값을 받는 변수
- 이렇게 함수를 정의한 수 함수에서 수행할 문장을 입력
def add(a, b) :
return a + b
위 함수의 이름은 add고 입력으로 2개의 값을 받으며 리턴값은 2개의 입력값을 더한 값으로 해석할 수 있다.
여기서 return은 함수의 결괏값을 리턴하는 명령어다. add 함수를 사용하는 코드를 본다.
def add(a, b) :
return a + b
a = 3
b = 4
c = add(a, b)
print(c)
add 함수에 a와 b를 입력값으로 넣어주고 변수 c에 add 함수의 리턴값을 대입하면 c의 값을 확인할 수 있다.
2) 매개변수, 인수
- 매개번수(parameter)는 함수에 입력으로 전달된 값을 받은 변수
- 인수(arguments)는 함수를 호출할 때 전달하는 입력값을 의미
3) 입력값, 리턴값에 따는 함수 형태
함수의 형태는 입력값과 리턴값의 존재 유무에 따라 4가지 유형으로 나뉜다.
(1) 일반적인 함수
입력값이 있고 리턴값이 있는 함수
def add(a, b):
result = a + b
return result
- 일반적인 함수는 위에서 했던 것과 같다. 2개의 입력값을 받아 서로 더한 결괏값을 리턴
def add(a, b):
result = a + b
return result
a = add(3, 4)
print(a)
- 입력값과 리턴값이 있는 함수는 "리턴_받을_변수 = 함수_이름(입력_인수1, 입력_인수2)"으로 사용
(2) 입력값이 없는 함수
def say() :
return 'Hi'
- 매개변수를 써야 하는 괄호 안이 비어 있는 함수가 입력값이 없는 함수
def say() :
return 'Hi'
a = say()
print(a)
- 입력값이 없는 함수는 "리턴값을_받을_변수 = 함수_이름()"으로 사용
(3) 리턴값이 없는 함수
def add(a, b):
print(f"{a}, {b}의 합은 {a + b}입니다.")
- 리턴값이 없는 함수는 호출해도 리턴되는 값이 없기 때문에 변수를 사용하지 않는다.
def add(a, b):
print(f"{a}, {b}의 합은 {a + b}입니다.")
add(4, 5)
- 리턴값이 없는 함수는 "함수_이름(입력_인수1, 입력_인수2)"로 사용
문장을 출력했는데 리턴값이 없다는 것을 궁금해 할 수 있다. print 문은 함수의 '수행할_문장'에 해당하는 부분이지 리턴값이 아니다. 리턴값은 오직 return 명령어로만 받을 수 있다.
def add(a, b):
print(f"{a}, {b}의 합은 {a + b}입니다.")
a = add(4, 5)
print(a)
- 위와 같이 코드를 작성하면 a의 값으로 None가 출력
- None은 거짓을 나타내는 자료형
add 함수처럼 리턴값이 없을 때 a = add(4, 5)처럼 쓰면 함수 add는 려턴값으로 a 변수에 None을 리턴한다. None을 리턴한다는 것은 리턴값이 없다는 것이다.
(4) 입력값, 리턴값이 없는 함수
def say() :
prtin('Hi')
- 위 함수를 사용하는 방법은 단 1가지
- "함수_이름()"으로 사용
4) 매개변수 지정
def sub(a, b):
return a - b
a = sub(a = 4, b = 5)
print(a)
b = sub(b = 4, a = 5)
print(b)
- a 변수에서 sub함수의 매개변수로 a = 4, b = 5
- b 변수에서 sub함수의 매매변수로 b = 4, a = 5
매개 변수를 지정하면 순서와 상관없이 사용할 수 있다.
매개변수의 순서가 달라져 전달하는 값이 달라 출력값이 달라진다.
(1) 매개변수 초깃값 설정
def myself(name, age, man = True) :
print(f'이름은 {name}입니다.')
print(f'나이는 {age}입니다.')
if man :
print('남자')
else :
print('여자')
myself('park', 23)
myself('park', 23, True)
myself('park', 23, False)
- 매개변수에 man = True처럼 미리 값을 넣었다.
함수 호출에서 매개변수에서 True가 있는 것과 없는 것이 있다. 출력을 해보면 같은 결과가 나올 것이다.
함수 정의에서 미리 man = True를 정의해 주었기 때문에 True가 없어도 man은 True가 되는 것이다.
False가 들어가면 man = False가 되기 때문에 else 문이 실행 된다.
매개변수에 초깃값을 설정할 때 주의해야 할 것이 있다. 초깃값을 설정한 매개변수의 위지다.
매개변수 초깃값을 설정한 매개변수는 항상 제일 끝에 나와야 한다.
- Python 인터프리터는 매개변수를 순서대로 처리
- 초깃값이 설정되지 않은 매개변수는 뒤쪽에 있는 초깃값이 설정된 매개변수에 의해 값을 할당받을 수 없다.
- 만약 초깃값이 설정된 매개변수가 앞쪽에 나오면, 뒤쪽에 있는 초깃값이 설정되지 않은 매개변수에 값을 할당할 수 없어 오류가 발생
5) 여러 개의 입력값을 받는 함수
*args, **kwargs 사용
(1) *args
def add_many(*args) :
result = 0
for i in args :
result += i
return result
result = add_many(1, 2, 3, 4)
print(result)
- *args를 사용하면 입력값이 몇 개든지 상관없다.
- *args처럼 매개변수 이름 앞에 *을 붙이면 입력값을 전부 모아 튜플로 만든다.
- 위 매개변수 *args는 임의로 정한 변수로 *python, *add 등으로 사용자가 정해 줄 수 있다.
def calcurator(operator, *operand):
if operator == "+":
result = 0
for i in operand:
result += i
return result
if operator == "*":
result = 1
for i in operand:
result *= i
return result
print(calcurator("*", 10, 20, 30))
print(calcurator("+", 10, 20, 30))
- 위 코드는 조건문에서 공부한 코드
매개변수 operator에 어떤 값이 들어오는지에 따라 *operand에 입력되는 모든 값을 코드에 따라 수행 후 값을 리턴한다.
(2) **kwargs(키워드 매개변수)
def print_kwargs(**kwargs) :
print(kwargs)
print_kwargs(a = 1)
print_kwargs(name = 'park', age = 5)
- 키워드 매개변수를 사용할 때는 매개변수 앞에 **를 붙인다.
- 매개변수 kwargs는 딕셔너리가 되어 Key = Value 형태의 입력값이 딕셔너리에 저장된다.
6) 리턴값
리턴값은 언제나 하나
def add_and_sub(a, b):
return a + b, a - b
result = add_and_sub(4, 5)
print(result)
- 리턴값은 언제나 하나다.
- 두 가지로 리턴이 될 때는 튜플값 하나에 (a + b, a - b)로 리턴한다.
위 함수와 같이 사용하기지 않고 리턴값을 나눠서 "return a + b", "return a - b"를 따로 쓴다면 먼저 쓴 return이 실행되고 함수를 빠져나가기 때문에 뒤에 오는 return은 실행되지 않는다.
return을 사용할 때 리턴값이 없이 단독으로 사용하면 함수를 즉시 빠져나갈 수 있다.
7) 함수 안에서 변수의 효력 범위
- 함수 안에서 사용하는 매개변수는 함수 안에서만 사용하는 '함수만의 변수'
- 함수 밖의 같은 이름을 가진 변수와는 전혀 상관없다.
a = 1
def test(a) :
a += 1
return a
print(test(a))
print(a)
- test(a)는 2 출력
- print(a)는 1 출력
위 코드에서 보듯이 함수에서 사용한 a는 함수 위에 정의된 a 변수의 값인 1을 더해서 2가 출력되는 것이다.
8) 함수 밖의 변수 변경
a = 1
def test(a) :
a += 1
return a
a = test(a)
print(a)
test 함수 매개변수로 쓴 a를 리턴 받아 함수 밖에 나와서 a 변수에 대입하면 리턴값이 함수 밖의 a 변수에 저장된다.
(1) global 명령어
a = 1
def test() :
global a
a += 1
test()
print(a)
- global a 문장은 함수 안에서 함수 밖의 a 변수를 직접 사용하는 것이다.
- global 명령어는 사용하지 않는 것이 좋다.
- 함수는 독립적으로 존재하는 것이 좋기 때문에 외부 변수에 종속적인 함수는 좋은 함수가 아니다.
9) lambda
함수를 생성할 때 사용하는 예약어
- def와 동일한 역할
- 함수를 한 줄로 간단하게 만들 때 사용
- def를 사용할 정도로 복잡하지 않거나 def를 사용할 수 없는 곳에서 사용
- "함수_이름 = lambda 매개변수1, 매개변수2 : 매개변수를_이용한_표현식"으로 사용
- lambda로 만든 함수는 return 명령어가 없어도 표현식의 결괏값을 리턴
add = lambda a, b : a + b
result = add(3, 4)
print(result)
2. 파일
파일을 통한 입출력
1) 파일 생성
f = open("new.txt", 'w')
f.close()
- "파일_객체 = open(파일_이름, 파일_열기_모드)"로 사용
- open() 함수는 '파일 이름', '파일 열기 모드'를 입력값으로 받고 결괏값으로 파일 객체를 리턴
파일 일기 모드 | 설명 |
r | 읽기 모드 : 파일을 읽기만 할 때 사용 |
w | 쓰기 모드 : 파일에 내용을 쓸 때 사용 |
a | 추가 모드 : 파일의 미지막에 새로운 내용을 추가할 때 사용 |
- 읽기 모드는 파일이 존재하지 않으면 오류가 난다.
- 쓰기 모드는 파일이 없으면 새로 만들고 파일이 있으면 덮어쓰기 한다.
- 추가 모드는 파일이 없으면 만들고 파일이 있으면 내용을 이어서 쓴다.
f = open("C:/new.txt", 'w')
f.close()
- C:/ 디렉터리에 new.txt를 생성하는 코드
- f.close()는 열려 있는 파일 객체를 닫아 주는 역할
파이썬은 프로그램이 열려 있는 파일의 객체를 프로그램을 종료할 때 자동으로 닫아주기 때문에 close()를 하지 않아도 된다. 하지만 close()를 사용해서 열려 있는 파일을 직접 닫아 주는 것이 좋다.
쓰기 모드로 열었던 파일을 닫지 않고 디시 시용하려고 하면 오류가 발생하기 때문이다.
2) 파일 쓰기 모드
f = open("C:/python/new.txt", 'w')
for i in range(1, 11):
date = f"{i}번째 줄입니다.\n"
f.write(date)
f.close()
- 위 경로에 new.txt 파일이 생성되고 date의 문자열이 쓰인다.
3) 파일 읽는 방법
(1) readline 함수
f = open("C:/python/new.txt", 'r')
line = f.readline()
print(line)
f.close()
- 파일의 첫 번째 줄을 읽어 출력하는 함수
readline()로 모든 줄 읽기
f = open("C:/python/new.txt", 'r')
while True :
line = f.readline()
line = line.strip()
if not line: break
print(line)
f.close()
- 무한 루프를 통해 더 이상 읽을 줄이 없으면 break를 수행한다.
(2) readlines 함수
f = open("C:/python/new.txt", 'r')
lines = f.readlines()
for line in lines :
line = line.strip()
print(line)
f.close()
- 파일의 모든 줄을 읽어서 각각의 줄을 요소로 가지는 리스트를 리턴하는 함수
(3) read 함수
f = open("C:/python/new.txt", 'r')
data = f.read()
print(data)
f.close()
- 파일의 내용전체를 문자열로 리턴하는 함수
(4) for 문
f = open("C:/python/new.txt", 'r')
for line in f:
line = line.strip()
print(line)
f.close()
- for 문을 사용하여 파일을 줄 단위로 읽을 수 있다.
4) 새로운 내용 추가
date = f"{i}번째 줄입니다.\n"
f.write(date)
f.close()
- 추가 모드인 'a'로 옵션을 주고 입력한다.
5) with 문
with open("abc.txt", "w") as f :
f.write("with 문을 사용했습니다.")
- with 문을 사용하면 with 블록을 벗어나는 순간, 열린 파일 객체 f가 자동으로 닫힌다.
파일을 열면 항상 닫아 주어야 한다. with 문은 열린 파일 객체를 닫아주기 때문에 close를 사용하지 않아도 된다.
3. 프로그램 입출력
명령어 [인수 1 인수 2]
1) sys 모듈
- 파이썬에서는 sys 모듈을 사용하여 프로그램에 인수를 전달할 수 있다.
- sys 모듈을 사용하려면 import sys 해야 한다.
import sys
args = sys.argv[1:]
for i in args :
print(i)
- 프로그램 실행 시 전달받은 인수를 for 문을 사용해 차례대로 하나씩 출력
- argv는 프로그램 실행 시 전달된 인수를 의미
argv[0]은 파일 이름이 되고, argv[1]부터 뒤에 따라오는 인수가 차례대로 argv의 요소가 된다.
'SK Shieldus Rookies 19th > 인프라 활용을 위한 파이썬' 카테고리의 다른 글
[SK shieldus Rookies 19기][Python] - 클래스, 모듈, 패키지, 오류 처리 (7) | 2024.03.18 |
---|---|
[SK shieldus Rookies 19기][Python] - 실습 2 (0) | 2024.03.17 |
[SK shieldus Rookies 19기][Python] - 실습 1 (2) | 2024.03.17 |
[SK shieldus Rookies 19기][Python] - 조건문, 반복문 (2) | 2024.03.14 |
[SK shieldus Rookies 19기][Python] - 자료형 4 (0) | 2024.03.14 |
댓글