본문 바로가기
Python

파이썬 자유롭게 만들기 (print, format, list)

by Nirah 2023. 1. 11.

파이썬으로 회원가입할 때 기입했던 정보를 다시 조회(출력)하는 것을 만들어보고싶다.

예를 들어 전화번호, 나이, 지출비용, 합계 같은 카테고리를 보기 좋게 나열해서 출력해보고싶은 것이다.

이를 구현해보기 위해 원하는 기능을 인터넷 서칭하여 공부한 뒤 자유롭게 사용해보며 트라이 해본다.

 

 

 

어떤 리스트에서 값을 가져와 틀에 맞게 출력

 

name = ['피카츄','꼬북이','파이리','이상해씨']
print('너의 포켓몬은 %s 란다!' % name)

name = ['피카츄','꼬북이','파이리','이상해씨']
for starting in name:
    print('너의 포켓몬은 %s 란다!' % starting)

 

음.. 모든 포켓몬이 출력돼버렸다.

원하는대로 리스트에서 몇 번째 포켓몬만 찝어서 지정하는 방법은 없을까>?

list에 대한 내용을 공부해보자.

 

 

list

 

https://lovelydiary.tistory.com/36

 

#1. 리스트에서 요소를 추출하는 방법

일반적으로 리스트에서 요소를 추출하려면 인덱스 번호를 활용한다. 예를 들어 a_list=['one','two','three','four','five']라는 리스트가 있을 때 a_list[0]과 같이 리스트 명을 쓰고 [ ] 괄호 안에 인덱스 번호를 적어 print(a_list[0])을 실행하면 해당 인덱스 번호에 해당하는 'one'이라는 원소가 출력이 된다. 참고로 파이썬에서 리스트의 인덱스 번호는 0부터 시작한다.

슬라이싱이라는 기법으로 몇번째부터 몇번째까지의 원소를 출력할 수도 있다. a_list[0:2]와 같이 인덱스 번호 대신 "0 콜론 2"를 [ ] 괄호 안에 입력할 경우, 0번째부터 2번째 전까지의 원소들을 출력해 준다. 즉 'one', 'two'가 출력이 된다.

홀수번째 요소를 추출하고 싶은 경우, 리스트[1::2]를 하면 되고, 짝수번째 요소를 추출하고 싶은 경우, 리스트[0::2]를 하면 되는 것이다.

 

회원 가입시 데이터베이스 형식으로 한 객체마다 여러 카테고리의 정보를 한줄로 저장해서

각 카테고리를 원하는 자리에 원한 폼으로 출력해보고싶었다.

음...상상한대로 되긴 했는데 줄이랑 칸도 잘 안맞고 띄어쓰기는 또 어떻게 구현해야하지..

스페이스바를 구현하려고 ""를 전체에 씌우면 list 함수가 작동을 안해버린다.

그렇다고 중간중간 "       " 를 넣으면 신텍스 에러가 뜬다.

 

 

아 포메팅이라는 것이 있네!

 

 

 

파이썬 문자열 포매팅 (format)

https://blockdmask.tistory.com/428

 

문자열 포맷팅(string formatting)

문자열을 만들때 원하는 위치에 특정한 값(변수)를 삽입해서 문자열을 그때그때 출력하는 것을 의미한다.

여튼 보기 좋게 정렬하는 데에 중점을 두는 기능이다.

 

예를 들어 학생 출석을 부른다고 했을떄

print('김땡땡 왔나요?')
print('박땡땡 왔나요?')
print('이땡땡 왔나요?')
이런식으로 코딩하는 것 보다 '~~ 왔나요?' 부분은 공통적이고 앞에 학생 이름만 바뀐다는 점을 착안해서

김땡땡, 박땡땡, 이땡땡 이름을 리스트 자료형에 넣고
print('%s 왔나요?') % names[i] 이런식으로 표현해서 이름을 순회 하면서 출력하도록 하면 된다.
이렇게 문자열 중간 특정 부분에 우리가 원하는 값을 넣기 위해 사용하는 것을 포맷팅 이라고 한다.

문자열 중간에 %d가 있으면 파이썬은 이 부분에 정수 타입의 숫자가 올것을 인식하게 된다.

 

% 서식문자를 이용한 문자열 출력 자료형
%s -> 문자열
%d -> 정수
%f -> 실수

%o -> 8진수
%x -> 16진수
%% -> 
문자 % 표현

 

자릿수

{0}이라고 표시하면, format함수 안의 첫 번째 값을 넣으라고 지정할 수 있다.

.1f와 같이 사용하면 출력할 소수점 자릿수를 지정할 수도 있다.

정수만 출력하고 싶다면 .0f로 지정하면 된다.

 

정렬

print('%10s %10s %10s' %('name','age','gender')) # 자릿수 지정 + 우측 정렬
print('{:>10} {:>10} {:>10}'.format('name','age','gender')) 
print('%-10s %-10s %-10s' %('name','age','gender')) # 자릿수 지정 + 좌측 정렬
print('{:10} {:10} {:10}'.format('name','age','gender')) 
print('{:^10} {:^10} {:^10}'.format('name','age','gender')) # 자릿수 지정 + 가운데 정렬

 

 

 

 

=======================이를 적용해서 만들어보기 =============================

성공했다. 생각보다 칸수 맞춰서 숫자 조정하는게 프론트엔드 같았다...

{:^10} 이것의 뜻은 좌우 양쪽으로 10만큼 칸 띄우기를 보장하는 것이라 (가운데정렬)

phone 카테고리(010-앞번호-뒷번호)끼리는 붙이고 그 옆의 money와는 사이를 띄우는 데 애먹었다.

정답은 phone 카테고리끼리는 가운데정렬(^)을 안쓰고 붙인 뒤,

money 쪽에서 오른쪽 정렬(>)을 해주는 것이었다.

 

 

 

깨달은 점1 : 원하는 모양으로 이쁘게 정렬하려면 가운데정렬은 조정하기가 힘들다..

 

깨달은 점2 : 왜 회원가입 페이지에서 전화번호 앞자리칸 뒷자리칸 나눠놨는 지,

어떤식으로 데이터베이스화 후 출력되는지 약간은 깨닫게 되는 공부였다.

 

 

 

나머지 사람들도 넣고 total로 $값을 합산하는 작품을 완성시켜보았다.

kim = ["kim",38,1111,1111,20.50]
seo = ["seo",24,1234,5678,30.30]
Lee = ["Lee",38,2525,2345,50.60]

print("======================================================")
print('{:<10}{:<10}{:<14}{:>10}'.format('name','age','phone','money'))
print("======================================================")
print('{:<10}{:<10}010-{:}-{:}{:>10}$'.format (kim[0],kim[1],kim[2],kim[3],kim[4]))
print('{:<10}{:<10}010-{:}-{:}{:>10}$'.format (seo[0],seo[1],seo[2],seo[3],seo[4]))
print('{:<10}{:<10}010-{:}-{:}{:>10}$'.format (Lee[0],Lee[1],Lee[2],Lee[3],Lee[4]))
print("======================================================")
print('{:>38}{:>6}$'.format ("total",kim[4]+seo[4]+Lee[4]))

 

근데 만들어놓고 생각해보니, 이것은 단순히 저 세 객체(kim, seo, Lee)의 값을 고정적으로 출력하기 위한 것일 뿐,

목록에 띄울 개체 값을 골라서 내용을 바꾸거나 하기 불편한 것 같다.

예를 들어 데이터베이스에 kim, seo, Lee 말고도 많은 사람이 수시로 추가되고 삭제되는 회원가입 환경인데,

그중 몇 명을 고르는 기능을 만들고, 그 값들만 출력한다거나 그런 기능 말이다..

 

 

그래서 출력 함수쪽에 객체(이름)을 고정하지 않고 (a,b,c)변수값으로 넣어줘봤다.

오 상상한대로 잘 작동한다. 감동이다

 

이게 작동만 한다면 a,b,c값을 바꿔주기만 하면 다른 내용이 출력될 것이다.

son이라는 사람을 추가해서 a,b,c 값을바꿔보자.

원하는 객체들이 출력됐고, 합산도 잘 된다 야호!

 

음.. 근데 여전히 슬롯이 3개로 고정인게 마음에 걸려서

2개만 지정해주면 어떻게 되는지 봤더니 다음과 같이 신텍스 에러가 뜬다.

이렇게 지정 슬롯 수보다 적은 선택을 했을 경우를 대비할 필요가 있다.

 

그래서 빈 값을 매울수 있는 none이란 개체를 하나 만들어서 선택하지 않은 빈 슬롯을 채우게 하려고 했더니

total 값을 비워놓으면 에러가 떠서 0이라도 입력되어야 했나 보다.

 

0을 입력해주어서 합계에 영향 안가게 했더니 줄이 어긋나고 흠... 이정도는 넘어가야겠다.

 

파이썬은 수업에서 알려준 내용과 다른방식으로 성공시키는 것이 재밌는 것 같다.

 

 

'Python' 카테고리의 다른 글

string, 내장함수, random 명령어 연습  (1) 2023.01.13
변수 문제 풀이  (0) 2023.01.12
연산자  (0) 2023.01.12
파이썬 기초 명령어 연습  (0) 2023.01.11
Visual Studio 설치 + Github 사용  (0) 2023.01.11