Study/CODE 3기 [Jump to python]

[김이김이나] python 스터디 3주차

민김정 2024. 3. 24. 15:29

 

  • 작성자: 김서현
  • 작성일: 3/24
  • 진도: [4-1] 함수란 무엇인가? ~ 입력값과 리턴값에 따른 함수의 형태

 


📌함수란 무엇인가?

입력값을 가지고 어떤 일을 수행한 후 그 결과물을 내어 놓는 것이 함수가 하는 일이다.
박스 안에 ‘입력’ 값을 넣고 결과물이 나오는 것이 ‘출력’이 된다.
 

📌함수를 사용하는 이유는 무엇일까?

반복되는 부분이 있을 경우, ‘반복적으로 사용되는 가치 있는 부분’을 한 뭉치로 묶어
'어떤 입력값을 주었을 때 어떤 결괏값을 리턴해 준다’라는 식의 함수로 작성하는 것이다.
또한, 프로그램의 흐름을 잘 파악할 수 있고 오류가 어디에서 나는지 쉽게 알 수 있다.
 

📌파이썬 함수의 구조 

def 함수_이름 (매개변수): 
       수행할_문장 1
       수행할_문장 2

여기서 def은 define의 약자로 함수를 만들 때 사용하는 예약어이다. 

def 김서현 (a, b):
     return a + b

위 함수의 이름은 김서현이고, 입력으로 2개의 값을 받으며 출력값은 2개의 입력값 (a, b)를 더한 값이다. 

 

📌매개변수와 인수

매개변수 (parameter)는 함수에 입력으로 전달된 값을 받는 변수이다.
인수 (arguments)는 함수를 호출할 때 전달하는 입력값을 의미한다. 

def add(a,b):
      return a + b
print (add(3,4))

위 예시에서 매개변수는 a, b이고, 인수는 3, 4이다.
 

📌입력값과 리턴값에 따른 함수의 형태

함수는 들어온 입력값을 받은 후 어떤 처리를 하여 적절한 값을 리턴해 준다. 
함수의 형태는 입력값과 리턴값의 존재 유무에 따라 4가지 유형으로 나뉜다.
 

1. 일반적인 함수

입력값과 리턴값이 모두 있는 함수이다.

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

ex) def 김서현 (a,b):
      result = a + b
      return result 
여기서, a, b 2개의 입력값을 받아 서로 더한 결괏값을 리턴한다. 

 

2. 입력값이 없는 함수

입력값이 없고 오직 리턴값만 있는 함수이다.

def say ():
     return 'Hi'
a = say ()
print (a)

위 예시에는 () 괄호 안에 아무런 입력값이 없지만, 리턴값으로 "Hi"를 리턴한다.
 

3. 리턴값이 없는 함수

리턴값이 없고 입력값만 있는 함수이다.

def add (a,b):
     print ("%d, %d의 곱은 %d입니다." % (a, b, a*b))

위 예시에는 a, b의 입력값은 존재하지만, return 명령어가 없기에 리턴값이 존재하지 않는다. 
리턴값이 없을 때 쓰이면 >>None<<을 리턴하게 된다. None을 리턴하는 것은 리턴값이 없다는 것이다.
 

4. 입력값도, 리턴값도 없는 함수

입력값도, 리턴값도 없는 함수이다.

def say():
       print ("Hi")

위 예시에서는 매개변수도 없고, return 명령어도 없기에 입력값도 리턴값도 없는 함수이다. 


📌느낀점

 


  • 작성자: 김민정
  • 작성일: 3/24
  • 진도: [4-1] 매개변수를 지정하여 호출하기 ~ 함수의 리턴값은 언제나 하나이다

📌매개변수를 지정하여 호출하기

함수를 호출할 때 매개변수를 지정할 수도 있다.
매개변수를 지정하면 순서에 상관없이 사용할 수 있다는 장점이 있다.
아래 예시를 통해 이해해보자.



첫 번째 수에서 두 번째 수를 뺄셈하는 sub함수의 리턴값을 result라는 매개변수를 지정한 결과이다.

 

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

파이썬에서는 이러한 경우 일반적으로 볼 수 있는 함수 형태에서 괄호 안의 매개변수 부분이 *매개변수로 바뀐다.

<여러 개의 입력값을 받는 함수 만들기>

앞서 설명한 것처럼 매개변수 이름 앞에 *을 붙이게 되면 입력값을 전부 모아 튜플로 만들어 주기 때문에
입력값이 몇 개이든 상관없이 함수에 적용시킬 수 있게 된다. (이때 매개변수의 이름은 임의로 정할 수 있다.)
예시로 add_many 함수를 만들어보자.



(args는 인수를 뜻하는 영어 단어 arguments의 약자이며 관례적으로 자주 사용한다고 한다!)

여러 개의 입력을 처리할 때 위의 예시처럼 함수의 매개변수로 *args 하나만 사용할 수 있는 것은 아니다.
여러 개의 입력값을 의미하는 *매개변수 앞에 choice 매개변수를 추가할 수 있다.

<키워드 매개변수 kwargs>

(kwargs는 keyword arguments의 약자이며 args처럼 관례적으로 자주 사용된다.)
키워드 매개변수는 매개변수 앞에 **를 붙여 사용한다.
매개변수 이름 앞에 **를 붙이면 매개변수는 딕셔너리가 되고
그 딕셔너리에 Key=Value 형태의 입력값이 전부 저장된다.

📌함수의 리턴값은 언제나 하나이다

책에 수록된 예시와 같이 어떤 함수가 2가지 값을 리턴하는 함수라고 할 때,
이 함수의 리턴값을 받아들이는 result변수가 2개가 필요하다고 생각할 수 있다.
리턴값이 2개라고 오해하기 쉽기 때문이다. 하지만, 이러한 경우에도 리턴값은 하나이다.
2가지 값이 하나의 튜플로 리턴되는 것이기 때문이다.
그렇기 때문에 이번 주제의 제목이 '함수의 리턴값은 언제나 하나이다'인 것이다.
n개의 값을 하나의 튜플로 리턴하는 함수를 호출하면 어떻게 되는지 실제 화면을 통해 확인해보자.



division이라는 이름으로 나눗셈 결과, 몫, 나머지의 세 가지 값을 리턴하는 함수를 설정하였고
하나의 튜플로 세 가지 값 모두 잘 리턴된 것을 확인할 수 있다.

하지만 만약 이 하나의 튜플 속 값들을 각각 분리하여 받고 싶다면 어떻게 호출해야 할까?
result1과 resul2로 나누어 호출하면 분리된 값을 받을 수 있다.
애초에 함수를 설정할 때 return문을 여러 번 사용하면 리턴값을 각각 돌려 주지 않을까?
라는 의문이 들 수 있지만 결과는 그렇지 않다.
그 이유는 아까 말했듯이, '리턴값은 하나뿐'이기 때문이다!

<return의 또 다른 쓰임새>

특별히 return값이 없는 함수에서 함수를 빠져나가고 싶을 때 return을 단독으로 쓰면 된다.
이때 함수의 return값은 오로지 return문에 의해서만 생성된다는 것을 기억해야 한다.
문자열을 출력한다는 것과 리턴값이 있다는 것은 전혀 다른 말이다.


📌느낀점

지금까지 스터디를 하며 공부한 내용 중 가장 헷갈렸지만 그만큼 더 확실히 공부해야겠다는 생각이 드는 시간이었다. 티스토리를 작성하며 스스로 한 번 복습한 후 팀원들과 복습 스터디 시간도 가지며 배운 내용을 더욱 내 것으로 만들어야겠다.



  • 작성자: 정현석
  • 작성일: 3/25
  • 진도: [4-1] 매개변수의 초깃값 미리 설정하기 - lambda 예약어 

📌매개변수 초깃값 미리 설정하기

 
앞서 살펴본 방법과는 조금 다른 방법으로 인수를 전달하는 법을 알아보자.

def say_myself(name, age, man=True):
        print("내 이름은 %s 입니다." % name)
        print("나이는 %s살 입니다." % age)
        if man :
            print("남자입니다.")
        else:
            print("여자입니다.")

 
여기서 등장하는 매개변수는 무엇일까?
바로 name, age, man=True 이다. 
어쩌면 man=True라는 매개변수는 낯설게 느껴질지도 모른다. 
하지만 이것이 매개변수에 미리 값을 설정한 것이다.
이로써 위 함수에서 매개변수의 초깃값을 설정한 것이다. 
 

say_myself("정현석", 22)
say_myself("정현석", 22, True)

 
입력값으로 ("정현석", 22)처럼 2개를 주면 name에는 "정현석"이, age에는 22가 대입된다.
man에는 입력값을 주지 않았지만, man은 초깃값 True를 갖게 된다.
그러므로 위의 함수를 사용한 2가지 방법은 모두 동일한 결과를 도출할 것이다.
 

나의 이름은 정현석입니다.
나이는 22살입니다.
남자입니다.

 
그렇다면 그 반대인 False로 바꿔보면 어떻게 될까?
 

say_myself("석현정", 22, False)

 
그렇다면 man 변수에 False 값이 대응되어 결괏값은 다르게 출력된다.
그 결괏값은 다음과 같다.
 

나의 이름은 석현정입니다.
나이는 22살입니다.
여자입니다.

 

📌함수에서 이미 사용된 변수의 사용

 
함수에서 이미 사용된 변수를 사용한다면  어떻게 될까?
다음과 같은 예시를 통해 살펴보자.
 

def example_function():

    inner_variable = "I am inside the function"
    print("Inside the function:", inner_variable)

outer_variable = "I am outside the function"

example_function()

print("Outside the function:", inner_variable)

 
이 예제에는 'example_function( )' 이라는 함수가 정의되었다.
이 함수 안에는 'inner_variable'라는 변수가 정의되어 있고,
함수 밖에는 ' outer_variable '라는 변수가 정의되어 있다.
여기서 함수 밖에서 'inner_variable'에 접근하려고 하면 어떻게 될까?
함수 밖에서 함수 안의 변수에 접근하려고 한다면 실행되지 않으며 다음과 같은 문구가 나타날 것이다.
 

Inside the function: I am inside the function
Outside the function: NameError: name 'inner_variable' is not defined

 
이는 함수 외부에서 'inner_variable'에 접근할 수 없기에 발생하는 오류이다.
반대로 말하면 함수 안에서 사용하는 매개변수는 함수 밖에서 사용하는 변수와는 관련이 없다는 것을 의미한다.
 

📌함수 안에서 함수 밖의 변수 변환

 
그렇다면 함수 안에서 함수 밖의 변수를 변환할 수는 없을까?
크게 return과 global 명령어를 사용하는 두 가지 방법이 있다. 
하지만 global 명령어는 외부 변수에 종속적인 함수를 사용하기 때문에 return 함수의 예시만 살펴보자.
 

def vartest(new_value):
    return new_value

outer_variable = "I am outside the function"

outer_variable = vartest("I am modified with return")

print("Outside the function:", outer_variable)

 
이 예제에서는 vartest 함수는 입력받은 값을 리턴하는 함수를 사용한 예시이다.
이 함수는 실행할 때 "I am modified with return"을 전달하고, 리턴된 값을 외부 변수 outer_variable에 부여한다.
결과적으로 outer_variable의 값은 함수 안에서 변경되고, 변경된 값을 출력하게 된다.
 

📌lambda 예약어 사용하기

lambda 는 함수를 생성할 때 사용하는 예약어이다.
보통 '람다'라고 하며 간단하고 쉬운 함수를 생성할 때 사용된다.
 

함수_이름 = lambda 매개변수1, 매개변수2, ... : 매개변수를_이용한_표현식

 
그렇다면 실제로 적용해보자.

addition = lambda x, y: x + y

result = addition(3, 5)

print("두 수의 합:", result)

 
위 예시에서는 'addition'이라는 람다 함수를 정의해보았다.
이 함수는 변수 'x'와 'y'를 설정하고, 이 두 변수를 더한 값을 리턴한다.
그리고 나서 이 함수의 결과를 'result 변수에 할당하고, 이를 출력한다.
 


📌느낀점

이번주에는 함수 안에서 이미 사용된 변수의 사용에 대해 알아보는 부분이 가장 어려웠던 것 같다.
그리고 그를 활용한 함수 안에서 함수 밖의 변수를 변환하는 내용도 이해하는 데 상당히 까다로운 부분이었던 것 같다.
하지만 마지막에 등장한 람다 예약어는 내용도 적고 간단해서 쉽게 이해할 수 있었던 것 같다. 
앞으로도 조금씩 파이썬에 대해 알아가다 보면 어느새 성장할 수 있을 것 같아서 뿌듯하다!


 

  • 작성자: 김한세
  • 작성일: 3/25
  • 진도: [4-2] 사용자 입출력

 


📌사용자 입출력



기본적인 입출력에 대해 알아보자



위의 그림은 우리가 흔히 생각하는
‘입출력’이다
함수에서 다루는 입력과 출력이 그 예시다.


그렇다면 파이썬에서의
입출력을 알아보자.

📌입력


먼저 ‘입력’을 알아보자

<input 사용하기>

 

>>> a = input()
Hanse is cute
>>>a
'Hanse is cute'


input은 ‘입력’한 모든 것을 문자열로 정리한다.


<프롬프트 띄우기>


예시로 알아보자.


>>>Name = input("이름을 입력하세요: “)
이름을 입력하세요: 


괄호 안의 문구가 프롬프트로 나타난다.

>>>Name = input("이름을 입력하세요: “)
이름을 입력하세요: Hanse
>>>print(Name)
Hanse

"이름을 입력하세요“라는 프롬프트에 Hanse를
대입하면 변수 Name에 Hanse가 대입된다.

추가로 print(Name)로 출력해서
제대로 입력되었는지 확인할 수 있다.

# input은 입력되는 모든 것을 문자열 취급한다는 점!

📌출력


다음은 ‘출력’을 알아보자

>>>a = 5
>>>print(a)
5

>>>a = "Hanse"
>>>print(a)
Hanse


위의 예시는
우리가 알고 있는 print의 기본 사용이다.

그렇다면 추가적인 print문 사용을 알아보자.



<끈 따옴표로 둘러싸인 문자열은 +연산과 동일하다>

 

>>>print("Hanse" "is" "cute") #a
Hanseiscute
>>>print("Hanse"+"is"+"cute") #b
Hanseiscute



a와 b의 출력값은 같다.
따옴표로 둘러싸인 문자열을 연속해서 쓰면
+연산을 한 것과 같다.

<문자열 띄어쓰기는 쉼표>

 

>>>print("Hanse", "is", "cute")
Hanse is cute


쉼표를 사용하면 띄어쓰기가 가능하다.




📌느낀점


코드를 짜는 중  print문 사용에 있어서 혹시 있지는 않을까 했던 ‘사용법 추측들’이 실제로 가르치는 이론 중 하나였어서
공부한 보람이 가장 컸던 주차였다.




  • 작성자: 김민혁
  • 작성일: 3/25
  • 진도: [4-3] ~readlines함수 사용하기

📌파일 읽고 쓰기

파일을 통한 입출력 방법에 대해 알아보자!!!>!>!!

<파일 생성하기>

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

위 코드를 IDLE 에디터로 작성하면
프로그램을 실행한 디렉터리에 새로운 파일이 하나 생성된 것을 확인할 수 있을 것이다.

파일_객체 = open(파일_이름, 파일_열기_모드)

파일 열기 모드에는 다음과 같은 것들이 있다.

r 읽기 모드: 파일을 읽기만 할 때 사용한다.
w 쓰기 모드: 파일에 내용을 쓸 때 사용한다.
a 추가 모드: 파일의 마지막에 새로운 내용을 추가할 때 사용한다.

파일을 쓰기 모드로 열면 해당 파일이 이미 존재할 경우 원래 있던 내용이 모두 사라지고
해당 파일이 존재하지 않으면 새로운 파일이 생성된다.
 
만약 ‘새파일.txt’ 파일을 C:/doit 디렉터리에 생성하고 싶다면 다음과 같이 작성해야 한다.

f = open("C:/doit/새파일.txt", 'w')
f.close()

 

<파일을 쓰기 모드로 열어 내용 쓰기>

문자열 데이터를 파일에 직접 써 보자.

f = open("C:/doit/새파일.txt", 'w')
for i in range(1, 11):
      data = "%d번째 줄입니다.\n" % i
      f.write(data)
f.close()

이제 명령 프롬프트 창에서 첫 번째 예제를 실행해 보자.
이 프로그램을 실행한 C:/doit 디렉터리를 살펴보면 ‘새파일.txt’ 파일이 생성된 것을 볼 수 있다.
파일 안에는 모니터 화면에 출력될 내용이 들어있다!!

 

 

 

<파일을 읽는 여러가지 방법>

파이썬에는 파일을 읽는 방법이 여러 가지 있다.
 
1.realine함수 이용하기

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

위는 ‘새파일.txt’ 파일을 읽기 모드로 연 후
readline()을 사용해서 파일의 첫 번째 줄을 읽어 출력하는 예제이다.
앞에서 만든 새파일.txt 파일을 수정하거나 지우지 않았다면
위 프로그램을 실행했을 때 새파일.txt 파일의
가장 첫 번째 줄이 화면에 출력될 것이다.
만약 모든 줄을 읽어 화면에 출력하고 싶다면 ??

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

여기서 while True 루프 안에서 readline함수를 이용하여
읽을 줄이 없을 때까지 파일을 계속 한 줄씩 읽어 들인다.
 
2.realine함수 사용하기

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

readlines 함수는 파일의 모든 줄을 읽어서 각각의 줄을 요소로 가지는 리스트를 리턴한다.
여기서 주의할 점은 f.readlines()는 f.readline()와 달리 s가 하나 더 붙어 있다는 것이다.


📌느낀점

 


  • 작성자: 이나은
  • 작성일: 3/25
  • 진도: [4-3] read 함수 사용하기~ [4-4] 프로그램의 입출력

3.read 함수 사용하기

이 코드에서 f.read()는 파일 내용 전체를 문자열로 리턴한다.
위 코드에서의 data는 파일 전체의 내용이다.
 
4. 파일 객체를 for 문과 함꼐 사용하기

파일 객체 (f)는 for문과 함께 파일을 줄 단위로 읽을 수 있다.
 

📌파일에 새로운 내용 추가하기

우리가 쓰기모드 'w'로 파일을 열 때 이미 존재하는 파일을 열면 그 파일의 내용이 사라진다.
하지만 코드를 작성하다보면 원래 있던 값 뒤에  새로운 값을 추가하고 싶을 때가 있을 것이다.
이럴 경우 파일을 추가하는 'a' 로 파일을 열면된다.

위 코드는 기존의 새파일.txt를 추가모드 'a' 로 열고 write를 이용해 값을 뒤에 추가한 예이다.
앞의 예제에서 봤던 것처럼 원래는 새파일.txt에 10번째 줄 까지만 있었지만 이 코드를 실행하면

다음과 같이 19번째까지 추가된 것을 확인할 수 있다.
 

📌with 문으로 파일 닫기

지금까지는 항상 close()를 이용하여  파일을 닫았지만 with 문을 이용하면 파일을 자동으로 닫을 수 있다.

위 코드는 with 문에 속해 있는 문장을 벗어나는 순간 f가 자동으로 닫힌다.
여기서는 김이김이나를 작성하고 닫히는 것이다.
 

📌프로그램의 입출력, sys 모듈 사용하기

파이썬에서는 sys 모듈을 사용하여 프로그램에 인수를 전달할 수 있다.
sys 모듈을 사용하는 것은 다음과 같다.

위 코드는 프로그램 실행 시 전달받은 인수를 for 문을 사용해 차례대로 하나씩 출력하는 코드이다.
여기서 argv는 전달된 인수를 의미한다.

명령형 프롬프트에서 위와 같이 명령을 실행하면, 인수 aaa bbb ccc가
차례대로 출력하는 것을 확인할 수 있다.
 

이를 이용해서 간단한 프로그램을 작성해 볼 수 있는데,
위 프로그램은 전달된 인수를 모두 소문자로 바꾸는 예제이다.

이를 명령형 프롬프트에서 명령을 넣어주고 CODE를 인수로 넣었더니
code 와 같이 모두 소문자로 잘 바뀐 것을 볼 수 있다.


📌느낀점

함수에 대해서 배우니 본격적으로 입력을 받는 프로그램에 대해서 알아가는 느낌이 들었다.
하지만 그만큼 내용이 이해하는데 시간이 오래걸리는 부분도 많아진 것 같다. 특히 함수와 입출력 부분은 앞으로
프로그램을 짤 때 꼭 필요한 요소이니 헷갈리지 않도록 잘 복습해야겠다.


 백준 2주차 퀴즈 정답

#1번
#2번

def prime_factors(n):
    factor = 2
    while n > 1:
        if n % factor == 0:
            print(factor)
            n //= factor
        else:
            factor += 1

def main():
    N = int(input())
    if N > 1:
        prime_factors(N)

if __name__ == "__main__":
    main()
#3번

n = int(input('정사각형 개수를 입력하시오. '))
if 1 <= n <= 10^9:
   print (n*4)
else:
   print('1과 10의 9제곱 사이의 수를 입력해 주세요.')
#4번

word = str(input())

if word == word[::-1]:
    print(1)
else:
    print(0)