Python

Python(4) 반복문과 함수

사회적가치누리 2024. 11. 2. 17:22
목차
6-1. if문
6-2. for문
6-3. while문
6-4. countinue와 breeak
6-5. 한줄 for문
6-6. 퀴즈 #5
7-1. 함수 and 7-2. 전달값과 반환값
7-3. 기본값
7-4. 키워드값
7-5. 가변인자
7-6. 지역변수와 전역변수
7-7. 퀴즈 #6

 

6-1. if문

 

파이썬에서 if문을 작성하는 방법은

if 조건 :
실행할 내용
elif 조건 :
실행할 내용
else : > 위의 조건이 다 아니면
실행할 내용

 

weather = input("오늘 날씨는 어떠합니까?") > input()은 사용자로부터 값을 입력받습니다.

if weather == "비" or "눈": > 비나 눈이올때 or를 사용해서 둘중에 하나일때 if문을 실행시킬 수 있습니다.


int(input("기온은 어때요? ")) -> input으로 입력받을때 무조건 문자열로 받기때문에 숫자를 입력받고 싶으면 int로 바꿔줍니다.

그리고 위에서 사용한 or 말고 and도 가능합니다.

elif 0 <= temp < 10: -> 이런식으로 and를 생략가능

 

weather = input("오늘 날씨는 어때요?")
if weather == "비" or weather == "눈":
    print("우산을 챙기세요")
elif weather == "미세먼지":
    print("마스크를 챙기세요")
else:
    print("준비물 필요 없어요")

temp = int(input("기온은 어때요? "))
if 30 <= temp:
    print("너무 더워요. 나가지 마세요")
elif 10 <= temp and temp < 30:
    print("괜찮은 날씨에요")
elif 0 <= temp < 10:
    print("외투를 챙기세요")
else:
    print("너무 추워요, 나가지 마세요")

6-2. for문

 

for문은 반복문 입니다.

 

for문의 사용법은

for waiting_no in [0,1,2,3,4,5]:
    print("대기번호 : {0}".format(waiting_no))
만약 숫자가 순차적으로 올라갈때는

for waiting_no in range(1, 6):
    print("대기번호 : {0}".format(waiting_no))
처럼 range를 사용하면 더 편합니다..

for waiting_no in range(1, 6):
    print("대기번호 : {0}".format(waiting_no))

starbucks = ["아이언맨","토르","그루트"]
for customer in starbucks:
    print("{0}, 커피가 준비되었습니다.".format(customer))

 

6-3. while 문

 

while문 또한 for문과 마찬가지로 반복문 입니다.

 

사용법은

while 조건문:

      수행할 문장

 

while문은 조건문이 참(True)인 동안 while 문에 속한 문장이 계속해서 돕니다.

 

customer = "토르"
index = 5
while index >= 1:
    print("{0}, 커피 준비 완료 {1}번 남았습니다.".format(customer, index))
    index -= 1
    if index == 0:
        print("커피는 폐기처분되었습니다.")

만약 코드를 이렇게 작성하면

customer = "아이언맨"
index = 1
while True:
    print("{0}, 도와주세요! 호출 {1} 회".format(customer, index))
    index += 1

wow

이렇게 무한 루프에 걸려 계속해서 호출합니다.

무한루프를 탈출 하려면 Ctrl + C 를 눌러 탈출할 수 있습니다.

 

customer = "토르"
person = "Unknown"

while person != customer:
    print("{0}, 커피가 준비 되었습니다.".format(customer))
    person = input("이름이 어떻게 되세요? ")

토르 라고 말 할때까지 계속 돕니다.

 

while문은 조건에 만족할때까지 계속 돕니다.

 

위의 코드에서는 손님 customer 가 "토르" 이고 조건문에서는

person 과 customer 이 같지 않으면 계속해서 실행시켜달라는 조건이기 때문에

"토르"라고 입력해야 프로그램이 종료됩니다.

 

6-4. countinue와 breeak

 

countinue와 break는 반복문 안에서 사용할 수 있습니다.

 

예를 들어 책읽기를 시키는데 특정 번호 몇번이 결석 했다고 가정해보고 코드를 작성해보면

absent = [2, 5] # 2번과 5번이 결석 했다고 가정

for student in range(1, 11): # 1부터 10까지
    if student in absent: # 만약 absent에 있는 숫자면
        continue # 건너뛰기
    print("{0}, 책을 읽어라.".format(student))

2와 5번이 없습니다.

 

이제 break를 사용해 보겠습니다.

absent = [2, 5] #결석
no_book = [7] #책이 없음

for student in range(1, 11):
    if student in absent:
        continue
    elif student in no_book: 
        print("오늘 수업 여기까지. {0}는 교무실로.".format(student)) 
        break # 반복문 즉시 종료

    print("{0}, 책을 읽어라.".format(student))

 

 

6-5. 한줄 for문

 

출석번호가 1 2 3 4, 앞에 100을 붙이기로 했습니다. > 101, 102, 103, 104
그러면 숫자에 100씩 더해줘야하는데 이렇게 사용할 수 있습니다.

students = [1,2,3,4]
students = [i+100 for i in students] # i에 100을 더하고 i를 students와 합치겠다.
print(students)

 

아니면 이름을 길이로 변환할 수도 있습니다.

students = ["Iron man", "Thor", "I am groot"]
students = [len(i) for i in students] # 문자별 길이를 출력해라.
print(students)

 

마지막으로 문자를 대문자로 다 바꿔주는 코드입니다.

students = ["Iron man", "Thor", "I am groot"]
students = [i.upper() for i in students] # 문자를 다 대문자로 바꿔줘라.
print(students)

 

 

6-6. 퀴즈 #5

 

 

우선 난수로 정해진다고 했으니까 역시나 random을 사용해야겠군요.

 

그리고 50번째 손님까지 출력해야 하니까 반복문을 사용해야겠습니다.

 

from random import *

count = 0
for customer in range(1,51): # 50명의 승객
    time = randrange(5, 51) # 5분 ~ 50분 사이의 난수 생성
    if time >= 5 and time <= 15: # 5분 ~ 15분 사이의 승객만 매칭
        print("[o] {0}번째 손님 (소요시간 : {1}분)".format(customer,time))
        count += 1
    else:
         print("[ ] {0}번째 손님 (소요시간 : {1}분)".format(customer,time))
print("총 탑승 승객 : {0} 분".format(count))

 

7-1. 함수 and 7-2. 전달값과 반환값

 

함수를 정의 하는법

def 함수이름(안에 선언할 변수1,변수2):
    동작할 내용

 

함수를 실행시키는법은 

함수이름()

 

def open_account():
     print("새로운 계좌가 생성되었습니다.")

def deposit(balance, money): #입금
    print("입금이 완료되었습니다. 잔액은 {0}원 입니다.".format(balance+money))
    return balance + money
#함수 deposit은 더한 값을 반환해야하기 때문에 return이 필요함.


def withdraw(balance, money): #출금
    if balance >= money: # 잔액이 출금보다 많으면
        print("출금이 완료되었습니다. 잔액은 {0} 원입니다.".format(balance - money))
        return balance - money
    else:
            print("출금이 완료되지 않았습니다. 잔액은 {0} 원입니다.".format(balance))
            return balance

def withdraw_night(balance, money): # 저녁에 출금
    commission = 100 # 수수료 100원
    return commission, balance - money - commission

open_account()
balance = 0 # 잔액
balance = deposit(balance, 1000)
commission, balance = withdraw_night(balance, 500)
print("수수료 {0} 원이며, 잔액은 {1} 원입니다.".format(commission, balance))

 

7-3. 기본값

 

만약에 학생들이 있는데, 프로필을 만들어야 한다고 가정해봅시다.

이 학생들이 같은 학교,같은 학년,같은 반,같은 수업. 이면

학교 이름,몇학년인지,몇반인지,수업과목이 뭔지만 정해주고

이름만 입력하게하면 편하게 프로필을 만들 수 있겠죠?

def profile(name, age = 17, main_lang = "파이썬"): # 기본값을 정해주면 나이,언어는 자동으로 나온다.
    print("이름은 : {0}\t나이 : {1}\t주 사용 언어 : {2}".format(name, age, main_lang))

profile("김")
profile("박")

 

 

7-4. 키워드값

 

함수에서 전달받는 매개변수의 값을 키워드를 이용해서 호출해주면

그 키워드에 해당하는 값이 순서가 뒤바뀌어도 잘 전달됩니다.

def profile(name, age, main_lang): # 매개변수 : name,age,main_lang
    print(name, age, main_lang)

profile(name="김원식",age=20, main_lang="파이썬")
profile(name="강성욱",age=23, main_lang="자바")

 

7-5. 가변인자

 

또 다시 프로필이라는 함수를 만들때

이름,나이,할줄 아는 언어 를 입력받는다고 했을때 코드를 작성하면,

def profile(name, age, lang1, lang2, lang3, lang4, lang5):
    print("이름 : {0}\t나이 : {1}\t".format(name, age), end = " ") 
    # end = " "는 줄바꿈을 하지 않고 이어서 출력한다는 뜻이다.
    print(lang1, lang2, lang3, lang4, lang5)

profile("유재석",20,"Python","Java","C","C++","C#")
profile("김태호", 25, "Kotlin", "Swift","","","")

근데 만약

누구는 언어 공부를 열심히 해서 많이 쓸 수 있는데,

누구는 몇개밖에 모를 수 있습니다.

이럴때 쓸 수 있는게 가변인자 입니다.

 

def profile(name, age, *language): 
     print("이름 : {0}\t나이 : {1}\t".format(name, age), end = " ")
     for lang in language:
        print(lang, end=" ")
     print()

profile("유재석",20,"Python","Java","C","C++","C#","JavaScript")
profile("김태호", 25, "Kotlin", "Swift")

 

 

7-6. 지역변수와 전역변수

 

지역변수 : 함수내에서만 쓸 수 있는것
함수가 호출될때 만들어 졌다가, 함수 호출이 끝나면 사라집니다.

전역변수 : 모든 공간에서 (프로그램 내에서) 쓸 수 있는것

gun = 10

def checkpoint(soldiers):
    gun = gun - soldiers
    print("[함수 내] 남은 총 : {0}".format(gun))


print("전체 총 : {0}".format(gun))
checkpoint(2)
print("남은 총 : {0}".format(gun))
# 에러 발생

 

에러가 발생하는 이유는

checkpoint에서 만들어진 gun은

gun = 10 과 다른 gun이라서 초기화가 안되어있으니까 에러가 발생하는데

이것이 바로 지역변수입니다.

 

그럼 이제 전역변수를 사용해보겠습니다.

gun = 10

def checkpoint(soldiers):
    global gun # 전역 공간에 있는 gun 사용
    gun = gun - soldiers
    print("[함수 내] 남은 총 : {0}".format(gun))


print("전체 총 : {0}".format(gun))
checkpoint(2)
print("남은 총 : {0}".format(gun))

 

전역변수를 많이쓰면 코드 관리가 어려워집니다. 그래서 권장되는 방법은 아닙니다.

따라서 함수의 전달값으로 전달해서 계산을 하고 반환값을 받아서 사용하는 방법이 있습니다.

gun = 10

def checkpoint_ret(gun, soldiers):
    gun = gun - soldiers
    print("[함수 내] 남은 총 : {0}".format(gun))
    return gun


print("전체 총 : {0}".format(gun))
gun = checkpoint_ret(gun, 2)
print("남은 총 : {0}".format(gun))

 

7-7. 퀴즈 #6

 

우선 기본적으로 1m = 100cm 라는 것을 알고있습니다.

175cm 남자는 1.75m x 1.75m x 22 = 67.375가 나오는데,

키를 100으로 나누고 곱해주면 되겠군요.

 

조건2를 보시면 소수점 둘째자리 까지 표시라고 되어있습니다.

 

그러면 round()를 사용해야겠습니다.

def std_weight(height, gender):
    if gender == "남자":
        weight = height / 100 * height / 100 * 22 # 1m = 100cm
        print("키 {0}cm{1}의 표준 체중은 {2}kg입니다.".format(height,gender,round(weight,2)))
        return round(weight, 2)

    elif gender == "여자":
        weight = height / 100 * height / 100 * 21 # 1m = 100cm
        print("키 {0}cm{1}의 표준 체중은 {2}kg입니다.".format(height,gender,round(weight,2)))
        return round(weight, 2)
 
std_weight(175,"남자")
std_weight(165,"남자")
std_weight(165,"여자")
std_weight(185,"여자")

 

'Python' 카테고리의 다른 글

Python(6) 활용1  (0) 2024.11.04
Python(5) 기초 마무리  (0) 2024.11.03
Python(3) 문자열 , 자료구조  (0) 2024.11.01
Python(2) 파이썬 숫자  (0) 2024.10.31
Python(1) 첫 시작.  (0) 2024.10.30