본문 바로가기
LG 헬로비전 DX DATA SCHOOL/Python

Python - 제어문과 함수

by 황밤 2023. 7. 7.
728x90
반응형

2023-07-07

 

이전 Python 기초 내용을 보고싶으신 분은 아래를 클릭하세요!

2023.07.06 - [LG 헬로비전 DX DATA SCHOOL/Python] - Python 기초

 

Python 기초

2023-07-06 Python 파이썬은 프로그래밍언어 작성 후, 컴파일이 아닌 인터프리터를 통해 실행된다. 1991년 Guido van Rossum에 의해 개발되었다. (사실은 java 보다 4년 일찍 출시되었다.) 객체 지향 언어이며

dxdata.tistory.com

Python 

 

오늘 알아볼 파이썬 내용으로는 제어문함수가 있습니다.

 

긴말 필요없이 바로 알아보겠습니다!

 

1. 제어문

  • 프로그램은 왼쪽에서 오른쪽으로 위에서 아래로 수행되는데 이 흐름을 변경하고자 하는 명령어
  • 파이썬은 if, for, while, break, continue, return 을 제공

if : 분기문(branch)

 

while : 반복

 

for : 순서열을 순회

 

break : 반복문 종료

 

continue : 다음 반복으로 넘어가는 역할

 

return : 현재 함수의 수행을 종료하고 호출하는 함수로 되돌아가는 역할 - 데이터를 가지고 갈 수 있음.

 

 

1.1)표현식

 

  • 연산식 : = 가 있는 경우가 하나의 연산식(나머지 연산자는 중첩해서 사용해도 하나의 표현식으로 간주)

ex) 3 + 4 -> 연산식이라고 할 수는 있는데, 표현식은 아님

ex) a = b = 10 이면 두번에 걸친 연산식

  • 리턴이 있는 함수 호출 : 리턴이 없는 함수 호출은 표현식으로 간주하지 않는데 그 이유는 판단을 할 수 없기 때문이다.
  • 파이썬은 제어문이 하나의 블럭을 생성 -> 제어문 안에서 만든 데이터는 외부에서 사용이 불가

1.2) If (조건 분기)

 

문법 :

if bool 데이터 :

          bool 데이터가 True 인 경우 수행할 문장

 

elif bool 데이터 :

          앞의 데이터가 False 이고 현재 데이터가 True 인 경우 수행할 문장

 

...

 

else :

          앞의 모든 데이터가 False 인 경우 수행할 문장

 

  • elif 와 else 는 if 없이는 사용이 안됨.
  • elif는 0번 이상 사용 가능, else는 생략 or 1번 사용 가능.
  • elif를 작성할 때 주의할 점은 수행되지 않는 조건을 만들지 않도록 해야한다.
  • else는 처리보다는 예외적인 상황을 처리하는 용도로 사용하는 것을 권장.

 

예제 : 

#하나의 점수를 입력받아서 60점 이상이면 합격 아니면 불합격띠
#무조건 프로그램 종료라는 문구를 출력

score = int(input("점수를 입력하세요: "))
#실제 프로그램이라면 잘못된 입력을 할 수 있으므로 예외처리를 해주는 것이 좋다.

#print(type(score))
if type(score) == int :
    if score >= 60 :
        print("합격입니다")
    elif score < 60 :
        print("불합격입니다..")

else :
    print("정수를 입력해주세요")

점수를 입력하세요: 40
불합격입니다..

 

# 학점 예제 입니다

"""
0~ 100 사이의 점수를 입력받아
90 ~ 100 사이면 A
80 ~ 90 사이면 B
70 ~ 80 사이면 C
60 ~ 70 사이면 D
0 ~ 59 F
다음의 점수를 반환하시오
"""


score = int(input("점수를 입력해주세요"))

if 90 <= score <=100 :
    print("A")
elif 80 <= score < 90 :
    print("B")
elif 70 <= score < 80 :
    print("C")
elif 60 <= score < 70 :
    print("D")
elif 0 <= score < 60 :
    print("F")
else :
    print("점수를 다시 입력하세요")

항상 숫자 데이터를 처리할 때에는, 숫자의 범위에 대한 제한을 항상 생각해둬야 합니다.

저는 0~ 100 사이의 점수만 처리할 수 있도록 코드를 짜주었습니다.

그 외의 상황은 else를 통해서 처리할 수 있게 해주었어요

 

# 혹시라도 점수를 입력시, 실수를 넣으면 어떻게 될까요?

 

해당 코드는 int(input()) 형태로입니다. 

input() 함수는 입력값을 문자열로 형 변환을 해주는데, int 함수는 문자열 내 실수는 형변환이 안됩니다.

따라서 실수를 넣고 싶으시다면!

 

int(float(input("점수를 입력하세요~ :")로 작성하시면 됩니다.

 

1.3) Falsy

  • 파이썬에서는 0이 아닌 숫자나 데이터가 없는 데이터의 모임도 False로 간주, None, 
  • Falsy 가 아니면 전부 True로 간주

 

1.4) Switch 흉내내기

  • switch 는 if 보다 조건에 따른 접근이 매우 빠르다.
  • 파이썬에서는 switch가 없지만, dict을 이용해 구현할 수 있다.

"""
0이면 일요일
1이면 월요일
2이면 화요일
3이면 수요일
4이면 목요일
5이면 금요일
6이면 토요일
"""
switcher = {
    0:'Sunday',
    1:'Monday',
    2:'Tuesday',
    3:'Wednesday',
    4:'Thursday',
    5:'Friday',
    6:'Saturday'
}

print(switcher.get(3, 'Unknown Week'))
print(type(switcher))

결과 : 

PycharmProjects\pythonProject0706\0707.py 

Wednesday

<class 'dict'>

 

dict 형태의 데이터로 switch와 같은 효과를 볼 수 있다.

 

추가로 dict.get()을 사용하면, 0~6이 아닌 값을 넣었을 때, default 값으로 처리할 수 있기 때문입니다!

 

1.5) if를 이용한 값 대입 - list 사용할 때 중요

  • x 값에 따라 y의 true나 fasle 를 설정하고자 하는 경우

x = 10

if x >= 10 :

    y = True

else :

    y = False

 

  • 위 코드를 if 를 이용해서 축약이 가능

x = 10

y = False if x < 10 else  True       # Y는 기본적으로 False를 갖고, x 값의 조건에 따라 True를 가진다.

 

어때요 참 간단해졌죠?

 

1.6) While

  • 반복을 위한 제어문

while bool 데이터 :

 

            bool 데이터가 True인 경우 수행할 문장

 

  • python에서는 while과 else를 매핑하는 것이 가능

while bool 데이터 :

 

            bool 데이터가 True인 경우 수행할 문장

 

else :

 

            while이 break를 만나지 않고 정상 종료된 경우 수행할 문장

 

코드 예시

idx = 0
jdx = 0
while idx < 10 :
    print(idx)
    idx += 1
    jdx += idx #조건문 까지의 합
    if idx == 5 :
        break
else :
    print(jdx , "수행완료") #break while이 종료되었거나 예외가 발생하면, else 조건문이 발동하지 않음

 

  • 무한반복

while True :

          반복할 내용

 

1.7) For

 

for 임수변수 in 순서열 :

            순서열의 데이터를 하나씩 임시변수에 대입하고 수행할 문장

  • 순서열은 __iter__가 구현된 인스턴스
  • 순서열 : bytes, str, list, tuple, set, dict
  • dict는 key값이 하나씩 대입되고 나머지는 데이터가 하나씩 대입된다.
  • 숫자열을 만들 수 있는 함수 : range()

range(숫자) : 0부터 숫자 전까지 1씩 증가한 숫자열

range(숫자1, 숫자2) : 숫자1 시작, 숫자2 - 종료

range(시작숫자, 종료숫자, 간격)

 

 

string = "Hello"
ar = [10, 20] #list
row = (100, 200) #tuple
s = {1000, 2000} #dict
dic = {"key1" :"value1", "key2":"value2"}

for ch in string :
print(ch)

for k,v in dic.items():
print(k)
print(v)

 

for와 range를 이용해 크롤링에 활용할 수 있다.

 

저는 동아일보를 크롤링 한다는 가정으로 진행해보겠습니다.

 

동아일보는 1페이지는 p=1, 2페이지는 p=16, .. 이렇게 15 단위로 변합니다.

 

이를 이용하면 15씩 더하는 for 문을 작용하면 각 페이지의 url을 구할 수 있습니다.

 

for 도 else와 같이 사용 가능 : whlile ~ else 와 동일하게 동작

#크롤링 시작전 기본 연습

url = "https://www.donga.com/news/search?p="

for i in range(0, 3) :
    p = url + str((i*15)+1)
    print(p)

#해당 페이지에 대한 url 주소를 얻어 크롤링에 활용이 가능하다.

 

 

1.8) 기타

  • 제어문은 중첩해서 사용 가능
  • break : 반복문 종료
  • continue : 다음 반복으로 이동

파이썬에서의 제어문 문법은 이 정도가 될겁니다!


이제 부터는 파이썬의 함수에 대해서 알아보겠습니다!

 

 

2. Function

 

함수는 우리가 파이썬을 사용하면서 정말 빼먹을 수 없는 중요한 물건이죠!

함수는 어떤 것들이 있는지 알아보겠습니다.

 

 

2.1) 개요

  • 별도의 메모리 공간을 할당받아서 독립적으로 수행되는 코드의 집합
  • 목적은 코드의 모듈화(분할)와 동일한 코드의 중복을 제거

 

2.2) 종류

  • Built-In Function(Maker Function) : 파이썬이 제공하는 함수
  • User Define Function : 개발자가 필요에 의해서 만든 함수
  • 3rd Party Function : 다른 개발자가 만들어서 제공하는 함수 - 되도록이면 파이썬 중앙 저장소에서 제공하는 것만 이용

 

2.3) 파이썬에서는 함수도 데이터이다.

  • 사용자 정의 명칭 < - > 변수(파이썬은 함수를 변수로 지정이 가능)

 

2.4)Buit-In-Function

 

Built-in Functions

The Python interpreter has a number of functions and types built into it that are always available. They are listed here in alphabetical order.,,,, Built-in Functions,,, A, abs(), aiter(), all(), a...

docs.python.org

  • 버전마다 다르니 꼭 확인이 필요(switch가 새로 생성된다는 말이 있음.)

 

2.5) User Define Function

 

2.5.1) 함수 선언(정의)

 

def 함수이름(매개변수 나열) :

             함수 내용

             return 데이터

 

  • 함수 이름은 사용자 정의 명칭을 사용
  • 매개변수는 없을 수도 있습니다.
  • return 생략 가능

 

2.5.2) 함수 호출(call, 실행)

 

함수이름(매개변수에 대입할 데이터 나열)


def display(str) :
for i in range(3) :
    print(str)

#함수 이름은 함수를 저장한 곳의 참조
print(display)

 

2.5.3) 함수를 호출한 곳으로 돌아가기 : return

 

  • 함수 내에서 return을 만나면, 함수를 호출한 곳으로 돌아갑니다
  • 돌아갈 때 데이터를 1개 가지고 갈 수 있다
  • return 데이터 를 이용하면 데이터를 가지고 돌아간다.
  • 함수를 호출한 곳에 return 되는 데이터가 남겨지는 것과 같습니다.
  • 파이썬은 ,를 이용해서 데이터를 나열하면 tuple로 간주

10, 20 -> (10, 20) 이 됨.

  • 이전의 파이썬 문법에서 함수의 헤더에 리턴되는 자료형을 적지 않았지만 최근에는 가독성 문제 때문에 헤더 부분에 리턴되는 데이터의 타입을 기재하는 경우가 많다.
  • return 되는 데이터가 없을 때는 None으로 기재합니다.

def display() -> 리턴되는 데이터 타입:

    for i in range(3) :

        print("Hello Python")


def display(str) :
for i in range(3) :
    print(str)
    return str*3
#함수 이름은 함수를 저장한 곳의 참조
print(display)

a = display("python")
print(a)

출력 결과 :

python
python
python
pythonpythonpython

 

  • return 되는 데이터가 있으면 그 결과를 가지고 다른 작업을 수행할 수 있습니다.
  • return이 없으면 일반적으로 매개변수로 대입된 데이터를 수정.

 

함수의 return값을 tuple로 받기

def intOpWithInt(a, b) :
    return a+b, a-b

#튜플 전체를 하나의 변수로 받기
t = intOpWithInt(100, 200)
print(t)

#튜플을 분해해서 각 변수로 받기
add, sub = intOpWithInt(123451342, 12312523)

- 전처리 할 때는 return을 하자!

 

 

2.5.4) argument(매개변수, 인수, 인자, parameter)

  • 함수를 호출할 때 함수에게 넘겨주는 데이터
  • 없을 수도 있고 여러 개 일 수 도 있다.
  • 함수를 호출할 때 매개변수가 있는 함수의 경우 매개변수를 전달하지 않으면 에러가 발생
  • 최근에는 매개변수의 자료형을 명시하는 것을 권장합니다.

매개변수 이름 다음에 : 자료형 기재 가능

 

UML(모델을 만드는 표준언어)에 맞추어 쓰자!

#정수 2개를 받아 합 결과를 정수로 리턴하는 함수

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

print(add(10, 1111))

 

  • call by value & call by reference(매개 변수 전달 방법)
  • scala data 는 값이 전달되는 형태이고, vector data(collection, container)는 참조가 전달되는 형태로 동작
  • 함수 호출시 scala data를 넘겨주면 함수 내부에서 데이터를 변경해도 외부의 데이터는 변경되지 않는다.
  • vector data를 넘겨주면 함수 내부에서 함수 외부의 데이터를 수정할 수 있다.

관련 코드 :

def callByValue(a : int) -> None :
    a = 20 
    print(a)
x = 30
#x의 값을 바꾸지 못함 (함수 내부에서는 x의 복사본의 값을 바꿨기 때문에, 원래의 x값은 그대로임)
callByValue(x)
#복사본을 빌려준 것.
print(x)

def callByReference(li : list) -> None :
    li[0] = 20
    print(li)
#li l이 똑같아지면서, l 0번째를 20으로 바꿈

l = [100, 200, 300]
callByReference(l)
print(l)
#소프트웨어 비용에서는 callbyreference 가 가산점이 있음. -> 원본을 빌려주는 것
  • pure function(순수 함수)

: 함수 내부에서 함수 외부의 데이터를 변경하지 않고 매개변수가 동일하면 항상 동일한 결과를 리턴하는 함수

 

  • 매개변수의 기본값을 설정하는 것이 가능

매개변수이름 = 값 형태를 작성하면, 매개변수의 값을 생략하면 기본값이 설정됩니다.

기본값이 설정된 매개변수는 호출할 때 생략할 수 있다.

 

  • 함수를 호출할 때 매개변수 이름과 값을 같이 전달할 수 있습니다.
  • 파이썬은 함수를 호출할 때 매개변수이름과 함께 데이터를 전달할 수 있다.
  • 매개변수의 unpacking : 매개 변수가 여러 개 일때, list나 tuple 또는 set으로 한꺼번에 전달이 가능합니다. list 나 tuple 그리고 set 을 분할해서 매개변수에 대입한다. 매개변수로 대입할 때 앞에 *을 붙여서 전달.
  • dict을 전달하면 key 가 순서대로 대입되니, value를 호출하고자 한다면 **을 붙여서 전달하면 된다.

예시 코드

def collect(a,b) :
    print(a)
    print(b)

collect(*[100, 200]) #list를 분할해서 a 100, b 200이 대입된다.
collect(*{"key1" : 100 , "key2" : 150 }) #dict *을 사용하면 key를 전달
collect(**{"a" : 100 , "b" : 150 }) #dict **을 사용하면 value를 전달
#이 때 key 이름과 함수의 매개변수 이름이 동일해야함.

 

2.5.5) 가변 매개변수 : 매개변수의 개수를 정하지 않고 사용하는 매개변수

  • 매개변수를 만들 때는 *을 이용해서 이름을 설정한다. -> 개수에 상관없이 대입이 가능함.
  • 함수 내부에선 매개변수들을 모아서 하나의 튜플을 만들어 낸다.
  • 매개변수를 만들 때 **을 추가하면 dict로 받아들임.
  • 가변 매개변수 앞에 있는 매개변수를 대입할 때 매개변수 이름과 함께 대입하면 에러!
  • 가변 매개변수 뒤에 있는 매개변수를 대입할 때는 반드시 매개변수 이름과 함께 대입해야 함.

# 가변 매개 변수 코드 예시

#가변 매개변수 사용
#함수 내부에서는 튜플
def merge(*a) :
new_list = []
for element in a :
new_list.append(element)
return new_list

b = merge(1, 6, 8, 10)
print(b)
#[1, 6, 8 ,10]
  • 함수를 호출 때 존재하지 않는 매개변수 이름을 이용해서 대입하면 dict로 받을 수 있다. 
  • 이 경우 dict는 가장 마지막 매개변수로 만들어야 한다.
def merge(name, **param) :
for k in param :
    print(k, param[k])

merge(name="adam", job = "singer", gender ="남자")

 

 

2.5.6) recursion(recursive call, 재귀 함수)

  • 함수가 자기 자신을 다시 호출하는 것
  • 함수의 수행이 종료되기 전에 자기 자신을 다시 호출하기 때문에 메모리 사용량도 늘어나고 속도도 느리지만 가독성이 우수
#피보나치 수열을 재귀로 구하는 함수
#1, 1, 2, 3, 5, 8
def fibonacci (n: int) -> int :
    if n <= 2:
        return 1
    return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(100))
#재귀를 사용하면 쉬워보이나, 메모리 사용이 과다하여 속도가 굉장히 느리다.

굉장히 느려서 결과가 안나오지만,

밑의 functools를 import 해주면 계산이 훨~ 씬 빨라진다.

import functools
@functools.lru_cache() #재귀를 쓸려면 이를 꼭 import 해주세용                                                                                          #메모이제이션 : 함수의 호출 결과를 저장해 두 후 재사용하는 것

 

 

2.5.7) pass

 

  • 함수나 클래스의 내용을 나중에 작성하기 위해서 비워두는 것

def temp() :

              pass       #tdd 라고 함 (Agile)

                             #추후 추가 혹은 수정을 하기 위해 tdd를 만들어서 pass 를 통해 error가 안나게 해놓은 것

 

(우아한 형제들은 무조건 tdd를 할 줄 알아야 함. + kotlin)

 

 

2.5.8) 함수의 매개변수에 설명을 추가하는 것이 가능

 

def 함수이름(매개변수이름 : '문자열'자료형) -> 리턴 타입 :

 

->

def pan(score : 'int >0 and <= 100' = 0) -> None   '   '안 내용은 주석임.

 

 

2.5.9) 함수의 도움말 만들기

 

  • help를 했을 때 출력되는 문자열 만들기
  • 함수를 만들고 난 후 함수.__doc__ 속성에 문자열을 대입해서 만들 수 있고 함수를 만들 때 가장 상단에 문자열을 추가하면 help를 했을 때 출력이 된다.

 

2.5.10) 파이썬에 함수는 일급 객체

 

일급객체 :

  • 자료형이어야 한다
  • 동적으로 생성이 가능해야 한다.
  • 변수에 대입이 가능해야 한다.
  • 함수의 매개변수로 사용이 가능해야 한다
  • 함수에서 리턴할 수 있어야 한다

 

함수를 변수에 대입 :

  • 함수를 다른 변수에 대입해서 호출하는 이유는 다형성 때문이다.
  • 다형성(polymorphism) : 동일한 메시지에 대하여 다르게 반응하는 성질이라고 하는데 동일한 코드가 상황에 따라 다른 함수 또는 메서드를 호출하는 것

 

High Order Function(고위 함수)

  • 함수를 매개변수로 받거나 함수를 리턴하는 함수
#함수가 함수를 내부에 만들어서 리턴하면 고위 함수라고 한다.
def outer() :
    def inner() :
        print("내부 함수")
return inner
#함수를 호출해서 그 결과를 변수에 대입하고, 그 변수를 통해서 함수를 호출한다

a = outer()
a()

 

lamda(람다)

  • 이름이 없는 한 줄 짜리 함수
  • 람다 함수 안에서는 변수를 생성할 수 없고 할당문이나 while, try 등도 사용할 수 없음

-> lamda 매개변수 나열 : 리턴할 내용을 작성

lamda x,y : x + y

주로 함수형 프로그래밍에서 함수의 매개변수로 이용 (호출 할 때 만들어지고 소멸 됨)

 

ex) KTX 어플로 표를 예매한다고 할 때, 미리 함수를 만드는 것은 손해이므로 이럴 때 주로 사용한다.

 

 

 

 

매번 느끼지만,, 이번 23년 여름 정말 덥습니다.. 모두 건강 조심하시고 힘들더라도 화이팅!

반응형
LIST

'LG 헬로비전 DX DATA SCHOOL > Python' 카테고리의 다른 글

Python 예외처리 / File handling  (0) 2023.07.14
파이썬 Data Type 및 처리  (0) 2023.07.11
객체 지향 프로그래밍 (OOP)  (0) 2023.07.11
Python - 제어문과 함수 2  (0) 2023.07.10
Python 기초  (0) 2023.07.06