Python < Replit 정리 43 - 54 >

do yeon kim·2022년 6월 23일
0

Python

43-1. For Loops

반복문
리스트를 포함해 순서가 있는 자료형들을 돌면서 하나씩 가지고 올수 있다.

for문이 리스트를 돌면서 하나씩 꺼내는 것을 iteration이라고 한다.


break
for문을 돌다가 경우에 따라서 iteration을 멈추어야 하는 경우 break를 사용한다.


continue
break처럼 for문을 빠져 나오는 것이 아니라 다음 요소로 iteration 하고 싶은 겨우 continue를 사용한다.


중첩 for문
if문과 마찬가지로 for문도 중첩해서 사용할 수 있다.


for i in range(10):
	for j in range(10):
    	print(i,j)

위의 중첩 for문의 경우 총 100번을 반복하게 된다.

my_list = [1, 2, 3, 4, 5, 1, 2, 3, 7, 9, 9, 7]

my_set = set(my_list)

for i in my_set:
  if my_list.count(i) == 1:
    print(i)
  else:
    pass

set으로 만들고 for문으로 set으로 만든 리스트를 돌면서 my_list의 요소의 카운트가 1개 인 경우만 출력하게 한다.



44. For Loops - Iterate with Python For Loops

range객체

for in range(start_value, end_value, step)

range객체는 정해진 범위 내의 숫자 객체를 만든다.
객체를 만들때 시작값, 끝값, 증가감값을 설정할 수 있다.

def for_loop():
    my_list = []
    
    for i in range(1,6):
      my_list.append(i)

    return my_list

range객체를 이용해서 1부터 5까지의 숫자를 만들고 for문을 이용해서 돌면서 하나씩 리스트에 추가한다.



45-1. Iterate Odd Numbers With a For Loop

range객체를 만들때 증가감값을 추가함으로써 원하는 데이터를 만들 수 있다.

def for_loops():
    my_list = []
    for i in range(1,10,2):
      my_list.append(i)

    return my_list

시작 값과 증가감값을 조절해서 홀수만을 담은 리스트를 생성했다.



46-1. Count Backwards With a For Loop

증가감값을 마이너스를 줌으로써 줄어드는 숫자형 range객체를 만들 수 있다.

def list_for_loops():
    my_list = []
    for i in range(9, 0, -2):
      my_list.append(i)
    return my_list


47-1. Iterate Through an Array with a For Loop

요소를 하나씩 돌면서 꺼내서 total을 구한다.

def list_loop():
    
    my_list = [2, 3, 4, 5, 6]
    total = 0
    for i in my_list:
      total = total + i

    return total


48 . For Loops get_all_letters

문자열 역시 순회가능한 데이터로 하나씩 꺼내 올수 있다.

def get_all_letters():
    str_list = []
    mission_str = "wecode"

    for i in mission_str:
      str_list.append(i)

    return str_list


49. While Loop

while

for문 이외의 반복문으로 while이 있다.
for문이 반복횟수가 정해져 있는 경우에 사용한다면
while문은 반복횟수를 모를 경우 사용하는게 일반적이다.

while 문도 for문 처럼 리스트, set, dictionary 등의 data structure 등의 반복 수해을 위해서 사용된다.

while <조건문>:     
    <수행할 문장1>     
    <수행할 문장2>     
    <수행할 문장3>     
    ...
    <수행할 문장N>
초기값
while <조건문>:
	<수행할 문장1>
    <수행할 문장2>
    <수행할 문장3>
    ...
    <수행할 문장N>

	증감값

초기값과 증감값을 이용해서 리스트 필요없이 반복문을 수행할 수 있다.

break와 continue
for문과 같이 while문도 break와 continue가 있다.
break는 반복문을 탈출하고 싶을 때 사용하며,
continue는 반복문의 다음 요소로 넘어 가고 싶은 경우 사용한다.

while else
파이썬은 while문에 else문이 추가 될 수 도 있다.

while문의 else는 while문의 조건이 False가 되었을 때 실행되는 구문이다.

while <조건문>:
    <수행할 문장1>     
    <수행할 문장2>     
    <수행할 문장3>     
    ...
    <수행할 문장N> 
else:
    <while문이 종료된 후 수행할 문장1>     
    <while문이 종료된 후 수행할 문장2>     
    <while문이 종료된 후 수행할 문장3>     
    ...
    <while문이 종료된 후 수행할 문장N>


49. While Loop

def find_smallest_integer_divisor(num): 
    i = 1
    result= []
    while True:
        if num % i == 0 :
            result.append(i)
        else:
            pass
        
        i = i +1

        if i > num:
            break
    return result[1]    

while문을 이용해서 무한루프를 만들고, 루프를 돌면서 1부터 주어진 수를 나머지 연산자로 계산한다. 만약 연산 결과가 0이라면 그 수는 주어진 수의 약수에 해당 한다.

나머지 연산이 종료후 증가감값으로 i를 1증가 시킨다.

마지막으로 if문으로 i 가 num보다 큰 경우 break를 시킨다.



50. Looping Dictionary

딕셔너리 루프
딕셔너리도 리스트와 같이 반복문에 사용될 수 있다.
하지만 딕셔너리의 경우 설정을 하지 않으면 기본으로느 키값만 반환하게 된다.
함수 딕셔너리.values(), 딕셔너리.items() 를 이용하면, 원하는 값을 받을 수 있다.

딕셔너리.items() 이 함수의 경우 반환값으로 튜플을 준다.

def get_occurrence_count(my_list):
  set_list = set(my_list)
  dic = {}
  for word in set_list:
    count = my_list.count(word)
    dic[word] = count  
  return dic
  

먼저 리스트를 셋으로 만들어서 중복을 제거한다. 그리고, 리턴할 빈 딕셔너리를 만든다.

for문을 돌면서 셋으로 만든 데이터를 하나씩 가지고 와서 리스트안에서의 개수를 구한 뒤 딕셔너리에 추가해준다.



51. Complex Dictionary

List of Dictionaries
리스트로 감싼 딕셔너리
for문을 이용해서 하나씩 꺼내서 원하는 정보르 가지고 온다.
하지만 중첩 딕셔너리에 비해서 값을 가지고 오는 것이 번거롭고, 시간이 거린다.

for member in bts:
	if member["가명"] == "제이홉":
		print(member["생년월일"])

for문을 이용해서 리스트를 돌면서 첫번째 요소에 대한 조건문(가명)을 마치고 나야,
원하는 정보(생년월일)를 가지고 올 수 있다.

Nested Dictionary
중첩 딕셔너리

딕셔너리[][]


def get_team_info(team_name):
    # 아래 코드를 작성해주세요.
    dic = [{
      "구단":"강원 FC",
      "리그참가":2009,
      "연고지":"강원도(춘천시)",
      "주 경기장": "춘천송암레포츠타운"},
      {
      "구단":"광주 FC",
      "리그참가":2011,
      "연고지":"광주광역시",
      "주 경기장": "광주월드컵경기장"},
      {
      "구단":"대구 FC",
      "리그참가":2003,
      "연고지":"대구광역시",
      "주 경기장": "DGB대구은행 파크"},
      {
      "구단":"부산 아이파크",
      "리그참가":1983,
      "연고지":"부산광역시",
      "주 경기장": "구덕운동장"},
      {
      "구단":"상주 상무",
      "리그참가":2011,
      "연고지":"상주시",
      "주 경기장": "상주시민운동장"},
      {
      "구단":"FC 서울",
      "리그참가":1984,
      "연고지":"서울특별시",
      "주 경기장": "서울월드컵경기장"},
      {
      "구단":"성남 FC",
      "리그참가":1989,
      "연고지":"성남시",
      "주 경기장": "탄천종합운동자"},
      {
      "구단":"수원 삼성 블루윙즈",
      "리그참가":1996,
      "연고지":"수원시",
      "주 경기장": "수원월드컵경기장"},
      {
      "구단":"울산 현대",
      "리그참가":1984,
      "연고지":"울산광역시",
      "주 경기장": "울산문수축구경기장"},
      {
      "구단":"인천 유나이티드",
      "리그참가":2004,
      "연고지":"인천광역시",
      "주 경기장": "인천축구전용경기장"},
      {
      "구단":"전북 현대 모터스",
      "리그참가":1995,
      "연고지":"전라북도(전주시)",
      "주 경기장": "전주월드컵경기장"},
      {
      "구단":"포항 스틸러스",
      "리그참가":1983,
      "연고지":"포항시",
      "주 경기장": "포항스틸야드"},
      {
      "구단":"경남 FC",
      "리그참가":2006,
      "연고지":"경상남도(창원시)",
      "주 경기장": "창원축구센터"},
      {
      "구단":"대전 하나 시티즌",
      "리그참가":1997,
      "연고지":"대전광역시",
      "주 경기장": "대전월드컵경기장"},
      {
      "구단":"부천 FC 1995",
      "리그참가":2013,
      "연고지":"부천시",
      "주 경기장": "부천종합운동장"},
      {
      "구단":"서울 이랜드",
      "리그참가":2015,
      "연고지":"서울특별시",
      "주 경기장": "서울올림픽주경기장"},
      {
      "구단":"수원 FC",
      "리그참가":2013,
      "연고지":"수원시",
      "주 경기장": "수원종합운동장"},
      {
      "구단":"충남 아산 FC",
      "리그참가":2020,
      "연고지":"아산시",
      "주 경기장": "이순신종합운동장"},
      {
      "구단":"안산 그리너스",
      "리그참가":2017,
      "연고지":"안산시",
      "주 경기장": "안산외-스타디움"},
      {
      "구단":"FC 안양",
      "리그참가":2013,
      "연고지":"안양시",
      "주 경기장": "안양종합운동장"},
      {
      "구단":"전남 드래곤즈",
      "리그참가":1995,
      "연고지":"전라남도(광양시)",
      "주 경기장": "광양축구전용구장"},
      {
      "구단":"제주 유나이티드",
      "리그참가":1983,
      "연고지":"제주특별자치도(서귀포시)",
      "주 경기장": "제주월드컵경기장"}]
      
    for index, i in enumerate(dic):
        if team_name in dic[index].values():
            return(dic[index])

a = get_team_info("제주 유나이티드")
print(a)


52. More Complex Function Parameters

위치가변매개변수(Non-keyworded variable length of arguments)

def 위치가변매개변수(*args):
	return 튜플형태

순서대로 매개변수가 들어간다.

키워드가변매개변수(Keyworded variable length of arguments)

def 키워드가변매개변수(**kwargs)
	매개변수가 딕셔너리 형태로 들어간다.
        
def sum_of_numbers(*args):
  count = 0  

  if len(args) == 0:
    return 0
  
  elif len(args)>0 :
    for arg in args:
      count = count + arg
    return count
  
    
def what_is_my_full_name(**kwargs):
    
    #case1 이름만 있는 경우
    if "first_name" in kwargs and "last_name" not in kwargs:
        return kwargs["first_name"]
    #case2 성만 있는 경우
    elif "first_name" not in kwargs and "last_name" in kwargs:
        return kwargs["last_name"]
    #case3 둘다 있는 경우
    elif "first_name" in kwargs and "last_name" in kwargs:
        fullname = kwargs["last_name"], kwargs["first_name"]
        fullname = " ".join(fullname)
        return fullname
    
    #case4 아무 것도 없는 경우
    elif "first_name" not in kwargs and "last_name" not in kwargs:
        return "Nobody"


53. Nested Function

중첩함수

함수도 다른 for문, if문 등과 같이 중첩해서 사용할 수 있다.
중첩함수는 함수안에 또 다른 함수를 정의하는 것이다.

def outer():
	def inner():
    	실행문
    return inner()

위의 코드와 같이 outer()라는 함수안에 inner()라는 함수가 중첩되서 선언 되었다. 중첩함수에서 안의 함수는 밖에 함수에서만 호출 가능하다.

중첩함수는 가독성을 높이고, Closure을 위해서 사용한다.

Closure

내부함수가 외부함수의 변수나 정보를 가두어 사용하는 것을 의미한다.
closure는 외부함수가 실행이 끝나도, 내부함수에서 외부함수의 정보와 변수를 사용할 수 있다. __closure__라는 특별한 공간에 정보와 변수를 담아둔다.

외부함수는 내부함수를 리턴한다. 그렇기 때문에 다른외부에서 외부함수에 접근하지 못하며, 내부함수에서만 외부함수의 변수,정보를 사용할 수 있게된다.

closure는 주로 정보의 접근을 차단하거나, 정보의 수정을 막을때 사용한다.
디자인패턴의 factory패턴을 구현할 때 사용된다.

클로저가 되기 위한 조건

  • 1.내부함수여야한다.

  • 2.외부함수의 변수를 참조해야한다.

  • 3.외부함수가 내부함수를 반환해야한다.


def outer(number):
	def inner(mult): # 내부함수이다.
    	return number*mult   # 외부함수의 변수를 참조
	return inner # 내부함수를 반환

closure = outer(2)
result = closure(10)
print(result)

클로저는 함수가 종료되어도 자원(변수)을 사용할수 있는 함수이다.





데코레이터 Decorater

데코레이터란 함수 앞, 뒤로 부가적인 기능을 추가 하고 싶을 경우 사용한다.
클로저를 이용해서 데코레이터를 구현한다.
먼저 데코레이터를 선언 후 사용하고자 하는 함수 앞이나 뒤에 @데코레이터 이름으로 사용가능하다.

def front_deco(fun):
    def inner():
        fun()
        print("hi")
    return inner

@front_deco
def print_hi():
    print("안녕")

a = print_hi()

결과
안녕
hi



방법1

def welcome_decorator(func):
    def inner():
        value = func() + "welcome to WECODE!"
        return value
    return inner

@welcome_decorator
def greeting():
  return "Hello, "

a = greeting()
print(a)



방법2
데코레이터 자체에 매개변수를 받아서 사용하기

def welcome_decorator(func):
  def wrapper(func_1):
    def inner():
      value = func_1()
      return value+func
            
    return inner
  return wrapper

func = "welcome to WECODE!"

@welcome_decorator(func)
def greeting():
    return "Hello, "

greeting()



데코레이터 경우의 수

  • 호출 함수에 매개변수가 없는 경우
def decorator(func):
	def inner():
   		#호출함수의 리턴값을 사용하는 경우
        func()
        #호출함수의 리턴값을 사용하지 않는 경우
    	value = func()
        return value
    return inner

@decorator
def call_fun():
	#리턴값이 없는 경우
    print("call_fun")
    #리턴값이 있는 경우
    return data

call_fun()



  • 호출 함수에 매개변수가 있는 경우(1)
def decorator(func):
	def inner(매개변수):
   		#호출함수의 리턴값을 사용하는 경우
        func(매개변수)
        #호출함수의 리턴값을 사용하지 않는 경우
    	value = func(매개변수)
        return value
    return inner

@decorator
def call_fun(매개변수):
	#리턴값이 없는 경우
    print("call_fun")
    #리턴값이 있는 경우
    return data

call_fun(매개변수)



  • 호출 함수에 매개변수가 있는 경우(2)
    파라미터에 관계없이 모든 함수에 적용가능한 데코레이터
    위치가변매개변수와 키워드가변매개변수를 inner의 파라미터로 준다.
def decorator(func):
	inner(*arg, **kwarg):
   		#호출함수의 리턴값을 사용하는 경우
        func(매개변수)
        #호출함수의 리턴값을 사용하지 않는 경우
    	value = func(매개변수)
        return value
    return inner

@decorator
def call_fun(매개변수):
	#리턴값이 없는 경우
    print("call_fun")
    #리턴값이 있는 경우
    return data

call_fun(매개변수)



  • 데코레이터 자체에 매개변수가 있는 경우
    3중 중첩내부함수를 만들어야 한다.
def deco_outter(number):
  def decorator(func):
      inner():
          #호출함수의 리턴값을 사용하는 경우
          func()
          #호출함수의 리턴값을 사용하지 않는 경우
          value = func()
          #이 안에서 number를 사용가능
          return value
      return inner
	return decorator 

#데코레이터 자체에 매개변수 존재
number = 1
@decorator(number)
def call_fun():
	#리턴값이 없는 경우
    print("call_fun")
    #리턴값이 있는 경우
    return data

call_fun()

def welcome_decorator(func):
    def inner():
        value = func() + "welcome to WECODE!"
        return value
    return inner

@welcome_decorator
def greeting():
  return "Hello, "

a = greeting()
print(a)

def welcome_decorator(func):
  def wrapper(func_1):
    def inner():
      value = func_1()
      return value+func
            
    return inner
  return wrapper

func = "welcome to WECODE!"
@welcome_decorator(func)
def greeting():
    return "Hello, "

greeting()


54. Scope

scope
스코프는 범위를 객체가(변수,함수 등)의 유효범위를 의미한다.
스코프 범위에서 벗어나면 객체를 사용할 수 없다.

파이썬에서 스코프는 항상 객체가 선언되 지점에서 위로는 상위 객체까지,
아래로는 모드 하위 객체들과 그안까지 범위에 해당한다.

스코프의 종류

  • Local-Scope
  • Enclosed-Scope텍스트
  • Global-Scope
  • Built-in-Scope

Local-Scope
Local-Scope의 객체(함수나, 변수등)는 특정 범위에서만 유효하다.

def print_test():
	a= "hello"

위의 a의 경우 함수 안에서만 사용할 수 있는 local scope이다.

Enclosed-Scope
중첩함수안에서 외부함수에 선언된 변수는 내부함수에서만 사용가능하다.

Global-Scope
함수 밖에서 선언된 변수 함수를 의미한다.

변수나 함수는 선언된 지점과 동일한 level의 지역, 그리고 더 안쪽의 지역들까지 범위가 유효합니다.

Built-in-Scope
가장 범위가 넓은 scope이다.
파이썬에서 제공하는 함수 또는 속성들이 Built-in-Scope에 해당한다.
len()함수의 경우 Built-in-Scope의 예이다.
어디선든 호출할 수 있다.

Shadowing
파이썬에서 함수나 변수를 찾을 때 Local => Enclosing => Global => Built-in 순으로 함수와 변수를 찾는다.

좁은 범위부터 시작해서 넓은 범위로 확대해가면서 찾는다.
만약 같은 이름의 변수나 함수가 다른 범위 안에 있다면, 작은 범위의 scope가 넓은 범위의 scope를 가르키는 효과가 난다.
이를 Shadowing이라고 한다.

def scope_test(what_is_my_scope):
    
    def inner_scope_test(what_is_my_scope): 
        what_is_my_scope = 63	# 내부함수에서 값을 하나로 설정
        return what_is_my_scope
    
    return inner_scope_test(what_is_my_scope) #내부함수 호출
 

내부함수에서 외부함수의 변수를 사용해서 하나의 값으로 통일시켰다.



0개의 댓글