교육 시작한지 3주차 2일째입니다.
오늘은 조건문, 반복문을 배웠습니다.

크게 어려울 건 없을 거라고 생각했지만 오산이었습니다.
어렵진 않은데 다양한 자료형과 내부함수 들과 얽히니 계속 머리속엔 이게 뭐더라?
라는 생각만 드네요.

코드 만들어 보고, 분석을 자주 해야 익숙해 지겠지요.
python 100제는 모르는거 찾아가면서 풀어보고 있습니다.
뭐를 써야 할지는 어느정도 떠오르는데 막상 작성할땐 조금씩 틀리네요.
그래도 200문제나 있으니 하고 나면 늘겠지 라는 생각이 있는데
1~2월은 벌려 놓은 일들이 있어서 조바심이 많이 납니다.

스터디도 참여 하고 싶지만 8시 이후에나 가능해서 같이 할 수 있는 분들을
찾을 수 있을지 모르겠습니다.
책 만드는 과정에 참여를 꼭 하고 싶어서 책 만드는 스터디 모임에 꼭 참여해서
기여하고 싶네요.^^


조건문

조건문 중에 주의해야 한다고 느낀 거은 다양한 형태의 자료형 또는 함수들이
참과 거짓으로 판단된다는 것입니다.
대부분 True 긴 하지만 False, "", '', None, 0, [], (), {}, set()등이 False 입니다.
다음은 관련된 코드 입니다.

print(bool(False))  # False
print(bool(None))  # False
print(bool(0))  # False
print(bool(0.0))  # False
print(bool(""))  # False
print(bool([]))  # False
print(bool({}))  # False
print(bool(()))  # False
print(bool(set()))  # False

if not '':
    print('hello')
print('end')

if None: # None은 False로 처리됩니다.
    print('hello')
print('end')

if not None: 
    print('hello')
print('end')

앞에 not 까지 붙으니 더 헷갈리네요. 잘 알아둬야 오류를 잘 찾아낼 수 있겠지요?
함수도 return 값이 없으면 None을 리턴하니 주의해야 합니다.


삼항연산자

# 삼항 연산자

x = 51
y = 10

result = 'x가 더 큽니다.' if x > y else 'y와 같거나 y가 더 큽니다'
print(result)

result를 보면 앞에 'x가 더 큽니다.' 가 할당된 것처럼 오해할 수 있는데
중간에 if x > y 결과에 따라 참이면 앞이 할당되고, 거짓이면 뒤문장이 할당됩니다.
삼항 연산자도 주의해야 합니다.


람다함수

익명함수 - 한 줄로 표현/임시 함수 만들때 사용

# 예) 두 숫자를 더하는 간단한 람다함수

def sum(x, y):
    z = x + y
    return z

add = lambda x, y : x + y 
print(add(5, 3))

# 홀짝
x = 4
# x를 2로 나눠서 나머지가 없으면(참) x에 'Even', 나머지가 있으면(거짓) 'Odd'
my_function = lambda x: 'Even' if x % 2 == 0 else 'Odd'
my_function(x)

람다함수 사용 예와 삼항연산자와 결합한 홀짝 판단 하는 로직입니다.


반복문

# 반복문
for 변수명 in 순회_가능한_객체:
    pass    # 수행할 문장

for문은 데이터 중심적이라 순회 가능한 객체의 끝까지 순회합니다.
문자열/리스트/데이터셋/range() 정도가 주요한 순회 가능한 객체입니다.

단어_사전 = {
    '하나' : 'one',
    '둘' : 'two',
    '셋' : 'three',
}

for i in 단어_사전:
    print(i ,':', 단어_사전[i])

for key, value in 단어_사전.items():
    print(f"{key} : {value}")

익숙하지 않은 딕셔너리를 for문을 통해서 출력해보는 거라 가져왔습니다.

# 리스트라면 비어있는 리스트라도 만들어야 한다. result = []
# 비어있는 자료형도 자료형이다. None도 자료형이다.
# result = 0

for i in range(101):
    if i % 2 == 0 or i % 2 == 1:
        result += i
result

앞에 result = 0 이 없었으면 result += i 문은 에러가 납니다.
주의해야하는 부분입니다. 정의하지 않고 바로 사용할 수 없습니다.
그외 구구단 같은것도 만들었는데 그런건 익숙하지만 리스트 컴프리헨션? 은
아주 생소하게 느껴졌습니다.


리스트 컴프리헨션

# 중첩된 리스트 컴프리헨션

# 1. 리스트 컴프리헨션: 중첩된 반복문
c = [f'{i} × {j} = {i*j}' for i in range(2, 10) for j in range(1, 10)]
print(c)

# 2. 리스트 컴프리헨션: 중첩된 컴프리헨션
cc = [[f'{i} × {j} = {i*j}' for j in range(1, 10)] for i in range(2, 10)]
print(cc)

# 3. 전통적인 방법
c_list = []
for i in range(2, 10):
    for j in range(1, 10):
        c_list.append(f'{i} × {j} = {i*j}')
print(c_list)        

for문을 이렇게 쓸 수 있다니 참^^
리스트 컴프리헨션은 파이썬에서 간결하게 리스트를 생성하는 기능입니다.
반복문, 조건문 과 결합하여 리스트를 만들어냅니다.
[추가할변수_또는_표현식 for 변수 in 특정범위]

위의 3개는 거의 비슷합니다.
2번만 조금 다릅니다. 각각의 단별로 리스트가 만들어졌습니다.
컴프리헨션은 for문 아래 if문을 넣을 수도 있습니다.

nums = [1, 2, 3, 4, 5]
result = [f'{x}는 3보다 큰 짝수' if x % 2 == 0 else f'{x}는 3보다 큰 홀수' for x in nums if x > 3]
print(result) # 출력: ['4는 3보다 큰 짝수', '5는 3보다 큰 홀수']

삼항연산자 아래 for문이 있고, if문도 있네요.ㅎ
순서는 for문 -> if x > 3 조건에 따라 나온 리스트가 if x % 2 == 0 조건에 참이면 3보다 큰 짝수,
거짓이면 3보다 큰 홀수를 result라는 리스트에 할당합니다.

def sumthingFunction(i):    # 함수 sumthingFunction(i)을 생성
    if i % 100 ==0:         # 조건문 100으로 나눴을때 나머지가 0이 되는것
        return i            # 조건에 일치하면 i를 리턴 일치하지 않으면 0을 리턴
    else:
        return 0

l = [100, 200, 300, 101, 202, 303]
l = [sumthingFunction(i) for i in l]    # ㅣ(리스트)에 있는 값들을 하나씩 꺼내서, 함수에 태워보고, 조건에 맞는 값들만 인쇄
l # 출력: [100, 200, 300, 0, 0, 0]

함수도 컨프리헨션에 들어갈 수 있습니다.
주의해야 할 것은 심플해야 하고 가독성을 높이는 수준에서 작성이 되야 합니다.
안되는 건 아니지만 가독성이 현저하게 떨어질 수 있습니다.


스무고개 만들기

# step 1을 구현했으나..
# 최대 100번까지 맞춰야 한다.
# input을 계속 입력해야 한다.
# 힌트가 없다.
import random

# 우리가 맞춰야할 숫자!
secret_number = random.randrange(1, 101)

# step 2 -> 20번 반속하는 기능을 구현! for문
for i in range(1, 21):
    while True:
        number = input("숫자를 입력해주세요 (1에서 100사이) :")

        if number.isdigit() == True:
            number = int(number)
            if 1 <= number <= 100:
                break
        else:
            print("1에서 100까지 숫자를 입력해주세요.\n")

    if secret_number == number:
        print(f"{secret_number} 정답입니다. {i}번 만에 맞췄네요.")
        print(f"축하합니다.")
        break
    else:
        print(f"{i}번 틀렸습니다.")

        if secret_number > number:
            print("정답보다 작습니다.\n")
        else:
            print("정답보다 큽니다.\n")

    if number == 20:
        print("패했습니다. 게임이 종료됩니다.")        
        print(f"정답은 {secret_number}")             

강의 시간중에 스무고개 만들어 보는 과정이 있었습니다.
기본적인 것들은 수업시간에 만들었고, 예전에 다른 언어로 만들었던 기억이 있어서 수월했습니다.
1 에서 100까지 숫자만 유효한 숫자로 처리하도록 오류 처리를 넣어봤습니다.


지금부터 과정이 중요할 것 같습니다.
다른 일로 시간이 부족하지만 100제 열심히 풀고, 손에 좀 익힌 다음에 원하는 것들을
배울 수 있었으면 합니다.



끝까지 화이팅!