문제:
반복문 연습문제 짝수의 갯수 출력하기에서
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 += 1
print(count)
이렇게 했더니 결과가
이렇게 나왔다.
강사님 껀
이렇게 나왔는데
시도:
들여쓰기를 자세히 보니 print() 에서 왼쪽 끝으로 가야 한다.
이런식
해결:
print 코드의 들여쓰기를 for문에 맞추니 해결되었다.
알게된점:
print 코드를 if 문 안에 넣으면, if 문의 연산이 끝날 때마다 프린트 한 후 다시 for 문이 작동한다. print가 if 문 안에 들어 있다는 것은 print가 for문 안에 들어 있다는 것. 즉, for문 작동 횟수만큼 print 코드도 계속 작동하게 된다. 그래서 +1 할 때마다 계속 계속 프린트도 해주는 작업이 만들어지는 것.
그런데 프린트를 for 문에 넣지 않고 마지막 줄로 빼면 print가 for 문에서 벗어나게 된다. 그럼 for문이 작동할만큼 신나게 작동한 다음에 print 명령이 실행되므로 for문이 실행될 때마다 변화하는 count 값에서 최종 모습인 숫자 7만 프린트 되게 된다.
들여쓰기를 어떻게 하느냐에 따라 뭐에 뭐가 속해있고, 빠져나오고 하는 것이 결정되므로 역시나 콜론 다음에 오는 자리는 들여쓰기의 위치까지 신경 쓰는 게 매우 중요하다는 것을 다시 상기했다.
그 외 새로 배운 작은 내용:
_syntax 오류가 뜨면 내가 타당한 문장을 구성하였는가? 생각해보아야 한다. 보통은 특수기호가 빠졌거나 짝이 안맞아서 그렇다. 위쪽에 쓴 코드 중에서 붉은 물결표시로 표현되는 문장이 없는지 찾아봐야 한다.
_역슬래시 버튼이 원화 표시이다. 일반 슬래시: / , 역슬래시: \. 이렇게 모양이 다름. /\/\/\/\/\/\/\ 해외에서 역슬래시가 있는 자리를 한국에서는 원화 표시로 쓰고 있는 것임. 둘 중에 뭐가 표시되냐는 부분도 폰트 설정에 따라 다르다는 것도 팁!
_파이썬에서 3의 2승 이라던지, 4의 8승 이라던지. 이런 승 표현 하는 방법은 3**2, 4**8 이런식으로 별 두개 붙이고 승
_나머지 구하는 법: / 슬래시 하면 나눗셈, % 퍼센트 하면 나머지 구하기
a = 3
b = 2
print(a%b)
_파이썬에서 문자열과 숫자를 같이 쓰면 어떤 오류가 나는지
이런 오류가 나는구만
_파이썬 문법 중 참거짓형 새로 배움
응용
_동일하다를 의미하는 ==
이렇게 는는 이렇게 쓰면 왼쪽값과 오른쪽값이 '동일하다' 라는 의미
_이런 것도 있다
이러면 숫자2를 전혀 담지 못하고 b=문자열 'a' 가 됨.
_문자화 된 숫자는 다른 문자열과 붙일 수 있
이러면 또 a에 들어있는 숫자 2는 작은따옴표로 감싸진 순간 문자열로 취급된다.
그래서 위 연산의 결과값은 문자열+문자열 재질이 됨. 잘 처리 됨.
2hello
_이 셋 중에 숫자는 a 뿐. 숫자를 강제로 문자열로 만드는 방법은 작은 따옴표 씌우기. 그리고 str( )에 넣기도 있다.
_이런 것도 있음
len(변수) 하면 변수에 담긴 문자열의 총 글자 수를 한 번에 알려줌. 편리 ㅎㅎ
_이런 것도 있음
변수 대괄호 콜론 숫자 쏙 : 숫자만큼 앞에서 끊어라 이 소리
반대로 이렇게 하면
이런 것도 됨
_이렇게 하면
그대로 다 들어감
_다음은 쪼개기.
변수명 .split('기준문자') 하면
기준 문자를 기준으로 앞 뒤로 조각조각 쪼개짐.
그럼 그 뒤에 쪼개진 조각들을 가지고 [0], [1], [2], [3], [4] 이런식으로 순번으로 불러서
골라다 쓸 수 있음.
그걸 또 쪼갤 수도 있음.
_이미 있는 리스트에 값 추가하기 .append()
_리스트에서 가장 마지막의 값 뽑기
num_list = [1, 2, 3, 4, 5]
result = num_list[-1]
print(result)
이러면 값이 5 나옴
아 오늘 파이썬 기초를 전부 모르다 보니까 새로 배우는 거 엄청 많다. 금광 터졌다 금광! 골드러시!!
이 기본기 재료들을 잘 숙달해서 똑똑하고 재치있는 코드를 짜야지
_길이 구하기 len()
a_list = [1, 2, 3, 4, 5]
result = len(a_list)
print(result)
이러면 답이 5
_정렬하기 .sort() 와 .sort(reverse=True)
a_list = [1, 4, 5, 8, 6, 2, 3]
a_list.sort()
print(a_list)
하면, 답이 [1, 2, 3, 4, 5, 6, 8]
a_list = [1, 4, 5, 8, 6, 2, 3]
a_list.sort(reverse=True)
print(a_list)
하면, 답이 [8, 6, 5, 4, 3, 2, 1]
_내가 원하는 값이 리스트 안에 있는지 확인하기
a_list = [1, 4, 5, 8, 6, 2, 3]
result = (5 in a_list)
print(result)
5가 있으면 참 True
5가 없으면 거짓 False
_딕셔너리에 새로 값 추가하기
a_dict = {'name':'bob', 'age':27, 'friend':['영희','철수']}
a_dict['height'] = 180
print(a_dict)
이러면 답이 a_dict = {'name':'bob', 'age':27, 'friend':['영희','철수'], 'height': 180}
이렇게 height 라는 키밸류가 새롭게 추가됨
_딕셔너리 퀴즈! 아래 people list에서 smith 씨의 science 점수를 출력하라
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'])
이러면 답이 90. 딩동댕
_조건문
money = 3000
if money > 3800:
print('택시를 타자!')
elif money > 1200:
print('버스를 타자')
else:
print('걸어가자')
** 이 때 중요한 것은, if문, for문, 함수 이런 것들 모두 콜론 다음 줄에서의 들여쓰기가 매우 중요하다는 것.
_반복문
fruits = ['사과','배','감','수박','딸기']
for fruit in fruits:
print(fruit)
for ___ in 리스트:
이런 형태로 쓰면 돌리면서 하나씩 출력하거나 사용.
응용
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:
name = person['name']
age = person['age']
if age > 20:
print(name, age)
_Enumerate
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 = people['name']
age = people['age']
print(i, name, age)
이렇게 하면 요소의 순서를 i 자리에 출력함. 자동으로 숫자를 1 2 3 4 5 이런 식으로 매 줄마다 먹인다.
응용
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 = people['name']
age = people['age']
print(i, name, age)
if i > 5:
break
이러면 i가 5 인 데이터까지만 출력하고 break 되어 있으니 멈춤.
다량의 데이터를 조회할 때 유용하다.
_반복문 연습문제: 짝수만 출력하기
num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]
for num in num_list:
if num % 2 == 0:
print(num)
_반복문 연습문제: 짝수가 몇 개인지 출력하기
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 += 1
print(count)
_리스트 안의 숫자를 모두 더하기
num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]
count = 0
for num in num_list:
count = count + num
print(count)
_리스트 안에서 가장 큰 요소 찾기
num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]
bigest = 0
for num in num_list:
if num > bigest:
bigest = num
print(bigest)
이러면 결과값은 6
_파이썬에서의 함수
결과는
def 함수이름(): 꼴로 쓴다.
_이런 것도 가능
def sum(a,b):
return a + b
print(sum(1,2))
이러면 답이 3
def bus_rate(age):
if age > 65:
print('무료입니다.')
elif age > 20:
print('1200')
else:
print('750')
bus_rate(40)
이러면 답이 1200
def bus_rate(age):
if age > 65:
return 0
elif age > 20:
return 1200
else:
return 750
mycharge = bus_rate(15)
print(mycharge)
이렇게 쓸 수도 있음. 이러면 답이 15살 이니까 750
_주민등록번호 가지고 남녀 구분하기 연습문제
def check_gender(pin):
num = pin.split('-')[1][:1]
if int(num) % 2 == 0:
print('여성입니다')
else:
print('남성입니다')
check_gender('140101-1012345')
check_gender('140101-2012345')
check_gender('140101-4012345')
check_gender('140101-1012345')
check_gender('140101-2012345')
여기서는 가져온 num값을 int()를 주어 숫자로 바꾸는 지점이 포인트!
_튜플: 리스트랑 똑같은데 [] 대괄호를 () 소괄호로 쓰고, 리스트랑 다르게 수정이 불가능하다.
우선 보통의 리스트▼
fruits = ['사과', '감', '배', '오이']
fruits[1] = '김치'
print(fruits)
결과값: ['사과', '김치', '배', '오이']
튜플▼
fruits = ('사과', '감', '배', '오이')
fruits[1] = '김치'
print(fruits)
결과값: 에러
그 외
사전형에서도 이렇게 중괄호 대신에 튜플로 쓸 수 있는데, 복잡해보이지만 마찬가지로 불변형이라는 메리트 때문에 쓴다.
_SET. 집합.
프린트 시, 자동으로 중복을 제거해주며 서열대로 정리해주는 효과가 있다.
집합을 여러개 만들어서 서로 집합 간에 교집합, 합집합, 차집합을 구할 수도 있다.
교집합 구하기 &
a = ['사과','감','배','수박','딸기']
b = ['사과','바나나','수박','오이','소세지','양상추']
set_a = set(a)
set_b = set(b)
print(set_a & set_b)
합집합 구하기 |
a = ['사과','감','배','수박','딸기']
b = ['사과','바나나','수박','오이','소세지','양상추']
set_a = set(a)
set_b = set(b)
print(set_a | set_b)
차집합 구하기
student_a = ['물리2','국어','수학1','음악','화학1','화학2','체육']
student_b = ['물리1','수학1','미술','화학2','체육']
set_a = set(student_a)
set_b = set(student_b)
print(set_a - set_b)
_f-string 에프스트링 ** 자주쓴다고함 **
f는 formatted string의 약자이다. String Formatting(문자열 포맷팅) 기술이란 문자열 속 특정한 위치에 특정한 값을 삽입해주는 것을 말한다. temp_html할 때 백틱 속에 넣던 ${ } 요 제이쿼리 코드와 비슷한 기능. 요것도 문자열포맷팅 기능이었던 것이다.
scores = [
{'name':'영수','score':70},
{'name':'영희','score':65},
{'name':'기찬','score':75},
{'name':'희수','score':23},
{'name':'서경','score':99},
{'name':'미주','score':100},
{'name':'병태','score':32}
]
for a in scores:
name = a['name']
score = a['score']
print(f'{name}의 점수는 {score}점 입니다.')
이렇게 프린트 하는 문자열의 작은 따옴표 앞에 f를 넣고, 벡터값을 주고 싶은 자리에 { } 해서, 앞서 선언한 변수를 넣어줌.
이 때 백터에 집어 넣는 변수는 앞에서 어떤 형태로든 선언만 되어 있으면 갖다 쓸 수 있기 때문에, 함수에 들어 있는 매개 변수도 사용 가능.
예를 들어,
_트라이 익셉트 try: except:
이렇게 쓴다. 들어가는 자리가 중요한데, for문 돌리고 난 다음에 구체적으로 조건 거는 자리에서 조건을 감싸면 된다.
그러면 결과는,
이런식으로 나온다. 즉, try except의 효과는 에러가 나도 명령을 실행하게 해주는 것과 동시에 정확히 어느 과정에서 에러가 난 건지 짐작할 수 있게 해준다.
그러나 이것을 자주 사용하면서 코딩을 진행하면 나중에 어디서 에러가 났는지 모르는 등 희한하게 꼬인다고 함.
구체적으로 어떻게 꼬인다는 건지는 추후 알아보고 싶다.
_함수파일 따로 보관하고 가져다 쓰기
이런식으로 하면 된다. 현재 열려 있는 python파일은 main_test.py 파일인데,
함수에 대한 복잡한 구조식은 모두 main_func.py 파일에 몰아서 저장해 두었고,
현재 열려 있는 main_test.py 파일에서는 간단하게 함수 이름만 톡톡 쓰면 함수가 들어간다.
이게 가능한 이유는 맨 윗줄에 써 있는
from 함수저장용파일 import *
이라는 코드 덕분이다. 여기서 ' * ' 은 '모두' 가져온다는 뜻.
심화
_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(a):
if a['age'] > 20:
return '성인'
else:
return '청소년'
result = map(check_adult, people)
print(list(result))
map은 늘 두가지 재료가 필요하다. 하나는 함수 짜 놓은 것이고, 또 하나는 그 함수를 적용할 반복가능 자료형 데이터다.
이 두 가지 준비물을 가지고 map이 하는 일은,
반복가능 자료형 데이터에서 요소를 for문처럼 하나씩 가져다가 짜 놓은 함수에 넣고 실행시켜 값을 추출한다.
그러면 여러개 값이 만들어지기 때문에, map의 마무리는 list(result) 라던지 tuple(result)라던지를 해서 다시금 자료형의 데이터로 내놓게 된다.
굳이 for문을 안 쓰고 map을 쓰는 이유는 단순성과 범용성 때문이다. 동작하는 데 재료로 썼던 자료형과 함수는 각각 독자적인 덩어리로 존재하기 때문에, 다른데서 필요할 때 또 재료로 갖다 쓰기 좋을 것 같다.
_람다 lambda x: x
간단하거나 일회성 작업인데 함수가 필요할 때 사용
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}
]
result = map(lambda x: ('성인' if x['age'] > 20 else '청소년'), people)
print(list(result))
앞서 배웠던 map의 재료가 1.적용할 함수 2.적용할 자료형 이라고 하였으니 이름없는 함수, 혹은 간이함수 쯤 개념인 람다 함수도 1번 자리에 넣을 수 있다.
람다는 lamba x: x 형식으로 쓰여,
앞의 x가 돌릴 변수의 이름이 될 글자이고
뒤의 x 자리에 그 변수에게 무슨 짓을 할 지 적으면 된다.
_filter: 필터는 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}
]
result = filter(lambda x: x['age'] > 20, people)
print(list(result))
이렇게 아까 배운 맵과 같이 1.(조건) 함수 2.순회 가능한 데이터 를 재료로 요구한다.
조건을 거는 자리에 오는 것이 꼭 함수의 형태여야 함을 유의한다.
_가변 매개변수 *args
def hey(*args):
for name in args:
print(f'{name}야 밥 먹어라~')
hey('철수', '영희', '민수')
결과값
이렇게 함수 선언 시, 매개변수 자리에 *args를 넣어 놓고 그걸로 함수를 짜 놓으면
나중에 함수를 사용할 때 마음껏 불특정 매개변수를 넣어줄 수 있다.
한 번 짜 놓고 페이지 여기저기에서 활용해야 하는 함수에 유용할 듯!
_키워드 가변 매개변수 **kwargs
def cal(**kwargs):
print(kwargs)
cal(name='bob',age=30)
결과는,
이렇게 추후에 내가 함수를 쓸 때, 넣어주는 매개변수들을 가지고 새로운 딕셔너리를 만들어서 돌려준다.
주의해야할 점은 매개변수 자리를 채울 때, 키값과 밸류값의 관계를 = 으로 표현해줘야 한다는 것이다.
'About coding > Today I learned' 카테고리의 다른 글
2023년 03월 23일 TIL (2) | 2023.03.23 |
---|---|
2023년 03월 22일 TIL (0) | 2023.03.22 |
2023년 3월 17일 TIL (0) | 2023.03.17 |
2023년 3월 16일 TIL (0) | 2023.03.16 |
2023년 3월 14일 TIL (1) | 2023.03.14 |