1. 변하지 않는 튜플

종류 구성 타입
문자열 문자 Immutable
리스트 요소 Mutable
딕셔너리 key:value Mutable

문자열은 "a[i]"로 문자에 접근할 수 있지만, Immutable 형식으로 값을 수정할 수 없다.

 

반면에 리스트, 딕셔너리는 Mutable 형식으로 추가 및 수정을 할 수 있다. 데이터를 처리할 때는 리스트, 딕셔너리를 많이 사용하지만 값을 수정할 수 없은 Immutable한 자료형이 필요할 때가 있다. 따라서 리스트와 유사하지만 값을 바꿀 수 없는 Immutable 버전인 '튜플'이 있다.

 

t1 = ('a', 'b', 'c', 1, 2, 3)
print(t1, t1[2])

t2 = ("hello",) #하나의 값이면 뒤에 콤마 입력
print(t2)

t3 = "goorm", 'b', "hello", 1, 2, 3 #괄호 생략 가능
print(t3, t3[2])

s1 = list(set([1,2,3])) #다음에 배우게 될 집합 Mutable 타입
t4 = ([1, 2, 3], {"사과":"apple", "포도":"grape"}, ('a', 'b', 'c'), s1) #리스트 내 어떤 값도 가능
print(t4, t4[1])

t4[3][2] = "edit" #중요: 튜플 요소가 Mutable하면 수정할 수 있음
t4[1]["사과"] = "edit"
t4[0][2] = "edit"
print(t4)
  1. 튜플을 선언하고 초기화 할 때는 소괄호를 사용하고 indexing으로 요소에 접근할 수 있다. 중요한 점은 괄호를 사용하지 않아도 튜플로 초기화된다.
  2. t2처럼 한 개의 요소만 초기화 하는 튜플은 요소 뒤에 콤마를 꼭 입력해야한다.
  3. 변수 t3 는 괄호를 사용하지 않고 나열된 값이 튜플로 초기화 된다.
  4. 튜플 안에 있는 Mutable한 값은 수정할 수 있다. 튜플 자체의 요소는 데이터 초기화와 동시에 정해진 값이기에 수정할 수 없지만, Mutable하다면 요소의 요소를 수정할 순 있다.

** 참고

튜플 내부의 mutable 객체 수정이 가능한 이유?

  • 튜플은 불변 객체이다. -> 한 번 생성되면 구성 요소(참조)를 바꿀 수 없다.
  • 튜플 안에 있는 객체가 가변적(mutable)이라면 객체의 내부 상태는 바꿀 수 있다.
t = ([1, 2], "hello", 3)
t[0].append(99)  # 가능
print(t)         # 출력: ([1, 2, 99], 'hello', 3)

t[1] = "world"   # 오류 (튜플 요소 자체를 바꾸는 것)

튜플이 저장하는 건 "값"이 아니라 "객체에 대한 참조(주소)"이다. 불변이란 것은 튜플이 가리키는 참조(포인터)를 바꿀 수 없다는 말이지, 그 참조가 가리키는 객체의 내부가 바뀌지 않는 다는 말이 아니다.

 

t[0] = [1, 2]에서 t[0]은 객체를 가리키는 포인터이다. 포인터는 바꿀 수 없지만, 포인터가 가리키는 리스트의 내부는 바꿀 수 있다.

 

t1 = ('a', 'b', 'c', 1, 2, 3)
t2 = ("hello",)
t3 = "goorm", 'b', "hello", 1, 2, 3

print(t1 + t2 + t3) #튜플 결합
print(t2 * t3[4]) #곱셈으로 반복 출력
t2 = ("hello",)       # 요소가 1개인 튜플
t3 = ("goorm", 'b', "hello", 1, 2, 3)
t3[4] == 2            # 즉, 숫자 2

t2 * t3[4]  ==  ("hello",) * 2

이는 튜플 반복 연산이며, "hello"라는 문자열을 요소로 가진 튜플이 2번 반복된 튜플이 된다.

 

(1, 2) * 3         →  (1, 2, 1, 2, 1, 2)
("a",) * 4         →  ('a', 'a', 'a', 'a')

튜플 곱셈의 개념은 튜플 * 정수는 그 튜플을 정수만큼 반복한 튜플을 생성한다. 리스트의 곱셈과 같은 개념이다.

 

2. 중복과 순서가 없는 집합(Set)

s0 = {3, 2, 5, 1, 8, 4, 3} #집합으로 바로 선언 및 초기화
print(s0, type(s0))

str = "Hello groom!!!"
print(str, type(str))

s1 = set(str)
print(s1, type(s1))
Hello groom!!! <class 'str'>
{'l', 'e', 'g', 'r', ' ', 'o', 'm', 'H', '!'} <class 'set'>

s0와 같이 바로 값을 초기화 할 수 있고, 다른 자료형을 set으로 바꿀 수 있다. set( ) 인자에 문자열, 리스트, 딕셔너리, 튜플 등을 입력할 수 있다. 그럼 값들이 집합으로 변경된다.

 

특징으로는

  1. 요소의 순서가 없다.
  2. 중복되는 값은 1개만 저장된다.
  3. 딕셔너리는 key만 저장한다.
list = ["a", "a", "c", "groom", 10, 20, 30]
print(list, type(list))

s2 = set(list)
print(s2, type(s2))

dic = {"Anna": 25, "Bob": "doctor"}
print(dic, type(dic))

s3 = set(dic)
print(s3, type(s3))

tp = (190,)
print(tp, type(tp))

s4 = set(tp)
print(s4, type(s4))
['a', 'a', 'c', 'groom', 10, 20, 30] <class 'list'>
{'groom', 'a', 10, 'c', 20, 30} <class 'set'>
{'Anna': 25, 'Bob': 'doctor'} <class 'dict'>
{'Bob', 'Anna'} <class 'set'>
(190,) <class 'tuple'>
{190} <class 'set'>

집합에는 순서와 중복이 없기 때문에 리스트, 튜플에 속한 요소의 중복을 제거하기 위한 필터로 많이 사용된다. 그리고 순서가 없기 때문에 indexing, slicing을 사용할 수 없다.

 

str = "Hello World!!!"
print(str, type(str))

s0 = set(str)
print(s0, type(s0))

newStr = tuple(s0)
print(newStr)
print(newStr[4])
print(newStr[5:])
print(type(newStr))
Hello World!!! <class 'str'>
{' ', '!', 'o', 'l', 'd', 'e', 'H', 'W', 'r'} <class 'set'>
(' ', '!', 'o', 'l', 'd', 'e', 'H', 'W', 'r')
d
('e', 'H', 'W', 'r')
<class 'tuple'>

set( )으로 다른 자료형을 변환한 것 처럼 튜플은 tuple( )을 사용해서 변환할 수 있다.

 

3. 집합 함수

함수명 사용 구문
교집합 &, intersection()
합집합 |, union()
차집합 -, difference()
s1 = set([2,4,6,8,10]) 
s2 = set([1,2,3,4,5,6,7,8])

interset = s1 & s2 #교집합
print(interset)
print(s1.intersection(s2), s2.intersection(s1)) #함수 사용
print(s1) #s1의 값이 바뀌는 것이 아님

uniset = s1 | s2 #합집합
print(uniset)
print(s1.union(s2)) 
print(s1) #s1의 값이 바뀌는 것이 아님

difset1 = s1 - s2 #어떤 집합에서 어떤 집합을 빼느냐에 따라 다른 결괏값
difset2 = s2 - s1
print(difset1)
print(difset2)

 

함수명 함수 사용 함수 실행 결과
add set.add(a) 집합 set에 a 값을 추가한다.
update set.update([a,b,c, ...]) 집합 set에 여러 개의 값을 추가한다.
remove set.remove(a) 집합 set에 a 값을 삭제한다.
s1 = {1, 2, 3, 4}

s1.add("hello")
print(s1)

s1.add(10)
print(s1)

s1.add((1, 2, 3))  # add() 사용 시 튜플, 문자열은 값 하나로 인식
print(s1)

s1.update(["a", "b", "c"])  # set()과 같이 여러 값을 한 요소로 저장
print(s1)
s1.update((11, 12))
print(s1)

s1.update("zyx") # s1.add("hello")와의 차이
print(s1)

s1.remove("hello") # 하나의 값만 제거 가능
print(s1)
{1, 2, 3, 4, 'hello'}
{1, 2, 3, 4, 10, 'hello'}
{1, 2, 3, 4, 10, (1, 2, 3), 'hello'}
{1, 2, 3, 4, 10, (1, 2, 3), 'b', 'c', 'hello', 'a'}
{1, 2, 3, 4, 10, (1, 2, 3), 11, 'b', 12, 'c', 'hello', 'a'}
{1, 2, 3, 4, 10, (1, 2, 3), 11, 'b', 12, 'x', 'c', 'hello', 'a', 'z', 'y'}
{1, 2, 3, 4, 10, (1, 2, 3), 11, 'b', 12, 'x', 'c', 'a', 'z', 'y'}

 

** set.add()와 set.update()의 동작 차이와 튜플, 리스트 사용 주의점

 

1. 리스트와 집합은 집합(set)의 원소로 사용할 수 없다.
? 이유 : 리스트와 집합은 mutable(가변) -> 해시 불가능 - > set 내부에 들어갈 수 없음

s = set()
s.add([1,2,3])   # ❌ TypeError 발생

 

2. 튜플은 set의 원소로 사용할 수 있다.

? 이유 : 튜플은 immutable(불변) → 해시 가능 → 집합의 원소로 사용 가능

s = set()
s.add((1, 2, 3))   # ✅ 정상 작동. 튜플 자체가 하나의 원소로 들어감

 

3. add( ) vs update( ) 차이점

메서드 설명
add(x) x를 하나의 원소로 집합에 추가
update(iterable) iterable의 각 원소를 하나씩 집합에 추가
s1 = set()

# add: 튜플 자체가 하나의 원소로 들어감
s1.add((1, 2, 3))
# 결과: s1 = { (1, 2, 3) }

# update: 각 요소가 개별 원소로 들어감
s1.update((11, 12))
# 결과: s1 = { (1, 2, 3), 11, 12 }

즉, add()는 전체 객체를 넣고, update()는 안의 요소들을 꺼내서 각각 넣는다.

 

⭐ update(['a', 'b', 'c'])처럼 리스트를 사용할 수 있음

update()는 iterable을 받기 때문에 리스트, 튜플, 문자열 등 반복 가능한 자료형을 넘겨줄 수 있음. 리스트 자체는 원소로 넣을 수 없지만 update()로 넘기면 각 요소 'a', 'b', 'c'가 원소로 추가됨.

s1 = set()
s1.update(['a', 'b', 'c'])
# 결과: s1 = { 'a', 'b', 'c' }

 

1. 딕셔너리 자료형

딕셔너리 또한 값들의 집합인 자료형이다. 딕셔너리에는 순서가 존재하지 않고 "key : value"의 형태로 값을 저장한다. 딕셔너리는 중괄호 혹은 함수를 사용해서 선언 및 초기화 할 수 있다.

 

  1. 딕셔너리 이름 = {key1:value1, key2:value2, key3:value3}
  2. 딕셔너리 이름 = dict(key1=value1, key2=value2, key3=value3)
dic1 = {"apple":"사과", "bird":"새", "bug":"벌레"}
print(dic1)

dic2 = dict(apple = "사과", bird = "새", bug = "벌레")
print(dic2)

두 방법을 모두 사용하지만, 중괄호를 이용한 초기화를 더 많이 사용한다.

 

dic = {}

dic["apple"] = "사과"
dic["grape"] = "포도"
dic["fruits"] = ["바나나", "딸기", "오렌지"]
print(dic)

딕셔너리는 리스트와 다르게 빈 딕셔너리({})를 초기화해도 함수 없이 위와 같이 코드로 값을 추가할 수 있다.

 

dic1 = {"apple":"사과", "bird":"새", "bug":"벌레"}
print(dic1)

del dic1["bug"]
print(dic1)

딕셔너리의 요소는 del 키워드로 삭제할 수 있다.

 

문자열 요소는 Immutable 타입이기 때문에 indexing으로 수정할 수 없다. 딕셔너리에서 key는 Immutable 타입이다. 이 외에도 key는 value를 찾기위한 유일한 값으로 중복사용할 수 없다. 또한 key에는 리스트를 사용할 수 없는 반면 value에는 어떤 값이든 상관없이 올 수 있다.

 

dic = {"num": 3}
dic["num"] = 4

# key에 False 사용할 수 있다.
dic[False] = 0
print(dic)

# value는 어느 값이든 저장할 수 있다.
dic[True] = [1, 10, "파이썬"]
dic["nums"] = {"one": 1, "two": 2}
print(dic) # {'num': 4, False: 0, True: [1, 10, '파이썬'], 'nums': {'one': 1, 'two': 2}}

 

2. 딕셔너리 함수

함수 설명
x.keys() 딕셔너리 x의 key만 모아 객체 형식 dict_keys([key, key2, ...])으로 반환
x.values() 딕셔너리 x의 value만 모아 객체 dict_values([value1, value2, ….. ])으로 반환
x.items() 딕셔너리 x의 key와 value를 튜플로 묶어 dict_items([(key1, value1), (key2, value2), ... ]) 형식으로 반환
x.clear() 딕셔너리의 모든 값을 삭제( del 키워드는 객체 자체를 삭제)
x.get(key) x[key]와 마찬가지로 해당 key의 value 반환
key in x key 값이 x 딕셔너리에 존재하는지 판별하는 키워드
  1. x.key()가 실행되면 dict_keys라는 객체를 반환합니다. 만약 리스트 형태로 필요하다면 "list(x.keys())"로 변경할 수 있지만, 추후 배울 반복성 구문에서 또한 요소에 차례대로 접근할 수 있습니다.
  2. 튜플은 다음 챕터에서 참고해주세요.
  3. clear 함수를 사용하면 빈 딕셔너리로 바뀝니다.
  4. key가 존재하지 않으면 'None'을 반환합니다. 이때 만약 'None'이 아니라 다른 값을 출력하고 싶다면 "x.get(key, 출력하고 싶은 값)" 으로 작성합니다.
  5. key 값이 존재하면 True를, 존재하지 않으면 False 를 반환합니다.
mem = {"김구름": 25, "박에듀": 23, "온라인": 24}
print(mem.keys()) # dict_keys(['김구름', '박에듀', '온라인'])

# 새로운 리스트 변수에 초기화
names = list(mem.keys())
print(names) # ['김구름', '박에듀', '온라인']

names.append("윤레벨")
print("새로운 리스트", names)
print("원래 딕셔너리에서 key 모음", list(mem.keys()))
print(list(mem.values()))

print("key와 value를 튜플로 ", mem.items()) # dict_items([('김구름', 25), ('박에듀', 23), ('온라인', 24)])

exist = '박에듀' in mem 
print(exist)

mem.clear()
print(mem) #빈 딕셔너리 출력 {}

1. Hypothesis and cost function

학습 한다는 것이 위 cost 값을 최소화 하는 것이다.

 

2. Build graph using TF operations

- x_train = [1, 2, 3], y_train = [1, 2, 3]은 x, y값을 1, 2, 3으로 주어졌을 때 학습해보라는 말이다.(당연히, x=4일 때 y=5일 것이다.)

- W, b를 정의해야 하는데 Variable로 정의했다. 이때, Variable은 변수인데 tensorflow가 자체적으로 변경시키는 값이다. 또한, trainable Variable이라고 한다. 

- random_normal은 랜덤한 값을 주게 되는데 shape이 [1]로 값이 1개인 1차원 배열이다.

- hypothesis = x_train * w + 라 할 수 있다. hypothesis는 Node이다.

 

- reduce_mean(t)는 t에 있는 값의 평균을 구한다.

 

- GradientDescent

const를 최소화 하는 방법이 여러가지 있는데 GradientDescentOptimizer를 사용한다.

 

3. Run/update graph and get result

* tensorflow2.0에서 Session( ) 사용하지 않음.

- sess.run(tf.global_variables_initializer())는 W, b를 초기화 하는 과정이다.

- for문으로 2000번으로 train을 한다.

- train된 값을 print하는데 2000번 출력하기 쉽지 않으므로 20번에 한 번 꼴로 const, W, b를 출력한다.

 

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '1'
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

# X and Y data
x_train = [1, 2, 3]
y_train = [1, 2, 3]

# Try to find values for W and b to compute y_data = x_data * W + b
# We know that W should be 1 and b should be 0
# But let TensorFlow figure it out
W = tf.Variable(tf.random_normal([1]), name="weight")
b = tf.Variable(tf.random_normal([1]), name="bias")

# Our hypothesis XW+b
hypothesis = x_train * W + b

# cost/loss function
cost = tf.reduce_mean(tf.square(hypothesis - y_train))

# optimizer
train = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost)

# Launch the graph in a session.
with tf.Session() as sess:
    # Initializes global variables in the graph.
    sess.run(tf.global_variables_initializer())

    # Fit the line
    for step in range(2001):
        _, cost_val, W_val, b_val = sess.run([train, cost, W, b])

        if step % 20 == 0:
            print(step, cost_val, W_val, b_val)

-> x_train, y_train 값만 보면 y = x임을 유추할 수 있다.

https://github.com/hunkim/DeepLearningZeroToAll/blob/master/lab-02-1-linear_regression.py

 

0 4.570045 [-0.37157094] [1.1860353]
20 0.3327738 [0.30366653] [1.3989786]
40 0.2676154 [0.39454955] [1.3588154]
60 0.24273884 [0.4285412] [1.2973922]
80 0.22045638 [0.45592505] [1.2366514]
100 0.20022206 [0.48154473] [1.1785556]
120 0.18184495 [0.5059149] [1.1231701]
140 0.1651545 [0.52913547] [1.0703855]
160 0.14999594 [0.55126446] [1.0200813]
180 0.13622865 [0.5723535] [0.972141]
200 0.12372508 [0.5924513] [0.926454]
220 0.11236911 [0.6116045] [0.8829141]
240 0.10205544 [0.62985766] [0.84142053]
260 0.09268838 [0.6472529] [0.80187684]
280 0.08418107 [0.66383076] [0.7641916]
300 0.07645459 [0.67962956] [0.7282774]
320 0.0694373 [0.69468576] [0.694051]
340 0.063064046 [0.70903444] [0.66143316]
360 0.0572758 [0.72270876] [0.6303482]
380 0.052018773 [0.7357404] [0.6007241]
400 0.04724425 [0.74815977] [0.5724921]
420 0.042908 [0.7599953] [0.5455871]
440 0.03896971 [0.7712746] [0.5199465]
460 0.035392944 [0.78202385] [0.49551103]
480 0.03214443 [0.7922679] [0.47222382]
500 0.029194077 [0.8020306] [0.450031]
520 0.026514536 [0.8113344] [0.4288813]
540 0.024080927 [0.820201] [0.4087254]
560 0.021870695 [0.82865083] [0.38951686]
580 0.019863313 [0.8367038] [0.371211]
600 0.018040175 [0.844378] [0.35376543]
620 0.016384369 [0.8516916] [0.33713976]
640 0.014880556 [0.85866153] [0.32129547]
660 0.013514764 [0.86530393] [0.30619586]
680 0.012274325 [0.8716342] [0.29180577]
700 0.011147744 [0.87766695] [0.27809194]
720 0.010124549 [0.88341606] [0.2650226]
740 0.009195277 [0.8888951] [0.2525675]
760 0.008351304 [0.89411664] [0.24069777]
780 0.0075847786 [0.89909273] [0.22938587]
800 0.006888623 [0.90383506] [0.21860558]
820 0.0062563564 [0.9083544] [0.20833193]
840 0.0056821294 [0.91266143] [0.19854113]
860 0.0051605976 [0.916766] [0.1892104]
880 0.004686937 [0.9206778] [0.18031819]
900 0.0042567495 [0.9244056] [0.17184387]
920 0.0038660485 [0.92795825] [0.16376787]
940 0.0035112074 [0.931344] [0.15607134]
960 0.0031889342 [0.93457055] [0.14873655]
980 0.002896243 [0.93764544] [0.1417465]
1000 0.0026304133 [0.9405759] [0.13508493]
1020 0.002388979 [0.9433686] [0.12873644]
1040 0.00216971 [0.9460301] [0.12268628]
1060 0.0019705684 [0.9485664] [0.11692051]
1080 0.0017896983 [0.9509837] [0.11142563]
1100 0.0016254311 [0.95328724] [0.10618903]
1120 0.0014762423 [0.9554826] [0.10119853]
1140 0.0013407505 [0.9575747] [0.09644257]
1160 0.0012176932 [0.95956856] [0.09191015]
1180 0.0011059236 [0.9614687] [0.08759069]
1200 0.0010044194 [0.96327955] [0.08347426]
1220 0.0009122326 [0.9650052] [0.07955129]
1240 0.0008285015 [0.96664983] [0.07581268]
1260 0.00075246085 [0.96821713] [0.07224979]
1280 0.0006833964 [0.9697109] [0.06885435]
1300 0.00062066916 [0.9711344] [0.06561839]
1320 0.0005637013 [0.9724909] [0.06253456]
1340 0.0005119643 [0.97378373] [0.05959568]
1360 0.00046497353 [0.9750158] [0.05679492]
1380 0.0004222969 [0.97619003] [0.05412576]
1400 0.00038353706 [0.977309] [0.05158203]
1420 0.00034833435 [0.9783753] [0.04915787]
1440 0.0003163648 [0.9793915] [0.04684767]
1460 0.0002873258 [0.9803602] [0.04464605]
1480 0.00026095452 [0.9812832] [0.0425478]
1500 0.0002370026 [0.9821628] [0.0405482]
1520 0.00021524967 [0.9830011] [0.03864257]
1540 0.00019549165 [0.9838] [0.03682648]
1560 0.00017755032 [0.9845613] [0.03509577]
1580 0.00016125313 [0.9852869] [0.03344638]
1600 0.00014645225 [0.98597836] [0.03187453]
1620 0.00013301123 [0.9866373] [0.03037656]
1640 0.000120802724 [0.9872653] [0.02894899]
1660 0.00010971467 [0.9878638] [0.02758849]
1680 9.964479e-05 [0.98843414] [0.02629196]
1700 9.0500165e-05 [0.9889777] [0.02505637]
1720 8.219385e-05 [0.9894957] [0.02387884]
1740 7.464935e-05 [0.98998946] [0.02275658]
1760 6.779731e-05 [0.9904599] [0.02168702]
1780 6.15738e-05 [0.9909082] [0.02066777]
1800 5.5922355e-05 [0.9913355] [0.01969645]
1820 5.078956e-05 [0.99174273] [0.01877078]
1840 4.6127447e-05 [0.99213076] [0.01788862]
1860 4.189448e-05 [0.9925006] [0.01704792]
1880 3.8048653e-05 [0.99285305] [0.01624673]
1900 3.455651e-05 [0.99318886] [0.01548321]
1920 3.1384752e-05 [0.993509] [0.01475557]
1940 2.8504479e-05 [0.99381405] [0.0140621]
1960 2.5888083e-05 [0.99410474] [0.01340124]
1980 2.3512248e-05 [0.9943818] [0.01277145]
2000 2.1353997e-05 [0.99464583] [0.01217124]

값이 늘어날 수록, cost는 굉장히 작은 값에 수렴하고, W는 1 그리고 b는 에 수렴한다.

 

placeholder를 통해 값을 직접 변경하면서 넣을 수 있다.

- placeholder에서 shape=[None]은 여러개 올 수 있다는 말이다.

 

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '1'
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

# Try to find values for W and b to compute Y = W * X + b
W = tf.Variable(tf.random_normal([1]), name="weight")
b = tf.Variable(tf.random_normal([1]), name="bias")

# placeholders for a tensor that will be always fed using feed_dict
# See http://stackoverflow.com/questions/36693740/
X = tf.placeholder(tf.float32, shape=[None])
Y = tf.placeholder(tf.float32, shape=[None])

# Our hypothesis is X * W + b
hypothesis = X * W + b

# cost/loss function
cost = tf.reduce_mean(tf.square(hypothesis - Y))

# optimizer
train = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost)

# Launch the graph in a session.
with tf.Session() as sess:
    # Initializes global variables in the graph.
    sess.run(tf.global_variables_initializer())

    # Fit the line
    for step in range(2001):
        _, cost_val, W_val, b_val = sess.run(
            [train, cost, W, b], feed_dict={X: [1, 2, 3, 4, 5], Y: [2.1, 3.1, 4.1, 5.1, 6.1]}
        )
        if step % 20 == 0:
            print(step, cost_val, W_val, b_val)

-> x_train, y_train 값만 보면 y = x+1.5임을 유추할 수 있다.

0 89.63948 [-0.5100383] [-1.2930396]
20 0.540154 [1.4656237] [-0.6164825]
40 0.47013456 [1.4436066] [-0.5017207]
60 0.41057214 [1.4145927] [-0.3968122]
80 0.3585555 [1.3874409] [-0.29878473]
100 0.31312934 [1.3620671] [-0.20717724]
120 0.27345806 [1.3383551] [-0.12156917]
140 0.23881304 [1.316196] [-0.04156766]
160 0.20855728 [1.295488] [0.03319446]
180 0.18213454 [1.2761363] [0.10306045]
200 0.15905948 [1.2580519] [0.1683508]
220 0.13890788 [1.2411518] [0.22936524]
240 0.1213092 [1.2253585] [0.2863838]
260 0.10594027 [1.2105997] [0.33966824]
280 0.09251839 [1.1968073] [0.38946304]
300 0.080796994 [1.1839182] [0.43599662]
320 0.07056058 [1.1718733] [0.47948268]
340 0.061621152 [1.1606172] [0.5201208]
360 0.053814214 [1.1500983] [0.55809754]
380 0.046996363 [1.1402682] [0.59358716]
400 0.041042235 [1.1310819] [0.62675244]
420 0.035842523 [1.1224972] [0.6577458]
440 0.031301547 [1.1144748] [0.68670946]
460 0.027335847 [1.1069778] [0.71377623]
480 0.02387261 [1.0999717] [0.73907024]
500 0.020848121 [1.0934244] [0.7627077]
520 0.018206833 [1.087306] [0.78479725]
540 0.015900169 [1.0815883] [0.8054402]
560 0.01388572 [1.076245] [0.82473123]
580 0.0121265035 [1.0712516] [0.8427587]
600 0.010590159 [1.0665853] [0.8596057]
620 0.009248455 [1.0622245] [0.87534934]
640 0.008076762 [1.0581495] [0.890062]
660 0.0070534833 [1.0543412] [0.9038109]
680 0.006159871 [1.0507823] [0.9166595]
700 0.0053794472 [1.0474566] [0.92866665]
720 0.0046979147 [1.0443486] [0.93988746]
740 0.0041027414 [1.0414442] [0.9503732]
760 0.003582944 [1.03873] [0.96017236]
780 0.003129019 [1.0361936] [0.9693297]
800 0.0027325884 [1.0338231] [0.97788745]
820 0.0023863944 [1.0316081] [0.9858846]
840 0.002084062 [1.029538] [0.9933581]
860 0.0018200235 [1.0276036] [1.0003421]
880 0.0015894463 [1.0257958] [1.0068686]
900 0.001388067 [1.0241065] [1.012968]
920 0.0012122168 [1.0225278] [1.0186676]
940 0.0010586402 [1.0210526] [1.023994]
960 0.0009245202 [1.0196736] [1.0289717]
980 0.0008073845 [1.0183852] [1.0336235]
1000 0.0007050986 [1.017181] [1.0379704]
1020 0.0006157699 [1.016056] [1.0420327]
1040 0.0005377593 [1.0150045] [1.045829]
1060 0.00046963594 [1.0140219] [1.0493765]
1080 0.00041013298 [1.0131036] [1.0526918]
1100 0.000358176 [1.0122454] [1.0557901]
1120 0.00031279214 [1.0114434] [1.0586855]
1140 0.00027316582 [1.010694] [1.0613912]
1160 0.00023855995 [1.0099937] [1.0639198]
1180 0.00020833302 [1.0093391] [1.0662829]
1200 0.000181936 [1.0087274] [1.0684911]
1220 0.0001588808 [1.0081557] [1.0705551]
1240 0.00013875077 [1.0076215] [1.0724835]
1260 0.000121172576 [1.0071225] [1.0742856]
1280 0.0001058207 [1.006656] [1.0759696]
1300 9.2415554e-05 [1.0062201] [1.0775434]
1320 8.0707374e-05 [1.0058128] [1.079014]
1340 7.048451e-05 [1.0054321] [1.0803882]
1360 6.155305e-05 [1.0050764] [1.0816725]
1380 5.37534e-05 [1.0047439] [1.0828729]
1400 4.694568e-05 [1.0044333] [1.0839945]
1420 4.099901e-05 [1.0041429] [1.0850426]
1440 3.5804078e-05 [1.0038717] [1.086022]
1460 3.1269286e-05 [1.0036181] [1.0869374]
1480 2.7306687e-05 [1.0033811] [1.0877929]
1500 2.3847457e-05 [1.0031598] [1.0885924]
1520 2.0825722e-05 [1.0029527] [1.0893395]
1540 1.8190036e-05 [1.0027596] [1.0900371]
1560 1.588315e-05 [1.0025789] [1.0906899]
1580 1.3871327e-05 [1.0024098] [1.0912997]
1600 1.2113875e-05 [1.0022521] [1.0918695]
1620 1.0579322e-05 [1.0021045] [1.0924019]
1640 9.239109e-06 [1.0019667] [1.0928994]
1660 8.068504e-06 [1.001838] [1.0933645]
1680 7.046337e-06 [1.0017176] [1.093799]
1700 6.1539417e-06 [1.001605] [1.094205]
1720 5.3741333e-06 [1.0015] [1.0945846]
1740 4.6937794e-06 [1.0014018] [1.0949391]
1760 4.098376e-06 [1.00131] [1.0952706]
1780 3.5797577e-06 [1.0012243] [1.0955802]
1800 3.126234e-06 [1.0011439] [1.0958697]
1820 2.730156e-06 [1.0010691] [1.0961401]
1840 2.3841878e-06 [1.0009991] [1.096393]
1860 2.0815778e-06 [1.0009336] [1.0966294]
1880 1.8181236e-06 [1.0008725] [1.0968502]
1900 1.5877906e-06 [1.0008154] [1.0970564]
1920 1.3866174e-06 [1.0007619] [1.0972492]
1940 1.210977e-06 [1.000712] [1.0974293]
1960 1.0574473e-06 [1.0006655] [1.0975976]
1980 9.2368873e-07 [1.0006218] [1.0977548]
2000 8.069102e-07 [1.0005811] [1.0979017]

값을 위와 같이 줄 때, cost는 굉장히 작은값 W는 1에 수렴하고 b는 1.1에 수렴하는 것을 볼 수 있다.

1. Predicting exam score : regression

위와 같은 시간에 따른 점수에 따른 데이터를 갖고 학습시킨다. 이런 regression 모델이 데이터를 갖고 학습하면 어떠한 모델이 만들어진다.  

 

2. Regression

 

3. (Linear) Hypothesis

세상에는 Linear로 모델을 가설을 세울 수 있는 것이 많다. 따라서 위 중에 어떤 선이 해당 데이터에 맞을까 찾는 것이 모델을 만드는 것이다.

 

4. Cost Function

설정한 선형 함수와 실제 값의 차이를 제곱하면 항상 양수가 되며, 이 값은 예측과 실제 값의 차이가 클수록 더 커지므로, 오차가 큰 경우에 더 큰 가중치를 부여할 수 있다.

 

m을 학습한 데이터라고 하면 예측한 값 H(x)와 실제 값인 y의 차이를 제곱한다.

 

H(x) = Wx+b를 cost function에 대입하면, const는 W, b의 함수가 된다. 따라서 이 차이를 줄이려면 W, b가 작아야 하므로

 

cost를 가장 작게 만드는 W,b를 구하는 것이 최종 목표이다.

 

 

1. What is a Data Flow Graph?

  • Nodes in the graph represent mathmatical operations
  • Edges represent the multimensional data arrays(tensors) communicated between them

Nodes는 +, * 등 연산이고 선인 Edges가 data arrays이다. data arrays를 다른 말로 tensors인데 이 것이 돌아다닌다고 해서 tensorflow이다.

 

2. TensorFlow Hello World!

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '1'
import tensorflow as tf

hello = tf.constant("Hello, TensorFlow!")

print(hello.numpy())  # b'Hello, TensorFlow!'

'''
위 코드를 실행하면 앞에 b가 붙는다.
b는 byte string 임을 나타낸다.
'''

 

3. TensorFlow Mechanics

이제 placeholder 사용 안해서 잘 모르겠음,,,

 

4. Tensor Ranks, Shapes, and Types

1, 2, ... n 차원 array라고 하는데 이를 tensorflow에서 Rank라고 한다.

 

Shape은 tensor를 설계할 때 중요하다.

 

 

 

1. Python 설치

https://www.tensorflow.org/install/pip?hl=ko#windows-wsl2

 

pip로 TensorFlow 설치

이 페이지는 Cloud Translation API를 통해 번역되었습니다. pip로 TensorFlow 설치 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 이 가이드는 TensorFlow의 최신 안정

www.tensorflow.org

 

TensorFlow에서 Python 버전 3.9 ~ 3.12를 요구한다.

 

https://www.python.org/downloads/

 

Download Python

The official home of the Python Programming Language

www.python.org

 

2025년 07월 21일 기준 파이썬 공식 홈페이지에 들어가면 3.13.5 버전을 다운로드 받을 수 있게 되어 있다. 따라서 낮은 버전을 설치해야 하는데, 만약 높은 버전이 설치되어 있다면 지우고 다시 설치하는게 정신 건강상 이롭다.

 

https://www.python.org/downloads/release/python-3100/

 

Python Release Python 3.10.0

The official home of the Python Programming Language

www.python.org

위 링크를 들어가면 3.10.0버전을 다운로드 받을 수 있다.

 

2. Tensorflow 설치 후 확인

cmd를 관리자 권한으로 실행하자. 

 

pip install --upgrade pip

"pip"는 파이썬 프로그래밍에서 패키지를 관리하는 도구인 Python Package Index의 약자이다. 즉, 파이썬으로 작성된 다양한 라이브러리나 도구를 쉽게 설치하고 관리할 수 있도록 도와주는 도구이다.

 

TensorFlow에는 최신 버전의 pip가 필요하므로 최신 버전을 실행하려면 pip 설치를 업그레이드 하자.

 

pip install tensorflow

 

그 다음 해당 코드를 입력하면 tensorflow가 설치된다. (만약 설치가 안되면 파이썬 버전을 한 번 더 확인하자!)

 

3. Tensorflow 실행 방법

C:\Users\eunho>python
Python 3.10.0 (tags/v3.10.0:b494f59, Oct  4 2021, 19:00:18) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> tf.__version__
'2.19.0'
>>>

python을 입력해 Python을 실행한 뒤,

 

 

import tensorflow as tf
tf.__version__

를 입력했을 때, 출력 결과로 '2.xx.x' 형식의 버전이 나오면 TensorFlow가 정상적으로 설치되어 잘 실행되고 있는 것이다.

 

https://strolrol.tistory.com/149

 

[Python] Windows에서 python vs python3 명령어 사용 차이(윈도우11에서 명령어 어떤거 사용해야 함? + tenso

1. 문제윈도우에서 커맨드 프롬프트로 Python을 실행할 때, 어떤 블로그는 python 명령어를 사용하고, 어떤 곳은 python3를 입력하라고 한다 https://www.reddit.com/r/learnpython/comments/mf7t0n/why_python3_in_command_pr

strolrol.tistory.com

만약, python, python3 둘 중 헷갈리면 위 글을 참고하자.

1. 문제

윈도우에서 커맨드 프롬프트로 Python을 실행할 때, 어떤 블로그는 python 명령어를 사용하고, 어떤 곳은 python3를 입력하라고 한다

 

https://www.reddit.com/r/learnpython/comments/mf7t0n/why_python3_in_command_prompt_vs_python/?tl=ko

 

Reddit의 learnpython 커뮤니티

learnpython 커뮤니티에서 이 게시글을 비롯한 다양한 콘텐츠를 살펴보세요

www.reddit.com

운영체제에 따라 다르게 동작하는 경우가 있기 때문이다. 예를 들어 macOS나 일부 리눅스 배포판에서는 python 명령어가 Python 2.x 버전에 연결되어 있는 경우가 있다. 이 경우 python으로 실행하면 구버전이 실행되기 때문에, 명시적으로 python3 명령어를 사용하여 Python 3.x 버전을 실행하는 것이 일반적인 방법이다.

 

그런데 Windows11에서는 이와 조금 다르다. python3를 입력하면 Microsoft Store로 연결되며, 새로 설치하라는 메시지가 나올 수 있다. 이는 PATH 설정이나 Windows의 App Execution Alias 기능 때문이며, 혼란을 유발할 수 있다.

 

결론적으로 Windows 사용자라면 보통 python 명령어를 사용하는 것이 안전하다. python3는 macOS나 Linux 환경에서 주로 사용하는 방식이므로, Windows에서는 python으로 실행하면 된다.

 

cmd에 python3를 입력하면 위와 같이 파이썬을 설치하라고 나온다. 이때, 아무 버전이나 설치하면 되는데 이미 파이썬 설치버전으로 설치했더라도 또 설치해도 상관은 없다. 그 이유는 두 경로가 다르다.

 

where python3
where python

 

C:\Users\eunho\AppData\Local\Microsoft\WindowsApps\python3.exe

python3 경로는 Microsoft에서 설치한 경로가

 

C:\Users\eunho\AppData\Local\Programs\Python\Python310\python.exe
C:\Users\eunho\AppData\Local\Microsoft\WindowsApps\python.exe

python 경로는 만약 파이썬을 설치했다면 설치한 경로가 위로 오기 때문에 위부터 연결된다. 나는 tensorflow를 사용하기 위해 3.10.0버전을 사용했기 때문에 Python310이 나오는데 이 숫자는 사용자마다 다를 수 있다.

 

python을 입력하면 3.10.0 버전이 나오고

 

python3를 입력하면 3.10.11 버전이 나온다.

 

python 버전은 파이썬 공홈에서 설치한 버전이고 python3 버전은 Microsoft에서 설치한 버전이다.

 

2. tensorflow 설치

pip install tensorflow

위 명령어로 tensorflow를 설치하고 python, python3 둘 중 어느 것을 실행하야 할까? 만약 python3를 실행하고서 tensorflow가 잘 실행되었는지 확인하면

C:\Windows\System32>python3
Python 3.13.5 (tags/v3.13.5:6cb20a2, Jun 11 2025, 16:15:46) [MSC v.1943 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
Traceback (most recent call last):
  File "<python-input-0>", line 1, in <module>
    import tensorflow as tf
ModuleNotFoundError: No module named 'tensorflow'

tensorflow가 없다고 나온다. 분명히 난 tensorflow를 설치 했는데??? python과 python3 중 어떤 것을 실행해야 할지는 TensorFlow를 설치한 경로에 따라 달라진다. 예를 들어 python3로 실행했는데 TensorFlow가 없다고 나오면, 실제로는 python3에 설치되지 않았기 때문이다. TensorFlow를 설치한 경로가 python3가 아니라 python이라면, python으로 실행해야 하고, 만약 python3에서 사용하고 싶다면 해당 환경에도 TensorFlow를 따로 설치해야 한다.

 

# Python3에 최신 버전 pip 설치
python3 -m pip install --upgrade pip 

# Python3에 pip를 사용해 Tensorflow 설치
python3 -m pip install tensorflow

 

C:\Windows\System32>python3
>>> import tensorflow as tf
>>> tf.__version__
'2.19.0'
>>>

위를 설치하고 위와 같이 코드를 입력하면 tensorflow가 잘 설치된 것이다.

1. ML lec 00 - Machine/Deep learning

https://www.coursera.org/instructor/andrewng

 

강사 Andrew Ng | Coursera

Andrew Ng is Founder of DeepLearning.AI, General Partner at AI Fund, Chairman and Co-Founder of Coursera, and an Adjunct Professor at Stanford University. As a pioneer both in machine learning and online education, Dr. Ng has changed countless ...

www.coursera.org

http://www.holehouse.org/mlclass/

 

2. ML lec 01 - 기본적인 Machine Learning 의 용어와 개념 설명

1. Supervised learning : learning with labeled example

사람이 기계에서 'cat'이라는 라벨링 된 데이터를 준다.

 

2. Unsupervised learning : un-labeled data(ex. Google news grouping, Word clustering)

3. Traning data set

ML을 위해서는 label된 데이터 set이 있어야 하는데 왼쪽에 빨간색 친 데이터가 Training data set이다.

 

4. Types of supervised learning

  • Predicting final exam score based on time spent
    - regression
  • Pass/non-pass based on time spent
    - binary classification (둘 중 하나를 고르는 것)
  • Letter grade (A,B,C,E and F) based on time spend
    - multi-label classification (A,B,... label이 다양할 때 사용함)

 

1. indexing

oddnumber = [1, 3, 5, 7, 9]
cafes = ["star", "bene", "yoger", "friends"]
A = [1, 5, "A", "CC", "B"]
listInList = [[1, 3, 5, 6, 7], cafes, oddnumber, 1, 3, "ABC"]

a = oddnumber[3]  # 7
b = cafes[1]  # bene
c = A[2]  # A
d = listInList[0][1]  # 리스트 내 리스트 접근, 3

print(a)
print(b)
print(c)
print(d)

print(a + d, oddnumber[4] + listInList[4])  #숫자 + 숫자 연산 가능
print(b + c) #문자열 + 문자열: 문자열 합하기

 

7
bene
A
3
10 12
beneA

 

2. slicing

oddnumber = [1, 3, 5, 7, 9]
cafes = ["star", "bene", "yoger", "friends"]
A = [1, 5, "A", "CC", "B"]
listInList = [[1, 3, 5, 6, 7], cafes, oddnumber, 1, 3, "ABC"]

a = oddnumber[1:5]
b = cafes[1:]
c = A[:2]
d = listInList[0][1:4]

print(a)
print(b)
print(c)
print(d)

 

[3, 5, 7, 9]
['bene', 'yoger', 'friends']
[1, 5]
[3, 5, 6]

 

3. 리스트 연산

evennumbers = [2, 4, 6, 8, 10]
oddnumbers = [1, 3, 5, 7, 9]

numbers = evennumbers + oddnumbers
print(numbers)
print(numbers * 4)
[2, 4, 6, 8, 10, 1, 3, 5, 7, 9]
[2, 4, 6, 8, 10, 1, 3, 5, 7, 9, 2, 4, 6, 8, 10, 1, 3, 5, 7, 9, 2, 4, 6, 8, 10, 1, 3, 5, 7, 9, 2, 4, 6, 8, 10, 1, 3, 5, 7, 9]

 

4. 리스트 수정

numbers = [2, 4, 6, 8, 10, 1, 3, 5, 7, 9]

numbers[4] = 100
print(numbers)

numbers[2] = "hello"
print(numbers)

numbers[0] = numbers[9] #인덱스 9를 인덱스 0에 대입
print(numbers)

numbers[8] = ['a', 'b', 'c'] #리스트 전체를 형태 유지하며 대입
print(numbers)

 

[2, 4, 6, 8, 100, 1, 3, 5, 7, 9]
[2, 4, 'hello', 8, 100, 1, 3, 5, 7, 9]
[9, 4, 'hello', 8, 100, 1, 3, 5, 7, 9]
[9, 4, 'hello', 8, 100, 1, 3, 5, ['a', 'b', 'c'], 9]

 

numbers = [2, 4, 6, 8, 10, 1, 3, 5, 7, 9]

'''
numbers[4:5] = 80
Traceback (most recent call last):
  File "d:\workspace-python\groom\groom.py", line 3, in <module>
    numbers[4:5] = 80
TypeError: can only assign an iterable
'''

numbers[4:5] = [80]
print(numbers)

numbers[4:5] 는 인덱스 4만 가져오지만 리스트로 판단되기 때문에, 슬라이싱으로 값을 수정할 때는 단일 값이 아닌 리스트로 대입해야 한다.

 

numbers = [2, 4, 6, 8, 10, 1, 3, 5, 7, 9]

numbers[2:6] = "hello"
print(numbers)
[2, 4, 'h', 'e', 'l', 'l', 'o', 3, 5, 7, 9]

nubers[2:6] = "hello" 에서 "hello"는 하나의 문자열이자 문자 집합이다. 따라서 슬라이싱으로 값을 대입할 때 슬라이싱한 범위에 문자열의 문자를 순차적으로 하나씩 대입한다.

 

numbers = [2, 4, 6, 8, 10, 1, 3, 5, 7, 9]

numbers[2:3] = ["a", "b", "c"]
print(numbers)

numbers[8] = ["a", "b", "c"]  # 리스트 전체를 형태 유지하며 대입
print(numbers)
[2, 4, 'a', 'b', 'c', 8, 10, 1, 3, 5, 7, 9]
[2, 4, 'a', 'b', 'c', 8, 10, 1, ['a', 'b', 'c'], 5, 7, 9]
  • numbers[2:3] = ['a', 'b', 'c'] 와 같이 슬라이싱한 범위에 리스트를 넣으면 대입할 리스트의 구성 요소들이 numbers 에 완전히 포함된다.
  • 그러나, numbers[8] = ['a', 'b', 'c'] 는 리스트 내 리스트 형태로 수정된다.

⭐⭐⭐ 인덱싱과 슬라이싱의 차이점을 확실히 하자!!

 

5. 리스트 삭제

numbers = [2, 4, 6, 8, 10, 1, 3, 5, 7, 9]

# 값만 삭제
numbers[3] = ""
print(numbers)
[2, 4, 6, '', 10, 1, 3, 5, 7, 9]

 

numbers = [2, 4, 6, 8, 10, 1, 3, 5, 7, 9]

# 요쇼 삭제
numbers[1:3] = []
print(numbers)
[2, 8, 10, 1, 3, 5, 7, 9]

 

numbers = [2, 4, 6, 8, 10, 1, 3, 5, 7, 9]

a = "goorm"

#공간까지 삭제
del numbers[4]
print(numbers)

del numbers[:5]
print(numbers)

#객체 자체를 삭제
del a
[2, 4, 6, 8, 1, 3, 5, 7, 9]
[3, 5, 7, 9]

del 키워드를 통한 삭제도 가능하지만, del 키워드는 객체 자체를 삭제한다는 차이를 가진다.

 

5. 리스트 값 할당

리스트를 선언하고 사용하는 방법에는 두 가지가 있다.

 

  1. a = [ ] 혹은 a = list( ) 형식으로 빈 리스트 생성
  2. a = [1, 2, 3, 4, 5] 혹은 a = list([1, 2, 3, 4, 5]) 형식으로 리스트 생성과 동시에 값 할당
# 잘못된 코드
drawer = []
drawer[0] = "양말"

# 올바른 코드
drawer = []
drawer.append("양말")
print(drawer, drawer[0]) # ['양말'] 양말

drawer = [ ]로 빈 리스트를 만들고 나서 drawer[0] = "양말" 이렇게 코드를 실행하면 IndexError: list assignment index out of range가 발생한다.

이유는 파이썬 리스트는 해당 인덱스가 존재해야만 값을 대입할 수 있기 때문이다. 빈 리스트는 아무 요소도 없기 때문에 drawer[0]은 존재하지 않고, 없는 위치에 값을 할당하려고 하면 에러가 난다.

 

drawer = []

# 요소 1개 추가
drawer.append("양말")

# 여러 요소 추가
drawer.extend(["속옷","모자","반팔","바지"])
print(drawer)

여러 값을 한 번에 추가하기 위해서는 extend( )함수를 사용하면 된다.

 

drawer = ["양말", "속옷", "모자", "반팔", "바지"]

# del 키워드는 index 자체를 삭제
del drawer[3]
print(drawer)

drawer[3] = ""
print(drawer)

drawer[3] = "점퍼"
print(drawer)

del 키워드는 값을 완전히 삭제한다.

함수 설명
count() 전달 인자의 문자 개수를 반환
find() 함수의 대상이 되는 문자열에 전달 인자와 같은 문자가 있는지 찾고,
그 문자가 처음 발견된 인덱스 값을 반환. 만약 전달 인자가 문자열 내에 없다면 -1 반환
index() find()와 같은 역할을 수행하나, 전달 인자가 문자열 내에 없으면 오류 발생
join() 전달 인자 사이에 함수의 대상이 되는 문자열을 삽입
(ex. ",". join("goorm" ) > "g, o, o, r, m")
upper() / lower() 함수의 대상이 되는 문자열을 대문자로 / 소문자로 변환
lstrip() / rstrip() 함수의 대상이 되는 문자열의 가장 왼쪽 / 오른쪽 공백을 모두 삭제
strip() 함수의 대상이 되는 문자열의 양쪽에 있는 한 칸 이상의 공백 모두 삭제
replace replace(전달 인자1, 전달 인자2) 형식으로 사용하며,
함수의 대상이 되는 문자열에서 전달 인자1과 동일한 부분을 찾아 전달 인자2로 교체
split() 함수의 대상이 되는 문자열을 전달 인자 기준으로 쪼개 리스트로 반환
(ex. "g! oo! rm" . split ( " !" ) > [ 'g', 'oo', 'rm' ])
len() 문자열뿐만 아니라 여러 값이 모여있는 자료형의 길이를 반환하는 함수
"len(변수 혹은 값 자체)"형태로 사용

 

str = " Hello groom! I study Python"

num = str.count(' ') #빈칸의 개수
print("빈칸의 개수는 %d 입니다." %num)
print("처음 등장하는 '1'의 인덱스 값은 %d 입니다." %str.find('1'))
print("Good day에서 처음 등장하는 'y'의 인덱스 값은 %d입니다." %"Good day".index('y'))

print(" ".join(str))
print(str.upper())
print(str.lower())
print(str.lstrip())
print(str.rstrip())
print(str.replace('Python', 'C'))
print(str.split())

위 코드를 실행하면 결과가 아래와 같다.

빈칸의 개수는 5 입니다.
처음 등장하는 '1'의 인덱스 값은 -1 입니다.
Good day에서 처음 등장하는 'y'의 인덱스 값은 7입니다.
  H e l l o   g r o o m !   I   s t u d y   P y t h o n
 HELLO GROOM! I STUDY PYTHON
 hello groom! i study python
Hello groom! I study Python
 Hello groom! I study Python
 Hello groom! I study C
['Hello', 'groom!', 'I', 'study', 'Python']

 

sentence = "I like studying Python"

print(len(sentence))
print(len("groom"))

 

22
5

 

+ Recent posts