프로그래밍/파이썬🐍

(4)처음시작하는 파이썬_[4장파이크러스트:코드구조]

개발자 덕구🐾 2022. 1. 11. 11:29
728x90

라인 유지하기 : \

 

print('fjslfjsf\
fslljf')

 

 

for문에서 튜플이나 리스트는 한 번에 한 항목을 순회하고, 문자열은 한 번에 한 문자를 순회한다.

 

word = 'cat'
for i in word :
    print(i)

 

 

 

딕셔너리의 순회는 키를 반환한다. 

 

값을 하고 싶다면 values()를 이용, 키와 값 모두 반환하려면 items()를 이용한다. 

 

break문이 발생하지않으면 else : 가 실행된다. 

 

cheeses = ['mocha']
for cheese in cheeses : 
    print('This shop has some lovely', cheese)
    break
else : # break가 호출되지않으면 
    print('This is not much of a cheese shop')

 

 

 

zip() : 여러 시퀀스 순회하기

 

english = 'Monday', 'Tuesday','Wednesday'
french = 'Lundi','Mardi', 'Mercredi'

print(dict(zip(english,french)))
print(list(zip(english,french)))

 

 

 

4.6 컴프리헨션 (함축)

하나 이상의  이터레이터로부터 파이썬의 자료구조를 만드는 컴펙트한 방법이다.

 

-> 파이써닉!

 

리스트 컴프리헨션

 

number_list =[표현식 for 항목 in 순회 가능한 객체]

 

표현식   : 루프의 결과를 number_list 변수에 넣어준다. 

 

<대괄호안에 루프가 있다는 것이 특징!>

 

[표현식 for 항목 in 순회 가능한 객체 if 조건]

 

num_list = [i for i in range(1,6) if i %2==1 ]
print(num_list)

 

 

 

 

4.6.4 제너레이터 컴프리헨션

 

number_thing = (number for number in range(1,6))
print(type(number_thing))

 

 

튜플 컴프리헨션같지만 이는 제너레이터 컴프리헨션으로 제너레이터 객체를 반환한다. 

제너레이터 객체는 순회할 수 있다. 

 

제너레이터는 한 번만 실행될 수 있다.

셋, 리스트 등은 메모리에 존재하지만, 제너레이터는 즉석에서 그 겂을 생성하고,

이터레이터를 통해 한번에 값을 하나씩 처리한다.  제너레이터는 이 값을 다시 기억하지 않는다. 

 

 

4.7 함수

인자 : 함수로 전달한 값

매개별수 : 함수를 호출하면 인자의 값은 함수 내에서 해당하는 매개변수에 복사된다. 

 

 

def echo(str) :
    print(str+' '+str)
echo('Rumple')

'Rumple'은 문자열 인자

str은 echo의 매개변수

 

 

None이 부울로 평가될 때는 false처럼 보이지만 false와는 다르다.

 

 


위치인자 : 평소에 함수호출할 때 있는 그 인자

 

키워드인자 : 위치인자의 혼동을 피하기 위해 매개변수에 상응하는 이름을 인자에 저장

<함수의 정의와 다른 순서가능>

 

 

 

'*' (애스터리스크) : 위치인자 모으기 

 

매개변수에서 위치 인자 변수들을 튜플로 묶는다. 

 

 

 

def print_more(required1, *args) :
    print('Need this : ',required1)
    print('All the rest : ', args)

print_more('cat','gloves','scarf')

 

args는 나머지들을 튜플로 묶어 만든다. 

굳이 args 여야하는 것은 아니지만 관용적으로 사용

 

 

파이썬에서 모든 것은 객체이다!

 

함수를 변수에 할당할 수 있고, 다른 함수에서 이를 인자로 쓸 수 있으며, 함수에서 이를 반환할 수 있다.

 

 

def sum_args(*args) :
    return sum(args)

def run_with_args(func,*args) :
    return func(*args)

print(run_with_args(sum_args,3,4))

 

마지막 줄에서 괄호가 없으면 함수를 다른 모든 객체와 마찬가지로 취급한다. 파이썬에서 모든 것은 객체이기때문이다. 

 

출력은 7이다. 

 

 

lambda() : 익명함수 

 

def edit_story(words, func) :
    for word in words :
        print(func(word))
def enliven(word) :
    return word.capitalize() + '!'

stair = ['thud','meow','thud','hiss']

edit_story(stair, enliven)
edit_story(stair,lambda word:word.capitalize() + '!')

 

작은 함수를 람다로 정의할 수 있다. 

 

 

 

제너레이터 : 파이썬의 시퀀스를 생성하는 객체

 

함수는 전역변수의 값을 얻을 수는 있지만 바꾸려 하면 에러가 발생한다. 

함수 내의 지역변수가 아닌 전역 변수를 접근하기 위해 global 키워드를 사용해 전역변수 접근을 명시해야한다. 

 

4.9 데커레이터

 

소스코드를 변경하지않고, 함수를 수정할 수 있다!

 

데커레이터는 하나의 함수를 취해서 다른 함수를 반환하는 함수다.

 

 

수동으로 데커레이터를 적용한 경우

def document_it(func) :
    def new_function(*args,**kwargs) :
        print('Running function : ', func.__name__)
        print('positional arguments : ', args)
    return new_function

def add_int(a,b) :
    return a+b

cooler_add = document_it(add_int) 

print(cooler_add(5,4))

 

자동으로 데커레이터를 적용한 경우

def document_it(func) :
    def new_function(*args,**kwargs) :
        print('Running function : ', func.__name__)
        print('positional arguments : ', args)
    return new_function

@document_it
def add_int(a,b) :
    return a+b

print(add_int(5,4))

@데커레이터_이름 을 이용해 자동으로 쉽게 적용할수있다.

 

 

 

4.10.1 이름에 _ 와 __ 사용

 

__ (언더스코어 2개)로 시작하고 끝나는 이름은 파이썬 내부 사용을 위해 예약되어있다. 

 

예) 함수의 이름 -> (시스템변수) func.__name__ , 함수의 docstring -> (시스템 변수) func.__doc__

 

 

4.11 예외 처리하기 : try, except

잠재적 에러 방지를 위해 적절한 예외처리가 필요하다. 

 

에러가 예상되는 코드에 try문을 사용하고, 그 에러를 처리하기위해 except 문을 사용한다. 

 

list= [1,2,3]

while True : 
    value = input('Position [q to quit] ?')
    if value == 'q' :
        break
    try : 
        position = int(value)
        print(list[position])
    except IndexError as err :
        print('Bad index :', err)
    except Exception as other :
        print('Somthing else broke :',other)

 

 

 

4장 연습문제

 

4-2

guess_me = 7
start = 1
while True :
    if guess_me > start : print('too low')
    elif guess_me == start : 
        print('found it!')
        break
    else : 
        print('oops')
        break
    start +=1

 

4-3 

arr = []
for i in range(4)[::-1] :
    arr.append(i)

print(arr)

 

괜히 복잡하게 만들었네...

 

 

4-4 

 

list = [data for data in range(10) if data%2==0]
print(list)

 

 

4-5

 

squares = {key : key*key for key in range(10) }
print(squares)

 

4-6

 

odd = {key for key in range(10) if key %2==1}
print(odd)

 

 

4-7

string = ('got %s' % key for key in range(10))
for i in string :
    print(i)

 

4-11

 

class OopsException(Exception) :
    pass
try : 
    raise OopsException()
except OopsException : 
    print('Caught an oops')

 

 

반응형