조컴퓨터

200814 OOP 02 - Python Index, Slice, String, Function, If 본문

자바 웹개발자 과정/Python

200814 OOP 02 - Python Index, Slice, String, Function, If

챠오위 2020. 8. 26. 22:21

String 문자열 데이터

" 와 ' 로 감싸여진 데이터를 말한다.

 

msg1= "Life is too short"
msg2= 'You need Python'

print(msg1)                 #Life is too short
print(msg2)                 #You need Python
print(msg1 +  msg2)         #Life is too shortYou need Python
print(msg1 + " " + msg2)    #Life is too short You need Python


name="Python"
print(name*50)              #Python이 50차례 반복 출력된다

print(123+456)              #579
print("123"+"456")          #123456

 

또는

 

case1= "Life is \'too\' short"      
print(case1)			#Life is 'too' short

case2= "Life is \"too\" short"      
print(case2)			#Life is "too" short

case3= "You 'need' Python"          
print(case3)			#You 'need' Python / " a 'b' c " 형태 가능

case4= 'You "need" Python'          
print(case4)			#You "need" Python / ' a "b" c ' 형태 가능

 

이러한 형태가 가능하다. 역슬래쉬 \를 이용하여 " 와 ' 형태를 나타낸다.

 

 

 

문자열 데이터의 인덱싱, 슬라이싱

 

 

다음 문자열 데이터를 자를 수 있다.

 

str="Life is too short, You need Python"

 

 

인덱싱은 특정 위치의 글자를 추출하는 방법으로 해당 문자의 위치를 파악해야 한다.

 

print(str[3])   #e
print(str[0])   #L / str[0]-> 문자열의 인덱싱(순서)은 0부터 카운트
print(str[-3])  #h / str[-3]-> (-)값은 마지막 글자부터 카운트
print(str[-1])  #n / str[-1]-> 마지막 글자

 

 

슬라이싱은 특정 범위의 글자들을 추출하는 방법이다.

 

print("#" + str[0:3] + "#")     # #Lif# / str[0:3] 문자열의 0부터 2번째까지

 

 

 

예제) 단어 short를 기준으로 잘라보시오.

 

print(str[12:17])

print("#" + str[19:] + "#")     # #You need Python# / 19번째부터 마지막까지
print("#" + str[:17] + "#")     # #Life is too short# / 0부터 16번째까지

 

 

예제) 다음을 출력하고 분석하시오.

 

print("#" + str[19:-7] + "#")

#You need#

 

위의 문제는 19번째부터 -7번째까지 출력하는 문제이다. 

-7번째는 27번째와 동일한 위치에 해당하므로 출력하면 You need가 발생한다.

 

 

 

문제) 주민번호에서 문자열을 추출해 보시오.

 

#     출력결과
#     -> 출생년도 : 1989년
#     -> 출생월 : 05월
#     -> 출생일 : 27일
#     -> 성별코드 : 1

 

주민번호 890527-1******에 해당하는 사람의 주민번호를 위와 같은 양식으로 출력하는 문제이다.

나는 단순하게 jumin이라는 값을 잡고 진행하였다.

 

내 답안

 

jumin="8905271"
print("출생년도 : 19" + jumin[0:2] + "년")
print("출생월 : " + jumin[2:4] + "월")
print("출생일 : " + jumin[4:6] + "일")
print("성별코드 : " + jumin[6:7])

""" 
결과값
출생년도 : 1989년
출생월 : 05월
출생일 : 27일
성별코드 : 1
"""

 

선생님 답안

 

myYear="19" + jumin[0:2]
myMonth=jumin[2:4]
myDate=jumin[4:6]
myCode=jumin[6:7]

print("출생년도 : %s년" % myYear)
print("출생월 : %s월" % myMonth)
print("출생일 : %s일" % myDate)
print("성별코드 : %s" % myCode)

 

나중에 고치는 것을 감안하면 내 식 보다 선생님 식이 편해 보인다.

 

 

 

 

함수 fuction

문자열과 관련된 함수

함수: 기능을 가지고 있음

 

function, method, module, procedure 등등

test() ; 함수

test   ; 변수

"test" ; 상수

 

 

 

 

문자열 서식 함수

format()

 

msg1="I eat {0} apples"
print(msg1.format(3))       #I eat 3 apples

msg2="{0} eats {1} apples"
print(msg2.format("강정수", 3))     #강정수 eats 3 apples

msg3="{0}는 {1}년 {2}월 {3}일입니다"
print(msg3.format("무궁화", 2020, 8, 13))   #무궁화는 2020년 8월 13일입니다

msg4="{0}는 {1}년 {2}월 {0}일입니다"
print(msg4.format("무궁화", 2020, 8))       #무궁화는 2020년 8월 무궁화일입니다

 

차례대로 대입하는 함수라 보면 된다.

각자의 위치에 해당하는 값이 함수 자리에 대입된다.

 

이름을 설정하여 대입도 가능하다.

 

msg5="{name}은 {yy}년 {mm}월 {dd}일입니다"
print(msg5.format(name="홍길동", yy=2020, mm=8, dd=13)) #홍길동은 2020년 8월 13일입니다

 

 

 

 

문자열 관련한 다양한 함수

 

str="Life is too short. You need Python."

 

위의 str의 문자열 데이터의 글자 개수를 확인할 수 있다.

 

print(len(str))             #35

 

해당 글자의 개수 또한 확인 가능하다.

 

print(str.count("e"))       #3개
print(str.count("short"))   #1개
print(str.count("nice"))    #0개 / 문자열이 없을 때

 

해당 글자의 위치를 확인할 수 있다.

 

print(str.find("e"))        #3번째 
print(str.find("short"))    #12번째
print(str.find("nice"))     #-1 / 문자열이 없을 때

 

해당 글자의 위치 또한 확인할 수 있다. 이때 문자열의 위치는 오른쪽을 기준으로 한다. (rfind 활용)

 

print(str.rfind("e"))       #25 / 꼬릿말 한 자리 포함
print(str.rfind("short"))   #12
print(str.rfind("nice"))    #-1 / 문자열이 없을 때

 

다음과 같은 다양한 방식의 함수가 존재한다.

 

print(str.startswith("Life"))   #True
print(str.endswith("Python"))   #False
print(str.upper())      #LIFE IS TOO SHORT. YOU NEED PYTHON. / 전부 대문자
print(str.lower())      #life is too short. you need python. / 전부 소문자

print(str.swapcase())   #lIFE IS TOO SHORT. yOU NEED pYTHON. / 대문자 <-> 소문자
print(str.capitalize()) #Life is too short. you need python. / 제일 앞글자만 대문자
print(str.title())      #Life Is Too Short. You Need Python. / '단어' 앞글자 대문자

 

 

문자열 데이터의 공백을 제거할 수 있다.

예를 들어,

 

word="     py tho       n    "

 

위의 문장의 공백을 삭제해 보면

 

print("#" + word.lstrip() + "#")    # #py tho       n    #  /'l'strip -> 'l'=left
print("#" + word.rstrip() + "#")    # #     py tho       n# /'r'strip -> 'r'=right
print("#" + word.strip() + "#")     # #py tho       n#      / 조건 없을시 왼쪽, 오른쪽 전부 삭제

 

문장의 왼편, 오른편을 구분한 공백 삭제도 가능하다.

 

 

 

 

③ 조건문 If

 

이때부터 파이선의 코딩블럭이 중요해 진다. 헷갈릴 수 있기 때문. 주석과 함께 잘 관리해야 하는 요소에 속한다.

 

코딩블럭을 표시하기 위해 들여쓰기(Identation)를 사용한다. 일반적으로 들여쓰기에는 4개의 공백을 사용할 것을 권장하는데, 동일한 블럭의 들여쓰기는 모두 동일한 수의 공백을 사용해야 한다. 주의할 점은 공백과 탭을 혼용해서 사용하지 말아야 한다.

 

 

제어문: 프로그램의 흐름을 제어하는 문법이다. 조건문반복문이 포함된다.

 

조건문의 형식

 

1)
    if 조건: 조건이 True일 때 처리명령어

2)
    if 조건:
        조건이 True일 때 처리명령어
    else:
        조건이 False일 때 처리명령어
    
3)
    if 조건1:
        조건1이 True일 때 처리명령어
    elif 조건2:
        조건2가 True일 때 처리명령어
    elif 조건3:
        조건3이 True일 때 처리명령어
    else:
        조건이 False일 때 처리명령어 / 조건1~3이 False일 때 처리명령어

 

위의 3가지 형식으로 나눈다. 

간단하게 말하자면 if 단일 사용은 물어볼 것이 하나일 때,

else 사용은 궁금한 마지막 질문에 이것만 물어볼 게 하며 사용하는 의문대명사로 보면 될 것 같고,

elif 사용은 if 와 else 사이의 연결고리 정도로 보면 될 것 같다.

 

if - elif - else 

 

그리고 elif를 자꾸 else if로 작성하게 되는데, 출력에서 걸러지니깐... 그래도 생각은 하고 살아야 한다.

 

 

 

예제1) 성적 프로그램

 

name="코로나"
kor=95
eng=80
mat=100
aver=(kor+eng+mat)/3    #선생님 / aver=(kor+eng+mat)//3

 

내 답안

 

print("이름 : %s" % name)
print("국어점수 : %d점" % kor)
print("영어점수 : %d점" % eng)
print("수학점수 : %d점" % mat)
print("평균 : %.2f점" % aver)   #91.67점

 

나는 평균 처리를 실수값으로 받아 1/100까지 계산했는데,

선생님은 정수값으로 진행하셨다.

 

aver=(kor+eng+mat)//3

 

 

예제1-1) 평균이 95점 이상이면 장학생으로 출력하시오.

 

if aver>=95:
    print("장학생")

 

 

예제1-2) 국어점수가 70점 이상이면 '국어 : 합격' 아니면 '국어 : 불합격'으로 출력하시오.

 

if kor>=70:
    print("국어 : 합격")
else:
    print("국어 : 불합격")

 

 

예제1-3) 수학점수가 90점 이상이면 수학 : A학점

                        80점 이상이면 수학 : B학점

                        70점 이상이면 수학 : C학점

                        60점 이상이면 수학 : D학점

                        아니면 수학 : F학점 

 

if mat>=90:
    print("수학 : A학점")
elif mat>=80:
    print("수학 : B학점")
elif mat>=70:
    print("수학 : C학점")
elif mat>=60:
    print("수학 : D학점")
else:
    print("수학 : F학점")

 

 

예제2) 과락

        평균이 70점 이상이면 결과 : 합격

        (단, 국영수 세 과목 중에서 한 과목이라도 40점 미만이면 결과 : 재시험)

        평균이 70점 미만이면 결과 : 불합격

 

kor=30
eng=90
mat=100
aver=(kor+eng+mat)/3

 

내 답안

 

if kor<40:
    print("결과 : 재시험")
elif eng<40:
    print("결과 : 재시험")
elif mat<40:
    print("결과 : 재시험")
elif aver>=70:
    print("결과 : 합격")
else:
    print("결과 : 불합격")

if kor<40 or eng<40 or mat<40:
    print("결과 : 재시험")
elif aver>=70:
    print("결과 : 합격")
else:
    print("결과 : 불합격")

 

선생님 답안 (or조건)

 

if aver>=70:
    if kor<40 or eng<40 or mat<40:
        print("결과 : 재시험")
    else:
        print("결과 : 합격")
else:
    print("결과 : 불합격")

 

선생님 답안 (and조건)

 

if aver>=70:
    if kor>=40 and eng>=40 and mat>=40:
        print("결과 : 합격")
    else:
        print("결과 : 재시험")
else:
    print("결과 : 불합격")

 

 

 

문제1) 절대값을 구하시오.

 

abs=-3
if abs<0:
    print("%d의 절대값: %d" % (abs, abs*-1))
else:
    print("%d의 절대값: %d" % (abs, abs))

 

 

문제2) 양수, 음수, 제로를 출력하시오.

 

num=5
if num>0:
    print("%d: 양수" % num)
elif num<0:
    print("%d: 음수" % num)
else:
    print("%d: 제로" % num)

 

 

문제3) 윤년, 평년을 출력하시오.

 

y=2020
if y%4==0 and y%100!=0 or y%400==0:
    print("%d년: 윤년" % y)
else:
    print("%d년: 평년" % y)

 

 

문제4) 세 개의 수 중에서 최대값을 구하시오.

 

a=2
b=8
c=6

 

내 답안

 

if a>b:
    if a>c:
        print("a")
    else:
        print("c")
elif b>a:
    if b>c:
        print("b")
    else:
        print("c")
elif a>c:
    if a>b:
        print("a")
    else:
        print("b")
elif c>a:
    if c>b:
        print("c")
    else:
        print("b")
elif b>c:
    if b>a:
        print("b")
    else: 
        print("a")
elif c>b:
    if c>a:
        print("c")
    else: 
        print("a")

 

선생님 답안

 

max=0
if a<b:
    max=b
else:
    max=a

if max<c:
    max=c
else:
    max=max
    print("%d, %d, %d 중 최대값: %d" % (a,b,c,max))

 

나는 a를 기준으로 b와 c를 비교해서 큰 수를 올리고 b를 기준으로 c를 비교해서 큰 수를 올린다는 방법을 착안해 식을 꾸렸는데 솔직히 복잡하고 말이 너무 길어진다. 

선생님은 max라는 값을 지정해 a와 b를 비교한 후 큰 수를 max에 넣고 max값을 c와 비교하는 형식으로 값 비교를 진행하셨다. 

 

 

 

문제5) 성별코드에 따라 성별을 출력하시오.

 

jumin="8912301"

myCode=jumin[6:7]       #성별코드 "1"
print(myCode)           #82번째 줄에서 "8912301"으로 묶인 문자열
print(type(myCode))     #변수의 속성을 확인

if myCode=="1" or myCode=="3":      #myCode값은 문자열이기 때문에 ==""
    print("남자")
elif myCode=="2" or myCode=="4":
    print("여자")

 

 

문제6) 운행거리에 따라 택시 요금을 계산하는 프로그램

         2000m 까지는 기본요금이 900원이고,

         2000m 초과 운행시 200m 단위마다

         기본요금에 100원씩 가산하여 요금을 계산한다.

 

"""
    예) 운행거리: 1600m
        기본요금: 900원
    예) 운행거리: 2500m
        기본요금: 900원
        추가요금: 300원
        총요금  : 1200원
"""

 

내 답안

 

meter=2100
if meter<=2000:
    print("900원")
else:
    meter=meter-2000
    if meter%200==0:
        meter=meter//200
        cost=900+meter*100
        print("%d원" % cost)
    else:
        meter=meter//200
        cost=900+(meter+1)*100
        print("%d원" % cost)

 

선생님 답안

 

distance = 3100     #운행거리
fee = 0
overFee = 0

if distance<=2000:
    fee = 900
else:
    exceed = distance - 2000            #초과거리
    overFee = (ceil(exceed/200))*100    #운행거리 3100일 때, 1100/200=5.5에서 ceil을 씌우면 6이 도출
    fee = 900 + overFee

print("운행거리:%d m" % distance)       #운행거리:3100 m
print("기본요금:%d 원" % 900)           #기본요금:900 원
print("추가요금:%d 원" % overFee)       #추가요금:600 원
print("총요금:%d 원" % fee)             #총요금:1500 원

 

내 답안은 주석처리가 많이 필요해 보인다.

 

meter=2100
if meter<=2000:
    print("900원")
else:
    meter=meter-2000		#2100m 이상일 때 2000m 단위의 기본요금을 제외
    if meter%200==0:		#나머지 미터 단위가 200으로 나누어떨어질 때
        meter=meter//200	#meter값을 200으로 나누어 다시 meter에 대입
        cost=900+meter*100	
        print("%d원" % cost)
    else:			#나머지 미터 단위가 200으로 나누어떨어지지 않을 때
        meter=meter//200	
        cost=900+(meter+1)*100	#200으로 나누어떨어지지 않고 값이 남았기 때문에 +1
        print("%d원" % cost)

 

더 나은 주석 처리에 대한 공부가 필요하다.