학습내용
- 파이썬 기초
- 변수
- 자료형
- 문자열
- 리스트와 딕셔너리
- 조건문
- 반복문
- 함수
- 파이썬 심화
- 튜플과 집합
- 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
key와 value로 이루어진 자료의 모음으로 자바스크립트의 객체와 비슷한 개념
기본적인 문법은 자바스크립트의 조건문과 동일하나 파이썬에서는
else if
를elif
로 표기한다.
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년대생부터는 차마 생각을 못했다......^^ 프로그래밍 사고가 부족해서가 아니라 나이가 많아서 틀린 거임 이게 맞음
리스트와 마찬가지로 순서가 있는 자료의 모음이지만 내용 변경 불가능
주로 리스트와 함께 딕셔너리 비슷한 것을 구현할 때 사용한다.
ex)a_dict = [('bob','24'),('john','29'),('smith','30')]
리스트 vs 튜플
- 요소의 수정, 추가, 삭제
리스트(O) / 튜플(X)- 사용 괄호
리스트: 대괄호[]
/ 튜플: 소괄호()
집합을 구현하는 방법으로 중복 제거에 유용
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)
> {'청포도', '멜론', '토마토'}
자바스크립트의 리터럴과 마찬가지로 변수명을 직관적으로 표기하는 방식
print('저는 ' + name+'입니다.')
print(f'저는 {name}입니다.)
try
- except
에러가 발생해서
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]
리스트의 요소를 조작하는 함수. 액션(=요소를 변경시킬 함수)과 리스트를 인자로 받는다.
Q. people
리스트의 요소를 변경해서 새로운 리스트로 담기
def check_adult(person):
return '성인' if person['age'] > 20 else '청소년'
result = map(check_adult, people)
print(list(result))
> ['청소년', '성인', '청소년', '청소년', '성인', '성인', '성인', '성인']
check_adult
result
에 할당result
를 다시 리스트로 담아 출력함수를 생성한 후에 호출하는 과정을 생략할 수 있도록 한 줄에 모두 요약한 간이 함수
lambda 매개변수:표현식
의 형태로 사용
위 문제의 정답을 lambda식으로 정리하면 다음과 같다.
result = map(lambda x: ('성인' if x['age'] > 20 else '청소년'), people)
print(list(result))
check_adult
함수를 생략함으로써 훨신 더 효율적인 코드 작성이 가능해졌다.
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
와 같다.
자바스크립트와 유사한 개념이 많아서 이미 알고 있는 내용은 자바스크립트와 비교하는 방식으로 공부했다. 이제 내일부터는 알고리즘을 본격적으로 공부할 예정이다. 근데,,, 어제 알고리즘 강의를 잠깐 들었었는데 퀴즈를 풀 때마다 정답은 고사하고 접근법부터 전혀 감을 못잡아서 걱정이다....... 후......... 기능을 구현하는 것과 코드를 잘 짜는 것은 전혀 다른 문제라는 걸 몸소 실감했다. 강의를 모두 수강할 때쯤엔 어떤 문제든 척척 해결할 수 있었으면 좋겠다.
그나저나 이번주부터 새로운 팀을 배정받았는데 글쎄 내가 팀장이 됐다. 저번 미니프로젝트 회고록에 아직 팀장 역할은 힘들 것 같다고 적었었는데 어쩜 팀이 바뀌자마자 일이 이렇게...^^ 이왕 이렇게 된 거 리더십을 키우고 협업을 효율적으로 조율해보는 기회로 삼아야겠다. 다음 프로젝트 때는 보다 더 적극적으로 행동하는 게 목표였는데 일단 반강제적으로... 그렇게 됐다.
ㅎㅎ팀장의 무게감을 너무 크게 느끼지 않으셨으면 좋겠습니다 잘하실 수 있어요!
알고리즘은 친구처럼 항상 옆에두고 오래오래 봐야 조금 익혀지더라구요
화이팅입니다!