2 - Python : operator, condition, loop

최민규·2023년 1월 3일
0

Python 대/소문자 변환 함수

  • upper() : 모든 문자열을 대문자로 변경
  • lower() : 모든 문자열을 소문자로 변경
data = 'python'
data.upper()

# Terminal
'PYTHON'

Python 빌트인 함수

  • type() : 객체의 타입을 체크해주는 함수
  • dir() : 괄호 안 객체에 대해 어떤 메서드를 쓸 수 있는지 알려주는 함수
  • help() : 키워드, 함수, 클래스, 매서드 등에 대한 사용법을 알려주는 함수

식별자 n개 - 데이터 n개 : tuple

tuple 데이터 타입은 여러 개의 식별자로 받을 수 있다

data = 1, 2
print(type(data), data)
d1, d2 = data
print(d1, d2)

# Terminal
<class 'tuple'> (1, 2)
1 2

데이터 규모에 따른 스킬

  • 엑셀 : 사용이 간편하고, 데이터 100만개 까지 처리 가능, 만들어진 기능만 사용 가능, 속도가 느림
  • 파이썬 : 파이썬 문법으로 처리, 데이터 RAM의 용량 만큼 처리 가능, 기능을 만들어서 사용 가능, 속도가 빠름
  • 파이썬 : 가상 메모리(DASK)
  • 데이터베이스 : SQL 문법, 데이터 SSD(HDD) 용량 만큼 처리 가능, 속도가 빠름
  • 빅데이터 : 여러 개의 컴퓨터를 1대의 컴퓨터처럼 사용하는 것(SPARK, scala, python)

연산자 : CPU를 사용하는 방법

  • 산술
    + - * / // % **
    데이터 (int str list) + 데이터 = 데이터
  • 할당
    식별자 산술= 데이터
  • 비교
    == != > < >= <=
    데이터 + 데이터 = 논리값
  • 논리
    not and or
    논리값 + 논리값 = 논리값
  • 멤버
    특정 데이터가 컬렉션 데이터에 포함되었는지 확인
    결과로 논리값 출력

산술 연산자

a = 10, b = 20, c = 3

OperatorDescriptionExample
+더하기a + b = 30
-빼기a - b = -10
*곱하기a * b = 200
/나누기b / a = 2.0
%나머지b % a = 0
**제곱a ** c = 1000
//a // c = 3
data1, data2 = 14, 4
data1 - data2, data1 // data2, data1 % data2, data2 ** 2, data2 ** 0.5

# Terminal
(10, 3, 2, 16, 2.0)
# **연산자 우선순위**

1 + 2 * 3, (1 + 2) * 3

# Terminal
(7, 9)
# **나이를 입력 받아 연령대로 출력하는 코드 작성**

age = 49
ages = age // 10 * 10
ages # 30

# Terminal
40
# **데이터 타입에 따른 연산자 사용**

d1, d2, d3, d4 = 1, 2, '3', '4'
# **데이터 타입에 따라서 수행되는 연산이 다름**

d1 + d2, d3 + d4

# Terminal
(3, '34')
# **데이터 타입의 형변환**

# int(), float(), bool(), str(), list(), tuple(), dict()
d1 + int(d3), str(d1) + d3

# Terminal
(4, '13')
# **추가적인 연산, 형변환**

d5, d6 = [1, 2], list('ABC')
print(d5 + d6, d6 * 2, d4 * 5)

# Terminal
[1, 2, 'A', 'B', 'C'] ['A', 'B', 'C', 'A', 'B', 'C'] 44444

할당 연산자

누적해서 산술 연산 수행

a = 10, b = 20

OperatorDescriptionExample
=왼쪽 변수에 오른쪽 값을 할당한다c = a + b → c = a + b
+=왼쪽 변수에 오른쪽 값을 더하고 결과를 왼쪽변수에 할당c += a → c = c + a
-=왼쪽 변수에서 오른쪽 값을 빼고 결과를 왼쪽변수에 할당c -= a → c = c - a
*=왼쪽 변수에 오른쪽 값을 곱하고 결과를 왼쪽변수에 할당c = a → c = c a
/=왼쪽 변수에서 오른쪽 값을 나누고 결과를 왼쪽변수에 할당c /= a → c = c / a
%=왼쪽 변수에서 오른쪽 값을 나눈 나머지의 결과를 왼쪽변수에 할당c %= a → c = c % a
**=왼쪽 변수에 오른쪽 값만큼 제곱을 하고 결과를 왼쪽변수에 할당c = a → c = c a
//=왼쪽 변수에서 오른쪽 값을 나눈 몫의 결과를 왼쪽변수에 할당c //= a → c = c // a
data = 10
# data = data + 5
data += 5
data

# Terminal
15

비교 연산자

a = 10, b = 20

OperatorDescriptionExample
==값이 동일하다(a == b) → false
!=값이 동일하지 않다(a != b) → true
>왼쪽 값이 오른쪽 값보다 크다(a > b) → false
<왼쪽 값이 오른쪽 값보다 작다(a < b) → true
>=왼쪽 값이 오른쪽 값보다 크거나 동일하다(a >= b) → false
<=왼쪽 값이 오른쪽 값보다 작거나 동일하다(a <= b) → true
# ==, !=, >, <, >=, <=
# 데이터 + 데이터 = 논리값
# 수식의 문법이 틀리면 Fasle, 맞으면 True 출력
d1, d2 = 10, 5
d1 == d2, d1 != d2, d1 > d2

# Terminal
(False, True, True)
# **ATM 기기 코드로 구현**

# 인출이 가능하면 True, 불가능하면 False 출력
# 인출금액을 입력받아서 처리 : input()
balance = 10000
draw = int(input('insert draw amount : '))
balance >= draw

# Terminal
insert draw amount : 2000
True

논리 연산자

a = True, b = False

OperatorDescriptionExample
and논리 AND 연산. 둘다 참일때만 참(a == b) → false
or논리 OR 연산. 둘 중 하나만 참이여도 참(a != b) → true
not논리 NOT 연산. 논리 상태를 반전(a > b) → false

논리값 + 논리값 = 논리값 : 논리값(데이터+데이터) + 논리값(데이터+데이터) = 논리값

비교연산자 : 조건1개

논리연산자 : 조건2개이상

not, and(T: T and T = T), or(F: F or F = F)

논리 연산자의 우선 순위

not > and > or

and 는 두개의 조건이 모두 True이여야 True

or 는 두개의 조건중 하나만 True이여도 True

not False, not (True and False), False or True, (10 > 5) or (10 > 15)

# Terminal
(True, True, True, True)
# **ATM 기기 업그레이드**

# 1회당 최대 인출금액은 5000원 입니다.
# 잔고보다 인출금액이 작거나 같음 : 최대인출금액 5000원
# 인출이 가능하면 True, 불가능하면 False 출력
balance = 10000
draw = 4000
(balance >= draw) and (draw <= 5000)

# Terminal
True

멤버 연산자

컬렉션 데이터에서 특정 데이터가 있는 확인 : 결과 논리값

a = 10, b = 10, list = [1, 2, 3, 4, 5]

OperatorDescriptionExample
inlist 내에 포함되어 있으면 참(a in list) = False
not inlist 내에 포함되어 있지 않으면 참(b not in list) = True

in not in

data = list('ABC')
'B' in data, 'D' in data, 'D' not in data

# Terminal
(True, False, True)
# **선수 명단에 손흥민이 있으면 True 출력**

players = ['메시', '손흥민', '호날두']
'손흥민' in players

# Terminal
True

연산자 요약

  • 산술
    + - < * / // % < **
    데이터 + 데이터 = 데이터
    데이터타입에 따라 다르게 연산수행
  • 할당
    식별자 산술= 데이터
  • 비교
    == != > < >= <= 데이터 + 데이터 = 논리값 (조건1개)
  • 논리
    not > and > or
    논리값 + 논리값 = 논리값 (조건2개 이상)
  • 멤버
    in not in
    컬렉션 데이터에서 특정 데이터가 있는 확인
    결과 논리값

실수할 만 한 코드 2

data1, data2 = 0.1, 0.2
(data1 + data2) == 0.3

# Terminal
False

# 부동소수점 때문에 'False'가 출력됨
# **부동 소수점 연산 문제**

data1 + data2

# Terminal
0.30000000000000004
# **해결방법 1 : 반올림으로 해결 round()**

print(round(data1 + data2, 1))
round(data1 + data2, 1) == 0.3

# Terminal
0.3
True
# **해결방법 2 : 고정소수점 연산**

from decimal import Decimal
print(float(Decimal(str(data1)) + Decimal(str(data2))))
float(Decimal(str(data1)) + Decimal(str(data2))) == 0.3

# Terminal
0.3
True

조건문

특정 조건에 따라서 다른 코드를 실행

if elf else

조건문 예시 1

# 내가 가진 돈이 5000원 이상이면 택시를 탄다.
# 내가 가진 돈이 2000원 이상이면 버스를 탄다.
# 그렇지 않으면(2000원 이상이 없으면) 걸어간다.

money = 3000

if money >= 5000:
    print('택시 탄다')
elif money >= 2000:
    print('버스 탄다')
else:
    print('걸어 간다')

print('END')

# Terminal
버스 탄다
END

Python과 다른 언어의 차이

Python은 들여쓰기를 강조한다

이는 조건문에서도 엄격하게 적용되며, 조건문에 포함되는 코드들은 들여쓰기를 해주어야 알맞게 작동

다른 언어에서는 조건문을 다음과 같이 작성하여, 들여쓰기를 강조하지는 않음

if(money >= 2000){
    print('버스 탄다');
}

조건문 예시 2 : 점수를 입력받아 학점을 출력하는 코드 작성

# 90 >= A, 80 >= B, 70 >= C, 60 >= D, F

point = 87

if point >= 90:
    print('A')
elif point >= 80:
    print('B')
elif point >= 70:
    print('C')
elif point >= 60:
    print('D')
else:
    print('F')

# Terminal
B

조건문 예시 3 : 숫자를 입력받아 홀수, 짝수를 출력하는 코드

**# 조건을 확인하는 코드 부분의 데이터가 bool(True, False)가 아니면, bool() 형변환해서 판단**

number = 8

if number % 2:
    print('홀수')
else:
    print('짝수')

# Terminal
짝수
# **숫자 데이터 연산과 bool() 을 통한 형변환 연산**

number = 8
number % 2, bool(number % 2)

# Terminal
(0, False)
# **bool() 형변환 했을 때 False가 나오는 데이터**

bool(0), bool(0.0), bool(''), bool(' '), bool([]), bool(()), bool({})

# Terminal
(False, False, False, True, False, False, False)

# bool(''), bool(' ')에서 후자는 공백이 있기에 True로 출력됨

조건문 예시 4 : ATM 기기 구현

프로그래밍 = 알고리즘 + 코딩

# 1. 계좌생성 : account : 10000
account = 10000
# 2. 입금, 출금 입력 : 입금(0), 출금(1) : command 변수에 저장
command = int(input('입금(0), 출금(1)을 입력하세요 : '))

# 3. 금액입력 : money 변수에 저장
money = int(input('금액을 입력하세요 : '))

# 4. 입금인 경우
if command == 0:

#   4-1. 입력받은 금액을 계좌에 추가
    account += money

# 5. 출금인 경우
else:

#   5-1. 잔액이 부족한 경우 : 'xx의 잔액이 부족합니다.' 출력
    if account < money:
        print(f'{money - account}의 잔액이 부족합니다.')

#   5-2. 잔액이 충분한 경우 : 'xx의 잔액이 출금되었습니다.' 출력
    else:
        account -= money
        print(f'{money}의 잔액이 출금되었습니다.')

# 6. 계좌 잔액 출력 : 'xx의 잔액이 남았습니다.' 출력
print(f'{account}의 잔액이 남았습니다.')

# Terminal
입금(0), 출금(1)을 입력하세요 : 1
금액을 입력하세요 : 7000
7000의 잔액이 출금되었습니다.
8000의 잔액이 남았습니다.

삼항 연산자

간단한 조건문을 한줄의 코드로 작성하는 방법

<true data> if <condition> else <false data>

# **일반 조건문**

balance, draw = 10000, 12000
if balance >= draw:
    print("인출가능")
else:
    print("인출불가")

# Terminal
인출불가
# **삼항 연산자로 변환**

balance, draw = 10000, 2000
result = "인출가능" if balance >= draw else "인출불가"
result

# Terminal
인출불가

반복문

특정 코드를 반복적으로 실행 → 코드 유지 보수에 좋음

while for break continue range() enumerate() zip()

# **문자열 세번 출력하기**

print('jupyter')
print('jupyter')
print('jupyter')

# Terminal
jupyter
jupyter
jupyter

while

무한루프에 빠지지 않도록 조심(특별한 이유가 아니라면 무한루프에서 탈출하는 코드를 중간에 넣어줘야 함)

무한루프 나오는 방법 : 런타임 → 실행 중단으로

count = 3
while count: # 조건을 확인하는 코드에 True, False가 아니면 bool() 형변환 해서 판단
    print('jupyter')
    count -= 1

# Terminal
jupyter
jupyter
jupyter

for

# _ : 식별자로 사용될때 사용되지 않는 식별자로 사용 
for _ in [0, 1, 2]:
    print('jupyter')

# Terminal
jupyter
jupyter
jupyter

range()

리스트를 만들어주는 함수

range(end) range(start, end) range(start, end, stride)

list(range(3)), list(range(3, 10)), list(range(3, 10, 2))

# Terminal
([0, 1, 2], [3, 4, 5, 6, 7, 8, 9], [3, 5, 7, 9])
# **range() 를 활용한 문자열 세번 출력하기**

for _ in range(3):
    print('jupyter')

# Terminal
jupyter
jupyter
jupyter
# **일 ~ 토 중에 주중, 주말을 나눠서 출력하는 코드 작성하기 + 스케쥴도 추가해보기**

week = list('일월화수목금토')
for day in week:
    if (day == '일') or (day == '토'):
        print(day, '주말', '육아')
    else:
        print(day, '주중', '강의, 육아')

# Terminal
일 주말 육아
월 주중 강의, 육아
화 주중 강의, 육아
수 주중 강의, 육아
목 주중 강의, 육아
금 주중 강의, 육아
토 주말 육아
# **30세 이상의 사용자 목록 출력**

users = ['홍길동(32)', '김파이썬(27)', '정노트북(43)']
for user in users:
    # print(user, int(user[-3:-1]))
    if int(user[-3:-1]) >= 30:
        print(user)

# Terminal
홍길동(32)
정노트북(43)

breakcontinue

  • break : 반복되는 코드를 중단
  • continue : 아래에 있는 코드를 실행하지 않고 반복구문의 코드로 올라서 코드를 실행
for data in range(10): # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    if data % 2: # 홀수 일때 True
        continue
    
    if data >= 5:
        break

    print(data)

# Terminal
0
2
4
# **랜덤한 숫자 먼저 맞추기 게임 만들기**

# 1. 0 ~ 9의 랜덤한 숫자 생성
import random
random_number = random.randint(0, 9)

# 2. 숫자를 입력한 횟수를 카운팅하는 변수 선언 : count
count = 0

# 3. 아래의 내용 반복 : while True:
while True:

#   3-1. 숫자를 입력 받음 : int(input())
    input_number = int(input('insert number(0~9) : '))

#   3-2. 카운팅 +1 추가 : count +=
    count += 1

#   3-3. 랜덤한 숫자와 입력받은 숫자가 같은지 확인 : if ==
    if random_number == input_number:

#   3-4. 같으면 카운팅 횟수 출력 > 게임 종료 : print() break
        print(f'count : {count}')
        break

#   3-5. 다르면 up, down 출력하기

# Terminal
insert number(0~9) : 5
insert number(0~9) : 3
insert number(0~9) : 2
insert number(0~9) : 4
insert number(0~9) : 7
insert number(0~9) : 6
insert number(0~9) : 9
insert number(0~9) : 8
insert number(0~9) : 0
count : 9

# 9번 만에 맞추었음

enumerate()

반복문에서 리스트 데이터에 idx 숫자를 출력할때 사용

# **user_id와 user를 출력 코드작성하기**

users = ['홍길동(32)', '김파이썬(27)', '정노트북(43)']
idx = 0
for user in users:
    print(idx, user)
    idx += 1

# Terminal
0 홍길동(32)
1 김파이썬(27)
2 정노트북(43)
users, list(enumerate(users))

# Terminal
(['홍길동(32)', '김파이썬(27)', '정노트북(43)'],
 [(0, '홍길동(32)'), (1, '김파이썬(27)'), (2, '정노트북(43)')])
for idx, user in enumerate(users):
    print(idx, user)

# Terminal
0 홍길동(32)
1 김파이썬(27)
2 정노트북(43)

zip()

같은 인덱스의 데이터끼리 튜플로 묶어서 리스트로 출력

players = ['손흥민', '메시', '호날두']
goals = [30, 20, 10]
games = [50, 30, 40, 20]
# print(list(zip(players, goals)))
for data in zip(players, goals, games):
    print(data)

# Terminal
('손흥민', 30, 50)
('메시', 20, 30)
('호날두', 10, 40)

Conditional Probability : 조건부 확률

  • 사건 A가 발생했다는 조건에 사건 B가 발생할 확률
  • 사건 A가 발생했을때 사건 B의 조건부 확률
  • 𝑃(𝐵|𝐴)=𝑃(𝐵∩𝐴)𝑃(𝐴)
  • 특징
    • 𝑃(𝐵|𝐴)≠𝑃(𝐴|𝐵)
    • 𝑃(𝐴∩𝐵)=𝑃(𝐵)𝑃(𝐴|𝐵)=𝑃(𝐴)𝑃(𝐵|𝐴)
    • 𝑃(𝐴|𝐵)=𝑃(𝐴∩𝐵)𝑃(𝐵)=𝑃(𝐴)𝑃(𝐵|𝐴)𝑃(𝐵)
    • 사건 B가 발생했을때 사건 A가 발생할 확률을 사건 A가 발생했을때 사건 B가 발생할 확률로 알아낼수 있다.
    • 𝑃(𝐵|𝐴) 로  를 알아낼수 있다. 𝑃(𝐴|𝐵)

Examples

  • A를 구매한 사람에게 B를 구매하라고 추천하는게 좋을까?
    • 𝑃(𝐴)=0.7,𝑃(𝐵)=0.6,𝑃(𝐴∩𝐵)=0.5
    • A를 구매한 사람이 B를 구매할 확률 :  = 𝑃(𝐵|𝐴)=𝑃(𝐴∩𝐵)𝑃(𝐴) 0.50.7=0.714
    • B를 구매할 확률 : 𝑃(𝐵)=0.6
    • 결론 : A를 구매하고 B를 구매하는것이 그냥 B를 구매하는 확률보다 높다. -> 추천하는것이 좋다!
  • A를 구매한 사람이 B를 구매할 확률로 B를 구매한사람이 A를 구매할 확률을 구할수 있다.
    • B를 구매한사람이 A를 구매할 확률 : 𝑃(𝐴|𝐵)=𝑃(𝐴)𝑃(𝐵|𝐴)𝑃(𝐵)=0.7∗0.7140.6=0.833

위의 공식을 통해 응용하기

아이폰을 구매한 고객에게 아이패드를 구매하라고 추천하는게 좋을까?

import pickle

with open('purchase_apple.pkl', 'rb') as file:
    data = pickle.load(file)
data[:2]

# Terminal
[{'customer_id': 10023, 'iPhone': 1, 'iPad': 1},
 {'customer_id': 10044, 'iPhone': 0, 'iPad': 1}]
# iPhone을 구매한 고객에게 iPad를 구매하라고 추천하는게 좋을까?
# P(iPad|iPhone)
# P(iPhone)
# P(iPad)
# P(iPhone & iPad)
total = len(data)
iphone = ipad = iphone_ipad = 0
for user in data:
    iphone += user['iPhone']
    ipad += user['iPad']
    if (user['iPhone'] == 1) and (user['iPad'] == 1):
        iphone_ipad += 1
total, iphone, ipad, iphone_ipad

# Terminal
(3593, 1798, 1510, 1291)
# P(iPhone) : 아이폰을 구매한 사람들
p_iphone = round(iphone / total, 4)

# P(iPad) : 아이패드를 구매한 사람들
p_ipad = round(ipad / total, 4)

# P(iPhone & iPad) : 둘 다 구매한 사람들
p_iphone_ipad = round(iphone_ipad / total, 4)

p_iphone, p_ipad, p_iphone_ipad
# 확률로 변환하기

# Terminal
(0.5004, 0.4203, 0.3593)
# P(iPad|iPhone) = P(iPad & iPhone) / P(iPhone)
# iPhone을 구매한 사람에게 iPad를 구매하라고 추천하는것이 좋을까?
round(p_iphone_ipad / p_iphone, 4)

# Terminal
0.718

→ 그냥 아이패드를 구매하는 확률보다 아이폰을 산 사람들이 아이패드를 구매할 확률이 높으니 충분히 타겟 마케팅을 진행할 만 하다고 판단할 수 있다

profile
안녕

0개의 댓글