1. 함수
믹서에 과일을 넣는다. 그리고 믹서를 사용해서 과일을 갈아 과일 주스를 만든다.
=> 입력 : 믹서에 넣는 과일
=> 함수 : 믹서
=> 출력(결과값) : 과일 주스
단, 프로그래밍에서는 입력과 출력이 없을 수 있습니다.
1-1. 함수를 사용하는 이유는 무엇일까?
- 반복적으로 사용하는 가치 있는 부분 => 어떤 입력값을 주었을 때 어떤 결과값을 돌려준다라는 식의 함수로 작성하는 것이 현명
- 자신이 작성한 프로그램을 기능 단위의 함수로 분리해 놓으면 프로그램 흐름을 쉽게 볼 수 있습니다.
1-2. 파이썬 함수의 구조
def 함수명 (매개변수):
<수행할 문장1>
<수행할 문장2>
return 리턴 값
- def : 함수를 만들 때 사용되는 예약어
- 매개변수 : input 값
- 수행할 문장 : function
- return 값 : output
# 함수의 기본 구조
def add(a, b): # 정의만 한 것
return a + b
print(add(1, 2)) # 3
1-3. 매개변수와 인수
- 매개변수(parameter) : 함수에서 정의되어 사용되는 변수 (= 인자, 파라미터)
- 인수(arguments) : 함수를 호출할 때 건네주는 변수
def add(a, b): # a, b는 매개변수
return a + b
print(add(3, 4)) # 3, 4는 인수
1-4. 입력값과 리턴값에 따른 함수의 형태
총 4가지 유형이 존재합니다.
1. 일반적인 함수
- 입력값이 있고 리턴값이 있는 함수
- 리턴값을 받을 변수 = 함수 이름(입력 인수1, 입력 인수2, ...)
def 함수 이름(매개변수):
<수행할 문장>
...
return 리턴 값
# 일반적인 함수
def add(a, b):
result = a + b
return result
print(add(3, 4)) # 7
2. 입력 값이 없는 함수
- 매개변수 부분을 나타내는 함수 이름 뒤의 괄호 안이 비어있는 경우
- 리턴 값을 받을 변수 = 함수 이름()
def 함수 이름():
<수행할 문장>
...
return 리턴 값
# 입력값이 없는 함수
def say():
return 'Hi'
a = say()
print(a) # Hi
3. 리턴 값이 없는 함수
- 함수 이름(입력 인수1, 입력 인수2, ...)
- add 함수처럼 리턴 값이 없을 때 a = add(3, 4)처럼 쓰면 함수 add는 리턴 값으로 a 변수에 None을 리턴합니다.
- 즉, None을 리턴한다는 것은 리턴값이 없다는 것입니다.
- 결과 값이 나오는 이유는 print로서 출력이 된 것일 뿐입니다.
def add(a, b):
print(f"{a}, {b}의 합은 {a+b}입니다.")
a = add(1, 2)
print(a)
# 리턴 값이 없는 함수
def add(a, b):
print(f"{a}, {b}의 합은 {a+b}입니다.") # 1, 2의 합은 3입니다.
a = add(1, 2)
print(a) # None
4. 입력 값도 리턴 값도 없는 함수
- 매개변수도 없고 return문도 없는 경우
- 함수 이름()
# 입력 값도 리턴 값도 없는 함수
def say():
print('Hi') # Hi
a = say()
print(a) # None
1-5. 매개변수 지정하여 호출하기
- 매개변수 지정하여 호출하면 순서에 상관없이 사용할 수 있습니다.
# 매개변수 지정하여 호출하기
def sub(a, b):
return a - b
# a = sub(3, 1)
result = sub(a=7, b=3) # 처럼 지정해도 가능
print(result) # 4
1-6. 입력 값이 몇 개가 될지 모를 때는 어떻게 해야 할까?
def 함수 이름(*매개변수):
<수행할 문장>
...
여러 개의 입력값을 받는 함수 만들기
- 매개변수 이름 앞에 * 을 붙이면 입력값을 전부 모아서 튜플로 만들어주기 때문에 입력값이 몇 개이든 상관없습니다.
# 여러 개의 입력값을 모두 더하는 함수
def add_many(*args): # arguments의 약자
result = 0
for i in args:
result = result + i
return result
print(add_many(1, 2, 3, 4, 5)) # 15
# 여러 개의 입력값에 여러 개의 매개변수를 사용하는 함수
def add_mul(choice, *args): # choice는 한 개의 값, args는 튜플로
if choice == "add": # 매개변수 choice에 "add"를 입력받았을 때
result = 0
for i in args:
result = result + i
elif choice == "mul": # 매개변수 choice에 "mul"을 입력받았을 때
result = 1
for i in args:
result = result * i
return result
result = add_mul("mul", 1,2,3,4)
print(result) # 24
1-7. 키워드 매개변수 kwargs
딕셔너리 형태로 받는 매개변수입니다.
- 매개변수 앞에 ** 를 붙입니다.
- **kwargs 처럼 매개변수 이름 앞에 ** 을 붙이면 매개변수 kwargs는 딕셔너리가 되고 모든 key=value 형태의 입력 값이 그 딕셔너리에 저장된다는 것을 알 수 있습니다.
# kwargs
def print_kwargs(**kwargs): # keyworkd arguments의 약자
print(kwargs)
print(kwargs['a'])
print_kwargs(a=1, b=2) # 딕셔너리 형태로 출력
# {'a':1, 'b':2}
# 1
1-8. 함수의 리턴값은 언제나 하나이다
함수는 return문을 만나는 순간 결과값을 돌려준 다음 함수를 빠져나가게 됩니다.
# 함수의 리턴값은 언제나 하나이다
def add_and_mul(a,b):
return a+b, a*b # 이는 튜플로서 하나의 return이다.
print(add_and_mul(3,4)) # (7, 12)
# 함수의 리턴값은 언제나 하나이다_2
def add_and_mul(a,b):
return a + b
return a * b
print(add_and_mul(3,4)) # 7
1-9. return의 또 다른 쓰임새
특별한 상황일 때 함수를 빠져나가고 싶다면 return을 단독으로 써서 함수를 즉시 빠져나갈 수 있습니다.
- 반복문의 break처럼 사용합니다.
# return의 또 다른 쓰임새
def say_nick(nick):
if nick == "바보":
return
print(f"나의 별명은 {nick}입니다.")
say_nick("강지현") # 나의 별명은 강지현입니다.
say_nick("깡지") # 나의 별명은 깡지입니다.
say_nick("바보")
1-10. 매개변수에 초기값 미리 설정하기
def say_myself(name, age, man=True):
- say_myself 함수는 3개의 매개변수를 받아서 마지막 인수인 man이 True이면 "남자입니다.", False이면 "여자입니다."를 출력합니다.
- man의 기본값은 True여서 True인 경우는 안 써줘도 가능합니다.
- 초기화시키고 싶은 매개변수는 항상 뒤쪽에 놓아야 합니다.
# 매개변수에 초기값 미리 설정하기
def say_myself(name, age, man=True):
print(f"나의 이름은 {name}입니다.") # 나의 이름은 강지현입니다.
print(f"나이는 {age}살 입니다.") # 나이는 25살 입니다.
if man:
print("남자입니다.")
else:
print("여자입니다.") # 여자입니다.
say_myself("강지현", 25, False)
1-11. 함수 안에서 선언한 변수의 효력 범위
- 함수 안에서 사용하는 매개변수는 함수 안에서만 사용하는 "함수만의 변수" 입니다.
- 함수 밖의 변수는 함수 내부의 변수와 전혀 상관이 없다는 의미입니다.
- 지역 변수 : 함수 내부의 함수
- 함수가 끝나면 지역 변수는 없어집니다.
- 전역 변수 : 함수 외부의 변수
def vartest(a):
a += 1
vartest(3)
print(a)
- 위 코드에서 print(a)에서 사용하는 a 변수를 어디에서도 찾을 수 없기 때문에 오류가 발생합니다.
- 함수 안에서 선언한 매개변수는 함수 안에서만 사용될 뿐 함수 밖에서는 사용되지 않습니다.
# 함수 안에서 사용할 변수의 이름을 함수 밖에서 사용한다면?
a = 1
def vartest(a):
a += 1
vartest(a)
print(a) # 1
1-12. 함수 안에서 함수 밖의 변수를 변경하는 방법
1. return 사용하기
a = 1
def vartest(a):
a += 1
return a
a = vartest(a)
print(a)
- vartest 함수는 입력으로 들어온 값에 1을 더한 값을 리턴합니다.
- a = vartest(a) 라고 작성하면 a에는 vartest 함수의 리턴 값이 대입됩니다.
# return 사용하기
a = 1
def vartest(a):
a += 1
return a
a = vartest(a)
print(a) # 2
2. global 명령어 사용하기
- global a : 함수 안에서 함수 밖의 a 변수를 직접 사용하겠다는 의미
- 함수는 독립적으로 사용하는 것이 좋기 때문에 global 명령어를 추천하지 않습니다.
# global 명령어 사용하기
a = 1
def vartest():
global a
a += 1
vartest()
print(a) # 2
1-13. lambda 예약어
lambda : 함수를 생성할 때 사용하는 예약어로 def와 동일한 역할
- 함수를 한 줄로 간결하게 만들 때 사용합니다.
- 함수명이 없어도 가능
함수명 = lambda 매개변수1, 매개변수2, ...
# 전역변수가 mutable한 경우
b = [1, 2, 3]
def vartest2(b):
b = b.append(4) # b 자체가 바뀐 것임 (mutable)
vartest2(b)
print(b) # [1, 2, 3, 4]
# lambda 예약어
add = lambda a, b: a + b
result = add(3, 4)
print(result) # 7
2. 사용자 입력과 출력
2-1. 사용자 입력
- input 사용하기
- input은 사용자가 키보드로 입력한 모든 것을 문자열로 저장합니다.
# input 사용하기
a = input()
print("내가 입력한 것 :" + a)
# jioni
# 내가 입력한 것 : jioni
- 프롬프트를 띄워서 사용자 입력 받기
- input()의 괄호 안에 안내문구를 입력하여 프롬프트를 띄워주면 됩니다.
# 프롬프트를 띄워서 사용자 입력받기
number = input("숫자를 입력하세요 : ")
print(number)
# 숫자를 입력하세요 : 7
# 7
input은 입력되는 모든 것을 문자열로 취급하기 때문에 number는 숫자가 아닌 문자열임을 인지하자!!
2-2. print 자세히 알기
- 큰따옴표(")로 둘러싸인 문자열은 +연산과 동일합니다.
# 큰따옴표("")로 둘러싸인 문자열은 +연산과 동일하다.
print("Life " "is " "too short") # 1번
print("Life " + "is " + "too short") # 2번
# Life is too short
# Life is too short
- 문자열 띄어쓰기는 콤마로 합니다.
# 문자열 띄어쓰기는 콤마로 한다.
print("Life", "is", "too short") # Life is too short
- 한 줄로 결과값 출력합니다.
- end 매개변수의 초기값은 줄바꿈 문자입니다.
# 한 줄에 결과값 출력하기
for i in range(10):
print(i, end=" ")
# 0 1 2 3 4 5 6 7 8 9
3. 파일 읽고 쓰기
3-1. 파일 생성하기
- 파일을 생성하기 위해 파이썬 내장 함수 open을 사용합니다.
- 파일 객체 = open(파일 이름, 파일 열기 모드)
- 파일 열기 모드
- r : 읽기 모드 - 파일을 읽기만 할 때 사용
- w : 쓰기 모드 - 파일에 내용을 쓸 때 사용
- 쓰기 모드로 열면 해당 파일이 이미 존재할 경우 원래 있던 내용이 모두 사라지고, 해당 파일이 존재하지 않으면 새로운 파일이 생성됩니다.
- a : 추가 모드 - 파일의 마지막에 새로운 내용을 추가시킬 때 사용
- 파일 열기 모드
파일 경로와 슬래시(/)
- 만일 역슬래시(\)를 사용한다면 역슬래시를 2개 사용하거나 문자열 앞에 r 문자를 덧붙여 사용해야 합니다.
- 왜냐하면 \n 과 같은 이스케이프 문자가 있으면 의도했던 파일 경로와 달라질 수 있기 때문입니다.
# 파일 생성하기_상대경로
f = open("새파일.txt", 'w')
f.close()
3-2. 파일을 쓰기 모드로 열어 내용 쓰기
파일에 데이터를 적는 방법입니다.
f = open("C:/doit/새파일.txt", 'w')
for i in range(1, 11):
data = f"{i}번째 줄입니다.\n"
f.write(data)
f.close()
- print함수 대신 파일 객체 f의 write 함수를 사용합니다.
- 만일 해당 파일을 열었는데 숫자는 올바르지만 문자가 깨져 있는 경우, 인코딩이 깨진 것입니다.
- 한글이 안 깨지게 하기 위해서 f = open("새파일.txt", 'w'. encoding="UTF-8")로 코드를 작성해야 합니다.
# 파일을 쓰기 모드로 열어 내용 쓰기_절대경로
f = open("C:/doit/새파일.txt", 'w')
for i in range(1, 11):
data = f"{i}번째 줄입니다.\n"
f.write(data)
f.close()
# 현재 C에 doit 폴더가 없기 때문에 오류가 발생
3-3. 파일을 읽는 여러가지 방법
1. readline 함수 이용하기
f = open("C:/doit/새파일.txt", 'r')
line = f.readline()
print(line)
f.close()
- r : 읽기 모드로 연 것
- readline() : 첫 번째 줄을 읽는다.
- 여러 줄을 읽고자 할 때는 while문을 이용하고 더 이상 읽을 줄이 없으면 break
# readline 함수 이용하기
f = open("C:/doit/새파일.txt", 'r')
line = f.readline()
print(line)
f.close()
# readline 함수 이용하기_여러 줄 읽기
f = open("C:/doit/새파일.txt", 'r')
while True:
line = f.readline()
if not line: break
print(line)
f.close()
2. readlines 함수 사용하기
- readlines 함수 : 파일의 모든 줄을 읽어서 각각의 줄을 요소로 갖는 리스트를 리턴
줄 바꿈 문자 제거하기
- line = line.strip() 을 사용하면 됩니다.
# readlines 함수 사용하기
f = open("C:/doit/새파일.txt", 'r')
lines = f.readlines()
for line in lines:
line = line.strip() # 줄 끝의 줄 바꿈 문자를 제거한다.
print(line)
f.close()
3. read 함수 사용하기
- f.read() : 파일의 내용 전체를 문자열로 리턴합니다.
# read 함수 사용하기
f = open("C:/doit/새파일.txt", 'r')
data = f.read()
print(data)
f.close()
4. 파일 객체를 for문과 함께 사용하기
# 파일 객체를 for문과 함께 사용하기
f = open("C:/doit/새파일.txt", 'r')
for line in f:
print(line)
f.close()
3-4. 파일에 새로운 내용 추가하기
a 모드 : 추가 모드 (append로 생각하자)
- with문과 함께 사용하기
- 파일을 open하면 항상 close를 해주어야 합니다.
- with문이 열고 닫는 것을 자동으로 처리해줍니다.
- with문을 사용하면 with 블록(with문에 속해있는 문장)을 벗어나는 순간 열린 파일 객체 f가 자동으로 close됩니다.
# 파일에 새로운 내용 추가하기
f = open("C:/doit/새파일.txt", 'a')
for i in range(11, 20):
data = f"{i}번째 줄입니다.\n"
f.write(data)
f.close()
# with문과 함께 사용하기
with open("foo.txt", "w") as f:
f.write("Life is too short, you need python")
4. 프로그램의 입력과 출력
type 명령어 : 바로 뒤에 적힌 파일 이름을 인수로 받아 해당 파일의 내용을 출력해주는 명령어
- 명령어[인수1인수2...]
4-1. sys 모듈 사용하기
외부 모듈을 가져와서 사용하는 것입니다.
- sys 모듈의 argv는 프로그램 실행 시 전달된 인수를 의미
- sys1.py aaa bbb ccc
- sys1.py : argv[0]
- aaa : argv[1]
- bbb : argv[2]
- ccc : argv[3]
# sys 모듈 사용하기
import sys
args = sys.argv[1:]
for i in args:
print(i)
# sys 모듈 사용하기_2
import sys
args = sys.argv[1:]
for i in args:
print(i.upper(), end=" ")
반응형
'Study > Python' 카테고리의 다른 글
[Jump-to-Python] 제어문 (1) | 2024.12.23 |
---|---|
[Jump-to-Python] 자료형 (0) | 2024.12.22 |