whatisthis?

Phython. 파이썬 코딩 기초편-07 본문

WEB STUDY/PHYTHON | BACK-END

Phython. 파이썬 코딩 기초편-07

thisisyjin 2021. 9. 16. 12:34

<Quiz>

 

표준 체중을 구하는 프로그램을 작성하시오

 

*공식

 

남자 : 키(m) * 키(m) * 22

여자 : 키(m) * 키 (m) * 21

 

<조건>

1. 표준체중은 별도의 함수 내에서 계산

- 함수명 : std_weight / 전달값 : height, gender

 

2. 표준 체중은 소수점 둘쨰자리까지 표기

 

 

 

<출력 예제>

키 175cm 남자의 표준 체중은 67.38kg 입니다.

 

 


소수점 둘째자리까지 반올림하는 방법

1. round 이용
print(round(3.3678, 2)
<결과> 3.37

2. format 이용
{ : .2f}".format(3.3678)
<결과> 3.37
제곱 구하는 방법

1. x ** y

2. pow(a, b) : a의 b제곱

3. math 라이브러리 속의 math.pow(x, y)

 

 

 

** 내가 작성한 코드

 

def std_weight(height, gender):
if(gender == "남성"):
weight = round((height / 100) ** 2 * 22, 2)
print("키 {0}cm 남자의 표준 체중은 {1}kg 입니다.".format(height, weight))
elif(gender == "여성"):
weight = round((height / 100) ** 2 * 21, 2)
print("키 {0}cm 여자의 표준 체중은 {1}kg 입니다.".format(height, weight))

weight = std_weight(168, "남성")

 

 

내가 작성한 코드 실행 결과 

 

____________________cf. 모범 답안_______________________

 

def std_weight(height, gender):
    if gender == "남자":
        return round((height / 100) ** 2 * 22, 2) 
    elif gender == "여자":
        return round((height / 100) ** 2 * 21, 2)

height = 175
gender = "남자"
weight = std_weight(height, gender)
print("키 {0}cm {1}의 표준 체중은 {2}kg 입니다.".format(height, gender, weight))

 

 

내 코드의 잘한 점 내 코드의 잘못된 점
1. round를 이용하였다.

2. if-elif문을 사용하였다. (남자 / 여자만 입력되게
return을 이용하지 않았다.
이는 전역변수가 아니므로 좋지 않다.


함수에서 if-elif문에
return ____계산식____ 과 같이 입력해야하며,
함수 바깥에
weight = std_weight(175, 남자) 와 같이 입력해야함.

(weight는 함수바깥 새로운 변수임)

 


1. 표준 입출력

 

예제 1. sep=" " 의 사용과 end=" "의 사용

print("Python"+"Java") # PythonJava
print("Python", "Java") # Python Java
print("Python","Java",sep=",") # Python,Java

#sep=" "를 이용하면 두 문자열 사이를 구분하는 것을 정할 수 있음

 

print("Python","Java", sep=",", end="?")
print("무엇이 더 재밌을까요?")

# end=" "를 이용하면 다음 print문과 한줄로 이어서 쓸 수 있음.

sep=","으로 구분하고, end="?"로 다음 print문과 한줄로 나타난 결과

다음과 같이 end=" " 를 이용하면 다음 print문과 한줄에 나오게 된다.

(원래는 print문 하나가 줄 띄기를 자동으로 한다. 즉 print()만 써도 한줄 띄기가 가능한 것)

 

 

 

___

 

 

예제 2. sys에서 stdout과 stderr (standard output / standart error)

 

import sys
print("Python", "Java", file=sys.stdout)
print("Python", "Java", file=sys.stderr)

 

결과상으론 차이가 없어보이지만, 이는 stderr의 경우엔 에러라는 의미이므로 따로 처리를 하기 쉽게한다.

 

 

___

 

 

예제 3. 스트링의 왼쪽 정렬과 오른쪽 정렬 (칸 지정)

 

#시험 성적

scores = {"수학":0, "영어":50, "코딩":100} # 사전 형태(키와 value)
for subject, score in scores.items():  # 변수명.items()는 키와 value 쌍으로 출력
    print(subject.ljust(8), str(score).rjust(4), sep=":") # 총 8칸의 공간을 만들고 왼쪽정렬

subject . ljust ( 8 )  ,  str( score ) . rjust ( 4 )

(변수명)  (8칸 공간/왼쪽정렬)  정수형 변수이므로 str()필요. (4칸 공간/오른쪽정렬)

 

** ljust와 rjust는 ()안에 몇칸의 공간을 만들지를 적어야 하며, 기본적으로 string변수를 정렬하므로

정수형 변수의 경우엔 str()을 감싸줘야한다.

 

 

+)  center()을 해주면 가운데 정렬이 된다.


 

** 이쯤에서 복습하는 자료형!

리스트는 [ , ,  ]
사전은 { 키값1: value , 키값2: value}
튜플은 ( , , )
세트는 { , , } 또는 set([ , , ])

+) 사전에서 key값과 value값 선택해서 출력시

** Key값만 출력하려면 (value 말고)  = 변수명.keys()
** Value들만 출력하려면  = 변수명.values()
 
 
** (key,value) 와 같이 두 값을 쌍으로 묶어서 출력하려면 = 변수명.items()

 

___

 

 

**참고 : str()은 언제 쓰고 int()는 언제 쓰는 걸까?

 str string의 약자로 character string은 문자열을 뜻함.

즉, 정수형의 자료를 임시로 문자열로 바꿔줄때 사용함.

 

예> money = 30000

print("저는 지금" + str(money) + "원이 있습니다.")

위와 같이 문자열과 '+'기호로 정수형 변수를 합쳐서 출력할때는 str()으로 감싸줘야 한다.

 

또한 위에서 나온 정렬함수를 할떄에도 정수형 변수의 경우 str()으로 감싸줘야 함.

 


예제 4. 빈공간에 0을 채워주는 .zfill() 함수

 

# 은행 대기 순번표 = 001, 002, 003, ...

for num in range(1,21):
    print("대기번호: " + str(num).zfill(3))

 

변수명.zfill(숫자)

숫자는 문자열의 길이이다.

 

zfill은 zero fill, 즉 0을 채워주는 함수이다.

 

** 단, zfill()함수 또한 int형 변수에는 적용이 되지 않으므로 str()으로 감싸줘야 한다.

 

 

zfill()의 결과. 앞부분에 0을 채워준다.

 

 

___

 

 

예제 5. 표준 입력 (input 함수)

 

# 표준 입력

answer = input("아무 값이나 입력하세요: ")
print("입력하신 값은 " + answer + "입니다.")

 

 

즉, input()함수로 사용자 입력을 받게되면 항상 str형으로 알아서 받게 된다.

(숫자를 입력해도 str, 문자를 입력해도 str)

 

 

 

type(answer)로 해당 변수의 타입을 찍어보면

숫자를 입력해도, 문자를 입력해도 class는 str으로 나오게 된다.

 

 

 


2. 다양한 출력 포맷

 

# 빈자리는 빈공간으로 두고, 오른쪽 정렬을 하되, 10자리 공간을 확보

print("{0: >10}".format(500)) # 빈칸은 스페이스로 / > = 오른쪽정렬 / 10은 공간


# 양수 일 때는 +로, 음수일때는 -로 표시

print("{0: >+10}".format(500)) # >+10을 해주면 빈칸 / 오른쪽정렬 / 양수일때 + 표시 / 10칸공간 
print("{0: >+10}".format(-500))


# 왼쪽 정렬하고, 빈칸을 _로 채움

print("{0:_<10}".format(500)) # _<10 은 빈칸을 _로 / 왼쪽정렬(<) / 10칸 공간


# 3자리 마다 콤마 찍어주기

print("{0:,}".format(1000000000)) # ,를 해주면 세자리마다 ,찍힘
print("{0:+,}".format(1000000000))  # 앞에 +부호가 나오도록. (, 앞에 +붙임)
print("{0:^<+20,}".format(1000000000)) # 빈칸을 ^로 채우고 / 왼쪽정렬 / +부호 / 20칸공간 / 3자리마다 ,


# 소수점 출력
print("{0:f}".format(5/3)) 
print("{0:.2f}".format(5/3))  #f 앞에 .2 추가하여 소숫점 둘째짜리까지 표시

 

예제 결과

 

if> 만약 조건이 여러개일떄 순서를 바꾼다면?

 

예-

{0:^<+20,}를 {0:^+<20,}이렇게 바꾼다면?

=오류 발생!!!

 

 

순서

1. 빈칸에 들어갈 것
2. 왼쪽, 오른쪽 정렬
3. 부호 (+) - 생략 가능
4. 공간 칸수
5. 소수점 나누기(,)

 


 

3:18:01

 

3. 파일 입출력

 

 

예제 1. "w"모드로 파일 작성 (덮어쓰기 개념)

score_file = open("score.txt", "w", encoding="utf8") # w는 write. 쓰기위한 파일임을 명시
print("수학 : 0", file=score_file)
print("영어 : 50", file=score_file)
score_file.close()
1. 파일 오픈
파일변수명 = open("파일명.txt", "w", encoding="utf8")
-> 여기에서 w란 write로, 쓰기 전용 파일임을 나타낸다.

2.  파일을 오픈한 상태이므로, print를 통해 파일에 작성함.
print("내용", file=파일변수명)

3. 파일을 오픈했으면 반드시! 닫아줘야함.
파일변수명.close()

**주의 = 오픈시에는 파일변수명 = open("파일명.txt", "w", encoding="utf8") 이였지만
닫을때에는 변수명.close()로 닫아야한다.

 

 

___

 

예제 2. "a" 모드로 파일 작성 (이어쓰기 개념)

 

 

score_file = open("score.txt", "a", encoding="utf8") # a는 이어쓰기, w는 덮어쓰기

score_file.write("과학 : 80")
score_file.write("\n코딩 : 100")

위 예제 1에서는 print문을 이용하여 작성했지만,

파일변수명.write("")를 통해서 작성해도 된다.

print("내용", file=파일변수명)
파일변수명.write"내용")

 

** 주의 : print를 이용하면 자동 줄바꿈 되지만, 이건 수동으로 입력해줘야한다. (\n)

 

예제 2를 실행하고 나면 score.txt 파일 내용이 갱신되었음을 알 수 있다.

 

 

___

예제 3. 파일 읽기용도인 "r" 모드

 

score_file = open("score.txt", "r", encoding="utf8")
print(score_file.read())
score_file.close()

** 읽을때에도 반드시 close()를 해주어야한다!

 

print(파일변수명.read())

를 이용하여 터미널로 파일내용 출력 가능.

 

 

또 다른 출력 방법 > 

 

print(파일변수명.readline())

**readline()

줄별로 파일 내용을 읽는다.
한줄을 읽고나서 커서는 다음 줄로 이동한다.

readline을 네번 반복해본 결과 

print자체에서 한줄을 띄고, readline 한줄마다 띄기때문에 두줄씩 띄어진다.

이게 싫다면 , end="" 를 이용하면 된다.

 

 

if> 파일이 몇줄인지 모를때는 어떻게 해야 하는지? = 반복문 사용

 

score_file = open("score.txt", "r", encoding="utf8")

while True:
    line = score_file.readline()
    if not line:
        break
    print(line)
score_file.close()

 

+) 리스트 형태로 저장하는 readlines()

score_file = open("score.txt", "r", encoding="utf8")

lines = score_file.readlines() #list 형태로 저장
for line in lines:
    print(line, end="")

score_file.close()

readline() 한줄씩 가져와 문자열로 저장

readlines() 전체를 가져와 리스트로 저장

readline() - 파일의 한 줄을 가져와 문자열로 반환.  파일 포인터는 그 다음줄로 이동.
readlines() - 파일 내용 전체를 가져와 리스트로 반환.  각 줄은 문자열 형태로 리스트의 요소로 저장.

 

 

 

** 그 외 open에 대한 추가 정보

 

형태 = open(파일 경로, 모드)

 

1. open ('/etc/test.txt', 모드)

지정된 경로에 있는 파일을 불러온다.

 

2. 경로를 변수로 지정하고 사용해도 된다.

예 - file_path = ' /etc/test.txt '

open(file_path, 모드)

 

**모드란? = 

읽기 모드 ('r'), 새로 쓰기 모드 ('w'), 이어 쓰기 모드 ('a')

 

 


 

4. Pickle

프로그램에서 사용하는 데이터를 파일 형태로 저장해주는 것.

 

 

예제1. 피클 쓰기 "wb" 모드 / 변수 내용을 파일에 저장하기 (pickle.dump)

import pickle

profile_file = open("profile.pickle", "wb") # w=쓰기 / b=바이너리. 피클에선 인코딩 설정X
profile = {"이름":"김진아", "나이":30, "취미":["축구", "골프", "코딩"]}
print(profile)
pickle.dump(profile, profile_file) # profile변수에 있는 정보를 file에 저장
profile_file.close()

 

우선 pickle 라이브러리를 import를 통해 불러오고, 

파일과 마찬가지로 open - write - close 과정을 걸쳐야 한다.

 

단, write대신 변수 내에 있는 데이터를 파일로 저장하기 위해서

 

pickle.dump(변수명, 파일변수명)

을 입력 한 후에 close를 해줘야한다.

 

**주의할것. profile.pickle은 파일명이고, 파일변수명은 profile_file이므로 잘 구분하자.

 

** 파일에선 모드가 w, r, a 세가지였으나 피클에서는 이 뒤에 'b'를 붙여야 한다. bianary라는 의미이다.

 

 

___

 

예제 2. 피클 읽기 "rb"모드 / 변수로 불러오기 (pickle.load)

 

import pickle

profile_file = open("profile.pickle", "rb") 
profile = pickle.load(profile_file) # file에있는 정보를 profile에 불러오기
print(profile)

 


5. with

with문을 사용하여 close()필요없이 간단하게 작성 가능.

 

예제 1. pickle 파일 읽기

import pickle

with open("profile.pickle", "rb") as profile_file:
    print(pickle.load(profile_file))

 

<형태>

with open("파일명", "모드") as 파일변수명  : 

 

= 따로  close를 해줄 필요 없이 with문을 탈출하면서 자동으로 출력해주는 것.

 

 

 

___

 

예제 2. txt파일 작성하기

 

with open("study.txt", "w", encoding="utf8") as study_file:
    study_file.write("열심히 파이썬을 공부하고 있습니다.")

 

 

+) 마찬가지로 파일의 읽기도 with문으로 할 수 있다.

 

with open("study.txt", "r", encoding="utf8") as study_file:
    print(study_file.read())

 

 

 


 

<Quiz>

 

당신의 회사에서는 매주 1회 보고서를 작성해야한다.

보고서는 항상 아래와 같은 형태로 출력되어야한다.

 

- X  주차 주간 보고 -

부서 :

이름 :

업무 요약 :

 

1주차부터 50주차까지의 보고서 파일을 만드는 프로그램을 작성하시오.

 

조건 : 파일명은 1주차.txt , 2주차.txt, ... 와 같이 만든다.