새소식

Programming/Python

[Python] Function parameters & Caesar Cipher

  • -

함수의 매개변수와 카이사르 암호

[입력 값이 있는 함수]

이전에 우리는 함수가 복잡한 명령어 세트를 

하나의 코드 블록 안에 패키징하여 이름을 부여하는 매우 유용한 방법이라는 것을 배웠다.

 

나중에 코드에서 이 함수 안에 패키징된 모든 코드 줄이 필요할 때

우리는 함수 이름을 입력하고 괄호를 추가하여 함수를 호출하면 된다.


기존에 배웠던 지식을 바탕으로 greet라는 함수를 만들어보자.

그리고 세 줄의 print 문을 작성하자.

마지막으로, 완료되면 함수를 호출하여 콘솔에서 실행되도록 하자.

 

[답]

더보기
def greet():
print("HI")
print("Hello")
print("How are you?")

 

greet()

#Fuctions

def my_functions():
	#Do this
    #Then do this
    #Then do this

위와 같이 함수를 만들면 함수를 호출할 때마다 항상 동일한 내용이 수행될 것이다.

 

이때, 사용자의 입력에 따라 결과를 다르게 하고 싶다면 어떻게 해야할까?

#Functions with Inputs

def my_functions(something):
	#Do this with something
    #Then do this
    #Finally do this

우리는 괄호 안에 변수 이름을 추가하여 함수에 입력값을 제공할 수 있다.

 

예를 들어, 함수에 전달될 (something)이라는 변수가 있다고 가정해보자.

그리고 이 something은 이 코드 블록, 이 함수 내에서 사용될 수 있다.

 

이제 실제로 이 값을 전달하려면, 

함수를 호출할 때 괄호 안에 데이터를 추가해야 한다. 

 

예를 들어, zero coke를 전달하기로 했다고 가정하자.

이 경우, 아래 코드 줄이 실행되면 컴퓨터는 이 함수가 선언된 위치를 찾을 것이다.

my_function(zero coke)

그런 다음 zero coke라는 데이터를 something이라는 변수에 전달할 것이다.

그래서 이제 my_function이라는 함수 내에서 (something)이라는 변수가 zero coke와 같아지고

이 데이터 조각을 사용하여 코드 블록 내에서 something을 할 수 있다.

 

이는 마치 USB를 컴퓨터에 꽂는 것과 비슷하다.

 

다른 입력을 받으면 컴퓨터가 다른 파일을 보여 주게 된다.

 

따라서 이는 우리가 제공하는 입력에 따라 컴퓨터가 다른 작업을 수행할 수 있음을 의미한다.

def greet_with_name(name):
	print(f"Hello {name}")
  
greet_with_name("Pin")

우리가 greet_with_name() 함수를 호출할 때 이전과는 조금 다르게 될 것이다.

 

우리가 함수를 호출할 때 이 변수(name)를 저장할 데이터를 실제로 전달한다.

 

#Functions with Inputs

def my_function(something):
	#Do this with something
    #Then do this
    #Finally do this

my_function(123)

입력값이 있는 함수에 대해 이야기할 때,

구분해야 할 두 가지 중요한 요소가 있다.

 

이 함수(my_function)를 호출하고 (123)이 데이터를 전달할 때

우리는 효과적으로 something이라는 새로운 변수를 생성하고 있다.

something = 123

그리고 이 전달된 데이터를 이 변수에 할당하고 있다.

 

프로그래밍 용어로,

이를(something) 매개변수라고 하며 이 데이터(123)를 인자고 한다.

something = 123
   |         |   
Parameter   Argument

인자는 함수가 호출될 때 전달되는 실제 데이터이며

매개변수는 그 데이터의 이름이다.

 

매개변수(Parameter)는 전달되는 데이터의 이름

인자(Argument)는 데이터의 실제값

 

우리는 함수 내부에서 매개변수를 사용하여 이를 참조하고 작업을 수행한다.


[실습]

Description

나는 Tim Urban의 Your Life in Weeks 이라는 기사를 읽으며

우리가 실제로 가진 시간이 얼마나 적은지 깨달았습니다.

90세까지 사는 경우 우리가 남은 주 수를 알려주는 수학과

f-string를 사용한 life_in_weeks()함수를 만들어보세요.

 

현재 나이를 입력으로 사용하고 

다음 형식으로 우리가 남은 시간을 나타내는 메시지를 출력합니다.

You have x weeks left.

 

여기서 x는 입력된 나이부터 90세까지 남은 주 수로 계산된 실제 숫자로 대체됩니다.

 

input

56

output

You have 1768 weeks left.

 

[답]

더보기
def life_in_weeks(left_weeks):
    print(f"You have {(90 - int(left_weeks)) * 52} weeks left.")

life_in_weeks("56")

[위치 인자 vs 키워드 인자]

이제 여러 개의 입력값을 허용하는 함수를 만들어 보자.

#Functions with more than 1 input
def greet_with(name, location):
    print(f"Hello {name}")
    print(f"What is it like in {location}")

greet_with("Pin", "Seoul")

이제 원하는 만큼 많은 입력을 추가하고 함수의 기능을 수정하여

함수가 매번 다른 작업을 수행하도록 할 수 있다.

 

이때 Pin과 Seoul의 위치를 바꾸면 어떻게 될까?

 

그 둘의 위치를 바꾼다면

Hello Seoul

What is it like in Pin

이 출력될 것이다.

 

그 이유는 데이터의 위치를 보고 두 인자를 확인했을 때,

첫 번째 인자는 첫 번째 매개변수에 할당되고

두 번째 인자는 두 번째 매개변수에 할당되기 때문이다.

 

파이썬 프로그래밍에서는 이를 위치 인자(positional argument)라고 한다.

 

함수 호출 시, 특정 매개변수에 어떤 데이터를 연결할지 지정하지 않았기 때문에

위치를 보고 할당한 것이다.

이것이 함수 호출의 기본 방식이다.


입력값이 더 많다고 가정해보자.

#Positional Arguments

def my_function(a, b, c):
	#Do this with a
    #Then do this with b
    #Finally do this with c
my_function(1, 2, 3)

이렇게 되면 생성되는 변수는

a = 1

b = 2

c = 3

이 된다.


함수를 호출할 때 위치 인자로 인해 발생하는 문제가 없도록 하려면 어떻게 해야할까?

 

그럴 때는 키워드 인자(Keyword Arguments)를 사용할 수 있다.

#Keyword Arguments

def my_functions(a, b, c):
	#Do this with a
    #Then do this with b
    #Finally do this with c
my_function(a= 1, b = 2, c = 3)

위와 달리 각 매개변수 이름과 등호를 추가하여

 

첫 번째 매개변수 a는 1,

b는 2, 

c는 3이 되도록 할 수 있다.

 

이렇게 하면 순서를 변경해도 상관이 없다.

my_function(c = 3, a = 1, b = 2)

[실습]

위에서 만들었던 코드를

def greet_with(name, location):
    print(f"Hello {name}")
    print(f"What is it like in {location}")

greet_with("Pin", "Seoul")

이번에는 위치 인자 대신 키워드 인자를 사용해서 해보자.

 

더보기
def greet_with(name, location):
    print(f"Hello {name}")
    print(f"What is it like in {location}")

greet_with(name = "Pin", location = "Seoul")

[실습]

두 이름 사이의 호환성을 테스트하는 calculate_love_score()함수를 작성할 것이다.

두 사람 사이의 사랑 점수를 계산하려면:

1. 두 사람의 이름을 가져와 각 단어에서 'True' 단어의 등장 횟수를 확인한다.

2. 그럼, 단어 "Love"안의 각 알파벳이 몇 번 나타나는지 확인해보자.

3. 이 숫자들을 결합하여 2자리 숫자를 만들고 출력하자.

 

ex)

name1 = "Angela Yu"

name2 = "Jack Bauer"

T 0회 발생

R 1회 발생

U 2회 발생

E 2회 발생

Total = 5

L 1회 발생

O 0회 빌생

V 0회 발생

E 2회 발생

Total = 3

 

Love Score = 53

 

input ex)

calculate_love_score("Kanye West", "Kim Kardashian")

output ex)

42

[답]

더보기
count = 0
def calculate_love_score(n1, n2):
    n1 = n1.upper()
    n2 = n2.upper()

    combine_names = n1 + n2

    t = combine_names.count('T')
    r = combine_names.count('R')
    u = combine_names.count('U')
    e = combine_names.count('E')
    true_score = t + r + u + e

    l = combine_names.count('L')
    o = combine_names.count('O')
    v = combine_names.count('V')
    e = combine_names.count('E')
    love_score = l + o + v + e

    print(f"{true_score}{love_score}")

calculate_love_score("Kanye West", "Kim Kardashian")

[카이사르 암호 1부 - 암호화]

카이사르 암호는 율리우스 카이사르 시대만큼이나 오래된 텍스트 암호화 방식이다.

그래서 그가 이러한 일급 비밀 군사 메시지를 받았을 때,

그는 알파벳의 각 글자를 특정한 미리 정해진 양만큼 이동시켰다.

 

[강의에서 나온 코드]

더보기
import art
alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
print(art.logo)

def caesar(original_text, shift_amount, encode_or_decode):
    output_text = ""
    for letter in original_text:

        if letter not in alphabet:
            output_text += letter
        else:
            if encode_or_decode == "decode":
                shift_amount *= -1

            shift_position = alphabet.index(letter) + shift_amount
            shift_position %= len(alphabet)
            output_text += alphabet[shift_position]
    print(f"Here is the {encode_or_decode}d result: {output_text}")

should_continue = True

while should_continue:

    direction = input("Type 'encode' to encrypt, type 'decode' to decrypt:\n").lower()
    text = input("Type your message:\n").lower()
    shift = int(input("Type the shift number:\n"))
    caesar(text, shift, direction)

    restart = input("Type 'yes' if you want to go again. Otherwise, type 'no'.\n").lower()
    if restart == "no":
        should_continue = False
        print("Goodbye")

'Programming > Python' 카테고리의 다른 글

[Python_Project] Secret Auction Program  (0) 2024.12.02
[Python] Dictionaries, Nesting  (0) 2024.12.02
[Python] Python Functions & Karel  (0) 2024.12.01
[Python] Python Loops  (0) 2024.12.01
[Python] Randomisation and Python Lists  (0) 2024.12.01
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.