개발자 되는 중/TIL&WIL

내배캠 TIL 2022.11.08 (python 1주차)

SeonChoco 2022. 11. 8. 18:35

류제천 튜터님과의 상담

github으로 협업하는 법 배웠다.

issu 기능을 이용해서 

무엇을 해야하는지

무엇을 끝냈는지

누가 해야하는 일인지 등을 

올려놓을 수가 있고, 다 끝나면 done을 누르는 기능 또한 있다

풀 리퀘스트를 할 때도 이 issue와 연결해서 pull request가 완료되면 자동으로 issue가 close 되도록 할 수도 있다

안해봐서 정확히는 모르는데 

혼자 연습을 해봐야겠다.

 

오늘 목표

파이썬 강의 끝내고

프로그래머스 문제 풀기

알고리즘 강의 강의 시작하기

 

 

새로운 조에 배정되었다.

1조가 되었고 조이름은 사람이 조아요

(협업과 소통을 잘하는 개발자가 되자는 의미를 담았다)

새로운 조원들과 서로 멤버카드를 활용해서 소개를 했는데, 

민수님꺼가 잘 되어있어서 나도 저정도로 잘 만들어야겠다 맘 먹었다.

TMI 제출하였다.

멤버들과 수다떨고 멤버카드 업뎃하면서 12시까지 보냈다.

 

1-2. 파이썬 시작하기

파이썬이란 우리의 언어를 컴퓨터 언어로 바꿔주는 일종의 번역팩

읽기 쉽게 만든 언어

초보자들에게 진입장벽 낮다

무료/오픈 소스로 운영되고 커뮤니티가 커서 직접 구현하기 힘든 기능 다른 개발자의 라이브러리를 이용해 쉽게 코딩할 수 있다.

 

파일 생성

프로젝트 생성

초록색 실행버튼은 클릭하면 실행이 되지만 가끔 내가 보고 있는 파일이 아닌것을 실행해 줄 때가 있다.

 

1-3. 변수 선언과 자료형

변수 선언 (변수의 값은 정수, 소수, 문자열, boolean, 비교 연산자 )

a = 2 # 2를 a에 넣는다.
print(a)

b = a  # b에 들어있는 값인 2를 b에 넣는다.
a = 7  #a에 새로운 값을 넣어준다
print(a, b) # 결과 7, 2 프린트 

 

숫자형

사칙연산, 나머지 구하기, 제곱

a = 3
b = 5

print(a+b)
print(a-b)
print(a/b)
print(a*b)
print(a**b) #제곱
print(a%b)  #나머지 


Bool 자료형

비교연산자 결과로 나타내기 위해 쓴다 >/ </ ==/ >=/ <=/

논리연산자를 이용할 수 있다.and/ or/ not  

a = True #T가 대문자여야 된다.
print(a) #결과 True
a = (3 > 2)
print(a)

b = (2 == 3)
print(b)

c = (2 > 3)
print(c)

 

#변수에 값을 할당한다는 것의 의미

a =2 란  2를 지칭할 수 있도록 a라는 박스에 넣어준다. a는 2라는 값을 가리키고 있다.

메모리에 올려둔다고 표현

 

  • Q. 숫자들의 평균 구하기
a=24
b=16
c=26

print((a+b+c)/3)

 

1-4. 문자열 다루기

작은 따옴표, 큰따옴표

a = 2
b = 'a'
print(b) #결과는a
a = 2
b = a
print(b) #결과는 2
a = 2
b = 'hello'
print(a + b) #에러남

숫자 2 와 문자열 '2'는 다르다

숫자와 문자열은 연산할 수 없다

str()

b = str(2) #숫자를 문자열로 바꿔주는 코드

 

인덱싱과 슬라이싱

문자열은 '문자들의 모임'이기 때문에 그 일부를 따로 떼어 부르는 방법이 있습니다. 한 글자 씩 부를 때는 몇 번째인지 '인덱스'를 넣어 불러서 인덱싱이라고 합니다.

문자열의 일부를 잘라낼 때는 슬라이싱이라고 해요.

text = 'abcdefghijk'

result = len(text) # 텍스트 길이 구한다
print(result)

print(text[0])   #[0]에 해당하는 문자열 보여준다
print(text[:3])  #[3]까지 #여기서부터는 슬라이싱에 해당
print(text[3:])  #[3]부터 끝까지
print(text[5:8]) #[5]부터 [8]까지
print(text[:])   #처음부터 끝까지

.split('')

(특정 문자열로 슬라이싱)

myemail = 'tjsgud2564@naver.com'

print(myemail.split('@')) #문자를 쪼갤 때 쓴다. 
print(myemail.split('@')[0])
print(myemail.split('@')[1])
print(myemail.split('@')[1].split('.'))
print(myemail.split('@')[1].split('.')[0])

  •  Q. 문자열의 앞의 반만 출력하기

"sparta"의 앞의 3글자인 "spa"만 출력해봅시다.

text = 'sparta'

result = text[:3]

print(result)
  •  Q. 전화번호의 지역번호 출력하기
phone = "02-123-1234"

result = phone.split('-')[0]

print(result)


1-5. 리스트와 딕셔너리

리스트

리스트명 = ['', '', '']

a_list = [2, '사과', False, ['배', '귤']] 
# 리스트에 들어갈 수 있는 것들
# 숫자, 문자열, Boolean, 리스트

result = a_list[3][1]
a_list = [3, 5, 1, 4, 2, 8]
a_list.append(99)
a_list.append(80) #리스트에 추가

a_list.sort() # 리스트 안의 데이터를 오름차순으로 정렬
a_list.sort(reverse=True) #내림차순 정렬

print(a_list)
print(a_list[5:7]) #믄자열 뿐만 아니라 리스트에서도 쓴다
print(a_list[-1])  #마지막 데이터 불러오기
print(len(a_list))  #리스트 길이 구하기
a_list = [3, 5, 1, 4, 2, 8]

result = (3 in a_list) #데이터가 리스트 안에 있는지 확인한다

print(result)

딕셔너리

딕셔너리명 = { '', '', '' }

키(key): 값(value)

순서가 없다

a_dict = {'name':'wandu', 'age':9, 'food':['건사료', '습식사료']}

a_dict['speices'] = 'korean short hair' #새로운 데이터 넣는다
print(a_dict['name'])
print(a_dict['age'])
print(a_dict['food'][0])
print('speices' in a_dict)

리스트 안에 딕셔너리

cats =[
    {'name':'wandu', 'age':9,},
    {'name':'jadu', 'age':8,}
]

print(cats)
print(cats[1]['age'])

  • Q. 딕셔너리에서 원하는 정보를 찾아보기
people = [
    {'name': 'bob', 'age': 20, 'score':{'math':90,'science':70}},
    {'name': 'carry', 'age': 38, 'score':{'math':40,'science':72}},
    {'name': 'smith', 'age': 28, 'score':{'math':80,'science':90}},
    {'name': 'john', 'age': 34, 'score':{'math':75,'science':100}}
]

print(people[2]['score']['science'])

1-6. 조건문

파이썬 문법에서  들여쓰기는 엄청 중요하다

뭐가 어디에 포함되어있는지를 나타내기 때문이다.

: 콜론은 그러면 이라는 의미를 가진다 

if, elif, else

money = 3000

if money > 5000:
    print('택시를 타자!')
elif money > 3000:
    print('지하철을 타자')
elif money > 1200:
    print('누비자를 타자')
else:
    print('걸어가자')
print('그럼 뭘타?') 
#마지막 줄은 들여쓰기 안 되어있어서 조건문에 들어가지 않았다.
#조건과 관계없이 계속 프린트된다.

1-7. 반복문

for ~ in ~s

반복되는 내용을 계속 써주기 힘드니까 사용한다.

fruits = ['사과','배','감','수박','딸기']

for fruit in fruits:
    print(fruit)

 

 

  • Q. 사람의 나이 출력하기

리스트 안에 딕셔너리가 들어가 있고, 반복문으로 데이터를 다 뽑아주고,  조건문으로 걸러서 결과를 낸다.(굉장히 전형적인 패턴)

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

for person in people:
    if person['age'] > 20:
        print(person['name'], person['age'])

#Shift + tab (tab 되돌리기)

 

for문 - enumerate, break

for i, 리스트 낱개명 in enumerate(리스트명):
    뽑아낼 내용
    if i > 2: 
        break

너무 많은 개수의 데이터를 가지고 코딩을 할 때

이 기능을 가지고 반복문을 중간에 멈춰서 결과를 짧게 출력해줄 수 있다.

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



for i, person in enumerate(people): #각각의 데이터에 숫자를 붙여준다
    name = person['name']
    age = person['age']
    print(i, name, age)
    if i > 2: # 데이터 번호가 2 이상일 때 엄춰라
        break

 

1-8. 반복문 - 연습문제

#print()를 조건문에서 빼주어 마지막 결과만 출력하면 된다. (그전에 그렇게 하지 않아서 수정)

Q. 리스트에서 짝수만 출력하는 함수 만들기

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

b_list = []

for num in num_list:
    if num % 2 == 0:
        b_list.append(num)

print(b_list)

 Q. 리스트에서 짝수의 개수를 출력하기

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

b_list = []

for num in num_list:
    if num % 2 == 0:
        b_list.append(num)

print(len(b_list))

 

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

count = 0

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

print(count)

 Q. 리스트 안에 있는 모든 숫자 더하기

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

total = 0

for num in num_list:
    total += num

print(total)

 Q. 리스트 안에 있는 자연수 중 가장 큰 숫자 구하기

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

num_list.sort()

print(num_list[-1])

 

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

print(max(num_list))

 

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

max_num = 0

for num in num_list:
    if num > max_num:
        max_num = num

print(max_num)

1-9. 함수

같은 동작을 할 때 쓴다.

def cheerup():
    print('안녕')
    print('오늘도 열심히네?')
    print('고생이 많아')

cheerup()

def sum(a,b):
    return a+b

result = sum(1,2)
print(result)

def bus_rate(age):
    if age > 65:
        print('버스비가 무료입니다')
    elif age >20:
        print('성인 요금을 내세요')
    elif age > 13:
        print('청소년 요금을 내세요')
    elif age > 7:
        print('어린이 요금을 내세요')
    else:
        print('버스비가 무료입니다.')


bus_rate(15)
bus_rate(5)
bus_rate(26)
bus_rate(90)
bus_rate(10)

def bus_rate(age):
    if age > 65:
        return 0
    elif age > 20:
        return 1700
    elif age > 13:
        return 1200
    elif age > 7:
        return 500
    else:
        return 0


print(bus_rate(15))
print(bus_rate(26))
print(bus_rate(90))
print(bus_rate(10))
print(bus_rate(4))

 

  •  Q. 주민등록번호를 입력받아 성별을 출력하는 함수 만들기

내가 쓴 코드

def check_gender(num):
    gender_num = num.split('-')[1][:1]
    if gender_num == '2':
        print('여자입니다')
    elif gender_num == '4':
        print('여자입니다')
    elif gender_num == '1':
        print('남자입니다')
    elif gender_num == '3':
        print('남자입니다')

강의자료 답  (나머지 연산을 이용하면 간단)

def check_gender(num):
    gender_num = num.split('-')[1][:1]
    if int(gender_num) % 2 == 0:
        print('여성입니다')
    else:
        print('남성입니다')

 

2-1. 파이썬 문법 뽀개기 - 심화

쓸만한 것도 있고, 알아두기만 해도 괜찮은 것들도 나올 것

 

2-2. 튜플, 집합

튜플 tuple

리스트랑 똑같이 생겼는데 불변이다.

소괄호 안에 넣어준다.

튜플 명 = ( , , ,)

a = (1,2,3)
a[0] = 99 # 에러가 난다. 튜플을 데이터 수정이 불가하기 때문

a_dict = [('bob','24'),('john','29'),('smith','30')]
# 딕셔너리 대신에 튜플로 딕셔너리 비슷하게 만들어야 할 때 많이 쓰인다. 

 

집합 set

set()

중복을 제거해준다

a = ['호두', '완두', '자두', '삐두', '황두']
b = ['완두', '밤두' , '호두','두두', '치두']

a_set = set(a)
b_set = set(b)

print(a_set & b_set) #교집합
print(a_set | b_set) #합집합
print(a_set - b_set) #차집합

student_a = ['물리2','국어','수학1','음악','화학1','화학2','체육']
student_b = ['물리1','수학1','미술','화학2','체육']

a_set = set(student_a)
b_set = set(student_b)

print(a_set - b_set)

2-3. f-string

변수로 더 직관적인 문자열 만들기

변수명을 문자열과 쉽게 섞어주는 방법

f ' {변수명}과 문자열 '

scores = [
    {'name':'영수','score':70},
    {'name':'영희','score':65},
    {'name':'기찬','score':75},
    {'name':'희수','score':23},
    {'name':'서경','score':99},
    {'name':'미주','score':100},
    {'name':'병태','score':32}    
]

for sco in scores:
    name = sco['name']
    score = sco['score']
    print(f'{name}의 점수는 {score}점입니다.') 
    #score을 str으로 문자로 바꿔주지 않았는데 오류 없이 실행된다.
    print( name + '의 점수는 ' +str(score)+ '점입니다' )

2-4. 예외처리

try:

 조건문

except:

   에러나면 대신 나타낼 내용

에러가 있어도 건너뛰게 할 수 있는 방법

내 파일의 오류가 아니라 서버의 오류인 경우 구별하기 위해서 사용한다

남용하면은 에러가 나는데 계속 작동하기 때문에 에러를 찾기어려워 질 수 있다.

웬만하면 쓰지마라

for person in people:
    try:
        if person['age'] > 20:
            print (person['name'])
    except:
        print(person['name'], '에러입니다')

 

2-5. 파일 불러오기

깔끔하게 파일 분리하는 법

 

main_func.py

def say_ilu():
    print('사랑해')

def say_ilu_to(name):
    print(f'{name}를 사랑해')

 

main_test.py

from 파일명 import 함수명 or *(전체)

from main_func import * #main_func.py에서 전체파일을 불러온다
from main_func import say_ilu_to, say_ilu
#app.py에 라이브러리 import할 떄 쓰는거다!


say_ilu()
say_ilu_to('완두')
say_ilu_to('자두')

2-6. 한줄의 마법

축양형 만드는 법

if문 줄이기

기존에 하던 방식

num = 3

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

print(f'{num}은 {result}입니다')

한줄의 마법 

num = 3

result = ('짝수' if num % 2 == 0 else '홀수') #괄호가 없어도 된다.

print(f'{num}은 {result}입니다')

 

for문 줄이기

기존 방식

a_list = [1,3,2,5,1,2]

b_list = []

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

print(b_list)
# print를 조건문 바깥에 두어 마지막으로 완성된 리스트만 불러온다.

#for문으로 뽑아낸 데이터들을 새로운 리스트에 넣는 방법

이걸 보니까 아까 퀴즈에서 실수 했다는 것을 알겠다.

 

한줄의 마법

a_list = [1,3,2,5,1,2]

b_list = []

b_list = [a*2 for a in a_list]

print(b_list)

여기서부터 조금 어려울 수 있다.

 

2-7. map, filter, lambda식

map - 리스트의 모든 원소를 조작하기

result = map(함수명, 리스트명)

1차 조작 - 반복문 대신 map 이용하기

people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby', 'age': 57},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]
def check_adult(person):
    if person['age'] > 20:
        return '성인'
    else:
        return '청소년'
#반복문으로 person을 뽑아주지 않은 상태이다

result = map(check_adult, people)
#people을 반복문처럼 돌려주면서 check_adult에 하나씩 넣어라

print(list(result))
#list 해주지않고 그냥 print 하면 <map object at 0x0000022156394DF0>이런 코드가 뜬다

# map을 이용한 데이터들을  list 해주지않고 그냥 print 하면 <map object at 0x0000022156394DF0>이런 코드가 뜬다

 

2차 조작- if문 축약해주기 

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

result = map(check_adult, people)

print(list(result))

 

lamda

3차 조작 lamda를 이용해서 함수를 쓰지 않고 바로 조건을 넣어주었다.

map(lamda 리스트 낱개 이름 : if문, 리스트명) 

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

print(list(result))

 

filter - 리스트의 모든 원소 중 특별한 것만 뽑기

 map이랑 거의 비슷한데 True 인 것만 뽑는다. 

filter(lambda x:x 조건, 리스트명)

(관용적으로 x를 많이 사용한다) 

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

print(list(result))

2-8. 함수 심화

함수의 매개변수 (매개변수에 값을 정확하게 할당해주는 것)

직접쓰기보다는 내장함수 등을 이용할 때 도큐먼트를 읽는데 도움이 된다.

 

1. 일반함수

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

result = cal(1,2)
print(result)

2.값을 넣어줄 때 매개변수에 지정해서 넣어준 것

result = cal(b=2,a=1)
print(result)

 

3.함수 만들 때 매개변수에 값을 이미 할당해준 것

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

result = cal(1)
print(result)

함수에 값을 할당했더라도, 내가 새로운 값을 넣어주면 그 값을 적용해준다

result = cal(1,3)
print(result)

4. 입력값 개수를 지정하지 않고 모두 받는 방법

*arg 

관례적으로 arg를 쓰는거지 arg만 써야하는건 아니다

*부분이 더 중요

def cal(*args):
    for name in args:
        print(f'{name} 양치해라~') #for문으로 args리스트에 있는 데이터를 다 뽑아준다

cal('선린','선우','고양이','강아지') #cal 함수에 들어갈 값들

5. 키워드 인수를 여러개 받는 방법 

받아온 데이터를 딕셔너리 형태로 만들어준다 

**kwargs 

앞쪽의 **이 중요하고 이름은 사실 마음대로 정해도 된다

def cal(**kwargs):
    print(kwargs)

cal(name='선형', age =27, height=162)
cal(name='선린', age=21, height=156)

2-9. 클래스

언제 사용하는지를 아는것이 어떻게 사용하는지를 아는 것 보다 더 중요

 

뱀의 HP를 중앙에서 관리하는것 vs  각각 HP를 가지고 있는것 뭐가 더 나을까?

나는 여러마리일 수록 중앙에서 관리하는게 편할것 같다고 생각했는데 아니었다.

각각이 가지고 있는데 더 낫다. 이런 것을 객체지향적 이라고 한다. 

 

1.물체에 물체에 관련된 속성을 넣는다.

2. 컨트롤할 함수를 만들어 붙인다

3.중앙에서는 함수만 불러들이면 객체들이 관리가 된다.

 

self는 javascript의 this와 비슷한 건가? 구글링해보니까 비슷한거 맞는 것 같다.

class Monster():
    hp = 100
    alive = True

    def damage(self, attack):  #damage함수는 파이썬 내장함수이다.
        self.hp -= attack
        if self.hp < 0:
            self.alive = False

    def status_check(self):
        if self.alive == True:
            print('살았다')
        else:
            print('죽었다')  #여기까지가 클래스

m1 = Monster() #m1을 인스턴스라고 부른다
m1.damage(150)
m1.status_check()

m2 = Monster()
m2.damage(50)
m2.status_check()