22.06.30 탈출문,str,list
<script>
'''
* 탈출문(흐름 제어문) - break, continue, return
- 반복문은 조건을 만족하는 동안 계속 반복 실행하기 때문에
한번 반복이 시작되면 반복 횟수가 끌날 때 까지
멈추지 않고 반복을 실행합니다.
- 하지만 중간에 어떠한 이유로 반복을 중지해야 한다거나
현재 반복을 건너 뛰어야 할 경우에 탈출문을 사용합니다.
* break
- break는 현재 반복문을 즉시 종료시키고 반복문을 탈출합니다.
- 일반적으로 특정 조건 하에서 반복문을 종료시키기 때문에
if문과 함께 사용합니다.
'''
for n in range(1, 11):
if n == 7:
break
print(n, end=' ') # 1 2 3 4 5 6
print('\n반복문 종료!')
'''
* 무한 루프
- 무한 루프는 반복 횟수를 정하지 않고 무한하게 반복문을 실행하는 구조입니다.
- 사전에 정확한 반복 횟수를 알 수 없을 때 구현합니다.
탈출문을 통해 종료할 수 있도록 설계하면 됩니다.
- 파이썬의 무한 루프는 while문으로만 작성하며 for문으로는 구현이 불가능합니다.
'''
print('# 먹고싶은 음식을 입력하세요.')
print('입력을 중지하려면 "그만"이라고 입력하세요.')
while True:
food = input('> ')
if food == '그만':
print('종료합니다.')
break
print('먹고싶은 음식:', food)
print('프로그램 정상 종료!')
'''
* continue
- break가 반복문을 강제로 종료시켰다면, continue는 이번 반복 1회차만 건너뛰고,
다음 반복부터는 정상적으로 실행을 계속하게 하는 탈출문 입니다.
'''
for n in range(1, 21):
if n % 3 == 0: # 3의배수 빼고
continue
print(n, end=' ')
</script>
<script>
'''
* 문자열 인덱싱
- 파이썬은 문자열을 기본 타입으로 지정했을 뿐만 아니라
문자열을 관리하는 풍부한 명령을 가지고 있습니다.
- 문자열은 메모리상에 낱말(단일문자) 하나하나가
일렬로 늘어선 형태로 저장되는 시퀀스 구조입니다.(순차적 구조)
- 문자열의 각 문자들은 인덱스(index)로 관리되며
맨 앞글자부터 0번이 저장되며, 그 뒤로 1씩 순차적으로 증가합니다.
'''
s = 'python'
# 0 1 2 3 4 5
# [p, y, t, h, o, n]
# -6 -5 -4 -3 -2 -1
print(s)
print(s[2]) # t
print(s[5]) # n
print(s[-1]) # n
# 인덱스 범위를 초과한 값을 참조하면 에러가 발생.
# 자바에서는 .charAt(2)로 사용
# 문자열도 리스트처럼 순차적 자료형이기 때문에 반복문 for를 통해 단일문자 반복이 가능합니다.
for n in s:
print(n, end="!") # p!y!t!h!o!n!
print() # 단순 줄 개행
for day in '월화수목금토일':
print(day + '요일')
</script>
자바 subString()
<script>
'''
* 문자열 슬라이싱
- 문자열 인덱싱이 단일 문자를 취할 때 사용했다면
슬라이싱은 문자열 내부의 데이터를 범위를 지정해서 부분 추출할 때 사요하는 방법입니다.
ex) 문자열데이터[begin:end:step]
- range함수처럼 시작 인덱스는 포함이지만, 끝 인덱스는 포함하지 않습니다.
'''
s = 'python'
print(s[2:5:1]) # tho
print(s[1:4]) # yth(step 생략시 1)
print(s[3:]) # 3부터 문자열 끝까지 hon
print(s[:4]) # 처음부터 4미만까지 pyth
print(s[:]) # == print(s)
week = '월화수목금토일'
print(week[::2]) # 월수금일
print(week[1:6:2]) # 화목토
</script>
<script>
'''
* 문자열 포맷팅
- 포맷팅은 문자열 사이사이에 다른 타입의 데이터를 넣어서
문자열을 조립하는 방식입니다.
- 자바 printf (%d, %s, %f)
'''
apple = 3
print('사과가',apple,'개 있습니다.') # 사과가 3 개 있습니다.
print('사과가 %d개 있습니다.' %apple) # 사과가 3개 있습니다.
'''
- 여러개의 데이터도 하나의 문자열에 포맷팅 할 수 있는데,
이 때는 % 연산자 뒤에 나열할 변수를 ()로 묶어 줍니다.
'''
month = 12
day = 25
anni = '크리스마스'
print(month,'월',day,'일은',anni,'입니다.')
print('%d월 %d일은 %s입니다.' %(month, day, anni))
# 위에 코드는 파이썬에서는 잘 사용안한다. 밑에 방식을 자주 사용
'''
* format 함수를 사용한 형식 지정 출력 방식
- 문자열의 format 함수를 사용하면 서식 문자를 지정하는 것보다
좀 더 유용하고 편하게 문자열 포맷을 사용할 수 있습니다.
'''
point = 90
print('수학점수: {}점'.format(point))
print('{}월 {}일은 {}입니다.'.format(month, day, anni))
# 괄호안에 번호를 주면 인덱스번호에 맞게 값이 들어간다.
print('{1}월 {2}일은 {0}입니다.'.format(month, day, anni)) # 25월 크리스마스일은 12입니다.
# 소수점 표현
pi = 3.141592
print('원주율은 %.2f입니다.' %pi)
print('원주율은 {:0.2f}입니다.'.format(pi))
'''
* f 문자열 포맷팅
- 파이썬 3.6버전 이후로 사용할 수 있는 기능입니다.
- 접두어 f를 문자열 앞에 붙여서 사용합니다.
'''
print(f'{month}월 {day}일 {anni}입니다.')
# {}안에서는 수식도 사용이 가능합니다.
print(f'점수는 {point + 10}점 입니다.')
print(f'원주율은 {pi:0.4f}입니다.')
</script>
<script>
ssn = input('주민등록번호를 입력하세요: ')
print('주민등록번호 앞자리:', ssn[:6])
print('주민등록번호 뒷자리:', ssn[7:])
year = int(ssn[:2])
month = ssn[2:4]
day = ssn[4:6]
gender_num = ssn[7]
gender = '여자'
if gender_num == '1' or gender_num == '3':
gender = '남자'
birth_year = 0
if gender_num == '1' or gender_num == '2':
birth_year = 1900 + year
else:
birth_year = 2000 + year
age = 2022 - birth_year
print(f'{birth_year}년 {month}월 {day}일 {age}세 {gender}')
</script>
<script>
'''
* 문자열 관리 함수, 메서드
- 함수: 모듈(.py로 끝나는 파일) 내부에서 공용적으로 사용할 수 있는 기능의 집합.(단독 호출가능) len(s)
- 메서드: 클래스에 소속된 함수, 특정 자료형 전용 함수. s.find('o')
'''
# 내장 함수 len(): 순차형 자료(sequence)의 내부 데이터 개수를 구함.
# len()은 문자열에서만 쓸 수 있는게 아니에요. 함수입니다.
s = 'python programming'
count = 0
for c in s:
count += 1
print('s의 글자 수 :', count)
print('s의 글자 수 :', len(s))
'''
# 문자열 메서드 find(), rfind()
- 문자열 내부에 특정 문자를 검색하여 해당 문자의 인덱스 번호를 알려줍니다.
- find()는 앞에서부터, rfind()는 뒤에서부터 탐색을 한다.
- 자바 indexOf(), lastIndexOf()
'''
print(s.find('o')) # 4
print(s.rfind('o')) # 9
#program이 문자열 변수 s에 있다면 해당 단어의 첫번째 인덱스를 반환.
print(s.find('program')) # 7
# 탐색 시 문자를 발견하지 못했다면 -1를 반환.
print(s.find('메롱'))
# 메서드 count(): 문자열 내부에 찾는 단어의 출현 횟수 반환.
message = """
내가 그린 기린 그림은 목이 긴 기린 그림이고
니가 그린 기린 그림은 목인 안 긴 기린 그림이다.
"""
print('"기린"단어의 출현 횟수:', message.count('기린'))
'''
- 특정 문자가 있는 인덱스나 번호 및 횟수는 관심 없고
단순히 포함 여부만 빠르게 확인하고 싶다면 in 키워드를 사용.
True / False
'''
print('a' in s) # True
print('q' in s) # False
print('z' not in s) # True
print('pro' in s) # True
'''
- 사용자에게 데이터를 입력받을 때 입력값의 형태를 검사하는 메서드
1. isdecimal(): 모든 문자가 숫자 형태인지를 검사.
2. isalpha(): 모든 문자가 영문 알파벳인지를 검사.
3. islower(): 모든 문자가 영문 소문자인지를 검사.
4. isupper(): 모든 문자가 영문 대문자인지를 검사.
'''
print('15 + 8 = ???')
while True:
answer = input('> ')
if answer.isdecimal(): # 숫자 형태인지 검사
answer = int(answer) # True면 int로 변환
else:
print('정답은 숫자로만 입력해 주세요.')
continue
if answer == 23:
print('정답입니다.')
break
else:
print('틀렸습니다.')
</script>
<script>
'''
* 문자열 대체 메서드 replace()
- 특정 단어를 모두 찾아서 새로운 단어로 일관 교체하는 메서드
'''
s1 = '파이썬 프로그래밍! 파이썬은 문자열을 관리하는 \
수많은 메서드들을 제공합니다!! 파이썬 짱짱!!'
print(s1.replace('파이썬', 'python')) # 파이썬 -> python
print(s1.replace('!', '')) # ! 지우기
s2 = '아침부터 커피를 마셨는데, 점심먹고 커피를 또 마셨어 \
그런데 저녁에 커피를 또 주면 오늘 커피를 몇 잔 마신거지?'
# 변경할 문자열의 갯수도 지정할 수 있음
print(s2.replace('커피', '소주', 2))
</script>
<script>
'''
* 문자열 공백 제거 메서드
1. lstrip(): 문자열의 왼쪽 공백만 제거
2. rstrip(): 문자열의 오른쪽 공백만 제거
3. strip(): 문자열의 양쪽 공백을 제거
'''
user_id = input('아이디: ')
print(user_id + '님 안녕하세요.') # jwons 님 안녕하세요.
print(user_id.lstrip() + '님 안녕하세요.') # jwons 님 안녕하세요.
print(user_id.rstrip() + '님 안녕하세요.') # jwons님 안녕하세요.
print(user_id.strip() + '님 안녕하세요.') # jwons님 안녕하세요.
</script>
<script>
'''
* 문자열 알파벳 형태 변경 메서드
1. lower(): 영문 알파벳을 모두 소문자로 변경(자바 toLowerCase)
2. upper(): 영문 알파벳을 모두 대문자로 변경(자바 toUpperCase)
3. swapcase(): 영문 대소문자를 각각 반대로 변경
4. capitalize(): 문자의 맨 첫글자만 대문자, 나머지는 소문자
5. tilte(): 각 단어의 맨 첫글자만 대문자, 나머지는 소문자(공백)
'''
s = 'GOOD MORning!! my name is JANG'
print(s) # GOOD MORning!! my name is JANG
print(s.lower()) # good morning!! my name is jang
print(s.upper()) # GOOD MORNING!! MY NAME IS JANG
print(s.swapcase()) # good morNING!! MY NAME IS jang
print(s.capitalize()) # Good morning!! my name is jang
print(s.title()) # Good Morning!! My Name Is Jang
</script>
<script>
'''
* 문자열 분할
- split()메서드는 구분자를 기준으로 문자열을 분할해서 리스트에 담아서 반환합니다.
'''
s1 = '떡볶이 김말이 닭강정'
# 괄호 안을 비우면 공백을 구분자로 하여 분할.
print(s1.split()) # ['떡볶이', '김말이', '닭강정']
s2 = '홍깅동 | 대한출판사 | 2022년 7월'
data = s2.split(' | ')
print('저자: ', data[0])
print('출판사: ', data[1])
print('출판년월: ', data[2])
</script>
<script>
'''
* 리스트(list)
- 리스트는 여러 개의 값을 집합적으로 저장하기 위해 사용하는 파이썬의 자료형 입니다.
- 다른 언어의 배열과 유사한 개념이며, 실제로 배열과 유사한 방식으로 데이터가 관리됩니다.
- [] 대괄호안에 요소를 콤마로 구분하여 나열합니다.
'''
x = [5, 6, 10 , 'a'] # 파이썬 list는 어떤 타입이든 저장이 가능.
print(type(x)) # <class 'list'>
for c in x:
print(c)
print('리스트의 길이:', len(x))
</script>
<script>
'''
* 리스트의 내부 요소 다루기
- 리스트는 시퀀스 자료형이기 때문에 인덱스를 통한 요소들의 관리가 가능합니다.
- 리스트를 다룰 때는 문자열과 비슷한 방식을 사용합니다.
'''
from cmath import polar
pokemon = ['피카츄', '라이츄', '파이리', '꼬부기', '버터풀']
print(pokemon[2]) # 파이리
# list의 인덱싱안에 문자열 인덱싱 가능
print(pokemon[1][2]) # 츄
# 슬라이싱 가능
print(pokemon[4][:2])# 버터
# 리스트 슬라이싱 - > 리스트데이터[begin:end:step]
nums = [0,1,2,3,4,5,6,7,8]
print(nums[2:5:1]) # [2, 3, 4]
print(nums[:4]) # [0, 1, 2, 3]
print(nums[1:7:2]) # [1, 3, 5]
# 리스트는 인덱싱을 사용하여 변수처럼 내부의 값을 변경하는 것이 자유롭습니다.
print(nums) # [0, 1, 2, 3, 4, 5, 6, 7, 8]
nums[2] = 34
print(nums) # [0, 1, 34, 3, 4, 5, 6, 7, 8]
nums[3] = nums[6]
print(nums) # [0, 1, 34, 6, 4, 5, 6, 88, 8]
'''
- 문자열은 상수 형태로 저장되는 고정형 리스트입니다.
- 따라서 인덱싱이나, 슬라이싱을 통해 값의 복사본을 활용하는 것은 가능하지만,
영역에 직접 접근해서 내부의 값을 편집할 수는 없습니다.
- 문자열은 변경이 불가능한 자료형입니다.(immutable)
'''
s = 'python'
# s[2] = 'x' # 에러
s = 'phxhon'
# t -> x로 변경된 것이 아니라 'python'자체가 'phxhon'로 변경된 것이다.
# unpackaging: 리스트 내부 요소를 다시 변수에 저장할 때 사용하는 문법.
# pokemon = ['피카츄', '라이츄', '파이리', '꼬부기', '버터풀']
''' unpackaging 사용안하면 아래처럼 작성.
p = pokemon[0]
r = pokemon[1]
c = pokemon[2]
s = pokemon[3]
b = pokemon[4]
'''
# 좌항의 변수의 개수와 우항의 리스트의 요소의 개수가 일치한다면
# 자동으로 변수에 리스트 내부 요소의 값들이 차례대로 할당됩니다.
# unpackaging
p, r, c, s, b = pokemon
print(p, r, c, s, b) # 피카츄 라이츄 파이리 꼬부기 버터풀
# 빈 리스트 만들기
list1 = []
list2 = list()
</script>
<script>
'''
* 리스트에 데이터를 추가하는 메서드
1. append(): 요소를 리스트의 맨 마지막에 추가.
2. insert(): 요소를 리스트의 특정 위치에 삽입.
'''
nums = [1,3,5,7]
nums.append(9)
print(nums) # [1, 3, 5, 7, 9]
nums.append('안녕')
print(nums) # [1, 3, 5, 7, 9, '안녕']
# insert(index, value)
nums.insert(3, 44)
print(nums) # [1, 3, 5, 44, 7, 9, '안녕']
</script>
<script>
'''
* 리스트 내부 요소를 삭제
1. remove(): 삭제할 값을 직접 지정해서 삭제.
2. 내장 함수 del(): 삭제할 요소의 인덱스를 통해 삭제.
3. clear(): 리스트 내부 요소를 전체 삭제.
'''
from os import remove
poins = [88, 99, 56, 92, 100, 78]
poins.remove(92)
print(poins) # [88, 99, 56, 100, 78]
del(poins[2])
print(poins) # [88, 99, 100, 78]
poins.clear()
print(poins) # []
# 문제
pokemon = ['피카츄', '라이츄', '파이리', '꼬부기', '버터풀']
'''
- 삭제할 이름을 입력받아서 그에 해당하는 이름을 실제로 리스트에서 삭제한 후 삭제 후 정보를 출력하세요.
- remove()와 del()을 이용하여 각각 출력해 보세요.
'''
name = input('삭제할 이름을 입력하세요: ')
# remove() 사용
# pokemon.remove(name)
# del 사용
#range(len(pokemon)) -> range(5) -> range(0, 5, 1) -> [0,1,2,3,4]
for idx in range(len(pokemon)):
if name == pokemon[idx]:
del(pokemon[idx])
break
print('삭제 후 정보:', pokemon)
</script>
<script>
'''
* 리스트의 탐색과 정렬
1. index(): 리스트에서 특정 값이 저장된 인덱스를 반환.
2. count(): 리스트 내부에 저장된 특정 요소의 개수를 반환.
3. sort(): 리스트를 오름차 정렬.
4. reverse(): 리스트 데이터를 역순으로 배치
'''
poins = [99, 14, 87, 100, 55, 100, 99, 100, 22]
perfect = poins.count(100)
print(f'만점자는 {perfect}명 입니다.')
print(f'87점을 획득한 학생은 {poins.index(87)+1} 번째 입니다.')
# 내장 함수 len(), max(), min()
print(f'학생 수는 {len(poins)}명입니다.')
print(f'최고 점수는 {max(poins)}점 입니다.')
print(f'최저 점수는 {min(poins)}점 입니다.')
# 오름차 정렬 sort()
print(poins) # [99, 14, 87, 100, 55, 100, 99, 100, 22]
poins.sort()
print(poins) # [14, 22, 55, 87, 99, 99, 100, 100, 100]
# 내림차 정렬 1
# 정렬 후 reverse()
poins.reverse() # 정렬이 아니라 단순 역순 배치
# 내림차 정렬 2
poins.sort(reverse=True)
# 리스트 내의 요소의 단순 유무를 검사하려면 in 키워드를 사용합니다.
food_menu = ['김밥', '닭강정', '라면', '김말이']
name = input('음식명을 입력하세요: ')
if name in food_menu:
print(f'{name}음식이 주문되었습니다.')
else:
print(f'{name}은(는) 없는 음식입니다.')
</script>
<script>
# 리스트를 이용한 간단한 연락처 관리 프로그램
# namelist에 이름, phonelist에 전화번호를 저장해서
# 이름과 전화번호 리스트의 인덱스가 동일하게 증가할 수 있도록 조작.
from __future__ import print_function
from os import remove
namelist = []
phonelist = []
while True:
print('\n---------- 연락처 관리 프로그램 ----------')
print('1. 연락처 등록')
print('2. 연락처 검색')
print('3. 연락처 삭제')
print('4. 모든 연락처 조회')
print('5. 프로그램 종료')
print('---------------------------------------')
menu = int(input('메뉴를 입력하세요: '))
if menu == 1:
# pass # 파이썬의 블록구조는 비워져 있으면 에러가 발생합니다.
# 비워놓으려면 pass 키워드를 넣어서 통과시키라고 얘기하면 됩니다.
print('연락처 등록을 시작합니다.')
name = input('이름:')
phone = input('전화번호:')
namelist.append(name)
phonelist.append(phone)
print(f'{name}님 연락처 저장 완료!')
# 입력받은 이름과 전화번호 데이터를 각각의 리스트에 추가하세요.
# 추가 완료 시 "XXX님 연락처 저장 완료!" 를 출력하세요.
elif menu == 2:
name = input('검색할 이름을 입력하세요:')
if name in namelist:
idx = namelist.index(name)
num = phonelist[idx]
print(f'{name}님의 전화번호는 {num}입니다.')
else:
print(f'입력하신 {name}님은 없습니다.')
# 입력한 이름이 리스트 내부에서 발견된다면 해당 이름을 통해
# 인덱스 번호를 추출하여 인덱스를 통해 리스트의 전화번호를 얻어옵니다.
# 출력예시: "홍길동의 전화번호는 010-1234-5678입니다."
elif menu == 3:
name = input('삭제할 이름을 입력하세요:')
if name in namelist:
idx = namelist.index(name)
del(namelist[idx])
del phonelist[idx] # 괄호 생략 가능
print(f'{name}님의 연락처 삭제가 완료 되었습니다.')
else:
print(f'입력하신 {name}님은 없습니다.')
# 이름을 입력받아서 해당 이름과 전화번호를 동시에 삭제해 주세요.
# 이름이 없다면 없다고도 얘기 해 주세요.
elif menu == 4:
for idx in range(len(namelist)):
print(f'{namelist[idx]} : {phonelist[idx]}')
# for문을 통해 리스트 내부의 모든 인덱스에 접근하여 모든 이름과
# 연락처 정보를 출력하는 코드를 작성합니다.
# 홍길동 : 010-1234-5678
# 김철수 : 010-5678-1234...
elif menu == 5:
print('프로그램을 종료합니다.')
break # while True break
else:
print('메뉴를 다시 입력해 주세요.')
</script>