9일차 TIL : 파이썬 기초 및 심화

변시윤·2022년 11월 8일
0

내일배움캠프 4기

목록 보기
9/131

학습내용

  • 파이썬 기초
    • 변수
    • 자료형
    • 문자열
    • 리스트와 딕셔너리
    • 조건문
    • 반복문
    • 함수

  • 파이썬 심화
    • 튜플과 집합
    • f-string
    • 예외처리
    • 파일 불러오기
    • 코드 간략화
    • map, filter, lambda
    • 함수의 매개변수
    • 클래스

파이썬 기초

형변환

숫자 1과 문자열 '2' 더하기
파이썬에서는 서로 다른 자료형을 계산하면 에러가 발생하기 때문에 형변환 작업을 해줘야 한다.

파이썬의 형변환

  • str 문자형으로 변환
  • int 정수로 변환
  • 숫자로 변환하여 계산하기
  a = 1
  b = int('2')
  
  print(a+b)
  > 3
  • 문자로 변환하여 계산하기
  a = str(1)
  b = '2'
  
  print(a+b)
  > 12

💡 자바스크립트와의 차이
자바스크립트는 문자열과 숫자열을 더하면 모두 문자열로 인식하기 때문에 형변환 작업을 안해도 에러가 발생하지 않는다. 단, 숫자열로 변환시에는 parseInt()를 사용한다.


문자열

길이 구하기 : len()

text = 'abcdefghijk'
result = len(text)

print(result)
> 11

자르기 : [:]

text[:3]
> abc

text[3:]
> defghijk

text[3:6]
> def

text[:]
> abcdefghijk

특정 문자열 자르기 : split()

split()의 매개변수를 기준으로 문자열을 자르는 방식
ex) 이메일 도메인 값 가져오기



리스트와 딕셔너리

리스트

순서가 있는 자료의 모음으로 자바스크립트의 배열과 비슷한 개념

  • 문자열과 마찬가지로 len()[:] 사용 가능

  • 모든 자료형 포함 가능(자바스크립트의 배열은 boolean형 포함 불가)

  • 자바스크립트의 배열과 마찬가지로 [-1] 적용시 리스트의 마지막 요소 출력

  • 정렬함수 sort() 사용 가능

    • sort() 오름차순
    • sort(reverse-True)내림차순
  • 배열 내 요소 유무 판단

    # list 안에 5가 있으면 True, 없으면 False 
    list = [2, 7, 5, 3, 9]
    result = (5 in list)
    
    print(result)
    > True

참조문헌
Python list vs. JavaScript Array


딕셔너리

key와 value로 이루어진 자료의 모음으로 자바스크립트의 객체와 비슷한 개념

  • value에는 모든 자료형 가능
  • 리스트처럼 순서가 없기 때문에 인덱싱 사용 불가능
  • 리스트 안에 딕셔너리 포함 가능

조건문

기본적인 문법은 자바스크립트의 조건문과 동일하나 파이썬에서는 else ifelif로 표기한다.


반복문

for루프 : enumerate

인덱스의 변수를 증가시키는 기능으로 for 요소 in enumerate(리스트) 형태로 사용한다.
인덱스값도 얻고 싶다면 요소 앞에 i를 추가해서 for i, 요소 in enumerate(리스트) 형태로 응용하는 것도 가능하다.

fruits = ['사과', '배', '감', '귤','귤','수박','참외','감자','배','홍시','참외','오렌지']

for i, fruit in enumerate(fruits):
    print(i,fruit)
    
> 0 사과
  1 배
  2 감
  3 귤
  .
  .
  .

상위 요소만 출력하기 : break

조건문과 함께 쓰이며 조건을 충족하면 실행을 중단한다.

for i, fruit in enumerate(fruits):
    print(i, fruit)
    if i == 2:
        break
        
> 0 사과
  1 배
  2 감

연습문제

num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]

Q. num_list의 짝수 갯수 구하기

정답

count = 0

for even in num_list:
    if even % 2 == 0:
        count += 1

print(count)
> 7

오답

for even in num_list:
    if even % 2 == 0:
        count = 0
        count += 1
        
print(count)
> 1

나는 count 변수를 조건문 안에 삽입했다. 이 경우 반복문을 돌면서 count의 값이 다시 0으로 초기화 되기 때문에 값이 누적되지 않고 1만 출력된다. 그러므로 count는 반복문 밖에 위치해야 한다.

Q. num_list의 최대값 구하기

정답

max = 0

for num in num_list:
    if max < num:
        max = num

print(max)
> 6

오답

for num in num_list:
    for compare_num in num_list:
        if compare_num > num:
            break
    else:
        return num

print(num)
> SyntaxError: 'return' outside function

알고리즘 수업 때 배웠던 이중반복문을 사용했는데 쓰잘데기 없는 짓이었던 걸로,,,



함수

연습문제

Q. 주민등록번호로 성별 정보 반환하기

정답

def checkGender(pin):
    gender = pin.split('-')[1][:1]

    if int(gender) % 2 == 0:
        print("여성")
    else:
        print("남성")

오답

def checkGender(pin):
    gender = pin.split('-')[1][:1]

    if gender == '1':
        print('남성')
    else:
        print('여성')

이 답도 틀린 로직은 아니지만 이렇게 되면 주민등록번호 뒷자리가 3,4로 시작하는 경우엔 결과를 출력할 수 없으므로 위 로직대로 구현하는 것이 좋다. (내가 90년대생이라 00년대생부터는 차마 생각을 못했다......^^ 프로그래밍 사고가 부족해서가 아니라 나이가 많아서 틀린 거임 이게 맞음




파이썬 심화

튜플과 집합

튜플(tuple)

리스트와 마찬가지로 순서가 있는 자료의 모음이지만 내용 변경 불가능
주로 리스트와 함께 딕셔너리 비슷한 것을 구현할 때 사용한다.
ex) a_dict = [('bob','24'),('john','29'),('smith','30')]

리스트 vs 튜플

  • 요소의 수정, 추가, 삭제
    리스트(O) / 튜플(X)
  • 사용 괄호
    리스트: 대괄호[] / 튜플: 소괄호 ()

집합(set)

집합을 구현하는 방법으로 중복 제거에 유용

a = [1,2,3,4,5,3,4,2,1,2,4,2,3,1,4,1,5,1]
a_set = set(a)

print(a_set)
{1, 2, 3, 4, 5}
  • 교집합 : &

  • 합집합 : |

  • 차집합 : 기준집합 - 비교집합

a = ['사과','감','수박','참외','딸기']
b = ['사과','멜론','청포도','토마토','참외']

aSet = set(a)
bSet = set(b)

print(aSet & bSet)
> {'사과', '참외'}

print(aSet | bSet)
> {'수박', '참외', '딸기', '토마토', '사과', '감', '청포도', '멜론'}

print(bSet - aSet)
> {'청포도', '멜론', '토마토'}

f-string

자바스크립트의 리터럴과 마찬가지로 변수명을 직관적으로 표기하는 방식

  • 기존의 방식
print('저는 ' + name+'입니다.')
  • f-string
print(f'저는 {name}입니다.)

예외처리 : try - except

에러가 발생해서 print가 중단되는 일이 없도록 에러를 건너뛰고 처리하는 방식. 너무 많이 쓰면 에러가 어디서 발생했는지 알 수 없으므로 남용하지 않는 것이 좋다.

Q. 20세 이상만 출력하기

people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby'},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]

for person in people:
    try:
        if person['age'] > 20:
            print (person['name'])
    except:
        name = person['name']
        print(f'{name} - 에러입니다')
        
> carry
  ben
  bobby - 에러입니다
  red
  queen        

{'name': 'bobby'}age를 갖고있지 않기 때문에 try-except를 사용하지 않는다면 에러가 발생한다.


코드 간략화

if문 - 삼항연산자 조건식

if num % 2 == 0:
    result = "짝수"
else:
    result = "홀수"

= result = "짝수" if num%2 == 0 else "홀수"

for

for a in a_list:
    b_list.append(a*2)

= b_list = [a*2 for a in a_list]


map, filter, lambda식

map

리스트의 요소를 조작하는 함수. 액션(=요소를 변경시킬 함수)과 리스트를 인자로 받는다.

Q. people 리스트의 요소를 변경해서 새로운 리스트로 담기

def check_adult(person):
    return '성인' if person['age'] > 20 else '청소년'

result = map(check_adult, people)

print(list(result))
> ['청소년', '성인', '청소년', '청소년', '성인', '성인', '성인', '성인']
  1. 액션 함수 생성 = check_adult
    이때 매개변수는 리스트의 개별적인 요소를 가리킨다.
  2. 리스트의 요소를 변경한 값을 result에 할당
  3. result를 다시 리스트로 담아 출력

lambda

함수를 생성한 후에 호출하는 과정을 생략할 수 있도록 한 줄에 모두 요약한 간이 함수
lambda 매개변수:표현식의 형태로 사용

위 문제의 정답을 lambda식으로 정리하면 다음과 같다.

result = map(lambda x: ('성인' if x['age'] > 20 else '청소년'), people)
print(list(result))

check_adult 함수를 생략함으로써 훨신 더 효율적인 코드 작성이 가능해졌다.

filter

map과 유사하지만 True인 요소만 반환

result = filter(lambda x: x['age'] > 20, people)

print(list(result))
> [{'name': 'carry', 'age': 38}, {'name': 'ben', 'age': 27}, {'name': 'bobby', 'age': 57}, {'name': 'red', 'age': 32}, {'name': 'queen', 'age': 25}]

함수의 매개변수

디폴트값 지정

def cal(a, b=4):
    return a + 2 * b

print(cal(4)) > 12
print(cal(4, 2))  > 8
print(cal(a=6)) > 14
print(cal(a=1, b=7)) > 15

매개변수의 디폴트값을 지정하면 해당 자리에 들어오는 인수가 없을시 디폴트값이 적용된다.

인수 무제한 : *args

매개변수에 *args를 넣으면 인수 갯수에 제한받지 않고 무제한으로 넣을 수 있다.

def favMovies(*args):
    for i, movie in enumerate(args, start=1):
        print(f'인생영화{i}. {movie}')

favMovies('박쥐','펄프픽션','그래비티','타이타닉')
> 인생영화1. 박쥐
  인생영화2. 펄프픽션
  인생영화3. 그래비티
  인생영화4. 타이타닉

💡 i를 0이 아닌 1부터 출력하기 위해 start=1을 디폴트값으로 지정

키워드 인수 : **kwargs

*args와 유사하나 딕셔너리 형태로 저장

def movieInfo(**kwargs):
    print(kwargs)

movieInfo(title='박쥐', director='박찬욱', release=2009)
movieInfo(title='Pulp Fiction', director='Quentin Tarantino', release=1994)
movieInfo(title='Gravity', director='Alfonso Cuaron', release=2013)
movieInfo(title='Titanic', director='James Cameron', release=1997)

> {'title': '박쥐', 'director': '박찬욱', 'release': 2009}
  {'title': 'Pulp Fiction', 'director': 'Quentin Tarantino', 'release': 1994}
  {'title': 'Gravity', 'director': 'Alfonso Cuaron', 'release': 2013}
  {'title': 'Titanic', 'director': 'James Cameron', 'release': 1997}

클래스

자바스크립트의 클래스와 같은 개념

class goldenEgg():
    egg = 100
    status = True

    def crack(self, critic):
        self.egg = self.egg - critic
        if self.egg < 70:
            self.status = False

    def statusCheck(self):
        if self.status:
            print('🥚')
        else:
            print('🍳')

Confession = goldenEgg()
Confession.crack(6)

ProjectWolfHunting = goldenEgg()
ProjectWolfHunting.crack(35)

Confession.statusCheck() > 🥚
ProjectWolfHunting.statusCheck() > 🍳

💡 파이썬의 self는 자바스크립트의 this와 같다.



자바스크립트와 유사한 개념이 많아서 이미 알고 있는 내용은 자바스크립트와 비교하는 방식으로 공부했다. 이제 내일부터는 알고리즘을 본격적으로 공부할 예정이다. 근데,,, 어제 알고리즘 강의를 잠깐 들었었는데 퀴즈를 풀 때마다 정답은 고사하고 접근법부터 전혀 감을 못잡아서 걱정이다....... 후......... 기능을 구현하는 것과 코드를 잘 짜는 것은 전혀 다른 문제라는 걸 몸소 실감했다. 강의를 모두 수강할 때쯤엔 어떤 문제든 척척 해결할 수 있었으면 좋겠다.

그나저나 이번주부터 새로운 팀을 배정받았는데 글쎄 내가 팀장이 됐다. 저번 미니프로젝트 회고록에 아직 팀장 역할은 힘들 것 같다고 적었었는데 어쩜 팀이 바뀌자마자 일이 이렇게...^^ 이왕 이렇게 된 거 리더십을 키우고 협업을 효율적으로 조율해보는 기회로 삼아야겠다. 다음 프로젝트 때는 보다 더 적극적으로 행동하는 게 목표였는데 일단 반강제적으로... 그렇게 됐다.

profile
개그우먼(개발을 그은성으로 하는 우먼)

2개의 댓글

comment-user-thumbnail
2022년 11월 9일

ㅎㅎ팀장의 무게감을 너무 크게 느끼지 않으셨으면 좋겠습니다 잘하실 수 있어요!
알고리즘은 친구처럼 항상 옆에두고 오래오래 봐야 조금 익혀지더라구요
화이팅입니다!

1개의 답글