Code

python0707

seunghyeoniya 2023. 8. 7. 22:10

main.py

# 하나의 점수를 입력받아서 60점 이상이면 합격
# 무조건 프로그램 종료라는 문구를 출력
score = int(input("점수를 입력하세요:")) # int형으로 만들어주지 않으면, 문자로 입력을 받게 됩니다.
# 실제 프로그램이라면 잘못된 입력을 할 수 있으므로 예외처리를 해주는 것이 좋습니다. ex. 문자열을 입력받을 때 좌우 공백 처리를 한다.

print(type(score)) # 입력받은 데이터가 정수로 바뀌어지는지 확인

if score >= 60:
    data = 30
    print("합격")
else:
    print("불합격")
# data는 if절에서 선언하기 때문에 else절에서는 data를 사용할 수 없다.
# 조건에 의해서 else절에 도달하면 data는 선언되지 않는 것이다. 따라서, Block scope의 영향을 받는 것이 아니다.
#    print(data)

print("프로그램 종료")
# if절에 들어왔을 때 정상적으로 출력된다.
# print(data)


# 숫자 데이터를 가지고 작업할 때 데이터의 범위를 확인
"""
90 ~ 100 A
80 ~ 89 B
70 ~ 79 C
60 ~ 69 D
0 ~ 59  F
"""
# 0 ~ 100 범위의 문제인데 else에 0 ~ 100이 아닌 경우(제약)를 처리해주는 것이 좋다.
score1 = int(input("점수를 입력하세요:")) # 입력한 문자열이 정수(int)로 형변환이 가능할 때만 에러가 발생하지 않는다. ex. int(3.4) : O, int("3.4") : X
# score1 = [1,2,3] -> true, scroe1 = [] -> false : 데이터가 있는 것은 true로 간주하고, 없는 것은 false로 간주한다.
# !score1은 score1이 false인지 묻는 것이다. score1 == false의 문법은 권장하지 않는다.
if 90 <= score1 <= 100:
    print("A")
elif 80 <= score1 < 90:
    print("B")
elif 70 <= score1 < 80:
    print("C")
elif 60 <= score1 < 70:
    print("D")
elif 0 <= score1 < 60:
    print("F")
else:
    print("잘못된 점수")


import keyword
print(keyword.kwlist)


"""
0이면 일요일
1이면 월요일
2이면 화요일
3이면 수요일
4이면 목요일
5이면 금요일
6이면 토요일
"""
switcher = {
    0: "일요일",
    1: "월요일",
    2: "화요일",
    3: "수요일",
    4: "목요일",
    5: "금요일",
    6: "토요일"
}
# get은 dict에 일치하는 key가 있으면 그 값을 가져오고, 없으면 두번째 매개변수의 값을 리턴합니다.
# get 대신에 switcher[key]를 사용할 수도 있지만, 없는 값을 입력할 경우에 에러가 발생하므로 get을 사용합니다.
print(switcher.get(3, "알 수 없는 요일"))


x = 10
y = False if x < 10 else True
# x < 10인 조건에서 y는 기본적으로 False를 가지고, 예외가 되는 x >= 10인 조건에서 True를 가진다.
print(y)


# 0부터 9까지 출력
idx = 0
# 반복문에서 idx가 9까지 출력된다.
while idx < 10:
    print(idx)
    idx = idx + 1 # idx += 1
# 반복문에서 출력만 되지 않았을 뿐이지 idx는 10까지 증가한다.
print("idx", idx)


idx1 = 0

while idx1 < 10:
    print(idx1)
    idx1 = idx1 + 1
    if idx1 > 5:
        break
# 반목문을 모두 수행하고 종료된 경우에 else절을 호출한다.
# break를 만나거나 예외가 발생하면 수행되지 않는다.
else:
    print("반복문 종료")


print(dir(str)) # 문자열이 순서열인지 아닌지 확인 -> __iter__ 존재
print(dir(int)) # 정수가 순서열인지 아닌지 확인 -> __iter__ 존재하지 않음


help(range) # 새로운 함수가 등장하여 도움말을 한 번 확인


string = "Hello"
list = [10, 20]
tuple = (100, 200)
set = {1000, 2000}
dic = {"key1": "value1", "key2": "value2"}
# dic을 제외한 나머지는 반복문의 순서열로 정했을 때 value 값을 출력하지만, dic으로 순서열을 정했을 때는 key 값을 출력한다.
for idx in dic:
    print(idx)


# 같은 데이터를 출력할 때 세 가지 다른 method
for i in range(1, 32, 15):
    print("http://www.donga.com/news/search?p=", i, sep="")
for i in range(3):
    print("http://www.donga.com/news/search?p=", (i * 15) + 1, sep="")
for i in range(3):
    q = "http://www.donga.com/news/search?p=" + str((i * 15) + 1) # 하나의 문자열로 만들어 출력
    print(q)


# Hello Java 출력
print("Hello Java")

# Hello Python을 3번 출력
def display():
    for i in range(3):
        print("Hello Python")

display() # 같은 작업을 여러 번 반복하려고 할 때 함수를 사용한다.
print(display) # 변수처럼 함수 이름만 사용하게 되면 저장한 곳을 참조한다. (id를 출력한다.)


help(max)
# max(iterable) : 파이썬 내장 함수인 max는 iterable한 자료형을 인수로 받고 최대값을 반환한다.
# iterable한 자료형 : 문자열, 리스트, 튜플
# 두 가지 이상의 자료형을 인수로 받는 경우에는 가장 큰 자료형만을 반환한다.
help(sorted)
# sorted(iterable) : 파이썬 내장 함수인 sorted는 iterable한 자료형을 인수로 받고 정렬한 새로운 list로 만들어 반환한다.
# .sort() : 기존의 list를 정렬해서 반환한다.


def intAddWithInt1(a,b):
    print(a+b)
    # return이 없기 때문에 데이터가 아니다.
impossible = intAddWithInt1(100,300)
# 한 번 실행한 후에 곧바로 종료되기 때문에 함수의 재사용이 불가능하다.
print(impossible) # None

def intAddWithInt2(a,b):
    return a+b
    # return을 사용하면 함수 재사용 문제를 해결할 수 있다.

# 함수가 종료되고 다시 함수를 호출하기 때문에 어느 한 순간에 하나의 스택만 존재한다.
result = intAddWithInt2(100,300)
possible = intAddWithInt2(result,600)
print(possible)

# 함수의 수행이 종료되기 전에 다른 함수를 호출하기 때문에 두 개의 스택이 동시에 존재하는 경우가 발생한다.
# 위의 방법보다 이 경우가 메모리를 더 많이 사용한다.
print(intAddWithInt2(intAddWithInt2(100,300),600))


# 파이썬은 여러 개의 데이터를 나열해서 리턴하는 것이 가능하다.
# 여러 개의 데이터를 나열해서 리턴하면 하나의 튜플로 만들어서 리턴한다.
def intOpWithInt(a, b):
    # 튜플로 만들어서 리턴한다. 깨알) 데이터 분석을 할 것이면 이 방법을 권장한다.
    return a + b, a - b


# 튜플 전체를 하나의 변수로 받기
t = intOpWithInt(100, 200)
print(t)

# 튜플을 분해해서 받기
add, sub = intOpWithInt(100, 200)
print(add, sub)


# 정수 2개를 받아서 결과를 정수로 리턴하는 함수
def add(c: int, d: int) -> int:
    return c + d

print(add(100, 300))


help(print) # print 함수는 0개 이상의 데이터를 대입해도 됩니다.
print() # 줄바꿈

# 파이썬은 함수를 호출할 때 매개변수 이름과 함께 데이터를 전달할 수 있습니다.
print("반승현", "임한별", "밀리엄", sep="\t")


help(sum) # help를 사용하면 출력되는 설명 중에 /는 항상 무시해도 됩니다.


def collection(a, b):
    print(a, end=" ")
    print(b)

collection(10, 20)

# List를 분할해서 a에 100 b에 200이 대입
collection(*[100, 200])

# dict는 *이 1개이면 key 값이 매개변수에 전달됩니다.
collection(*{"key1": 100, "key2": 200})

# dict는 *이 2개이면 value 값이 매개변수에 전달됩니다.
# value 값을 전달할 때는 key이름과 매개변수의 이름이 같아야 합니다.
collection(**{"a": 100, "b": 200})


# 가변 매개변수 사용
# 매개변수 개수 상관없이 대입해서 호출 가능
# 함수 내부에서는 튜플
def merge(*arg):
    for element in arg:
        print(element)

merge(10)
merge(10, 20)
merge(10, 20, 30)


def merge1(name, *arg):
    for element in arg:
        print(element)

merge1("banseunghyeon", 10, 20, 30) # name에 banseunghyeon이 대입되고 나머지는 arg에 대입된다.
# merge1(name="banseunghyeon", 10, 20, 30) # 이 구문은 에러, 가변 매개변수 앞의 데이터에는 이름(변수명)을 붙이면 안 된다.
# merge1(10,20,30, "banseunghyeon") # 이 구문은 에러, 가변 매개변수 뒤의 데이터는 이름(변수명)과 함께 호출

# name 매개변수와 그 이외 매개변수로 구성된 함수
def merge2(name, **kwarg):
    for p in kwarg:
        print(p, kwarg[p])
# 가변 매개변수의 key가 아니라 단독으로 name이라는 데이터가 존재하기 때문에 name은 출력되지 않는다.
# merge2(name="banseunghyeon", job="student", gender="남자") # name에 banseunghyeon이 대입되고 나머지는 kwarg에 대입된다.
# 위와 같이 만드는 함수는 정말 최악이다.
# 어떤 데이터를 줘야 하는지 알 수가 없다.
# 자유도를 높이기 위해 제공되지만, 실제로 사용하면 많이 복잡하므로 사용하지 않는 것이 좋겠다.


# 합계를 구하는 재귀함수
def adder(n: int) -> int:
    if n == 1:
        return 1
    return n + adder(n - 1) # else절이 없지만 return이 함수의 수행을 종료하기 때문에 else의 역할을 return이 대신하여 else절을 작성하지 않았다.

print(adder(10)) # 55

def func():
    for i in range(10):
        if i == 5:
            return # 반복문(for문) 안에 if문 이외에 다른 문장이 없으므로, 종료하고 반복문을 빠져나가므로 break 대신 return을 사용해도 된다.


# 피보나치 수열을 재귀함수로 구하는 함수
# 첫번째와 두번째는 1, 그 이후부터는 이전 2개 항의 합
# 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89
import functools

@functools.lru_cache() # 메모이제이션(memoization) : 실행 속도를 빠르게 하기 위해 함수의 호출 결과를 저장해 둔 후 재사용하는 것을 의미한다.
def fibonacci(n:int) -> int:
    if n == 1 or n == 2:
        return 1
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10)) # 55
print(fibonacci(11)) # 89

# 재귀함수를 더 연습하고 싶다면 하노이의 탑을 연습해보기.

# 재귀함수를 사용하지 않고 피보나치 수열 구하기
# 재귀함수를 사용했을 때보다 속도가 훨씬 빠르다.
# 재귀함수를 사용하면 속도가 느려지니까 코딩 테스트에서는 사용하지 않는 것이 좋겠다.
def fibo(n:int) -> int:
    sum = 1
    n_1 = 1
    n_2 = 1
    for i in range(2, n):
        sum = n_1 + n_2
        n_1 = n_2
        n_2 = sum
    return sum

print(fibo(10)) # 55
print(fibo(11)) # 89
# 함수이름.__doc__을 이용해서 함수의 도움말로 표시될 부분을 추가할 수 있다. 함수의 첫째 줄에 작성하는 것이 좋아 보인다.
fibonacci.__doc__ = "재귀함수를 이용해서 피보나치 수열의 값을 리턴하는 함수"
help(fibonacci)


def deanhypeboy():
    print("딘의 하입보이")

def deangetup():
    print("딘의 겟업")

delegate = deanhypeboy
delegate()

delegate = deangetup
delegate()
# delegate에 두개의 함수를 저장 하였다. -> 다형성을 갖는다.


# 함수가 함수를 내부에 만들어서 리턴하면 고위 함수라고 합니다.
def outer():
    def inner():
        print("내부 함수")
    return inner

# 함수를 호출해서 그 결과를 변수에 대입하고 그 변수를 통해서 함수를 호출합니다.
# 바깥쪽 함수를 변수로 받아서 호출하면 됩니다.
func = outer()
func()

 

#python

'Code' 카테고리의 다른 글

python0710  (0) 2023.08.17
python0706  (0) 2023.08.05