[파이썬] re 라이브러리 활용한 정규표현식②

5. 또 다른 반복 표현 {n}, {n,m}

: 문자열을 특정할 수 있는 또 다른 반복 구문 표현으로 {n}, {n,m}이 있다. 해당 구문은 앞에 등장한 문자가 반복되는 회수를 n번 혹은 m~n번 사이로 지정할 수 있는 특징이 있다.  

  • {n} : 앞 문자가 n번 반복되는 패턴
  • {m,n} : 앞 문자가 m ~ n 사이의 수만큼 반복되는 패턴

예제 6) {n} 사용된 패턴을 통해 문자열 적용 유무 확인

- {n} 사용 위한 컴파일 함수 사용

- {n} 앞에 놓인 문자 A가 n 숫자에 맞게 등장한 경우

- {n} 앞에 놓인 문자 A가 n 숫자보다 적게 등장한 경우  → n 수를 충족하지 않아 문자열 특정하지 못함

 

예제 7) {m, n} 사용된 패턴을 통해 문자열 적용 유무 확인

- {m,n} 사용 위한 컴파일 함수 사용

- {n} 앞에 놓인 문자 A가 n 숫자에 최소값으로 등장한 경우

- {n} 앞에 놓인 문자 A가 n 숫자에 최대값으로 등장한 경우

 

6. [ ]괄호 : 괄호 안에 들어가는 문자가 들어 있는 패턴

: [ ] 괄호는 특정 위치에 대한 지정 없이 찾고자 하는 문자가 들어가 있는지 여부를 확인하기 위해 사용된다. 별도의 기호 없이 사용할 경우 해당 문자열을 알파벳 혹은 숫자 개별 단위로 찾는 특성이 있다. [ ] 괄호는 기호의 활용을 통해 보다 다양하게 활용 가능한데, 하이픈 (-) 표시를 통해 범위를 표시할 수 있으며, (^) 기호를 통해 반대로 괄호 안에 있는 것들을 제외한 문자열을 탐색할 수도 있다.  

  • [abc]괄호는 a, b, c 중 하나가 들어가 있는 패턴을 의미
  • [c-e]는 c,d,e 중 하나가 들어가 있는 패턴을 의미(0-9, A-Z, 가-힣 등으로 응용 가능)
  • [^a-z]는 소문자가 아닌 문자가 들어가 있는 패턴을 의미

예제 8) [ ] 사용된 패턴을 통해 문자열 적용 유무 확인

- [ ] 기능 사용을 위한 패턴 컴파일 함수 사용

- [ ] 괄호 안에 놓인 문자가 등장한 경우 → 첫 번째 등장값 반환

- [ ] 괄호 안에 놓인 문자가 등장하지 않은 경우  → 문자열 특정하지 못함

예제 9) 하이픈(-) 사용된 패턴을 통해 문자열 적용 유무 확인

- [-] 기능 사용을 위한 컴파일 함수 사용

- [-] 범위 내에 놓인 문자가 등장한 경우 → 첫 번째 등장한 번위값 반환

- [-] 범위 내에 놓인 문자가 등장하지 않은 경우  → 문자열 반환하지 못함

예제 10) (^) 사용된 패턴을 통해 문자열 적용 유무 확인

- (^) 기능 사용을 위한 컴파일 함수 사용

- [-] 범위 내에 놓인 문자가 등장한 경우 → (^) 기능으로 문자열 반환하지 못함

- [-] 범위 내에 놓인 문자 외 다른문자가 등장하지 않은 경우  → (^) 기능으로 문자열 반환

 

7. 정규 표현식 라이브러리 함수 사용법

1) match와 search 함수

  • match : 문자열 처음부터 정규식과 매칭되는 패턴을 찾아서 리턴
  • search : 문자열 전체를 검색해서 정규식과 매칭되는 패턴을 찾아서 리턴

예제 11) 같은 구문에 대한 match와 seach 함수 차이

- match와 search 함수의 차이를 알아보기 위한 컴파일 함수 사용

- 동일 구문에 대한 match와 search 함수 차이 확인  search는 구문의 처음부터 적용되어 대문자 안 됨을 확인

2) findall 함수: 정규표현식과 매칭되는 모든 문자열을 리스트 객체로 리턴

예제 12) findall 함수의 기능 확인

- findall 함수의 기능을 알아보기 위한 컴파일 함수 사용

- 구문에 대한 findall 함수의 기능 확인 → [a-z]+ 의 기준에 맞는 문자열 단위들을 리스트 형태로 반환

3) split 함수 : 찾은 정규 표현식 문자열을 기준으로 기존의 문자열을 분리

- split 함수의 기능을 알아보기 위한 컴파일 함수 사용

- 구문에 대한 split 함수의 기능 확인 → [-]을 기준점으로 나눠진 문자열들을 리스트 형태로 반환

re 라이브러리 활용한 정규표현식①

1. 정규표현식을 사용하는 이유

: '정규 표현식'이란 특정 텍스트 안에서 지정한 문자를 찾아내는 도구를 말한다. 이 기능이 실제 프로그래밍에 많이 사용되는 이유는 새로 수집한 데이터나 기존에 다른 용도로 쓰이던 데이터를 필요한 정보 형태로 가공해내는 데 있어 활용성이 매우 높기 때문이다. 간단한 예로 우리에게 '주민등록번호 : 981029-1234567' 라는 데이터가 있을 때, 우리는 '-' 다음 놓인 숫자를 활용해 그 사람의 성별을 알아낼 수 있다. 여기서 '- 다음에 놓이는 수'의 개념을 식으로 표현하는 것이 정규표현식의 활용을 통해 가능해지는 것이다. 

 

2. 정규표현식의 문자열 지칭 방법

: 정규 표현식은 아래와 같이 일정한 규칙을 가지고 작성됨으로 가지고 있는 데이터 양식에 따라 필요한 패턴을 직접 만들어서 사용할 수 있다. 해당 양식에 따라 작성된 패턴을 re 라이브러리의 complie 함수를 통해 패턴으로 저장하면 문자열 안에 해당 패턴의 존재 유무를 확인하고 추가적인 함수 활용을 통해 원하는 형태로 변형이 가능하다.

정규 표현식 축약 표현 예 시
[0-9] \d 숫자를 찾음
[^0-9] \D 숫자가 아닌 것을 찾음(텍스트, 특수 문자, white space(스페이스, 탭, 엔터 등등)
[\t\n\r\f\v] \s white space(스페이스, 탭, 엔터 등등) 문자인 것을 찾음
[^\t\n\r\f\v] \S white space(스페이스, 탭, 엔터 등등) 문자가 아닌 것을 것을 찾음
[A-Za-z0-9] \w 문자, 숫자를 찾음
[^A-Za-z0-9] \W 문자, 숫자가 아닌 것을 찾음

예제 1) 정규 표현식을 활용해 문자열 내에서 숫자 위치 찾기 

 

3. 점 (dot) 의 활용

: . (dot)은 정규 표현식 상에서 줄바꿈 문자 (\n)을 제외한 모든 문자 (한 개)를 의미한다. 만약 정말 . 을 문자열 내에서 찾고 싶다면 \n 으로 표기하거나 [.]으로 표기하면 된다.

 

예제 2) . (dot)이 사용된 패턴을 통해 문자열 적용 유무 확인 

- . (dot) 기능을 활용해 패턴 저장하기

- 패턴이 발견되는 사례 정리① .(dot)의 수만큼 문자/ 숫자가 차지한 경우

- 패턴이 발견되는 사례 정리② 문자열 사이에 패턴이 위치한 경우

- 패턴이 발견되지 못한 사례① .(dot)의 수보다 많은 변수가 있을 경우

- 패턴이 발견되지 못한 사례② .(dot)의 수보다 적은 변수가 있을 경우

- 패턴이 발견되지 못한 사례③ 대문자 대신 소문자가 적혀 있을 경우

 

4. ?,  *,  +를 사용한 반복되는 패턴 표현

: 문자열 내에서 해당 패턴을 찾기 위해 .(dot)의 경우에는 .(dot)의 개수와 문자열(\n 제외) 개수가 정확히 일치해야 한다는 제한 사항이 있다. 이러한 제한 사항 없이 보다 활용성 높게 문자열을 지정하고자 특정 형태의 문자열을 통째로 찾아내는 ?, *, + 구문이 사용된다. 

  • ?는 앞 문자가 0번 또는 1번 표시되는 패턴 (없어도 되고 한번 있어도 되는 패턴)
  • *은 앞 문자가 0번 또는 그 이상 반복되는 패턴
  • +는 앞 문자가 1번 또는 그 이상 반복되는 패턴 

예제 3) ?이 사용된 패턴을 통해 문자열 적용 유무 확인 

- ? 사용 위한 컴파일 함수 사용

- ? 앞에 놓인 문자 A가 없는 경우 → 문제 없이 B 구문만 특정

- ? 앞에 놓인 문자 A가 여러개 있는 경우 → 앞에 A부분들은 포함되어 있지 않고, 마지막 AB 구문만 특정

예제 4) *이 사용된 패턴을 통해 문자열 적용 유무 확인

- * 사용 위한 컴파일 함수 사용

- * 앞에 놓인 문자 A가 없는 경우 → 문제 없이 B 구문만 특정

- * 앞에 놓인 문자 A가 여러개인 경우 → 여러개의 A가 포함된 구문 전체 특정

예제 5) +이 사용된 패턴을 통해 문자열 적용 유무 확인

- + 사용 위한 컴파일 함수 사용

- + 앞에 놓인 문자 A가 없는 경우 +앞 문자가 한 개 이상 등장하지 않아 문자열 특정하지 못함

- + 앞에 놓인 문자 A가 여러개인 경우 → 여러개의 A가 포함된 구문 전체 특정

리스트를 문자열로 변환하는 방법

1. join 함수을 통한 리스트 to 문자열 변환 

: join 함수를 사용하면 정말 간단한 방식으로 기존의 타입이 리스트 형태였던 데이터를 문자열(str) 형태로 변환할 수 있다. 아래의 예시를 살펴보면 원하는 리스트 내 변인 사이에 삽입할 인자를 먼저 정의한 뒤, 해당 리스트를 쓰면 바로 문자열로 변환되는 것을 확인할 수 있다.

 

 다만 join 함수를 단독으로 사용할 경우 리스트 변인으로 문자열만을 포함하는 경우에만 한정적으로 작업이 진행되는 특성이 있다. 그렇기에 리스트 내 int 등의 다른 타입이 포함되어 있을 경우에 사용이 제한되는 경우가 있음에 유의해야 한다.

join 함수의 기본 사용 형태

2. join  + map 함수을 통한 리스트 to 문자열 변환

 : 위에 정리한 join 함수의 문제점, 문자열 외에 데이터 값이 있을 경우 적용되지 않는 사례를 보완하기 위해 map 함수를 함께 사용할 수 있다. map 함수의 특성과 이를 적용해 str과 int 인자가 혼재되어 있는 리스트를 문자열로 치환한 사례에 대해 정리해보면

 

※ map(함수 , 리스트 혹은 튜플 등) 함수는 이와 같이 2개의 인자를 사용한다.

  1. 함수 - str() 함수, 리스트 내 인자들을 대상으로 문자열 타입으로 변환하는 함수
  2. 리스트 - 위의 함수에 적용되어 리스트 내 모든 인자 타입을 문자열로 변환

str 변환 후 join 사용 형태

 

3. for 반복문을 통한 리스트 to 문자열 변환 

: 두 번째 방법은 for 반복문을 이용해 리스트 정보를 연속적으로 삽입시키는 방식이다. 우선 반복문의 결과로 도출되는 list 내 인자들을 받아줄 str 타입의 변수를 생성한 뒤 (아래 예시의 alist_str) 해당 변수 안으로 리스트 변인들을 차례대로 대입하는 방식이다.

 

 이 경우에도 join 함수와 마찬가지로 리스트 내 인자들을 str 값으로 변환하는 작업이 함께 이루어져야 한다. 다만 반복문 특성 상 인자별로 단일로 수행되기에 인자에 str() 함수를 더하는 것만으로 문제 없이 작업이 수행된다.   

for 반복문 통해 문자열 변환 형태

라이브러리의 개념과 사용 방법

1. 라이브러리의 개념

: 라이브러리는 미리 만들어놓은 함수들의 집합으로 개발 간 필요한 라이브러리를 찾아 사용한다면 개발에 필요한 시간과 노력을 획기적으로 절약할 수 있다. 라이브러리를 사용하기 위해선 원하는 기능이 갖고 있는 라이브러리를 찾고, 해당 라이브러리를 개발 환경 내에 설치한 뒤에 사용법에 맞춰 함수 기능을 이용할 수 있다.

#라이브러리 내 함수를 사용하기 위해선 사용자 컴퓨터 내에 라이브러리가 이미 설치가 되어 있어야 한다. (No module 에러 주의)

#Mac 환경 터미널, 윈도우 환경 cmd 내 'pip install 라이브러리명' 명령을 내림으로써 라이브러리 설치 가능

 

# 라이브러리 예시

  • NumPy: 파이썬을 이용해 다양한 수학 계산을 할 수 있도록 해준다.
  • Pandas: 데이터 분석 라이브러리.
  • matplotlib: 데이터 시각화 라이브러리.
  • scipy: 과학 계산에 많이 쓰이는 계산기법 및 알고리즘 탑재.
  • PyTorch: 딥러닝 라이브러리.

 

2. 라이브러리 사용 방법

: 라이브러리를 등록하고 사용함에 있어 등록하는 방법에 따라 호출하는 방법이 달라짐을 인지해야 한다.

 

1) 라이브러리 함수 전체 등록 및 사용 방법 1 

# 라이브러리 내 전체 함수 등록 방법 1
import 라이브러리명

# 라이브러리 내 함수 적용 및 출력
변수 = 라이브러리명.함수명()
print(변수)

2) 라이브러리 함수 전체 등록 및 사용 방법 2

# 라이브러리 내 전체 함수 등록 방법 2
from 라이브러리명 import *

# 라이브러리 내 함수 적용 및 출력
변수 = 함수명()
print(변수)

3) 라이브러리 함수 부분 등록 및 사용 방법

 

# 라이브러리 내 부분 함수 등록
from 라이브러리명 import 함수명1, 함수명2

# 부분적으로 입력한 함수 출력
num = 함수명1()
print(num)

 

 

3. 라이브러리 관련 세부 기능에 대해

1) as : 라이브러리명 혹은 함수명을 원하는 형태로 단축해줄 수 있는 기능

# as를 사용하여 라이브러리명 단축
import 라이브러리명 as d

변수 = d.함수명()
print(변수)

# as를 사용하여 함수명 단축
from 라이브러리명 import 함수명 as f

변수 = f()
print(변수)

객체와 클래스

1. 객체 지향 프로그래밍 (Object Oriented Progarmming)

:  객체(object) 단위로 데이터와 기능(함수)을 하나로 묶어서 쓰는 언어 

#붕어빵 찍어내는 틀을 클래스, 그 안에서 생성되는 붕어빵 (단팥빵 붕어빵, 슈크림 붕어빵 등)을 객체라 생각하고 아래 설명 및 코드 확인

 

 1) 해당 사물을 나타낼 수 있는 설계도를 만들어 둔 뒤 (Class)

 2) 해당 사물의 설계도를 기반으로 사물 1 객체를 만든다. (Object)

 3) 사물1 객체의 기능을 호출한다.

  - attribute : 사물1 객체의 변수

  - method : 사물1 객체의 함수

 

cf) 절차 지향 프로그래밍 : step by step으로 컴퓨터에 한줄씩 명령하는 방식 (ex. 파스칼, 포트란, C언어)

2. 객체 (Object) 와 클래스(Class) 정의하는 방법

1) 클래스 선언 및 함수 정의 방법

# class 선언 시 첫글자는 보통 대문자로 입력
# class에 있는 attribute에는 def 밑에 self가 들어가야함

class square():
    width = 0
    height = 0
    color = ''
    name = ''
    
    def square_area(self):
        return self.width * self.height

2) 클래스를 기반으로 객체 생성

#객체(object) 생성
square1 = square()
square2 = square()

#객체별 attribute 값 입력
square1.width = 10
square1.height = 10
square1.color = 'yellow'
square1.name = 'yellow square'

square2.width = 20
square2.height = 20
square2.color = 'blue'
square2.name = 'blue square'

3) 함수 값 출력

print(square1.square_area()) #square1에 해당하는 함수값 출력
print(square2.square_area()) #square2에 해당하는 함수값 출력

 

리스트 외 다른 데이터 구조

0. 데이터 구조 학습 간 필요 관점

: 리스트/ 튜플/ 딕셔너리/ 집합 4가지 데이터 구조를 학습하는 데 있어 선언, 읽기, 추가, 삭제, 수정 5가지 관점에서의 가능 여부와 방법에 대해 이해하는 것을 목표로 학습해야 한다.

#데이터 구조 간의 변형이 가능하다는 특징이 있어 필요한 상황에 맞게 데이터 구조를 변형해가며  다양한 기능을 활용해야 한다.

1. 튜플

: 튜플을 사용하는 경우는 여러 개의 return 값을 받아 저장할 때 그리고 변수 간의 값을 서로 바꾸고자 할 때 주로 사용한다.

# 여러개의 return 값을 받을 떄
def quot_rem(x,y):
	quot = x//y
    rem = x%y
    return quot, rem  #해당 값 튜플 형태로 추출

# 변수 간의 값을 교환할 때
x=1
y=5

x,y = y,x  #x=5, y=1로 값 추출

- 선언 + 입력 : 변수명 = (1,2,3,4) 또는 tuple(1,2,3,4)
- 읽기 : 변수명[인덱스 번호]         #슬라이싱 활용 가능

- 추가 : 기본적으로 불가하지만, 튜플 간의 합을 통해 추가하는 것은 가능

tuple = (1,2,3)
print(tuple+tuple)
# 값으로 (1,2,3,1,2,3) 출력

- 삭제 : 불가

- 수정 : 불가

 

2. 딕셔너리 (사전)

#key만 출력하고자 할 때
print(data_dict.keys())

for key in data_dict.keys():
    print(data_dict[key])
    

#value만 출력하고자 할 때
print(data_dict.values())

#key와 value를 튜플 형태로 각각 출력하고자 할 때
print(data_dict.items())

for items in data_dict.items():
    print(items)

- 선언 + 입력 : 변수명 = {키 : 값, 키 : 값} 또는 dict(키 : 값, 키 : 값)
- 읽기 : 변수명[키]

- 추가 : 변수명[새로운 키] = 새로운 값

- 삭제 : del 변수명[제거할 키]

- 수정 : 변수명[수정할키] = 새로운 값

3. 집합 (set)

: 다른 데이터 구조와는 달리 순서 혹은 중복이 없다는 특징이 있다. 중복이 없다는 특징을 이용해 수많은 데이터 중 중복을 제거하고 싶을 경우 set()함수로 집합으로 변형시킨 후 다시 원복할 시 중복된 데이터를 제거할 수 있다.

# 데이터 구조 집합의 기본 활용
data1 = {'apple', 'strawberry','kiwi'}
data2 = {'apple','banana','kiwi'}

print(data1&data2)  #교집합
print(data1|data2)  #합집합
print(data1-data2)  #차집합
print(data1^data2)   #교집합의 여집합

# 집합의 특징을 활용한 중복 제거
alist_data = [1,2,3,1,2,3,1]
alist = set(alist_data)
list(alist)      #[1,2,3] 출력

- 선언 + 입력 : 변수명 = set(), 변수명 = {데이터1, 데이터2 ...}, 변수명 = set({데이터1, 데이터2 ...})
- 읽기 : 인덱스 번호를 지원하지 않음. 반복문을 통해 읽을 수 있음.

함수의 기본 구조와 활용

1. 함수의 기본 구조

: 함수의 경우 사전에 정의된 있는 것들을 사용하는 경우가 많지만, 보는 이의 이해를 돕고 코드의 길이를 효율적으로 줄이기 위해 반복되거나 중요한 구문을 함수로 정의하는 경우가 많다. 함수를 정의함에 있어 인풋(인자 - argument, parameter)과 아웃풋 (결과값)의 개념이 중요한데 중학교 시절 배웠던 Y = F(x) 함수식에 착안해 생각한다면 이해할 수 있다.

#함수 정의 방법과 인자에 활용에 대한 사례
def func1(parameter1, parameter2):
    print("hello~!",parameter1,"I'm",parameter2)
func1('drogba','lampard')

 

2. 함수 내 return의 활용

: 결과값을 추가적으로 활용하고자 할 때에는 return을 통해 값을 받고 이에 대응하는 변수를 활용하는 방식을 취할 수 있다.

#보통의 경우 리턴은 한 개의 값만 가능한데, 파이썬의 경우 튜플의 형태로 여러개의 결과값을 저장할 수 있다.

#함수 안에서 리턴 이후의 것들은 실행되지 않는 특징이 있다. 따라서 작성자에 다라 코드 종료의 문구로 사용하기도 한다.

 

#return을 통해 변수에 해당 결과값을 기입할 수 있음
def func1(parameter1, parameter2):
	return parameter1 + parmeter2

y = func1(1,2)
#y에 3(1+2)의 값이 들어가 변수로서 추가적인 활용이 가능함

 

3. local variable과 global variable의 차이

: 함수의 인자, 혹은 함수 내 정의된 값은 해당 결과값에만 영향을 미칠 뿐, 함수 밖 변수에는 영향을 끼치지 않는다는 점을 주의해야 한다. 아래 예시를 보면 sum 함수 내에 정의된 c는 함수 내에서면 영향을 미치는 local variable로 함수 밖 print(c)할 경우 undefined 로 출력됨을 확인할 수 있다.

def sum(a,b):
    c = 5
    result = a + b + c
    return result

print(sum(1,2)) #값으로 8출력
print(c)        #not defined 에러 출력

반복문의 기본 구조와 활용

1. 반복문의 기본 구조

: 반복문은 특정 구문의 사용이 반복될 경우 이를 일일이 기입하는 방식이 아니라 하나의 구문을 대표로 하여 이를 반복 사용하는 방식이다. 코드를 효율적으로 작성할 수 있어 생산성이 높아질 뿐만 아니라 추후 유지 보수도 매우 용이한 특징이 있다. 반복문은 '리스트 내 인자' 혹은 '정해진 범위'에 대해 사용되는 for 반복문과 특정 조건에 부합되지 않을 때까지 반복하는 while 반복문이 대표적으로 사용된다.

 

1) for 반복문

: list 함수 내 인자 혹은 range 내의 범위 값에 해당하는 값 혹은 횟수 만큼 반복 실행하는 함수

#리스트 내 인자를 활용한 반복문 기본 구조
alist = [1,2,3,4,5]
for i in alist:
    print(i)
    
# range 범위를 활용한 반복문 기본 구조
for i in range(1,6):
    print(i)

 

2) while 반복문

:  while 행에 주어진 조건에 부합하지 않을 때까지 반복을 실행하는 함수

#시행 횟수를 제한하는 경우
i = 0
while i <=3:
    print(i)
    i = i+1

# 원하는 정답이 세팅되어 있는 경우    
name = input("who's the best palyer in Chelsea : ")
while name != "drogba":
    print("wrong")
    name = input("another?")
print("right")

2. for 반복문의 활용

: for 반복문의 'range 범위만큼 반복' 되는 특징을 이용해 구구단과 같은 계산식 프로그래밍이 가능하다.

#조건문과 반복문을 같이 사용한 경우
data = int(input("2~9사이의 값을 입력하세요 : "))

if data>=2 and data <=9:
    for i in range(1,10):
        print(data, "X", i, "=",data*i)
else:
    print("다시 입력하세요")

: for 반복문의 '리스트 내 인자에 대해 적용' 되는 특징을 이용해 리스트 내 데이터를 일괄적으로 가공하는 프로그래밍이 가능하다. 

#[이름] 형태로 받은 값에 대해 데이터 정리하는 경우
data = "[dave],[david],[andy],[arthor]"
data_list = data.split(",")

#strip 통해 해결
for i in data_list:
    print(i.strip("[""]"))
#슬라이싱 개념을 통해 해결
for i in data_list:
    print(i[1:-1])

3. while 반복문의 활용

:while 반복문의 특징인 '조건에 부합하지 않을 때까지' 를 이용하여 원하는 답변이 나올 때까지 답변을 재요구하는 프로그래밍이 가능하다.

#비밀번호 확인
data = input("비밀번호를 입력하세요")

while data != "4312":
    data = input("틀렸으니 재입력하세요")
print("통과")

조건문의 기본 형태와 활용

1. 조건문의 기본 형태

: 조건문의 기본 형태는 if / elif/ else 구조를 이뤄어져 있다. elif의 경우 횟수에 제한 없이 조건을 연속적으로 제시할 수 있다는 특징이 있으며 else는 굳이 사용하지 않아도 오류가 발생하진 않지만 쓴다면 마지막에 사용해야 한다는 특징이 있다. 추가로 조건문 사용 간 Tab 공간에 대해 정확히 세팅해야만 오류가 나지 않으니 주의해야 한다.

age = int(input("당신의 나이는 몇살입니까?"))
if age < 13:
    print("아동")
elif age < 20:
    print("청소년")
else :
    print("성인")

 

1) 논리 구조에서 and 혹은 or 활용하는 형태

age1 = int(input("철수의 나이는 몇살입니까?"))
age2 = int(input("영희의 나이는 몇살입니까?"))

if age1 > 20 and age2 > 20:
    print("출입 가능")
else:
    print("출입 금지")

 

2) if not 사용 형태 

age = int(input("당신의 나이는 몇살입니까?"))
if not age >= 20:
    print("미성년자")
else:
    print("성인")

 

2. 조건문 안에 조건문

: 조건문 안에 조건문 구조를 사용할 경우 elif을 단순 나열하는 방식과 비교했을 때 구조적으로 한 눈에 이해하기 쉽다는 특징이 있다. 논리 설정 간 핵심이 되는 기준을 통해 1차적인 프레임을 구분한 뒤 각 프레임 내에서 구조를 세분화하는 방식으로 사용할 수 있기 때문이다. 조건문 안에 조건문을 사용할 경우 들여쓰기 활용에 특히 더 주의해야 한다.

# 50,000원이 호텔과 모텔의 기준액이라는 점이 잘 보이도록 조건문 안에 조건문을 세팅한 사례 
cash = int(input("how much do you have?"))
if cash > 100000:
    print('go to 5star hotel')
elif cash >= 50000:
    if cash >=80000:
        print('go to 4star hotel')
    elif cash >= 70000:
        print('go to 3star hotel')
    else:
        print('go to 2star hotel')
else:
    if cash >= 30000:
        print("go to motel")
    else :
        print("go home")

 

3. if 조건문 활용 간 필요한 비교연산자 정리...

x == n #같다면
x != n #다르다면
x < n
x > n
x >= n
x <= n

문자열 다루기 기본과 리스트 데이터 구조

1. 인덱스

: 특정 데이터를 가르키는 번호를 나타내며, 시작점에서는 0부터 끝지점에서는 -1부터 시작하는 특징이 있다. 인덱스는 문자열(str)과 리스트를 대상으로 작용하지만 숫자(int)를 대상으로 작용하지 않는다.

p y t h o n
0 1 2 3 4 5
-6 -5 -4 -3 -2 -1

 

2. 슬라이싱

: 특정 데이터 내 부분을 추출하고 싶을 때 사용하는 개념이며, 인덱스 번호를 통해 추출한다.

슬라이싱 끝에 해당하는 문자는 포함되지 않고 출력되는 특징이 있으며, (-) 값을 활용해도 출력이 가능하다.

# 변수가 str인 경우와 list인 경우를 나눠서 슬라이싱의 기능을 생각해야 한다.

# str의 경우 글자별로 인덱스를 매칭하는 반면 리스트는 각 항목을 각 인덱스로 매칭하는 특징이 있다.

string = "python"
print(string[1:3])
print(string[-5:-3])
# 결과값으로 yt 출력

 

문자열 다루기 기본 함수 몇 가지...

- len() 함수의 사용

: 해당 변수의 전체 길이를 표시해주는 함수 (빈칸 포함)

 

- .strip()함수의 사용

: .strip()을 기본 적으로 사용할 시 "  " 빈칸을 제거하는데 활용 가능하며, 앞뒤의 빈칸만을 제거하는 특징을 가지고 있다.

("a") 괄호 안에 인자 설정을 통해 빈칸 외에도 다양한 것들을 제거 가능한 유용한 함수

# strip() 함수는 하나의 인자만을 받게 됨. 여러 인자를 기입할 때는 ","가 아닌 하나의 인자 내에 겹쳐서 사용할 것

# strip() 함수는 본래의 변수값을 변형시키지 않는다는 특징이 있다.

 

- .find()

: .find("a")의 형태로 쓰이며 해당 값이 처음 등장하는 위치를 표시해주는 함수 

 

- .replace

: .replace("a"."b")의 형태로 쓰이며 변수 내 a 값을 b로 바꾸는데 사용하는 함수

 

- .format  : 매개변수/ 변인 개념을 활용하는 함수이자 소수점 반올림 기능으로 활용되는 함수

# 매개변수/ 변인으로 활용되는 경우
print("I have an {1}, I have a {0}".format("pen","apple"))
# I have an apple, I have a pen 출력

# 소수점 반올림으로 활용되는 경우
a = 3.14159
print(format(a,".2f"))
#3.14 출력

4. 데이터 구조 - 리스트

: 여러가지 관계가 있는 데이터를 하나의 변수로 다루는 방법으로 []안에 ","를 사용해 데이터를 기입한다.

보통 빈 리스트를 시작으로 append 혹은 insert 함수를 통해 인자를 추가하는 방식으로 진행하는 것이 일반적이다.

#리스트를 정의하는 2가지 방법
리스트변수 = []
리스트변수 = list()
#리스트 추가
리스트변수.append('데이터')
리스트변수.insert(인덱스번호,'데이터')
#리스트 삭제
리스트변수.remove('데이터')
del 리스트변수[인덱스번호]
#리스트 데이터 수정
리스트변수[인덱스번호] = '수정할 데이터'

 

리스트 관련 몇 가지 기능...

 

- 찾고자 하는 값 in list 변수 

: 원하는 값이 리스트 내에 존재하는지 확인 가능. 추후 조건문과 결합되어 입력값에 대한 에러 체크하는데 용이하다.

alist = [1,2,3,4]

1 in alist    #True 출력

 

- .sort()

: 리스트.sort()의 형태로 쓰이며 오름차순으로 정렬되는 기능, 본래의 변수리스트가 변환되는 특징이 있다.

 

- .reverse()

: 리스트.reverse()의 형태로 쓰이며 내림차순으로 정렬되는 기능, 본래의 변수리스트가 변환되는 특징이 있다.

 

- .split()

: 리스트.split()의 형태로 쓰이며 띄어쓰기 " "에 따라 리스트화시키는 기능, 본래의 변수값이 변하지 않는다는 특징이 있다.

b = "a_b_c_d"
b_set = b.split("_")
#b_set ['a','b','c','d'] 형태로 출력
#스플릿 함수와 슬라이싱 응용 사례 : 주민등록번호 내 성별 확인
digit = input("주민등록번호 입력")

#1번 구조
data = digit.split("-")
data_back = data[1]
print(data_back[0])

#2번 구조
data = digit.split("-")[1]
print(data[0])

#3번 구조
data = digit.split("-")[1][0]
print(data)

 

+ Recent posts