AI를 공부하기 앞서 알아야할 것들이 참 많지만 그중에서도 가장 기본이자 핵심인 파이썬에 대해서 기초부터 흝고 가는 시간이 있었다.
파이썬의 기초을 배운지 1년이 지났고, 이제는 데이터 시각화나 머신러닝을 할 때 원활하게 다루긴 하지만, 이렇게 기초를 한번씩 되새겨 보는 시간도 분명 유익한 시간이었다.
파이썬 기초부터 프로젝트까지 담당하신 분은 김인섭 강사님이셨는데, 단순히 파이썬에 대해서만 공부한다기 보다는 강사님이 겪으신 다양한 경험과 직관을 바탕으로, 부트캠프 참여생들과 다양한 질문을 주고받으며 본인의 인사이트를 전달해주려 노력하시는 모습이 보여서 좋았다고 생각한다.
구글 Colab을 활용해서 기초 문법들을 공부했고 이후 Selenium을 간단히 사용해보는 시간이 있었다.
확실히 혼자 Selenium을 처음 접했을 때 어딘가 와닿지 않는 부분이 있었는데, 파이썬 Class 개념과 연동해서 Selenium을 차근차근 사용해보니 훨씬 이해하기 쉬운게 느껴졌다.
수업하며 작성했던 파이썬 문법과 다양한 질문들을 차근차근 정리해보았다.
파이썬 자료형 (Data Type) ⇒ 자료를 담는 그릇!
# 1.숫자형 (Number)
a=1
b=3
# 사칙연산이 가능
a + b
a - b
a * b
a / b
#float
a = 1.0
b = -3.5
a * b
-3.5
x = 3.14e3 # 3.14 * 10^(+3)
y = 3.14e-3 # 3.14 * 10^(-3)
x, y
(3140.0, 0.00314)
x = 3
y = 5
print(x ** y)
print(x % y)
print(x // y)
243
3
0
# 문자형 (String)
# - 작은 따옴표 (') 또는 쌍따옴표 (")로 감싸져 있는 형태 => python code convention
# 문자열 Indexing & slicing : 문자열의 위치를 숫자로 나타내는 것
txt = "Hello python!"
txt[4]
txt[0:4] # 0 <= txt <4 = hell
txt[0:5] # 0 <= txt <5 = hello
Hello
# Quiz.
# ”TitanicJames” 변수를 영화제목(title)과 감독(director)으로 슬라이싱 해보세요.
k = 'TitanicJames'
title = k[:7]
director = k[7:]
title, director
('Titanic', 'James')
# 문자열 포매팅
# - 문자를 출력하는 다양한 방법
name = 'inseop'
age = 30
print("Name : " + name + ", Age: " + str(age))
print("Name : {}, Age: {}".format(name, age)) #format
print(f"Name : {name}, Age: {age}")
Name : inseop, Age: 30
Name : inseop, Age: 30
Name : inseop, Age: 30
# 문자열 함수
# - strip(), join(), split()
# 1) strip() -> 벗겨내다
a = " 파이썬은 쉽다 "
# 필요없는 빈공간을 벗겨내야 분석이 제대로 된다
type(a)
text = a.strip()
text
파이썬은 쉽다
# 2) join
words = '안녕', '하세요', '파이썬'
type(words)
sentence = "-".join(words)
sentence
안녕-하세요-파이썬
# 3) split() 문자열을 나눠주자
sentence.split('-')
['안녕', '하세요', '파이썬']
# 리스트형 (List)
# - 리스트 : 여러개의 변수를 한 곳에서 관리
x = ['a', 'b', 'c', ['d','e']]
type(x)
x[0:3]
# 여러분이 스타크래프트를 만든다면 막막할 것
# Divide and Conquer => 분할하고 정복하기
# 스타크래프트를 정의할 수 있는 요소를 분할하고 하나씩 만들어나간다
# 종족별로 나눈다. 저그를 먼저 구현한다. 드론을 먼저 만든다.
x # 전체를 다 불러옴 ['a', 'b', 'c', ['d', 'e']]
x[3] # 3번째인 ['d','e']라는 하나의 리스트를 불러올 수 있음
y = x[3] # ['d','e']
y[1] # x[3][1] = e
e
# append() 요소 추가
fruits = ['사과','바나나','체리']
print(fruits)
fruits.append('오렌지')
print(fruits)
['사과', '바나나', '체리']['사과', '바나나', '체리', '오렌지']
# pop() 요소 제거
removed_fruits = fruits.pop(0)
print(removed_fruits)
사과
fruits
['바나나', '체리', '오렌지']
num = [10,6,30,100,50]
num.sort() # pandas의 num.sorted_values() 같은 메소드에도 결국 sort.()가 사용됨
num
[6, 10, 30, 50, 100]
# 튜플형 (tuple)
# () 소괄호로 감싸져 있다
# 특징 : 한번 생성되면 값 변경이 불가능하다. -> 요소를 더하거나, 제거하거나, 수정하거나 불가능
a = 1,2,3,4,5
# 불가능
# a[0] = 10
# a.append()
# a라는 튜플을 내가 변형할 수 있는 방법은 없나?
new_a = a + (10,)
new_a
(1, 2, 3, 4, 5, 10)
# 딕셔너리 Dict
# {}안에 key:value => {key:value, key2:value2 ...} => json형태
# API를 사용할 시 json의 형태로 동일하게 나타남
x = {"name":"inseop", "age":[30,32], "city":"seoul"}
type(x)
# x[0] keyError가 난다
# x['city'] key값으로 입력해줘야함
# x['city'], x['age']
# x['ages'] => error , try, except
x.get('ages', 0) # 오류에 대비한 코드
0
print(x.keys())
print(x.values())
print(x.items())
dict_keys(['name', 'age', 'city'])
dict_values(['inseop', [30, 32], 'seoul'])
dict_items([('name', 'inseop'), ('age', [30, 32]), ('city', 'seoul')])
for key,value in x.items():
print(key,value)
name inseop
age [30, 32]
city seoul
x.update({'name':'Inseop'})
x
{'name': 'Inseop', 'age': [30, 32], 'city': 'seoul'}
# dictionary에서 key 제거
x.pop('name') # del x['name']
Inseop
type(x.items())
dict_items
# 집합형 (Set) unique함수
# 특징 (1) 순서가 없다. (2) 중복을 허용하지 않는다.
x = set([1,2,3,4,5,6,6,6,6,6,6,6,3,4,2,1,2,3])
type(x), x
(set, {1, 2, 3, 4, 5, 6})
# 불형 (Boolean)
# True or False
x = True
y = False
type(x),x,type(y),y
(bool, True, bool, False)
1<100 # 조건문에서 많이 활용한다.
True
# 제어문
# 조건문 if , 반복문 for, while
num = 100
if num < 5:
print("숫자가 5보다 작습니다.")
elif num < 10:
print("숫자가 10보다 작습니다.")
else:
print("숫자가 10보다 큽니다.")
숫자가 10보다 큽니다.
# "같다"를 표현할 때는 "=="
num = 5 # num에 5를 넣는다
num == 5 # num이 5랑 같으냐?
# 서울에서 부산을 간다고 가정하에 나의 주머니에 있는 돈에 따른 조건문
# if => 7만원이 있으면 비행기를 타고,
# elif => 5만원이 있으면 기차를 타고
# elif => 3만원이 있으면 버스를 타고
# else => 걸어간다.
money = int(input("현재 얼마가 있으신가요?")) # 유저에게 값을 입력받는다.
card = True # and나 or 로 조건 추가 가능
if (money >= 70000) | (card == True): # python 3.9버전부터 사용가능(|)
print("비행기를 탄다")
elif money >= 50000:
print("기차를 탄다.")
elif money >= 50000:
print("버스를 탄다.")
else:
print("걸어간다.")
현재 얼마가 있으신가요?0
비행기를 탄다
# 비교연산자
a = 1
b = 3
a == b
a != b
a > b
a >= b # False
a < b
a <= b # and , or
# pandas => SQL // 파이썬코드 10줄로 해결할 것을 SQL할수있음
# 반복문(for)
# range(10) => 0~9까지의 숫자
for i in range(0,10):
print(i)
0
1
2
3
4
5
6
7
8
9
import numpy as np
for i in np.arange(0, 10, 2.5):
print(i)
0.0
2.5
5.0
7.5
cities = ['seoul','daejeon','daegu','busan']
for city in cities:
print(city)
if city == 'busan':
print("해운대로 가세요")
# 복수형과 단수를 활용하면 코드를 깔끔하게 짤 수 있다.
seoul
daejeon
daegu
busan
해운대로 가세요
for i in range(len(cities)):
print(i)
for i in range(len(cities)):
print(i)
0
1
2
3
4
5
# 반복문 (while) 무한반복 안되도록 조건설정을 잘 해줘야한다.
# 시간복잡도의 문제: for 문과 while문 중에서 for문이 기본적으로는 좋다. 로직에서 무한히 반복해야하는 상황이 있을 때 while을 사용함
a = 0
while a < 5:
a += 1 # a = a + 1
print(a)
1
2
3
4
5
# 1부터 5까지 더하는 프로그램. 결과값은 sum변수에 담기
# (1) for
sum1 = 0
for num1 in range(1,6):
print(num1)
sum1 += num1
print(sum1, sum1)
# (2) while
num2 = 1
sum2 = 0
while num2 < 6:
print(num2)
sum2 += num2
num2 += 1
print(sum2)
1
2
3
4
5
15 15
1
2
3
4
5
15
sum = 0
for i in range(1,6):
sum += i
print(sum)
15
sum = 0
i = 1
while i < 6 :
sum += i
i += 1
print(sum)
15
# 제어문 -> continue, break
for i in range(10):
if 3 <= i <= 5:
print("조건문 i : ",i)
# break : 반복문 종료
# continue : 다음 반복으로 / 뒤의 print(i)가 스킵됨, 즉 이번 반복은 여기까지만 실행하고 다음 횟수로 넘어간다.
continue
print(i)
0
1
2
조건문 i : 3
조건문 i : 4
조건문 i : 5
6
7
8
9
a = 'python'
b = a.upper() # 대문자
b.lower() # 소문자
python
import random
random.randint(1,10)
6
a = [1,1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,4,4,4,5,6,6]
random.choice(a)
2
import os
os.getcwd()
os.mkdir('test_folder')
import time
time.time() # UTC 기준 현재 시각을 초 단위로 변환
time.localtime(time.time()) # 서버시간 기준 (colab은 미국이므로)
time.struct_time(tm_year=2024, tm_mon=4, tm_mday=3, tm_hour=7, tm_min=15, tm_sec=54, tm_wday=2, tm_yday=94, tm_isdst=0)
# 클래스 (Class)
class FishBread: # Camel Case (서로 다른 단어는 대문자로)
# 초기화 => 생성자 => 클래스가 호출 됬을 때 가장 먼저 실행되는 함수
def __init__(self, name, ingredient):
self.name = name
self.ingredient = ingredient
# self로 인해 변수 name이 클래스내의 전역변수가 될 수 있다.
# 함수는 소문자로 표시
def bread(self):
print(f"붕어빵의 이름은 {self.name}, 재료는 {self.ingredient}")
chocolate_bread = FishBread('초코붕어빵','팟')
chocolate_bread.name,chocolate_bread.ingredient,chocolate_bread.bread()
sucream_bread = FishBread("슈크림 붕어빵", "슈크림")
sucream_bread.name
sucream_bread.ingredient
sucream_bread.bread()
붕어빵의 이름은 초코붕어빵, 재료는 팟
붕어빵의 이름은 슈크림 붕어빵, 재료는 슈크림
# 문제1. 1부터 10까지의 정수 중에서 짝수만 출력하는 코드
for i in range(1,11):
if i % 2 == 0:
print(i)
2
4
6
8
10
# 문제2. 사용자로부터 입력받은 숫자가 양수인지 음수인지 출력하는 코드
num = input("숫자를 입력하세요 : ")
num = int(num)
if num > 0:
print("양수입니다.")
elif num == 0:
print("0입니다.")
else:
print("음수입니다.")
숫자를 입력하세요 : -776
음수입니다.
# 문제3. 1부터 100까지의 정수 중에서 3의 배수이면서 5의 배수인 정수의 합을 구하는 코드
sum = 0
for number in range(1,101):
if (number % 3 == 0) & (number % 5 == 0):
sum += number
print(sum)
315
# 문제4. 사용자로부터 n개의 정수를 입력받아, 이 중에서 가장 큰 값과 가장 작은 값을 구하는 코드를 작성하세요.
numbers = input("숫자를 입력하세요 : (ex. 1,2,3)")
numbers = numbers.split(",")
k = []
for number in numbers:
k.append(int(number))
print(f"최대값은 {max(k)}, 최소값은 {min(k)}이다.")
user_count = int(input("몇 개의 숫자를 입력하시겠습니까?"))
user_input_list = []
for i in range(user_count):
user_input = int(input(f"숫자를 입력하세요 ({i+1}번째) :"))
user_input_list.append(user_input)
user_input_list
max_num = user_input_list[0]
min_num = user_input_list[0]
for number in user_input_list:
if number > max_num:
max_num = number
if number < min_num:
min_num = number
print("최대값은 : ", max_num)
print("최솟값은 : ", min_num)
숫자를 입력하세요 : 5,6,7,8,9,1235213
최대값은 1235213, 최소값은 5이다.
# 문제5. 사용자로 부터 입력받은 숫자의 구구단을 출력하는 코드
number = input("숫자를 입력해주세요. (1~9)")
number = int(number)
for i in range(1,10):
print(f"{number} X {i} = : {number*i}")
숫자를 입력해주세요. (1~9)6
6 X 1 = : 6
6 X 2 = : 12
6 X 3 = : 18
6 X 4 = : 24
6 X 5 = : 30
6 X 6 = : 36
6 X 7 = : 42
6 X 8 = : 48
6 X 9 = : 54
GPT 쓰기 데이터분석 Private Chain -> GPT 쓰지말라는 요청도 많음 Gemini 쓰지 않기
GPT 코딩한 결과를 믿을 수 있나 -> 코드 리뷰를 해주면 좋을 것 같다
Claude3 Opus 사용
Flutter, Vue, React => 잡식
AB180 Android SDK + Web SDK + Flutter SDK => 연봉을 빠르게 협상 ( 2인분하면되니까)
위치가져오기 IP 수집은 불법 gps 위치수집 => X WiFi List 수집 => 합법임 => 기지국 정보 3개를 알면 위치를 대략적으로 알 수 있음
추천알고리즘 개발 Factorization machine, light gcn 등 뭘로 하셨나요?
좋아요랑 상품 구매 후 타 상품구매 기록 gs shop의 airbridge
상용화 알고리즘 많이 나오면서 공정데이터로 옮겨갔다
mozilla data 법무법인 + 개발자와 함께
개발자 / 데이터사이언스 -> 공간적 자유를 가져갈 수 있다.
나는 4시간만 일한다 << 공간적 자유를 먼저 가져가라
배달의 민족 주4일 32시간제. (작년) => 배달의 민족 입사한 사람들? 열심히 일한 사람들
4일만 일하게 됬다. 3일은 노냐? => 재테크를 함 -> 양극화 발생
IT섹터 -> 계급장 떼고 실력으로 승부보자
AB180 6개월만에 // 팀장?? => 그 다음부터 팀장급 대우 받는 것.
스타트업은 위험하다는 생각 -> 복지않좋고 => 레버리지 삼아서 빠르게 연봉을 올리고 더 좋은회사로도 갈 수 있다.
그냥 네이버보다 상장되지 않은 계열사로 가면 내부우리사주를 노릴 수 있다.
연봉으로 돈버는 건 쉽지 않다. -> 종합소득세가 기다리는 중
주식양도소득세가 훨씬 낫다.
연봉 => 원하는 업무 (인공지능이나 양질의 프로젝트) => 연봉이 필요.
억대 연봉자에게 잡무를 시킬 수 있을까? => 양질의 업무를 준다. 연봉 = 기대감
양극화 => 좋은 프로젝트 경험이 계속 => 연봉이 높아지고 => 좋은 프로젝트
초반연봉이 매우 중요함 3천 => 5천 5년 4천 => 7천 2~3년 이면 된다.
학습을 많이 하다보면 Learning Curve -> 새로운 학습 시도시에 속도도 빨라지고 적극적으로 수용가능함
아침 10시부터 오후 7시까지 공부는 참 쉽지않지만 그래도 이렇게 여러명과 함께 공부하고, 열의 넘치는 강사님이나 매니저님들도 있다보니 즐기면서 할 수 있는 것같다. 다만 수요일과 금요일에는 이미지처리와 음성처리에 대해서 저녁 7시부터 9시까지 공부하는 시간이 있다보니 집에 가면 눈이 저절로 감기긴 한다....