본문 바로가기
개발일지/Python

2022.02.13 파이썬정복 17 고급 문법

by 다니엘의 개발 이야기 2022. 2. 13.
320x100
'''
def seqgen(data):
    for index in range(0, len(data),2):
        yield data[index:index+2]


solarterm = seqgen("입춘우수경칩춘분")
for k in solarterm:
    print(k,end=",")

'''

'''
# 2글자씩 구분해서 찢어놓는 작업
data = "입춘우수경칩춘분청명곡우입하소만망종"
for k in (data[index:index+2] for index in range(0,len(data),2)): # 너무 함축적이여서 이해하기가 난해하다.
    print(k, end=",")
'''

'''
for n in [i for i in range(100)]:
    print(n,end=",")
print("")
for n in (i for i in range(100)):
    print(n,end=",")

# 위 두 숫자들의 결과값은 같다. 하지만 전자는 리스트를 생성해 반복을하고
# 따라서 반복을 시작하기 전에 모든 숫자가 일단 메모리에 생성된다.
'''

# 17.2 데코레이터

'''
# 일급 시민

def add(a,b):
    print(a+b)

plus=add
plus(1,3)
'''

'''
def calc(op,a,b):
    op(a,b) # 어쩌라는 거지?

def add(a,b):
    print(a+b)

def multi(a,b):
    print(a*b)

calc(add,1,2)
calc(multi,3,4)
# 오 이렇게도 활용이 가능하구나..
# 놀랍다.
# 정말로 활용성이 무궁무진한것같다.
'''

'''
# 지역 함수

def calcsum(n):
    def add(a,b):
        return a+b


    sum = 0
    for i in range(n+1):
        sum = add(sum,i)
    return sum

print("10까지의 더한결과 값은 : ",calcsum(10))
# 딱 예제로만 봤을때는 무쓸모 같지만
# 직감적으로 언젠간 활용적 측면에서 분명 쓰임새가 있을 것같다는 느낌이 든다.
'''

'''
# 첫째 시도
def calcsum(n):
    def add(a,b):
        return a+b
                        # 틀림포인트 3. 심지어 여기서부터 아래 리턴값이 앞에 있으면 에러가 난다. 
    sum = 0             # 틀림포인트 1.여기에 있을때는 결과값이 45
    for i in range(10):
        #sum =0         # 틀림포인트 2. 여기에 있을때는 결과값이 9
        sum = add(sum,i)
    return sum


print("dd",calcsum(10))
'''


'''
# 둘째 시도
def calcsum(n):
    def add(a,b):
        return a+b

    sum=0
    for i in range(n+1):
        sum = add(sum,i) # 실수1 인수가 sum과 i라는 사실을 눈치채지 못했다.
    return sum

print("aa",calcsum(10))
'''

'''
# 셋째 시도

def calcsum(n): # 외부함수
    def add(a,b): # 지역함수
        return a+b


    sum = 0
    for i in range(n+1):
        sum = add(sum,i)

    return sum

print("aa",calcsum(10))

# 이렇게 외부함수와 지역함수를 동시에 사용하게 되었을때
# 이번 수식의 경우에 보면 사실상 지역함수는 기능을 상실하는것같다.
# 음... 지역함수는 사용해도되고 안해도 되는건가?

print(calcsum.add(1,5)) # 음.. 이게 사용이 안되는구나.
print(add(1,5)) # 이것도 사용이 안되고
# 지역함수는 외부함수의 내부 세계에서만 사용 가능한 함수 같다.
'''
# 지역함수이용 방법은 실용성이 높지 않다고 한다.
# 너무 고급 문법이라서 활용이 난해하다고 한다.

'''
# 전체적으로 이 책으로 처음 코드를 배우기 시작했던 입장으로써
# 개연성을 깨닫지 못하겠다. 
def makeHello(message):
    def Hello(name):
        print(message + ","+name)
    return hello # 이 저자는 정말 얼마나 하기 싫었을까 근데 돈은 가져가고 싶고 ㅠㅠ 진짜 엿같다

enghello = makeHello("Good Morning")
hanhello = makeHello("안녕하세요")

enghello("Mr kim")
hanhello("홍길동")
'''

# 함수 데코레이터
# 이게 함수 중에서 난이도가 가장 높은거라고 한다..
# 제발 그냥 기본적인 설명이나 잘 되어있고 예제 짜임새나 잘 되어있으면...

'''
def inner():
    print("결과를 출력합니다.")

def outer(func):
    print("-"*20)
    func()
    print("-"*20)

outer(inner)
# 짜임새가 매우 좋은것같고 별도의 설명 없이도 이해가 되었다.
# 더 난이도가 높아지면 그때는 모르겠으나, 현재는 최대한 기초를 익히는데 익숙해보자.
'''

'''
# 첫 시도 - 실패
def inner():
    print("결과를 출력합니다.") # 이건 생각이 안나서 보고 했다.

def outer(func):
    print("-"*20)# outer도 철자가 기억이 안나서 봤다.
    # print(inner) # 이렇게 해주니깐 메모리 값이 나온다. <function inner at 0x0000024CCFF1D3A0>
    func()
    print("-" * 20)

outer(inner)
'''

'''
def inner():
    print("결과를 출력합니다.")

def outer(func):
    print("-"*20)
    func()
    print("-" * 20)


outer(inner)

# 사실 func()라고 쓰는것도 그렇고
# print 없이 outer(inner)라고 하는것도 내게는 어색한 표현 방법이다.
# 뭐, 처음엔 다 어색했던 거니깐 익숙해져보자.
'''

'''
def inner():
    print("결과를 출력합니다.")

def outer(func):
    def wrapper():
        print("-"*20)
        func()
        print("-"*20)
    return wrapper # 이거는 여전히 긴가민가하다. 위에서는 ()로 쓰였는데 왜 여기선 빠지나..
                    # 심지어 ()라고 하니깐 오류가 생긴다.

inner = outer(inner)
inner()
'''

'''
def inner():
    print("결과를 출력합니다")


def outer(func):
    def wrapper():
        print("-"*20)
        func()
        print("-" * 20)
    return wrapper

inner = outer(inner)
inner()
'''

'''
# inner = outer(inner) # 이거는 @outer

def outer(func):
    def wrapper():
        print("-"*20)
        func()
        print("-" * 20)
    return wrapper

@outer
def inner():
    print("결과를 출력합니다.")
    
inner()
'''

# 데코레이트? 이게 @~~를 의미하는것같은데 유용성이 정말 대단할 것같다.
# 근데 아직은 설명을 들어도 뭐가뭔지 한개도 모르겠다.
# 그저 두려워하지 말고 코드쟁이로 살기로 했으니, 코드 두드려보자 따라하는 거라도

'''
def para(func):
    def wrapper():
        return "<p>" + str(func()) + "</p>"
    return wrapper

@para
def outname():
    return "김상형"

@para
def outage():
    return "29"

print(outname())
print(outage())
'''

'''
def div(func):
    def wrapper():
        return "<div>" + str(func()) + "</div>"
    return wrapper

def para(func):
    def wrapper():
        return "<p>" + str(func()) + "</p>"
    return wrapper

@para
@div
def outname():
    return "김상형"

@para
@div
def outage():
    return "29"

print(outname())
print(outage())

'''

'''
def div(func):
    def wrapper():
        return "<div>" + str(func()) + "</div>"
    return wrapper

def para(func):
    def wrapper():
        return "<p>" + str(func()) + "</p>"
    return wrapper

@div
@para
def outname():
    return "김상형"

@div
@para
def outage():
    return "29"

print(outname()) # 출력할땐 ()이렇게 해줘야 하는구나
print(outage()) # 출력할땐 ()이렇게 해줘야 하는구나
'''

'''
def div(func):
    def wrapper():
        return "<div>" + str(func())+"</div>"
    return wrapper

def para(func):
    def wrapper():
        return "<p>" + str(func())+"</p>"
    return wrapper

@div
@para
def outage():
    return "29"

@div
@para
def outname():
    return "송현주"

print(outname())
print(outage())
'''


'''
def div(func):
    def wrapper():
        return "<div>"+str(func())+"</div>"
    return wrapper

def para(func):
    def wrapper():
        return "<p>"+str(func())+"</p>"
    return wrapper

@div
@para
def outname():
    return "김상형"

@div
@para
def outage():
    return "29"

print(outname())
print(outage())
'''

'''
def div(func):
    def wrapper():
        return "<p>" + str(func())+"</p>"
    return wrapper

def para(func):
    def wrapper():
        return "<p>" +str(func())+"</p>"
    return wrapper

@div
@para
def outage():
    return "29"

@div
@para
def outname():
    return "부대찌개"

print(outname())
print(outage())
'''

'''
def div(func):
    def warpper():
        return "<p>"+str(func())+"</p>"
    return warpper

def para(func):
    def warpper():
        return "<p>"+str(func())+"</p>"
    return warpper

@div
@para
def outage():
    return "29"

@div
@para
def outname():
    return "김우중"

print(outname())
print(outage())
'''

'''
def para(func):
    def wrapper():0
        return "<p>"+str(func())+"</p>"
    return wrapper

@para
def outname(name):
    return "이름:" + name + "님"

@para
def outage(age):
    return "나이:" + str(age)

print(outname("김상형"))
print(outage(29))
'''

'''
def para(func):
    def wrapper(*args, **kwargs):
        return "<p>" + str(func(*args,**kwargs)) + "</p>"
    return wrapper

@para
def outname(name):
    return "이름" + name+"님"

@para
def outage(age):
    return "나이:" + str(age)

print(outname("김상형"))
print(outage(29))
print(outname.__name__)
'''


'''
from functools import wraps

def para(func):
    @wraps(func)
    def wrapper(*args,**kwargs):
        return "<p>" + str(func(*args, **kwargs)) + "</p>"
    return wrapper

@para
def outname(name):
    return "이름:" + name + "님"

@para
def outage(age):
    return "나이"+ str(age)

print(outname("김상형"))
print(outage(29))
print(outname.__name__)
'''

'''
# 전체적으로 지나치게 복잡하지 않은가? 싶기도하다.
# 이걸 도대체 어떻게 이해해야하는 걸까?
from functools import wraps #이해안됨1

def para(func):
    @wraps(func)  # 이해안됨2    
    def wrapper(*args,**kwargs): # 이해안됨 3
        return "<p>" +str(func(*args, **kwargs)) + "</p>" # 이 쓰임이 나에겐 진짜 난해하다. # 이해안됨4
    return wrapper

@para # 이해안됨 5
def outname(name): #이해안됨 6
    return "이름: "+name + "님"

@para
def outage(age):
    return "나이: " + str(age)

print(outname("김상형"))
print(outage(29))
print(outname.__name__)
'''

# 클래스 데코레이터
'''
class Outer:
    def __init__(self,func):
        self.func = func

    def __call__(self):
        print("-"*20)
        self.func()
        print("-" * 20)

def inner():
    print("결과를 출력합니다.")

inner = Outer(inner)
inner()

# 위의 코드를 보면 Outer클래스 안의 __call__,밑의 inner가 출력되었다.
# 어떻게 받아들이고 어떻게 학습을 해야할지 좀 감이 안 온다.
'''

'''

class Outer:
    def __init__(self,func):
        self.func=func

    def __call__(self):
        print("-"*20)
        self.func()
        print("-" * 20)

@Outer
def inner():
    print("결과를 출력합니다.")

inner()
'''

# 17,3 동적 코드 실행

# eval

# 컴파일 언어는 모든 코드를 완벽히 번역한 후 실행하며 실행 시점에 모든 코드가 완성 되어있다.
# 인터프리터 언어는 코드 실행중에 생성해 낼 수 있다.

'''
result = eval ("2+3*4")
print(result)

a = 2

print(eval("a+3"))

city = eval("['seoul','osan','suwon']") # 여기를 더블 코테이션으로 감쌌을때, 반대의 코테이션을 써줘야 작동이 되더라.
for i in city:
    print(i,end=",")

# 전체적으로 굳이 eval을 써줘야 작동이 되는건가? 싶어서 뺀 버전으로 따라해 보려고 한다.
'''
'''
result = 2+3*6
print(result)
# 음 ... 20으로 나오는데...

a = 2
print(a+3)
# 왜 굳이 eval를 써야할 메리트를 못찾겠다.
'''

# 뭔가 휘황찬란한 이유때문에 eval이 필요하다고 한다;
# 아무튼 잘 이해는 안가고 쓸모없을것같긴 하지만 그래도 해설코드만이라도 따라 써보자.

'''
import math

while True:
    try:
        expr = input("수식을 입력하세요. 끝내고싶으면 0을 입력하세요.: ")
        if expr =="0": # 해설에서는 "0"으로 되어있다. 도대체 왜 그런걸까
                        # 일반 숫자인 0으로 했더니 무한히 돌아간다..; 왜그런걸까
                        # input 받아서 입력되는 거라 str처리되서 그런건가?
            break
        print(eval(expr))
    except:
        print("수식이 잘못 되었습니다.")
# eval 함수는 "문자열로 된 표현식을 평가하여 값을 만들어내며 이 값을 변수에 대입하면
# 실행 중에 변수 값을 결정 할 수 있다." 라고 한다.
'''

'''
repr

# eval과는 반대로 객체로부터 문자열 표현식을 생성한다.

print(str(1234),end=",")
print(str(3.14),end=",")
print(str(['seoul','osan','suwon']),end=",")
print(str('korea'))

print(repr(1234),end=",")
print(repr(3.14),end=",")
print(repr(['seoul','osan','suwon']),end=",")
print(repr('korea'))

# 음... 정말 비슷하다. 하지만 str이 사람을 위한 문자 변환식이라면
# repr은 해석기를 위한 표현식이라고 한다.
# 결과적으로는 마지막의 'korea'만 유일하게 싱글 코테이션이 없고 있고의 표현 차이가 있다.
'''

'''
intexp = repr(1234)
intvalue = eval(intexp)
print(intvalue)

strexp = repr('korea')
strvalue = eval(strexp)
print(strvalue)
'''

'''
class Human:
    def __init__(self,age,name):
        self.age = age

        self.name = name
    def __str__(self):
        return "이름%s, 나이 %d" %(self.name, self.age)
    def __repr__(self):
        return "Human("+str(self.age)+",'" +self.name+ "')" # 여기가 특히 복잡하다.

kim = Human(29,"김상형")
print(kim)
kimexp = repr(kim)
kimcopy = eval(kimexp)
print(kimcopy)
'''

'''
exec("value= 3")
print(value)
exec("for i in range(5):print(i,end=',')")
'''

'''
for n in range(10):
    exec("""
for i in range(5):
    print(i,end=',')
print()    
    """)
'''

# 이번챕터는 전체적으로 사용법이 굉장히 난해하고 설명도 모호했다.
#근데 설명을 이번챕터같은 경우에는 보통 하기가 어려울 것같긴 하다.
# 그냥 주제자체가 난해하다. 
300x250