유사개발자 샤이와 무지

멋쟁이사자처럼 부트캠프 데이터 분석 부트캠프 5기 Day 4[6/155] 파이썬 기초 이론을 하는 날이에요333 ( 자료형[문자], 리스트와 튜플) 본문

멋사 데이터분석 5기를 보내며

멋쟁이사자처럼 부트캠프 데이터 분석 부트캠프 5기 Day 4[6/155] 파이썬 기초 이론을 하는 날이에요333 ( 자료형[문자], 리스트와 튜플)

Shy & Mujee 2025. 4. 4. 02:23

오늘은 어제에 이어 파이썬의 기초에 대해서 이야기 했어요. 오늘은 크게 문자열과 리스트, 튜플에 대한 이야기를 했어요 개념 자체는 단순하니깐 저는 제가 자주 안 쓰던 함수를 리마인드 차원에서 작성해두겠습니다.

str의 method

str.capitaltize() #가장 앞에 문자를 대문자로 바꾸고 나머지는 소문자로 바꾸는 str의 멤버함수(method)

str.center(int) #원본 문자열을 가운데 배치하고 나머지는 공백으로 채우는 str의 멤버함수(method) 홀수면 뒤쪽이 큰 수가 온다
str.ljust(int) #원본 문자열을 왼쪽에 배치하고 나머지는 공백으로 채우는 str의 멤버함수(method)
str.rjust(int) #원본 문자열을 오른쪽에 배치하고 나머지는 공백으로 채우는 str의 멤버함수(method)

str.startswith(compare_string) #문자열이 compare_string으로 시작하는지 확인하는 str의 멤버함수(method)
str.endswith(compare_string) #문자열이 compare_string으로 끝는지 확인하는 str의 멤버함수(method)

str.isalnum() #문자열이 숫자 or 문자열로만 끝나는지 확인하는 str의 멤버변수(method)
str.isdigit() #문자열이 숫자로만 끝나는지 확인하는 str의 멤버변수(method)
str.isalpha() #문자열이 문자로만 끝나는지 확인하는 str의 멤버변수(method)

str.replace(string1, string2, num) #문자열의 string1을 string2를 num개 만큼 바꾸는 str의 멤버변수(method) 갯수는 바꿀 수 있는 갯수를 초과해도 상관 없음

 


리스트와 튜플은 굉장히 많이 닮았지만 둘은 큰 차이가 있어요, 튜플은 불변성을 가져요. 본인의 요소를 수정할 수 없다는 의미에요

리스트와 튜플쪽도 비슷하게 잘 안써서 리마인드 할 함수들만 가져와봤어요.

list의 method

list.extend(list1) #리스트에 list1를 이어 붙여주는 멤버함수(method) == list+list1

extend는 사실 쓸모가 잘 없습니다 +로 이어버리면 그만이니까요


 

대신 오늘은 comprehension을 좀 파보겠습니다. 전 대학교 시절 예를 굳이 써야하나 싶었던 top2거든요 람다까지 해서

근데 자주 사용하신다고 하시더라고요 그래서.... 이걸 좀 깊게 파볼려고 합니다. 

일단 comprehension의 의미부터 알아봅시다 옥스포드 영어 사전에서는 이해력, 포함 정도로 해석 하네요 여기서 포함은 좀 오래된 해석이긴 하지만 전 이쪽이 좀 더 의미적으론 잘 어울린다고 생각합니다.

그럼 python의 docs에선 어떻게 설명할까요?

A compact way to process all or part of the elements in a sequence and return a list with the results.
                                                                                                                          -list_comprehension
A compact way to process all or part of the elements in an iterable and return a set with the results
                                                                                                                          -set_comprehension
A compact way to process all or part of the elements in an iterable and return a dictionary with the results.
                                                                                                                          -dictionary_comprehension

pythondocs

 

문장에 공통 부분이 보이죠?

A compact way to process all or part of the elements in an iterable and return () with the results

모든 요소 또는 일부를 반복 가능한 방식으로 처리하고 결과와 함께 ()을/를 반환하는 간결한 방법입니다.

저는 이 2가지 요소들로 comprehesion을 설명해보겠습니다. 포함과 간결한 방식이에요.

  • 내용물이 [] or {}에 포함되고
  • 코드의 작성 방식이 간결해요

간단한 예시를 보여드릴게요

>>> [x for x in range(10)]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

 

딱 이해가 가시죠? 대괄호에 포함되어 있고 간결합니다

저걸 리스트와 반복문만 사용한다면 이렇게 됩니다.

>>> list_=[]
>>> for i in range(10): list_.append(i)
[1, 2, 3, 4, 5, 6, 7, 8, 9]

코드 줄 수가 2줄로 늘어났죠 간결함을 상실했어요

그래서 comprehension을 사용하는겁니다. 지금은 읽는데 불편하겠지만 패턴을 알고 조금만 연습하면 쉬워질겁니다.

이제 제가 발견한 패턴을 여기에 적어볼게요. 이건 list, dictionary, set 공통입니다(tuple도 comprehesion은 가능하지만 좀 다른 식으로 결과가 나옵니다 ←이건 좀 나중에 한번 짚어볼게요 ) 

오늘 강사님이 내주신 문제 3개에 좋은 예제가 있었어서 미리 가져와볼게요

문제1) 리스트에 [1, 2, 3, 4, 5, 6, 7, 8, 9] 까지 담겨져 있다.
이를 이용해 구구단을 출력해보세요

답은 더보기를 눌러주세요

더보기

성질1) 반복문은 깊은 쪽에서 먼저 변하기 시작한다(루프가 돌기 시작한다)

해설은 따로 안하고 for문이 중첩된 상황입니다. a는 1차 루프 b는 2차 루프에 지역변수에요. 결과값을 보시면 아시다시피 b쪽(깊은 쪽)이 먼저 변함을 알 수 있습니다 밑에서 comprehesion을 풀어서 써볼게요.

>>> data=list(range(1,10))
>>> temp = [f"{a} X {b} = {b*a}" for a in data[1:] for b in data]
>>> for i in temp: print(i)

2 X 1 = 2
2 X 2 = 4
2 X 3 = 6
2 X 4 = 8
2 X 5 = 10
2 X 6 = 12
2 X 7 = 14
2 X 8 = 16
2 X 9 = 18
3 X 1 = 3
3 X 2 = 6
3 X 3 = 9
3 X 4 = 12
3 X 5 = 15
3 X 6 = 18
3 X 7 = 21
3 X 8 = 24
3 X 9 = 27
4 X 1 = 4
4 X 2 = 8
4 X 3 = 12
4 X 4 = 16
4 X 5 = 20
4 X 6 = 24
4 X 7 = 28
4 X 8 = 32
4 X 9 = 36
5 X 1 = 5
5 X 2 = 10
5 X 3 = 15
5 X 4 = 20
5 X 5 = 25
5 X 6 = 30
5 X 7 = 35
5 X 8 = 40
5 X 9 = 45
6 X 1 = 6
6 X 2 = 12
6 X 3 = 18
6 X 4 = 24
6 X 5 = 30
6 X 6 = 36
6 X 7 = 42
6 X 8 = 48
6 X 9 = 54
7 X 1 = 7
7 X 2 = 14
7 X 3 = 21
7 X 4 = 28
7 X 5 = 35
7 X 6 = 42
7 X 7 = 49
7 X 8 = 56
7 X 9 = 63
8 X 1 = 8
8 X 2 = 16
8 X 3 = 24
8 X 4 = 32
8 X 5 = 40
8 X 6 = 48
8 X 7 = 56
8 X 8 = 64
8 X 9 = 72
9 X 1 = 9
9 X 2 = 18
9 X 3 = 27
9 X 4 = 36
9 X 5 = 45
9 X 6 = 54
9 X 7 = 63
9 X 8 = 72
9 X 9 = 81

이 코드에서도 b가 들어간 반복문 쪽이 먼저 변함을 확인 할 수 있죠. 여기서도 깊은 쪽이 먼저 변함을 알 수 있어요

>>> data=list(range(1,10))
>>> for a in data[1:]: 
>>> 	for b in data: 
>>> 		print(f"{a} * {b} = {a*b}")

2 X 1 = 2
2 X 2 = 4
2 X 3 = 6
2 X 4 = 8
2 X 5 = 10
2 X 6 = 12
2 X 7 = 14
2 X 8 = 16
2 X 9 = 18
3 X 1 = 3
3 X 2 = 6
3 X 3 = 9
3 X 4 = 12
3 X 5 = 15
3 X 6 = 18
3 X 7 = 21
3 X 8 = 24
3 X 9 = 27
4 X 1 = 4
4 X 2 = 8
4 X 3 = 12
4 X 4 = 16
4 X 5 = 20
4 X 6 = 24
4 X 7 = 28
4 X 8 = 32
4 X 9 = 36
5 X 1 = 5
5 X 2 = 10
5 X 3 = 15
5 X 4 = 20
5 X 5 = 25
5 X 6 = 30
5 X 7 = 35
5 X 8 = 40
5 X 9 = 45
6 X 1 = 6
6 X 2 = 12
6 X 3 = 18
6 X 4 = 24
6 X 5 = 30
6 X 6 = 36
6 X 7 = 42
6 X 8 = 48
6 X 9 = 54
7 X 1 = 7
7 X 2 = 14
7 X 3 = 21
7 X 4 = 28
7 X 5 = 35
7 X 6 = 42
7 X 7 = 49
7 X 8 = 56
7 X 9 = 63
8 X 1 = 8
8 X 2 = 16
8 X 3 = 24
8 X 4 = 32
8 X 5 = 40
8 X 6 = 48
8 X 7 = 56
8 X 8 = 64
8 X 9 = 72
9 X 1 = 9
9 X 2 = 18
9 X 3 = 27
9 X 4 = 36
9 X 5 = 45
9 X 6 = 54
9 X 7 = 63
9 X 8 = 72
9 X 9 = 81
문제2) 1 부터 1000까지의 숫자 중 3의 배수이거나 7의 배수에 해당하는 숫자들의 총합을 구하세요
더보기

성질2) 반복문 후에 조건문이 나온다면 그 반복문은 조건문을 안고있는 것과 같다.

이번엔 for문 뒤에 if문이 나온 상황이에요 밑에 comprehesion을 풀어서 써볼게요.

>>> print(sum([i for i in range(1,1001) if (i % 3 == 0 or i % 7 == 0)]))
214216

 보면 반복문이 조건문을 안고 조건문의 조건을 통과한 값들만 반복문을 통과하고  sum_num에 더해진 것을 확인 할 수 있어요

>>> sum_num=0 #합을 구해주기위한 임시변수
>>> for i in range(1,1001):
>>> 	if(i % 3 == 0 or i % 7 == 0): #3의 배수 or 4의 배수를
>>> 		sum_num+=i #더해줍니다
>>> print(sum_num)
214216
문제3) 1 부터 1000까지의 숫자 중에 3의 배수만 담아준다. 이 때 3의 배수가 짝수라면 '짝수'라고 담고 홀수면 '홀수'라고 담는다.
더보기

성질 3 조건문 후에 반복문이 나온다면 이는 반복문을 계산하고 나온 결과값들이 다시 조건문에 들어가는 모습이다.

이번엔 조건문 뒤에 반복문이 나온 상황이에요

얘는 좀 특이한게 (if를 기준으로 앞쪽에는 참일 때의 결과값, if 뒤에 조건, 그 뒤에 else와 거짓일 때의 결과 값) 순서로 쓰여져요

밑에서 comprehesion을 풀어서 써볼게요.

>>> data=["짝수" if i % 2 == 0 else "홀수" for i in range(1,1001) if i % 3 == 0]
>>> for i in data: print(i ,end=", ")
홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수,

보면 반복문을 통과한 데이터들이 조건문을 통과하는 모습을 보여주죠? 

>>> data=[]
>>> for i in range(1,1001):
>>> 	if i%3 == 0:
>>>     	data.append(i)

>>> for i in data:
>>> 	if i % 2 != 0:
>>>     	print("홀수")
>>>     else:
>>>     	print("짝수")
홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수,

물론 이렇게도 압축할 수 있습니다만 위에 예시보다 직관적으로 패턴을 이해하기도 어렵고 2번째랑 햇깔립니다. 그리고 순서가 햇깔려요 그래서 윗 예시를 먼저 보여드린겁니다.

>>> for i in range(1,1001):
>>> 	if i%3 == 0:
>>> 		if i%2 !=0: print("홀수")
>>>     	else: print("짝수")

홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수, 짝수, 홀수,

3가지 문제를 보면서 우린 comprehesion을 해석하는 방법에 대해 제 관점에서 바라보았어요. 아래에 요약해보자면

  1. 반복문은 깊은 쪽(뒷쪽)에서 먼저 변하기 시작한다(루프가 돌기 시작한다)
  2. 반복문 후에 조건문이 나온다면 그 반복문은 조건문을 안고있는 것과 같다.
  3. 조건문 후에 반복문이 나온다면 이는 반복문을 계산하고 나온 결과값들이 다시 조건문에 들어가는 모습이다. (만약 저장될 값 바로 뒤에 if문이 온다면, 순서는 [저장될 값, 참일 때의 결과값, if, 조건, 그 뒤에 else와 거짓일 때의 결과 값]이다 )

이런 성격을 띄게 됩니다.

그럼 이제 3가지 조건 이외에 조건이 필요한지 확인 해봅시다 

>>> data=list(range(1,11))
>>> res=[f"{i}*{j} = {i*j}" for i in data if i % 2 == 0 for j in data if j % 3 ==0] #2의 배수가 먼저 처리되고 3의 배수가 처리되는 형태
>>> for i in res: print(i)
2*3 = 6
2*6 = 12
2*9 = 18
4*3 = 12
4*6 = 24
4*9 = 36
6*3 = 18
6*6 = 36
6*9 = 54
8*3 = 24
8*6 = 48
8*9 = 72
10*3 = 30
10*6 = 60
10*9 = 90
곱셈 기호를 기준 뒷쪽이 먼저 변하고 있음은 1번의 성질을
3의 배수만이 곱셈에 참여한 것은 2번 성질을
그 위 조건문은 반복문과 반복문 사이에 얽혀있어서 새로운 조건이 만들어집니다

조건4) 2번 만족하는 조건문 다음에 반복문 or 조건문이 나오면 그 반복문 or 조건문을 안고 있는 것과 같

>>> for i in range(1,11):
>>> 	if i%2 == 0:
>>>     	for j in range(1,11):
>>> 			if j%3 == 0:
>>> 				print(f"{i} * {j} = {i*j}")
2*3 = 6
2*6 = 12
2*9 = 18
4*3 = 12
4*6 = 24
4*9 = 36
6*3 = 18
6*6 = 36
6*9 = 54
8*3 = 24
8*6 = 48
8*9 = 72
10*3 = 30
10*6 = 60
10*9 = 90

자 보기 좋게 순서를 좀 바꿔볼게요

  1. 반복문은 깊은 쪽(뒷쪽)에서 먼저 변하기 시작한다.(루프가 돌기 시작한다)
  2. 반복문 후에 조건문이 나온다면 그 반복문은 조건문을 안고있는 것과 같다.
  3. 2를 만족하는 조건문 다음에 반복문 or 조건문이 나오면 그 반복문 or 조건문을 안고 있는 것과 같다.
  4. 2를 만족하지 않는 조건문 후에 반복문이 나온다면 이는 반복문을 계산하고 나온 결과값들이 다시 조건문에 들어가는 모습이다. (만약 저장될 값 바로 뒤에 if문이 온다면, 순서는 [저장될 값, 참일 때의 결과값, if, 조건, 그 뒤에 else와 거짓일 때의 결과 값]이다.)

제가 결론 내린 comprehesion을 푸는 알고리즘은 이 4가지에요 다른게 발견된다면 댓글로 알려주세요

 

그럼 이걸로 어제 받은 문제를 풀어볼까요?

 

멋쟁이사자처럼 부트캠프 데이터 분석 부트캠프 5기 Day 3[5/155] 파이썬 기초 이론을 하는 날이에

오늘은 셋째날 오늘도 여전히 파이썬 기초를 하고 있어요,조건문 if문하고 switch문이 있는데 switch문은 파이썬에 없어요... 그래서 사실 간단합니다. 넘어가요반복문은 for문하고 while문이 있는데

shymujee.tistory.com

>>> for num in range(2, 1001):
>>>     if all(num % div != 0 for div in range(2, int(num ** 0.5) + 1)):
>>>         print(num)
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
101
103
107
109
113
127
131
137
139
149
151
157
163
167
173
179
181
191
193
197
199
211
223
227
229
233
239
241
251
257
263
269
271
277
281
283
293
307
311
313
317
331
337
347
349
353
359
367
373
379
383
389
397
401
409
419
421
431
433
439
443
449
457
461
463
467
479
487
491
499
503
509
521
523
541
547
557
563
569
571
577
587
593
599
601
607
613
617
619
631
641
643
647
653
659
661
673
677
683
691
701
709
719
727
733
739
743
751
757
761
769
773
787
797
809
811
821
823
827
829
839
853
857
859
863
877
881
883
887
907
911
919
929
937
941
947
953
967
971
977
983
991
997

소수를 구하는 문제였고 정상적으로 잘 구해지는 모습이죠 이건 tuple_comprehesion을 활용한 모습이에요 

배운걸 활용해보면

반복문에서 num % div != 0 이란 식을 계산(return 자료형은 boolean)하고 이것이 모인 tuple에 all 함수에 넣어서 참이라면 즉 그 어떤 수로도 나누어지지 않으면 그 수를 출력해주라는 구조인거죠 

근데 여기서 div 범위가 없다면 all함수에 빈 튜플이 들어갈텐데 이건 문제가 아니냐고 생각하실 수도 있습니다만 all함수가 어떻게 구현되어있는지 확인해보시면 알 수 있어요

>>> def all(iterable):
>>>     for element in iterable:
>>>         if not element:
>>>             return False
>>>     return True

반복문에 값 자체가 들어가지 않으면 반복문 내부 if not element:는 판별될 기회조차 없기때문에 return True로 직행하게 됩니다. 그래서, 참인겁니다.

그리고 all함수의 설명은 이렇게 되어있어요

all(iterable)
Return True if all elements of the iterable are true (or if the iterable is empty).

전부 참이거나 비어있으면 참이라고요(이건 다른 언어들도 같습니다.)

 

오늘의 진도는 여기까지였고 오늘은 활용을 편하기 위해서 comprehesion이 어떻게 동작하는지를 뜯어봤어요 그리고 어제 주신 문제에 까지 응용해보았어요 상당히 알찼어요 내일은 또 뭘 배울까요 기대가 되네요 

 

멋쟁이사자들 데이터분석 5기 모두 화이팅입니다!!!

Comments