[프리코스] 파이썬 기초 특강 4일차
❇️ 오늘 배운 내용
1. LIST 인덱싱, 슬라이싱
2. LIST 원소 삭제, 추가, 재할당, 존재 여부
3. 문자열 포매팅
4. Tuple, Range 자료형
5. for 반복문
주요 개념
Indexing | [ ] | type() | .pop() | f-string | tuple |
slicing | [0: :1] | list() | .append() | string | range |
for 반복문
리스트 컴프리핸션
R - sep() , n:n 수열
어제자 간단 복습
1. 리스트 더하기, 곱하기
2. if elif else 조건문
리스트 인덱스
강사님이 코드 트리 사이트 추천하심.
💠 인덱싱 기본
[핵심]
- 파이썬은 0부터 시작함. 첫번째 위치라고 1번이 아님!
number_list[0] - 끝에서 셀 때는 0이 아니라 -1임! (음수 인덱싱)
number_list[-1]
#기본 원리
- 위치(index)를 사용해서 리스트 내부 원소(데이터)에 접근할 때 사용하는 개념.
- 웬만한 언어에서 인덱싱을 []를 사용.
- 리스트에 쓰는 []와 헷갈리지 말 것!
#리스트 생성
1- 12345가 저장된 리스트를 생성하고
2- 변수에 할당
(변수 만들고 리스트 생성하는 개념이 아님)
number_list = [1, 2, 3, 4, 5]
데이터 - [1, 2, 3, 4, 5]
인덱스 - 0, 1, 2, 3, 4
역으로 -5, -4, -3, -2, -1
#인덱싱 해보자
- 리스트형 변수 [원소의 위치]
- 파이썬은 0부터 시작함. 첫번째 위치라고 1번이 아님!
number_list[0]
-> 1가 나옴
print(number_list[2])
== 3
# 음수 인덱싱 (-1, -2...)
- 뒤에서부터 찾는다.
- 마지막 위치의 원소를 찾으려면 -1
- 끝에서 셀 때는 0이 아니라 -1임!
print(number_list[-1])
== 5
확인해볼 것
- 리스트형 변수 [원소의 위치]
리스트형 변수만 해당인가? 인덱싱 아니지 않나 데이터프레임도 되는데 뭐는 안되고 뭐는 될까? - 파이썬은 0부터 시작함. 첫번째 위치라고 1번이 아님!
r은 1부터 시작하지 않았던가?
추가 설명
- 왜 0부터 시작하나요 헷갈리게?
고대 컴퓨터(196-70)는 성능 구려가지고 0을 버리기에 아까웠다.
1부터 시작하면 0을 버리니까 쌉 아깝다.
💠 슬라이싱 - 인덱싱 활용
[핵심]
- 슬라이싱
- 리스트[시작위치: 마지막 위치: 간격]
- a~b의 것을 뽑고 싶으면 [a-1:b]하라.
#슬라이싱
- 리스트의 특정 구간을 분할 하는 것
- 리스트[시작위치: 마지막 위치: 간격]
- 첫번째부터 세번째까지 분할하기
slice1 = number_list[0:3]
#슬라이싱의 함정(마지막 위치) - 왜 첫번째~세번째가 0:2가 아닌가요?
- 마지막 위치의 데이터가 포함되지 않기 때문. (고대 개발자들이 이케 만들어서.. 외워야..)
- 첫번째는 또 0부터 시작;;
즉...
a~b의 것을 뽑고 싶으면
[a-1:b]하라 이거임.
예를 들어
[1:3]에서 [0:3]가 되는 거지.
#간격
- 간격 생략하면 1이 됨
slice2 = number_list[0:4:2]
하면 1, 3, 5가 나옴.
#음수 인덱싱 슬라이싱
slice3 = number_list[-3:-1:1]
-> 3, 4
-1이 마지막 원소인 5니까 그거 빼고 그 앞인 4까지 추출해준 거임.
- 마지막 위치값을 생략한다면, 마지막 원소까지 다 뽑아줌.
slice4 = number_list[-3::1]
-> 3, 4, 5
💠 원소 수정
[핵심]
- 데이터 수정
- 삭제: number_list.pop(뺄 것의 위치) - 위치 생략 시 마지막에.
*** 즉시 변수에 할당하면 뺀 거를 따로 저장할 수 있다. - 추가: number_list.append(넣을 원소) - 위치는 맨 마지막에.
- 수정: number_list[2] = 10
- 삭제: number_list.pop(뺄 것의 위치) - 위치 생략 시 마지막에.
#데이터 재할당
- 특정 원소 바꽈주기 (인덱스로 뺀 값 마음에 안들 때)
number_list[2] = 10
print(number_list[2])
-> 원래 3이었는데 10 나옴
#리스트변수에 원소를 추가하고 싶을 때
- 리스트형 변수.append(원소)
- 제일 마지막에 넣어줌
number_list.append(6)
string_list.append("h")
#리스트에 변수를 빼고 싶을 때
- 리스트형 변수.pop(원소)
- 제일 마지막 거를 삭제해줌.
number_list.pop()
- 하지만 위치를 지정한다면?
number_list.pop(3)
* 주의할 점
pop으로 뭘 빼내면 순서가 밀림.
즉 3번째 거 빼내면 뒤에거가 앞당겨지고
1번째 거 빼내면 차례대로 앞당겨진단 거임.
- 원소를 하나 빼내서 가져오려면?
number = number_list.pop()
print(number)
-> 5 뽑아줌
즉 상자에 담긴 하나를 다른 작은 상자에 바꿔 담는 거임.
바로 안담아주면 걍 내다버림.
추가 설명
- pop()의 두 가지 특징
- 삭제할 위치를 지정해서 없앨 수 있다.
- 리스트에서 삭제한 원소를 데이터로 되돌려준다.
(리스트에서 빼낸 걸 갖다준다는 거지..)
확인해볼 것
- append(넣을 원소)에 넣을 위치 지정하는 인자 있겠지?
append(넣을 원소, 3) 뭐 이런 식으로 할라나?
💠 원소 존재 여부 - in / not in
#마켓이라는 리스트에 사과가 있느냐.
"사과" in market
#사과가 없느냐.
"사과" not in market
#결과는 true false로 나옴.
그래서 조건문이랑 같이 잘 쓰임.
---
market = ["우유", "달걀"]
if "달걀" in market:
print("우유" * 6)
else:
...
질의응답
- 간격이 1이면 소수점일 때는 알잘딱하게 넘어가주나?
예를 들어서 [0.1, 0.33, 0.35, 1.12, 1.67, 4]
이러면은 0.1, 1.12, 4가 나옴?
노노~ 숫자가 아니라 위치였던 거임!
걍 다 나오는 거임~
띠요옹 나 왜 이거 헷갈린 거냐~! - f스트링 쓰는 게 혹시 코드 성능에 도움이 되나요?
짧은 거 쓸 때는 큰 차이를 못느끼겠읍니다...
코드 실행 성능차이는 없지만 변수가 포함된 문자열을 생성할 때 효율적이라 활용합니다.
특히, 복잡한 형태의 문자열 규칙을 지켜야할 때 활용하기에 좋습니다- 그래도 혹시 하나의 문자열만 쓰면 바이트 덜 차지하지 않을까? 그건 아닌가 흠
number_list[2] = 10
print(number_list)
number_list[3] = 11
print(number_list)
했을 때
[1, 2, 10, 4, 5] ...①
[1, 2, 10, 11, 5]...②
이라고 출력되는데,
①이랑 ②랑 연관 없이 하려면 ([1, 2, 10, 4, 5] 인 리스트와 [1, 2, 3, 11, 5] 인 리스트를 만들려면)
그냥 매번 number_list를 새로 만들어서 입력해야하나요??
네... 리스트 복제해서.. 만드셔야 합니다..
문자열 리스트 실습 문제
string_list = ["a", "b", "c", "d", "e", "f", "g"]
#문제1. a b c만 뽑아라
slice5 = string_list[:3]
[0:3:1] , [0:3]
#문제2. c d e f 뽑아라
slice6 = string_list[2:-2]
or
len(string_list)
-> 음, 총 7개구나. 그럼 마지막 거는 위치가 6겠구나.
slice6 = string_list[2:6]
#문제3. e f g 뽑아라
slice7 = string_list[-3:]
[4:0]
#문제4. a c e 뽑아라
slice8 = string_list[0:5:2]
[0:4:2] 아님;; 주의!!
문자열
💠문자열(그냥 "ㅇㅇㅇ" 이런 거)의 인덱스, 연산, 수정
- 문자열 인덱싱, 연산 - 리스트와 동일
word = "abc"
word[1] 하면 b 나오는... - 다만 문자열은 값의 재할당(수정), 추가, 삭제가 불가능하다.
list[0] = "d" 할 수 있는데
word[0] = "d" 해도
"dbc"가 되는 게 아니란 거지. 오류 뜸. - 추가처럼 보이게 더할 순 있다.
word.append(d)는 못하지만
word = word + "d" 를 해서 "abcd"를 만들 순 있다.
겉은 같지만 원리가 다르다. 새로운 문자열인 d를 만들어서 더해준 것 뿐이라.
(그럼 이 방식은 코드 용량이나 바이트 사용값 같은 거 늘리나?)
4. 문자열 분리해서 리스트로 저장
<문자열을 리스트로 변환해서 각 원소로 분리하기>
word = "ab cd"
list(word)
->
['a', 'b', ' ', ' ', 'c', 'd']
- 공백도 나눠줌
💠f - string : 문자열 포매팅
문자열 내부에 변수 또는 데이터를 삽입하는 방법.
age = "28"
print("내 나이는 28이야.")
이러면 나이 못바꾸잖아?
# f-string 안쓴 방법
print("내 나이는", age, "이야.")
# f-string 쓴 방법
print(f"내 나이는 {age} 이야.")
#결론
결과는 동일하지만
아래 거 방법이 쉼표 덜 써도 되어서 간편하다.
문자열 여러 개 안써도 된다. 문자열 내부에 변수를 삽입한 거라서.
---
# f-string 의 다른 예
print(f"1 + 1 = {1+1}")
print(f"1 > 0 = {1>0}")
-> 이거 하면 True 나옴
중괄호 안에 변수 말고 비교 연산자 등 표현식도 넣을 수 있음!
문자열 내부에 변수를 넣을 때가 생기면
f-string 적극 활용하길!
파이썬3인지 뭔지 최근에 생긴 좋은 기능이라고 함.
확인해볼 것
- print(f"{a} + {b} = {a+b}")
input(a)
input(b)
이럴 수도 있겠네?!
근데 효율적일까...
-> 여쭤봐씀. - class set은 어떤 자료형일까?
그 외 자료형
💠튜플(tuple) 자료형
#기본원리
- 여러 종류의 자료형 같이 저장 가능 (=리스트)
- 수정(삭제, 추가, 재할당) 불가함 (=문자열)
- 즉 리스트와 문자열 속성을 섞은 것.
- type: class 'tuple'
- 생성은 소괄호 ()
#생성하자
number_tuple = (1, 2, 3, 4)
type(number_tuple)
#패킹 문법
number_tuple = 1, 2, 3, 4
이래도 튜플로 인식되긴 함.
패킹 어쩌고 하는 거 때문에 그러는데 기초는 아니니까 넘어가~
💠range 자료형
연속된 정수 목록을 생성하는 것.
range(시작 숫자, 끝 숫자, 간격)
range(0, 6, 2)
-> [0, 2, 4]
시작, 간격 생략 가능.
마지막은 절대 안됨, 어디까지 만들어야 될지 모르니까.
슬라이싱은 마지막도 생략 가능.
원래 정해진 리스트에서 뽑아주는 거니까.
range(0, 6) 하면
0 1 2 3 4 5
해서 총 6개인데 0~5까지 뽑아줌.
range(1, 3) 하면
1 2
후덜덜
이게 헷갈리는 게...
여기서도 마지막 위치의 함정이 들어가서
6을 안넣어줌...
분명 어디서 가져오는 게 아니라
정수로다가 목록을 만들어주는 걸텐데도!
그럼 100에서 120까지 뽑으려면
range(100, 121)해야 되는 거...
a~b를 뽑으려면
range(a, b+1) 해야 되는 거 ㄷㄷ
+) R에서는
seq(1,30)
1:30
30:1
sep 인수 - 시작숫자(from), 마지막 숫자(to), 간격(by), 갯수(length)
seq(from=1, by=2, length=5)
seq(1,10,2)
(r에서는 정수 수열 뽑는 진짜 간단한 방법 있다는 것만 생각하고 기억 안나서 찾아봄..ㅎ)
반복문
조건문이 개발의 꽃이라면
반복문은 2인자 꽃이다.
#기본 원리
for 내부변수 variable in list:
결과(내부 변수)
list 내부에 저장된 원소들이 내부 변수에 하나씩 할당되면서 결과에 있는 거를 반복 수행함.
만약에 list 그냥 출력하면 [1, 2, ..] 이런 식으로 가진거 전부 나오겠지만
for 반복문으로 단순하게 출력하면
1
2
...
이런 식으로 하나씩 출력해주는 거임.
#문제. 각 원소에 1을 더한 값을 출력
list = [1, 2, 3, 4, 5]
for i in list:
result = v+1
print(result)
💠추가로 찾아본 FOR문 예시
# 이런 비슷한 거 있지 않나? 나 뭐 만들었던 거 같은데 하 ㅠ
for i in 1
i = i + 1
이거 안되는 이유가 어디까지 뽑을지를 안정해줘서...
# 찾아옴 (점프 투 파이썬)
add = 0
for i in range(1, 11):
... add = add + i
print(add)
55
# 즉 내가 알려고 하던 건
for i in range(1, 11)
i = i + 1
print(i)
# 살짝의 의문 - for문 안에서 프린트하는 것과 밖에서 하는 것의 차이
1. for문 밖에서 출력
add = 0
for i in range(1, 11):
... add = add + i
print(add)
55
-- 이러면 최종 add만 프린트해줄텐데 (1+3+6+10+15+...=55)
2. for문 안에서 출력
add = 0
for i in range(1, 11):
... add = add + i
... print(add)
-- 이러면 하나씩 차례대로
1
3
6
10
..
이케 나오나?
그렇겠지 출력하고 다시 반복 수행하니까
3. 리스트 컴프리핸션
빈 리스트 만들어서
거기에 저장하게 시키고
for문 안에서 출력하면
[1]
[1, 3]
[1, 3, 6]
...
이럴 것이고
for문 밖에서 출력하면
[1, 3, 6, ...] 이러겠지!
리스트 컴프리헨션
>>> a = [1,2,3,4]
>>> result = []
>>> for num in a:
... result.append(num*3)
...
>>> print(result)
[3, 6, 9, 12]
- 리스트.APPEND로 그냥..
위의 경우에선
add = add + i < 이걸 안넣으면 add가 갱신안되고 처음 지정한 값인 0에 머물러서 안됨.
result.append(add)가 되겟네.
다음 코드를 for문으로 작성하라.
print("-------")
print("-------")
print("-------")
print("-------")
답:
for 변수 in [1, 2, 3, 4]:
print("-------")
- 초보자를 위한 파이썬 300제
- 이거 *4로는 안되나?
사실 "---" * 4를 출력하는 게 가장 간단하긴 할텐데
반복문으로 만드는 방법은 아니니까...
<다른 예시>
for number in range(len(marks)):
if marks[number] < 60:
continue
- 점프투 파이썬
여담
1. 오늘 오프라인 등장
오늘은 현장에 나왔다. 뭔가 피곤하다.
한 3시? 4시? 쯤부터 3층 강의실에 있었다.
그야 아침부터 나와서 여기저기 다녔으니까 그렇지.
근데 왜이렇게 뭔가 한 게 없는 느낌이지?
해결이 안되어서 그런가.
내일은 노트북 두고 가는 김에 빨리 나와야겠다.
2. 집중 파스스
오늘 체력 안좋고 (어제 잠 덜 잠 + 오늘 아침부터 왔다갔다)
밥 제대로 못묵었고 (땅콩샌드 1.n개 먹은 게 다)
파이썬... 오늘치 배우는 량 너무 많아...
3. 이거 배웠던 건데.. 기초인데..
f스트링 기억 못하고 있엇다.. 그외에도
난... 바보야
이런 기초를 하나하나 찾아서 외우고 반복해야 하는.. 그런..
나는 개발 바보
개발은 역시 어려워
개발자들 대단해!!
'새싹 데이터 분석 교육 (24.05.13~24.08.16) > TIL' 카테고리의 다른 글
SQL 데이터 분석 프로젝트 3일차 (0) | 2024.10.04 |
---|---|
[성동2기 전Z전능 데이터 분석가] 0716 (0) | 2024.10.04 |
[성동2기 전Z전능 데이터 분석가] 0605 (0) | 2024.08.13 |
[성동2기 전Z전능 데이터 분석가] 0604 (1) | 2024.08.08 |
[성동2기 전Z전능 데이터 분석가] 0527 (0) | 2024.08.08 |