내일배움캠프 TIL 23/10/16

김민재·2023년 10월 16일
0


파이썬 기본 내장함수에 대한 이해
코드카타를 진행하면서 부족한 기본기를 보충해보는 시간을 가졌다.

  • map(function, iterable) : map 함수의 기본형태는 다음과 같고 반복 가능한 자료형에 일괄적으로 특정 함수를 적용시켜 주는 것을 의미한다. for 문 형태로 표현하지 않고 한줄로써 표현가능해 시각적으로 효율적인 코드 작성이 가능하다. 다만 map 함수의 반환값은 map 객체이기 때문에 이것을 list나 tuple 형태 등으로 바꿔줘야 print 했을 때 요소값을 확인할 수 있다.
    https://dojang.io/mod/page/view.php?id=2286 이 블로그 내용을 중점적으로 참고했고 여기서 코드카타에서 제시한 map(function, input().split()) 형태의 활용법도 제시해주고 있어서 참고해보면 좋을 것 같다. 여기서 다시 흔들린 개념들을 잡아봤다.
  • split() : 긴 문자열을 어떤 기준으로 쪼개어 리스트로 만들어주는 함수. 반환값은 list[str] 형식. 주의할 점은 str(문자열)에 한정된다는 점이다. split 함수 안에 특정 기준을 잡아주지 않는다면 공백을 기준으로 문자열을 쪼개준다. 그래서 'list'와 같은 특정 단어(공백을 포함하지 않는)는 split 함수를 적용해도 리스트 안에 문자열만 그대로 들어가게 된다. ['list']
    공백 이외의 어떤 기준(결국 기준도 문자열에 속하기 때문에 '' 표시가 필요하게 된다.)은 split('')의 형태라는 점을 숙지해두면 좋을 것 같다.
  • strip() : 처음에는 strip 함수가 괄호 안의 인자로 전달된 문자를 제거하는 것이라고 생각했는데, 실제로 살펴보면 lsstrip, rsstrip 함수의 존재나 strip 함수가 자체적으로 가지고 있는 기준을 간과했다. 함수의 형태는 다음과 같다.
    strip([chars]) : 인자로 전달된 문자를 String의 왼쪽과 오른쪽에서 제거합니다.
    lstrip([chars]) : 인자로 전달된 문자를 String의 왼쪽에서 제거합니다.
    rstrip([chars]) : 인자로 전달된 문자를 String의 오른쪽에서 제거합니다.

    strip 함수의 인자로 아무것도 받지않는 공백, strip()은 문자열에서 공백을 제거한다는 점에서 특이사항은 딱히 없다. 다만, 예시로 보면 split 함수에 대해 이해하기가 더 어려운듯 하면서 눈으로 확인해볼 수 있는 기회가 되었다. https://codechacha.com/ko/python-string-strip/ 블로그 자료는 다음을 참고했다.
    예시를 들기에 앞서 'String'의 '왼쪽','오른쪽'을 제거한다는 점에 집중을 해보자.
text = ",,,,,123.....water....pp"
print(text.lstrip(',123.p'))
print(text.rstrip(',123.p'))
print(text.strip(',123.p'))

인자로 받은 문자값과 동일하지 않은 문자가 나올때까지 제거하는데 처음에는 왜 이런 형태가 나타나는지 쉽게 이해하기 어려웠다. 첫번째 사례에서 lstrip은 ',123.p'과 겹치는 것이 없기 때문에 다음 조건 ',123.'가 제거된다면 결과값은 ",,,,....water....pp" 이라는 값을 가질 것 같았지만, 여기서 주의할 점은 동일하지 않은 문자가 나올때마다 제거해주기 때문에 다음은 일렬로 겹치는 값이 없고 ',','.','p' 각자 값을 가지는 문자가 하나씩 모두 삭제 될 것으로 예상했다. 그렇게 된다면 결과값은 "water"만 남게 되는 것. 하지만 최종 결과값은 "water....pp" 왜 이런 값이 나오는지 이해하기 위해 두번째 결과값은 ",,,,,123.....water" 세번째는 "water" 라는 것에 주목하면 좋을 것 같다. 그리고 위에서 주목하라고 했던 왼쪽과 오른쪽.... 즉, 코드의 text는 하나의 문자열처럼 보이지만 어떠한 기준에 의해 3부분으로 나뉘어져 있다고 생각해야 할 것 같다.
정리해보면 '왼쪽' : ",,,,,123....." /// '오른쪽' : "....pp" 나머지가 한 부분으로 존재하는 형태.
그래서 다시 첫번째 사례를 보면 lstrip은 왼쪽에서만 인자로 전달된 문자를 제거하기 때문에 결국 "water....pp"에 영향을 미치지 않고 각자의 요소까지 동일하지 않은 값을 모두 제거해준 것이다. rstrip 과 strip(왼쪽, 오른쪽 한정) 은 생각해보시는 게 좋을 것 같다.
다른 예시는 문자열이 구분된다는 개념을 더 잘 이해할 수 있는데

text = ' Water boils at 100 degrees '
print(text.lstrip(' Water'))
print(text.rstrip(' degrees '))
print(text.strip(' degrees '))

결과값

boils at 100 degrees
 Water boils at 100
Water boils at 100

세번째 사례의 strip 함수는 가장 왼쪽 "()Water" 과 가장 오른쪽 "degrees()"에만 영향을 미치는 것이다.


그래서 장황하게 설명했지만 결국 코드카타에서는 a, b = map(int, input().strip().split(' '))와 같은 형태가 기본값으로 주어졌었고, 다른 사람의 풀이 하나를 뜯어봤을 때 이해가 안가는 점을 다시 정리한 것이다. 풀이는 다음과 같다.

a, b = map(int, input().strip().split(' '))
for i in range(b):
    for j in range(a):
        print('*', end='')
    print('')

코드의 목적은 input 값을 입력했을 때 입력된 값으로 가로,세로 길이를 갖는 직사각형을 별로 찍는 것이다. 내가 한 방식은 가로 입력 값 a 만큼 별()을 곱해줘서 임의의 변수를 만들어주고 또 다시 다른 변수 d에 d=(c+'\n')b 형식으로 문자열 더하기에 세로값 b를 곱해주는 형식을 사용했다. 사실 위의 코드도 strip과 split 함수가 직사각형을 만드는 함수에 대해선 어떠한 영향을 끼치지 못한다. 그래서 위에서 장황하게 설명했던 것들은 결국 input 값을 제한하는 데만 사용했던 것이다. 예를 들어 어떤 사용자가 "5, 3" 이런 식으로 작성했다면 기본 코드는 공백을 기준으로 split 해줬기에 오류가 생길 것이다. 그래서 수정해 준다면 a, b = map(int, input().strip().split(','))가 형태가 될 것이고, 이것이 의미하는 것은 사용자의 input 값을 어떤 기준으로 작성하라고 제시해 준 형태가 아닐까 한다.


추가적으로!
print 출력문이 사용하는 두가지 옵션 end=""과 sep=""

  • sep=""
    이 옵션을 이용하게 되면 print문의 출력문들 사이에 해당하는 내용을 넣을 수 있습니다. print 문 자체의 기본 값으로는 공백이 들어가 있으며 이를 사용해 원하는 문자를 입력할 수 있습니다.
  • end=""
    이 옵션의 경우 print 문을 이용해 출력을 완료한 뒤의 내용을 수정할 수 있습니다. print 문 자체의 기본 값으로는 개행(\n)이 들어가 있으며 이를 사용해 개행을 없애거나 원하는 문자를 입력할 수 있습니다.
print("1-1칸","1-2칸","1-3칸")
print("2-1칸","2-2칸","2-3칸")

제대로 생각 안해보고 사용했던 것이지만, 위 코드를 출력하면 print문 자체가 가지고 있는 속성에 따라 출력문들 사이에는 기본적으로 한칸 띄워쓰기와 다른 print 문과 줄바꿈이 자동으로 실행될 것이다.

print("1-1칸", "1-2칸", "1-3칸", end="")
print("2-1칸", "2-2칸", "2-3칸", sep="")
print("3-1칸", "3-2칸", "3-3칸", sep="")

위의 코드와 같이 사용하면 줄바꿈이나 띄워쓰기를 없애거나 sep 옵션이 들어간 print문 내의 출력물 사이에 특정한 값을 집어넣어 줄 수 있고, end 옵션이 들어간 print문이 출력이 완료됐을 때(print 출력문의 마지막에) 원하는 값을 넣어줄 수 있게 된다.

0개의 댓글