본문 바로가기

파이썬 & 머신러닝과 딥러닝

1일차 파이썬 - 입력과 출력, 변수와 수식, 조건문, 반복문, 함수

1. 입력과 출력

x = -1
y = 5
print(x-4*y)
print(-(3/x)+(9/y))
print(x**2-3*x*y)
print((x+y)/(2*x-y))

 


2. 변수와 수식

# 거북이 오각형 색 다르게 그리기
import turtle
t = turtle.Turtle()
t.shape("turtle")
t.color("red")
t.fd(100)
t.left(72)
t.color("blue")
t.fd(100)
t.left(72)
t.color("red")
t.fd(100)
t.left(72)
t.color("blue")
t.fd(100)
t.left(72)
t.color("red")
t.fd(100)
t.left(72)

 


# time함수로 현재 시간 출력하기
import time
now = int(time.time())
hour = now % (24 * 3600) // 3600 + 9
minute = now % 3600 // 60
print("현재 시간은", hour, "시", minute, "분 입니다.")

1970년 1월 1일 0시부터 1초단위

 


3. 조건문

#if,else문 안쓰고 조건연산자로 짝수, 홀수 출력
number = int(input("정수를 입력해주세요 : "))
print("홀수입니다."if number%2 else "짝수입니다.")

 

 

-> 입력받는 경우 무조건 문자열

 


#n을 입력받은 후, n이 양의 정수 x의 제곱이라면 x+1의 제곱을 출력하고, n이 약의 정수 x의 제곱이 아니면 -1 출력
import math
n = int(input("정수를 입력해주세요 : "))
x = math.sqrt(n) 
if x ** 2 == n:
    print((x+1)**2)
else:
    printf(-1)

 

 


# random모듈을 이용하여 "가위/바위/보" 게임 만들어보기
# 가위 1, 바위2, 보 3이라 정한 후, randint()함수에서 1,2,3 중에 하나 값 생성 후 저장
# 이후 사용자로 부터 값 받기
import random
computer = random.randint(1,3)
user = int(input("가위(1), 바위(2), 보(3) 중 하나를 입력하세요: "))
if computer == user:
    print("비겼습니다.")
elif (computer == user+1 or compuer == 1 and user == 3):
    print("컴퓨터가 이겼습니다.", end=" ")
else:
    print("사용자가 이겼습니다.", end=" ")

choices = ["가위", "바위", "보"]
print("컴퓨터의 선택", choices[computer-1])

 


# 세개의 실수를 입력받아, 가장 큰 수를 출력하기
x,y,z = input("세 개의 실수를 입력하세요 : ").split()
x,y,z = float(x), float(y), float(z)

if x >= y:
    if x >= z:
        print(x)
    else:
        print(z)
else:
    if y >= z:
        print(y)
    else:
        print(z)

 


4. 반복문

# 양의 정수 n을 입력받은 후, 1부터 n까지 역수의 합(1+1/2+1/3...+1/n) 출력
n = int(input("양의 정수를 입력하세요: "))
total = 0
for i in range(1,n+1):
    total = total + 1/i
print(total)

 


#다음 수열의 합은? 1/3 + 2/5 + 3/7....+99/101
total = 0
for x in range(1,51):
    total += (2*x - 1)/ (2*x + 1)
print(total)

 


# 주어진 수가 1이 될 때까지 작업을 반복시 모든 수를 1로 만들수 있다.
# 입력된 수가 짝수면 2로 나누기, 입력된 수가 홀수면 3을 곱하고 1을 더하기
# 예를 들어 주어진 수가 6이라면 6->3->5->16->8->4->2->1 이되어 8번만에 1이 된다.
# 양의 정수 n을 입력받아 몇 번 작업하는지 계산
n = int(input("양의 정수를 입력하세요: "))
for count in range(500):
    print(n , end=" ")
    if n == 1:
        print("횟수",count)
        break
    if n % 2 == 0:
        n = n // 2
    else:
        n = n * 3 + 1

else:
    print(-1)

 

-> for 문도 else 사용 가능

 


# 피보나치 수열 - 양의 정수를 입력 받아 피보나치 수열 출력 (f0=0, f1=1)
n = int(input("양의 정수를 입력하세요: "))
if n == 1 or n == 2:
    print(1)
f1 = f2 = 1
for x in range(n-2):
    f3 = f1 + f2
    f1 = f2
    f2 = f3
print(f3)

 


# Turtle graphic을 이용하여 반지름이 120인 원을 오른쪽으로 6씩 이동하면서 60회 그려라
import turtle
t = turtle.Turtle()
t.speed(0)

for _ in range(60):
    t.circle(120)
    t.right(6)

turtle.mainloop()
turtle.bye()

 


# Color도 같이 변경
# 시작 지점은 (255,0,0), 다음 원에 대해 red는 4씩 감소, green은 4씩 증가
import turtle
t = turtle.Turtle()
t.speed(0)
screen = turtle.Screen()
screen.colormode(255)
red = 255
green = 0

for _ in range(60):
    t.color(red, green, 0)
    t.circle(120)
    t.right(6)
    red -= 4
    green += 4

turtle.mainloop()
turtle.bye()

-> while 문도 else 사용 가능

 


# 학생수를 정확히 모를 때, -1이 입력될 때까지 성적을 입력 받아 평균 출력
total = 0
count = 0

while True:
    grade = int(input("성적을 입력하세요: "))
    if grade == -1:
        break
    total += grade
    count += 1
    
print(total/count)

 


# 양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어 떨어져야함
# 예를 들어 18의 자릿수의 합은 1+8=9이고 18은 9로 나누어 떨어지므로 하샤드 수

n = int(input("n? "))
total = 0
while n > 0:
    total += n % 10
    n = n // 10
print(total)

 


# 양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어 떨어져야함
# 예를 들어 18의 자릿수의 합은 1+8=9이고 18은 9로 나누어 떨어지므로 하샤드 수

x, y = input("두 개의 정수? ").split()
x, y = int(x), int(y)

count = 0
for n in range(x, y+1):
    original = 0
    total = 0
    while n > 0:
        total += n % 10
        n = n // 10
    if original % total == 0:
        count += 1
        print(original, end=" ")

이거 해결하기

 


# 어떤 사람이 50달러를 가지고 라스베가스에서 게임을 한다고 하자. 한 번의 게임에 1달러를
# 건다고 가정하자. 돈을 딸 확률은 0.5라고 가정하자. 한번 라스베가스에 가면, 가진 돈을 다 잃
# 거나 목표 금액인 250달러에 도달할 때까지 게임을 계속한다. 어떤 사람이 라스베가스에 100
# 번을 갔다면 몇 번이나 250달러를 따서 돌아올 수 있을까 
import random

count = 0
for _ in range(100):
    money = 50
    while money > 0 and money < 250:
        coin = random.randint(1,2)
        if coin == 1:
            money += 1
        else:
            money -= 1
    else:
        if money == 250:
            count += 1
print(count)

 


중첩 반복문 패턴 이해하기

#  중첩 반복문 
# 2부터 10사이의 정수 n을 입력받은 후, 1부터 n^2까지의 연속된 수를 행렬로 표현 
n = int(input("1부터 10사이의 정수를 입력하세요: "))

for row in range(n):
    for col in range(n):
        print(f"{row*n+col+1:3d}",end =" ")
    print()

 

-> row가 세로, col이 가로

 


# ㄹ 모양으로 숫자 커지게
n = int(input("1부터 10사이의 정수를 입력하세요: "))

for row in range(n):
    if row % 2 ==0:
        for col in range(n):
            print(f"{row*n+col+1:3d}",end =" ")
    else:
        for col in range(n, 0,-1):
            print(f"{row*n+col:3d}", end =" ")
    print()

 


5. 함수

이미 작성한 코드 재활용 가능

def 키워드 사용

def 함수이름(매개변수1, 매개변수2, ...) :

: 파이썬에서 함수의 헤더만 결정하고 몸체는 나중에 작성하고 싶은 경우 pass 키워드 사용

def sub():
	pass

 


파이썬의 인수 전달 2가지 경우
In[1] : 
def func(arg):
arg *= 2
print("함수에서 변경된 값 = ", arg)

 

In[2] : 

a = 5
func(a)
print("함수를 호출한 후의 변수 값 = ", a)

 

Out[2]: 함수에서 변경된 값 = 10
함수를 호출한 후의 변수 값 = 5 <- 값에 의한 호출(call-by-value)

 

위 내용 확실히 이해하기

 

In[3]:
a = [10,20,30]
func(a)
print("함수를 호출한 후의 변수 값 = ", a)
Out[3]: 함수에서 변경된 값 = [10, 20, 30, 10, 20, 30]
함수를 호출한 후의 변수 값 = [10, 20, 30, 10, 20, 30]
<- 참조에 의한 호출(call-by-reference

 

 


 

키워드 인수 (vs 위치 인수)

키워드 인수

: 인수의 이름을 명시적으로 지정해서 값을 매개변수로 전달하는 방법

def sub(x, y, z):
print("x=", x, "y=", y, "z=", z)

>>> sub(10, y=20, z=30) # 위치(10) 후 키워드
x= 10 y= 20 z= 30
>>> sub(x=10, 20, 30) # 키워드(x=10) 후 위치 -> 에러
sub(x=10, 20, 30)
^
SyntaxError: positional argument follows keyword argument

 

# 원의 둘레를 계산하는 함수 get_peri(radius)를 정의하고 테스트
# 원의 반지름이 주어지지 않는 경우 5.0으로 간주
# 함수의 "default argument" 사용

import math

def get_peri(radius=5.0):
    return math.pi * 2 * radius

 


 

가변 인수

: 매개변수 이름 앞에 * 표시시 가변변수 튜플로 변환

-> 여러 개의 인수를 하나의 매개변수로 패킹(packing)

-> 위치 인자에 대해 패킹 매개변수는 tuple로 패킹

# 여러개의 정수를 입력 받아, 그 중에서 가장 큰 정수를 반환하는 함수 max_data()를 작성

import math

def max_data(*args):
    return max(args)

 

 

-> 매개변수 이름 앞에 이중 별표(**) 사용시 -> (key, value) 딕셔너리 형태

 


# 일회용 패스워드 생성기를 이용하여 3개의 패스워드를 생성하여 출력하는 프로그램
# password에 나올 수 있는 문자는 "abcdefghijklmnopqrstuvwxyz0123456789"이며, 6개의 문자로 구성되어 있다고 가정
# random 모듈의 choice() 함수를 이용

import random
alpha = "abcdefghijklmnopqrstuvwxyz0123456789"
def opt():
    msg = ""
    for _ in range(6):
        msg = msg + random.choice(alpha)
    return msg

 


# 주어진 정수가 소수인지를 검사하는 함수 isPrime(x)를 작성
# 두개의 정수 x,y(x<y)를 입력받은 후, x와 y사이에 존재하는 
# 모든 소수를 출력하고 개수를 출력하는 프로그램 작성

def isPrime(n):
    if n < 2:
        return False
    elif n == 2:
        return True
    else: 
        for x in range(3, n-1):
            if n % x == 0:
                return False
        return True
        
def primeNumbers(x,y):
    count = 0
    for n in range(x, y+1):
        if isPrime(n):
            count += 1
            print(n, end=" ")
    return count

 


  • 지역변수 : 함수 안에서만 보인다.
  • 전역변수 : 함수 밖에서 사용

def myfunc():
    a = 100
    print(a, id(a))

myfunc()
print(a, id(a))

전역변수라 오류가 출력되는 모습

 


gx = 100 # 전역변수
def myfunc() :
    gx = 200
    print(gx)
myfunc()
print(gx) # 지역변수가 바껴서 전역변수는 그대로

 


 

gx = 100 # 전역변수
def myfunc() :
    global gx # global 를 사용하여 전역변수 gx를 사용
    gx = 200
    print(gx)
myfunc()
print(gx) # 전역변수도 바뀐 모습

 


 

재귀함수

# 1부터 n까지 역수의 합(1 + 1/2 + 1/3 + ... + 1/n)을 recursion으로 계산하여 반환하는 함수 rsum(n)을 작성

def rsum(n):
    if n == 1: 
        return 1
    else:
        return 1/n + rsum(n-1)

 


# 이항 개수를 recursion으로 구해보기

def bcoef(n,k):
    if k == 0 or k == n:
        return 1
    else:
        return bcoef(n-1,k-1) + bcoef(n-1, k)

 


# 양의 정수(십진수)를 입력받아 이진수를 출력하는 함수를 recursion으로 작성
# 그 결과를 bin 함수와 비교

def myBin(x):
    if x <= 1:
        return str(x)
    else:
        return myBin(x // 2) + str(x % 2)