Study/CODE 3기 [Jump to python]

[5조 C5DE] Python Study #3

김세언 2024. 3. 25. 07:28

C5DE_퀴즈_3주차.ipynb
0.00MB

3주차 퀴즈 4문제 답안 업로드

💙 팀원: 김세언 박준현 박지호 소정인 인시환

작성자 : 박준현
날짜 : 03/25
범위 : 4-1 함수

 

함수란 ?

 

우리가 지금까지 배운 함수를 생각해보자.

f(x) = 2x + 9꼴을 생각할 수 있다. 이때 우리는 f(x)를 '함수'라고 칭한다.

함수는 일종의 자판기라고 생각할 수 있다.

어떤 값(입력값)을 입력함에 따라 출력값은 달라진다. 수학에서 보통 입력값은 x, 출력값은 y로 표현된다.

 

그렇다면 함수를 이용하면 어떤 점이 좋을까?

앞에서 본 함수를 다시 가져와보자. 우리가 만약 x라는 숫자에 대입했을 때 2x+9를 출력하고 싶을 때, 한 번만 입력하면 될 때에는 그저 2x+9라고 써도 무방할 것이다. 하지만 우리가 2x+9라는 식을 반복해서 사용하고 싶을 때

매번 식을 쓰는 것을 매우 비효율적이다. 이때 함수는 진가를 발휘한다.

 

f(x) = 2x + 9라고 정의한다면, 이제 2x+9가 필요할 때 f(x)를 대신 사용하면 될 것이다. 

 

파이썬의 미학은 간결함이다. 이러한 파이썬 체계에서 함수는 가장 빛나는 한 줄이 될 것이다.

 

 

함수의 구조

 

함수의 구조는 다음과 같다.

>>> def 함수이름(매개변수):
	수행할 문장1
        수행할 문장2
        return 리턴값

 

a와 b를 입력하면 더한 값을 출력해주는 add함수를 만들어보자.

>>> def add(a, b):
 	return a + b

위의 정의된 함수를 설명하면, add는 함수의 이름이고, (a, b)는 함수를 수행하는 과정에서 사용할 매개변수이다. 

그리고 return 값 다음에 나오는 a + b는 함수의 출력값이다. 

이 함수를 활용해보자

>>> print(add(3, 4))
7

 

add(3, 4)라고 함수를 선언하자마자 매개변수 a, b는 자동으로 3, 4가 대입된다.

그리고 add(3, 4)는 7이라는 출력값으로 선언된다. 즉 add(3, 4) = 7이 되는 것이다.

 

함수의 종류

 

1. 일반적인 구조 (입력값O, 출력값O)

 

함수의 일반적인 구조는 방금 add함수의 형태와 같다. add(a, b)처럼 매개 변수에 대입되는 값이 입력값이고 함수를 정의하는 과정에서 return 다음에 나오는 값이 출력값이다.

 

 

2. 입력값이 없는 구조 (입력값X, 출력값O)

 

입력값이 없는 구조는 곧 매개변수가 없는 구조이다. 예를 들어보자

>>> def say():
	return 'Hi"

 

위에 나온 say함수는 입력값을 따로 입력할 필요없이, return값이 하나로 정해진 형태이다.

 

 

3. 출력값이 없는 구조 (입력값O, 출력값X)

 

출력값이 없는 구조도 예를 통해 알아보자

>>> def add(a, b):
	print('두 값의 합은 %d입니다.' % a+b)
    
>>> add(3, 4)
두 값의 합은 7입니다.

위의 함수에서 return 값은 존재하지 않는다. 간혹 print를 통해 출력되는 값이 return값이 아닌가? 라고 궁금할 수 있다.

하지만 이때 print문은 add함수의 수행할 문장 중 하나이고, return값으로 함수가 끝맺음지어지지 않았기에 이 함수에서 출력값은 존재하지 않는다. 

>>> a = add(3, 4)
>>> a
두 값의 합은 7입니다.

>>> print(a)
None

 

위의 예시처럼 그냥 add(3, 4)를 친다면 print값이 출력되지만, a에 add함수를 선언한 후 print(a)를 통해 a함수의 출력값을 

print한다면, 출력값은 존재하지 않기에 파이썬에서 거짓을 의미하는 None이 출력된다.

 

 

4. 둘 다 없는 구조 (입력값X, 출력값X)

둘 다 없는 구조의 함수도 알아보자.

>>>def say():
	print('안녕하세요.')
    
>>>a = say()
>>>a
안녕하세요.

위의 예시에서 정의한 say는 입력값이 없는 동시에, 출력값도 없다.

여기서 print이후에 나오는 값이 출력값이 아닌 이유는 앞에서 설명한 바 있다.

따라서 a의 출력 값을 출력하는 print함수를 사용한다면

>>>print(a)
None

 

처럼 False를 뜻하는 None이 출력되게 된다.


고등학교 때 배운 함수의 개념을 끌고 와 그때 열심히 배워두길 잘했다고 생각했다. 출력값이 있는 함수와 없는 함수의 구별이 중요한 것 같다.

 

 

작성자 : 소정인
날짜 : 03/24
범위 : 4-1.함수
 

입력값이 몇 개가 될지 모를 때는 어떻게 해야 할까?

 
def 함수_이름(*매개변수):
      수행할_문장
 
일반적으로 볼 수 있는 함수 형태에서 괄호 안의 매개변수 부분이 *매개변수로 바뀌었다.
 

위에서 만든 add_many 함수는 입력값이 몇 개이든 상관없다. *args처럼 매개변수 이름 앞에 *을 붙이면, 입력값을 전부 모아 튜플로 만들어 주기 때문이다. 만약 add_many(1,2,3)처럼 이 함수를 쓰면 args는 (1,2,3)이 된다.

cf.여기에서 *args는 임의로 정한 변수 이름이다.
 

여러개의 입력을 처리할 때 def add_many(*args)처럼 함수의 매개변수로 *args 하나만 사용할 수 있는 것은 아니다. 다음 예를 살펴보자.
 

 add_mul 함수는 여러 개의 입력값을 의미하는 *args 매개변수 앞에  choice 매개변수가 추가되어 있다. 
매개변수에 choice에 'add'가 입력된 경우 *args에 입력되는 모든 값을 더해서 리턴하고, 'mul'이 입력된 경우 *args에 입력되는 모든 값을 곱해 리턴한다. 
 

키워드 매개변수, kwargs

키워드 매개변수를 사용할 때는 매개변수 앞에 별 2개(**)를 붙인다. 

즉, 매개변수 이름 앞에 **을 붙이면 매개변수 ooo는 딕셔너리가 되고 모든 Key=Value 형태의 입력값이 그 딕셔너리에 저장된다는 것을 알 수 있다.
 

함수의 리턴값은 언제나 하나이다.
매개변수에 초깃값 미리 설정하기

위 함수를 보면 매개변수가 name, age, woman=True 이다. man=True는 바로 함수의 매개변수에 초깃값을 설정한 것이다. woman이라는 변수에는 입력값을 주지 않았지만, woman은 초깃값 True를 갖게 된다. 주의할 점은 초기화하고 싶은 매개변수는 항상 뒤쪽에 놓아야 한다는 것이다.
 

함수 안에서 선언한 변수의 효력 범위

 

 

vartest 함수에서 매개변수 a의 값에 1을 더했으므로 2가 출력될 것 같지만, 프로그램 소스를 작성해서 실행해보면 결괏값은 1이 나온다. 그 이유는 함수 안에서 사용하는 매개변수는 함수 안에서만 사용하는 '함수만의 변수' 이기 때문이다. 즉, def vartest(a)에서 입력값을 전달받는 매개변수 a는 함수 안에서만 사용하는 변수일 뿐, 함수 밖의 변수 a와는 전혀 상관없다는 뜻이다.

 

 
 

위 함수에서 vartest(3)을 수행하면 vartest 함수 안에서 a는 4가 되지만, 함수를 호출하고 난 후 print(a) 문장은 오류가 발생하게 된다. 그 이유는 print(a)에서 사용한 a 변수는 어디에도 선언되지 않았기 때문이다. 다시 한번 말하지만, 함수 안에서 선언한 매개변수는 함수 안에서만 사용될 뿐, 함수 밖에서는 사용되지 않는다. 이것을 이해하는 것은 매우 중요하다.

그렇다면 vartest라는 함수를 사용해서 함수 밖의 변수 a를 1만큼 증가할 수 있는 방법은 없을까? 이 질문에는 2가지 해결 방법이 있다.

1.return 사용하기 : vartest 함수는 입력으로 들어온 값에 1을 더한 값을 리턴하도록 변경했다. 따라서 a = vartest(a)라고 작성하면 a에는 vartest 함수의 리턴값이 대입된다. 여기서도 물론 vartest 함수 안의 a 매개변수는 함수 밖의 a와는 다른 것이다.

2.global 명령어 사용하기 : vartest 함수 안의 global a 문장은 함수 안에서 함수 밖의 a변수를 직접 사용하겠다는 뜻이다. 하지만 프로그래밍을 할 때 global 명령어는 사용하지 않는 것이 좋다. 함수는 독립적으로 존재하는 것이 좋기 때문이다. 외부 변수에 종속적인 함수는 그다지 좋은 함수가 아니다. 따라서 됟록 global 명령어를 사용하는 이 방법은 피하고 첫번째 방법을 사용하기를 권한다.

 

lambda 예약어

lambda는 def와 동일한 역할을 한다.
04-3 파이썬 읽고 쓰기
작성자 : 김세언
우리는 파일을 통해 값을 입력받고, 출력받을 수 있다. 
1) 파일을 새로 만들고, 2) 프로그램이 만든 결괏값을 새 파일에 기록해야 한다.
3) 또, 파일에 적은 내용을 읽고, 4) 새로운 내용을 추가해야 한다!
1) 파일 생성하기

f = open("새 파일.txt", 'w')
f.close

 open 내장 함수를 사용했다!

입력값으로 파일 이름과 파일 열기 모드를 입력 받는다.
파일 열기 모드에는 r, w, a가 있고 각각 읽고/쓰고/추가하는 기능을 담당한다.
위와 같이 쓰기 모드로 읽는 경우, 원래 내용을 모두 지우고 새로 쓴다는 뜻이다.
여기까지 파일을 쓰기 모드로 읽었다.
 
2) 파일을 쓰기 모드로 열어 내용 쓰기
이제는 문자열 데이터를 파일에 직접 써보자.
 

f = open("C:/doit/새 파일.txt", 'w')
# /를 이용해 파일의 경로를 표시하기
 for i in range(1, 11):
# for 반복문을 이용했다. i 자리에 1부터 10까지 차례대로 대입한다.
 data = "%d번째 줄입니다.\n" % i
# 문자열 포맷팅을 이용해, 각 줄이 넘어갈 떄마다 줄 수를 하나씩 늘려간다.
 f.write(data)
# data 라는 변수에 담은 내용을 파일에 실제로 작성한다
 f.close()

 
3) 파일을 읽기
하나는 readline 함수를 사용하는 방법, 하나는 readlines 함수를 사용하는 방법이다.
readline 함수
readline 함수는 파일에 한 줄을 읽기 때문에, 모든 줄을 읽어 화면에 출력하고 싶다면?
예전에 학습했던 반복문을 이용하면 된다. ex) while true
 

f = open("C:/doit/새 파일.txt", 'r')
 line = f.readline()
 print(line)
 f.close()

readlines 함수
readlines 함수는 파일의 모든줄을 읽어서 각각의 줄을 요소로 가지는 리스트를 리턴한다.
모든 줄을 읽어 화면에 출력하고 싶다면? 여기서도 반복문을 이용해 리스트에 있는 각 요소들, 그러니까 한 줄씩 출력하면 되는 것이다.

 f = open("C:/doit/새 파일.txt", 'r')
 lines = f.readlines()
 for line in lines:
 print(line)
 f.close()

 
read 함수
f.read는 파일의 내용 전체를 문자열로 리턴하기에 보다 간편하게 읽을 수 있다.

f = open("C:/doit/새 파일.txt", 'r')
 data = f.read()
 print(data)
 f.close()

 
 
4) 파일에 새로운 내용 추가하기
쓰기모드로 파일을 열때 이미 존재하는 파일을 열면 그 파일의 내용이 모두 사라지게 된다. 원래 있던 값을 유지하면서 단지 새로운 값만 추가해야 할 경우, 파일을 추가모드 (‘a’) 로 열면 된다.
 

 f = open("C:/doit/새 파일.txt",'a')
 # 파일을 쓰기 모드가 아닌 추가 모드로 읽었다!
 # 즉, 원래 내용을 그대로 두고 원하는 내용만 덧붙인다.
 for i in range(11, 20):
 # 반복문 돌기
 data = "%d번째 줄입니다.\n" % i
 f.write(data)
 f.close()

 


 
작성자 : 인시환
날짜 : 03/25
범위 : 04-2 사용자 입출력
input()

사용자로부터 값을 입력받고 싶을 때에는 어떤 방법을 사용해야할까?

input()을 사용하여 사용자로부터 값을 입력받을 수 있다.

다음의 예시를 살펴보자. 


>>> a = input()
경희대학교 빅데이터응용학과
>>> print(a)
경희대학교 빅데이터응용학과


여기서 주의할 점이 있다. 여기서 입력받은 값은 "문자열"로 반환된다.



>>> type(a)
<class 'str'>



만약 문구를 출력하며 값을 입력받고 싶다면 input("문구")를 활용하면 된다. 


>>> a = input("전화번호를 입력해주세요: ")
전화번호를 입력해주세요: 01000000000
>>> print(a)
01000000000




print()

이제 print 함수에 대해 알아보자.


>>> a = 99999
>>> print(a)
99999
>>> a = "KHU"
>>> print(a)
KHU
>>> a = [2, 4, 6, 8]
>>> print(a)
[2, 4, 6, 8]



다음과 여러 종류의 자료형을 print함수를 통해 출력할 수 있다.


>>> print("오늘은" "3월25일" "월요일입니다")  
오늘은3월25일월요일입니다
>>> print("오늘은"+"3월25일"+"월요일입니다")  
오늘은3월25일월요일입니다
>>> print("오늘은", "3월25일", "월요일입니다")
오늘은 3월25일 월요일입니다



여러 문자열을 print함수에 넣으면 +를 통해 각 문자열을 연결한 것과 같은 출력값을 프린트한다.

,를 통해 각 문자열 간 공백을 넣을 수 있다.

for문과 end를 활용하여 결과값을 차례대로 출력할 수도 있다.


>>> for i in range(1, 11):
     print(i, end = " ")
1 2 3 4 5 6 7 8 9 10



작성자 : 박지호
날짜 : 24/03/25
범위 : 04-4 프로그램의 입출력

type 명령어
C:\> type c5de.txt


type 명령어는 바로 뒤에 적힌 파일 이름을 인수로 받아 그 파일의 내용을 출력해준다.
위 예시에서는 c5de 파일을 인수로 받아 그 내용을 출력해주는 것으로 이해할 수 있다.

sys 모듈

sys 모듈은 프로그램에 인수를 전달하는 방식이다.
이때 argv는 프로그램 실행 시 전달받은 인수들을 의미한다.
argv[0] : 파일 이름
argv[1] ~ : 뒤에 따라오는 인수들