멋사 AI스쿨8기

[멋사AI스쿨8기] TIL : 파이썬 문법3일차

JJouni 2023. 1. 4. 17:37

오늘의 시작은

지난 수업을 짧게 복습하며, 연습문제를 함께 풀었다.

 

로또번호 출력(list)
import random

# 1. 로또번호 저장 변수 생성
lotto = []

# 2. 아래의 코드 반복 : while
while True:

#   2-1. 1 ~ 45 랜덤한 숫자 출력 후 저장 : random_number : random.randint()
    random_number = random.randint(1, 45)

#   2-2. lotto 리스트에 random_number 없으면, random_number를 lotto 변수에 추가 : list.append()
    if random_number not in lotto:
        lotto.append(random_number)

#   2-2. random_number를 lotto 변수에 추가 : list.append()
    lotto.append(random_number)
    lotto = list(set(lotto))

#   2-3. lotto의 데이터 갯수가 6개 이상이면 반복 중단 : if, len(), break
    if len(lotto) >= 6:
        break

# 3. 로또번호 출력 : print()
lotto.sort()
print(lotto)

이번에 문제를 풀면서, 알고리즘을 짜는 법도 스스로 해봤는데,

강사님이 왜 저렇게 코드 사이사이에 주석을 넣는지 이해가 되었다.

먼저 주석으로 어떻게 코드를 짤건지 알고리즘을 먼저 짜고,

그 이후에 코드를 만드는 방식으로 진행되었다.

덕분에 알고리즘 연습도 되었다!

 

코딩은 계속 하다보면 늘지만, 어떤 식으로 코드를 짤지 알고리즘을 잘 짜는 것에서 경쟁력이 생긴다고 하셨다.

알고리즘 연습을 많이 해봐야겠다.

 

이를 돕기 위해 사이트를 하나 알려주셨다.

 

문제풀이 사이트

👇

https://www.hackerrank.com/ 

 

HackerRank

HackerRank is the market-leading technical assessment and remote interview solution for hiring developers. Learn how to hire technical talent from anywhere!

www.hackerrank.com

 

유익한 시간을 보내고 본격 수업에 들어갔다. 오늘은 함수다!

러버덕 디버깅에 관해서 이야기해주시면서, 가장 좋은 복습은 친구와 토론해보는 것이라고 하셨다.

오늘은 배운 것들을 이해한대로 설명해보고자 한다.

 


 

함수

  • 반복적으로 사용되는 코드를 묶어서 사용하는 방법
  • 코드의 유지보수가 쉬워짐 : 코드 수정시, 매번 각 출력 코드를 찾아 수정하지 않아도 됨! 함수 안에서만 수정하면 싹 고쳐짐!
  • 종류 : def, return, argument, parameter, docstring, scope, lambda
  • 사용법 : 함수선언(코드작성) > 함수호출(코드실행)
  • 함수는 데이터 타입이 function인 변수이다.
    • function은 코드를 담고 있는 데이터타입이다.
    • 함수는 함수 이름에 가지고 있는 코드를 불러와서 실행하는 것
    • 그러니까 함수 자체가 파라미터, 아규먼트에 들어갈 수 있다.

 

1. argument, parameter

  • 함수를 호출하는 코드에서 함수를 선언하는 코드로 데이터를 전달할 때 사용
  • parameter : 선언시 데이터를 받는 코드
  • argument : 호출시 데이터를 보내는 코드
  • 기본적으로 이 두가지의 데이터 갯수가 같아야 한다.
  • 그런데 두 개의 parameter 사용하고 1개만 선언해주고 싶다면? default parameter 사용!
  • 한 20개쯤 파라미터가 있는데, 마지막 값만 바꾸고 싶다면? Keyword argument 사용!
# 함수선언(코드작성)
def plus(n1, n2=10, n3=50): # n1 : parameter, n2=10, n3=50 : default parameter
	print(n1 + n2 + n3)
    
# 함수호출(코드실행)
plus(1, n3=100) # 1 : argument, n3=100 : Keyword argument

 

 

2. return

  • 코드실행 후 반환되는 값
  • 두 가지 경우에 사용 
    • 1) 함수를 호출해서 결과 데이터를 변수에 저장할 때   예) 리턴이 있는 함수 : str.upper(), 리턴이 없는 함수 : list.sort()
    • 2) 함수 코드를 중단할 때 : 반복문에서 함수를 중단하고 빠져나올 경우 return을 써주면 해당 함수를 중단할 수 있다. 
  • 여러개의 데이터를 리턴할 경우에도 사용된다. 
    • 다른 언어의 경우 하나씩 저장해야 하지만, 파이썬의 경우 튜플을 이용해 각각의 변수에 한꺼번에 저장이 가능하다. 

 

3. docstring

  • 함수에 대한 설명을 작성하는 것
    • 함수선언코드 바로 아래에 멀티라인 문자열로 작성한다
    • 보통  1) 함수에 대한 설명,  2) 파라미터의 종류 ,  3) 리턴 결과값을 작성함
    • 그러나 회사별, 패키지별로 다르게 사용될 수 있다. 
  • docstring을 확인하는 방법은 
    • ctrl+space
    • help() 로 출력
  • 예시로 print함수를 확인해보자.

print 함수의 파라미터와 아규먼트를 확인할 수 있으며, 이를 활용해서 print함수를 다양하게 쓸 수 있다.

 

 

4. *args, **kwargs 

  • 파이썬에만 있는 문법으로, 아규먼트의 갯수에 상관없이 함수를 실행할 수 있는 방법이다.
  • 즉, 여러 개의 아규먼트를 파라미터에서 받을 때 컬렉션 데이터타입으로 받는다.
  • *args (여기서 args는 변수이름이기 때문에 바꿔줘도 무방하나 대부분 args로 사용, *는 필수문법)
    • 여러개의 아규먼트를 튜플 데이터타입으로 받아준다
    • type(args) >> tuple
  • **kwargs (여기서도 kwargs는 변수 이름이어서 바꿔줘도 무방하나 대부분 args로 사용, **는 필수문법)
    • 여러개의 키워드(key-value) 아규먼트를 딕셔너리 데이터타입으로 받아준다
    • type(kwargs) >> dict
  • 보통 순서는 *args를 먼저쓰고, 그 뒤에 **kwargs를 사용한다. 섞어서 쓸 수 없음.
def plus(*args, **kwargs): # 파라미터에 컬렉션 데이터 타입을 받아줌 : 식별자1개, 데이터n개
    print(type(args), args)
    print(type(kwargs), kwargs)
    # return n1 + n2

plus(1, 2, 3, 4, 5, n1=10, n2=30) # 여러개의 아규먼트
  • 이를 argument 자리에 쓸 때도 있는데, 이럴 경우 묶여있는 컬렉션 데이터타입(list, tuple, dict)을 여러개의 아규먼트로 풀어서 함수를 호출한다.
    • 보내려는 데이터가 길어질 경우, 사용하는 것 같다.
    • 보내고자 하는 데이터 타입이 list, tuple일 경우 *(이름)으로 보내면 풀어서 나오고, dict일 경우 **(이름)으로 보내야 제대로 풀려서 나온다.

통쨰로 보낼 것인지, 잘라서 보낼 것인지는 */**사용 유무에 따라, * / **의 차이는 어떤 데이터타입이 오는지 판단해서 받는 것 같다.

 

 

5. scope

  • 변수를 어디서 선언할지 잘 확인해야 한다! 함수 안과 밖은 공간의 차이가 있어서 같은 변수명이어도 다르게 저장된다.
  • 범위
    • 함수 밖 : 전역영역, global이라고 함
    • 함수 안 : 지역영역, local이라고 함
  • 사용
# 지역영역에서 전역영역의 변수사용법
data = 10

def change():
    global data     #이미 선언된 data를 불러옴
	data = 20

change()
print(data)


# 전역영역에서 지역영역의 변수를 사용하려면 return을 활용한다
data = 10

def change():
	data = 20
    return data

data = change()
print(data)

 

 

 

6. lambda(매개변수 : 표현식)  - 익명함수

  • 일회성 함수로 간단한 함수(파라미터, 리턴)를 선언 없이 사용 가능하다
  • 효과 : 메모리 절약, 가독성 증대
  • 표현식의 결과값이 리턴된다.
# 예시 : 덧셈을 한 줄 코드로 작성
calc = (lambda n1, n2 : n1 + n2)(1,2)
calc  # 3 출력

 

 

7. list comprehension 리스트 컴프리헨션

  • 직역하자면, 리스트의 이해력. 생각해보면, 리스트를 간단하게 만들어서 이해하기 쉬우라고 한 건가 싶다.. 이름의 유래는 어떻게 될까.
  • 간단한 반복문, 조건문을 사용해서 리스트 데이터를 만들 때 사용하는 문법
  • 주로 리스트 데이터를 필터링하거나 변경할 때 사용한다. 
  • 물론 dictionary comprehension도 가능하다.
  • 간단한 코드에서 사용할 수 있다. 
# 예시 : 리스트 데이터를 필터링한다

reports = ['사업보고서(2020)', '감사보고서(2021)', '[기재정정]사업보고서(2020)']
# 2020년도 보고서 목록을 리스트로 출력, 연도데이터는 제외하고 이름만 출력
reports_2020 = [report[:-6] for report in reports if report[-5:-1] == '2020']
reports_2020

 

 

오늘의 퀴즈 : map() 구현하기!
# Quiz. map 함수 직접 구현
names1 = ['kim python(23)', 'lee notebook(32)', 'kim macbook(47)']
names2 = ['kim py(33)', 'lee note(52)', 'kim book(87)']

def map_func():
    # TODO

def ages(data):
    return data[:-3] + str(int(data[-3:-1]) // 10 * 10) + ')'

map_func(ages, names1)

def ages(*args):
    return [data[:-3] + str(int(data[-3:-1]) // 10 * 10) + ')' for data in args]

map_func(ages, names1, names2)

TODO 부분을 구현해보기!

 

 


TIL 소감

오늘은 처음에는 할 만했는데 갈수록 어려워졌다.. 그래도 함수를 잘 활용하면 다양한 코드를 구현할 수 있을 것 같다.

공부하면서 TIL을 작성하니 시간도 금방 가서 오늘은 과제도 못했다. 추후 해볼 예정..

오늘 실습으로는 네이버 papago를 활용해서 번역기를 만들어 보는 것을 했는데, VOD를 보면서 실습해본 크롤링하고 비슷한 방식이었다. 크롤링을 공부해봐도 유용히 사용할 것 같다.

 

그리고 강사님께서 오늘은 파이썬을 공부하는 방법에 대해서 알려주셨다.

  • 새로운 언어나 기술을 익힐 때 서점에서 입문 서적 최신의 보기 쉬운 책으로 산다.
  • 입문 서적이므로, 일주일 안에 책을 한 번 다 본다.
  • 입문 서적만으로 경쟁력이 없기 때문에, 공식사이트 도큐먼트를 보며 공부한다.

 

배울수록 공부할 게 많아진다. 심지어 도큐먼트는 영어임...ㅎㅎ

머리가 아프지만, 그래도 하나씩 해가다보면 파이썬도 마스터할 수 있겠2ㅣ!

2023년에는 열심히 공부해야겠다^^_^^