Python TIL(6) - Functions

random·2021년 3월 26일
0

Python - TIL

목록 보기
6/19

Function 관련 기초개념 학습

다양한 예제 연습을 통한 Function 개념익히기

  1. *args 개념
numbers = (0, 1, 2, 3, 4, 5)

print(numbers, sep=',')
print(*numbers, sep=',')         # *의 기능은 시퀀트 타입의 각 아이템을 언팩킹하는 것
print(0, 1 ,2, 3, 4, 5, sep=',')  #이 라인에서 튜플이 언팩킹 됨을 보여줌


print('-' * 40)

# * 를 시퀀스 타입을 언팩킹 하는데 쓸 수 있겠지만, 실제로는 그런 방법보다 역으로 사용하는게 더 효과적인 방법임: 
# 함수 파라미터가 언팩킹될 시퀀스임을 역으로 미리 보여주는게 바로 그 방법.

def test_star(*args):    # *args이 unpacked tuple임을 선제적으로 말해주고 가는것임 
    print(args)          # 위에서 *표시로 unpack임을 명시했으니 이 라인에서의 arg는 그냥 기본pack되어있는 튜플임
    for x in args: 
        print(x)


test_star(0, 1, 2, 3, 4, 5)

print()        #아무런 설정을 심어놓은게 없어서 그냥 기본값 print가 되었기 때문에 출력값 공백임
test_star()    #14번 패킹된 튜플이 나오게됨

  1. action function 개념
def banner_text(text):  #return 값이 없고 행동만 하는 함수임

    screen_width = 80
    if len(text) > screen_width - 4:
        print("Oops,")
        print("the text is too long to fit in the specified width")

    if text == "*":
        print("*" * screen_width)
    else: 
        centred_text = text.center(screen_width - 4)
        output_string = "**{0}**".format(centred_text)
        print(output_string)

banner_text("*")
banner_text("All the colors and personalities")
banner_text("You can't see right through what I truly am")
banner_text("You are hurting me, without noticing")
banner_text("I'm so so broke like someone just robbed me")
banner_text("I have much memories of getting more weaker")
banner_text("*")


#다른 예시, none 리턴됨
numbers = [4, 2, 7, 5, 1, 2, 3]
print(numbers.sort()) #sort 메쏘드는 그냥 action만 하는 기능을 지님, 리턴하는 메소드가 아님.

  1. 함수 내 다양한 유형의 인자값
def func(p1, p2, *args, k, **kwargs):
    print("positional-or-keyword:...{}, {}".format(p1, p2))
    print("var-positional (*args):..{}".format(args))
    print("keyword..................{}".format(k))
    print("var-keyword:............{}".format(kwargs))


func(1, 2, 3, 4, 5, 9, k=6, key1=7, key2=8)


#중간에 k를 삭제해보면 파라미터가 기대하는 5번라인의 값이 부재해서 코드가 crash된다.
#파라미터 기입 순서를 제대로 해서 오류가 어디서 났는지 파악하는게 중요!

4.1 함수 예제 풀어보기 - 피보나치 수열

def fibonacci(n: int) -> int:  #function annotation (n: 인자타입): -> (반환타입)
    """Return the `n`th Fibonacci number, for positive `n`."""
    if 0 <= n <= 1:
        return n

    n_minus1, n_minus2 = 1, 0 #전, 전전값을 지칭하는 것

    result = None
    for f in range(n - 1):
        result = n_minus2 + n_minus1
        n_minus2 = n_minus1
        n_minus1 =  result

    return result


for i in range(36):
    print(i, fibonacci(i))

4.2 함수 예제 풀어보기 - 팩토리얼

# 일반 풀이법

def factorial(n: int) -> int:
    """Return n! (0! is 1)."""
    if n <= 1:
        return 1
 
    result = 2
    for x in range(3, n + 1):
        result *= x
 
    return result
 
 
for i in range(36):
    print(i, factorial(i))

# recursive 풀이법 위랑 비교해서 어느게 더 나은건가? 고민해보기
def factorial(n: int) -> int:
    """
    Return n! (0! is 1).
 
    Valid for `n` in the range 0 to 998 (inclusive).
    Larger values of `n` will cause a RecursionError.
    """
    if n <= 1:
        return 1
 
    return n * factorial(n - 1)


for i in range(36):
    print(i, factorial(i))

4.3 함수 예제 풀어보기 - Plaindrome


def is_palindrome(string):
    # backwards = string[::-1]
    # return backwards == string
    return string[::-1].casefold() == string.casefold() #위 두줄보다 더 짧고 효율적인 코드



word = input("Please enter a word to check: ")
if is_palindrome(word): 
    print("'{}' is a palindrome".format(word))
else:
    print("'{}' is not a palindrome".format(word))

0개의 댓글