(Python) 01.30.목 TIL

Kepler·2020년 1월 30일
0

Python

목록 보기
3/12

Set

  • 요소들이 순서대로 저장되지 않는다. (unordered) 따라서, indexing도 없다.
  • for 문에서 읽어들일때 요소들이 random 하게 나온다.
  • 중복된 값을 저장할 수 없다. 오직 replace만 가능하다.

Dictionary

  • 기본 문법: my_dic = { "key1" : "value1", "key2" : "value2"}

  • index 대신 key 값을 사용하여 요소를 읽는다.

  • key값은 중복될 수 없다. 따라서, 이미 존재하는 key값을 입력할 경우, 값이 replace된다.

bts_rm = { "실명" : "김남준", "가명" : "RM", "태어난 년도": 1991 }
bts_rm["실명"]     #  김남준
  • Dictionary에 값 변경하기 :
    1. 새로운 key-value pair를 추가 : dictionary_name[new_key] = new_value
    1. 기존 value 값을 변경 :
      • 1번 방법 사용하기 dictionary name[new_key] = 바꿀값입력
      • dictinoary_name.update({new_key: new_value})
    2. key-value pair를 삭제 :
      • del dictionary_name[new_key]
      • dictionary_name.pop(new_key, [, default]) # value to be returned when the key is not in the dictionary
    3. key값을 변경 :
      • using pop() : dictionary_name[new_key] = dictionary_name.pop(old_key)
# 2. 예제
my_dict = { "one" : 1 , 2: "two" }
my_dict[2] = "둘"
print(my_dict)     # {"one" : 1 , 2 : "둘"}

또는, 

my_dict = { "one" : 1 , 2: "two" }
my_dict.update({"one" : "하나"})
print(my_dict)     # {"one" : "하나" , 2 : "two"}


# 3. 예제
my_dict = { "one" : 1 , 2: "two" }
del my_dict["one"]
print(my_dict)     # {2 : "two"}


#4. 예제
my_dict = { "one" : 1 , 2: "two" }
my_dict["deux"] = my_dict.pop(2)
print(my_dict)     # {"one" : 1 , "deux" : "two"}

For 구문

  • Data structure의 요소에 원하는 로직을 한번에 하나씩 실행할수 있게 해줌.
    • list나 set, dictionary 등을 기반으로 코드블록을 반복 실행 (data structure 기반이 아닐 경우 while구문)
문법 :
for element in list:
    do_something_with_element
예제:
my_list     = [int(s) for s in input().split()]
odd_numbers = [ ]   #먼저 홀수값들을 골라내서 리스트를 만들고
for element in my_list:
    if (element % 2) == 1:
        odd_numbers.append(element)   #홀수값들을 하나 하나 기존 리스트에서 지움
for odd_number in odd_numbers:
    my_list.remove(odd_number)

print(my_list)            #홀수값들이 지워진 my_list가 출력됨

Break : for문을 도중에 멈출때 사용. 완전히 빠져나가게 됨.

names = ['Kim', 'Lee', 'Park', 'Choi']
for element in names:
  if element == "Lee"
  break
else:
  print("searching Lee..")

Continue : 완전히 빠져나가지는 않지만, 다음 요소로 넘어가고 싶을 때 사용.

names = ['Kim', 'Lee', 'Park', 'Choi']
for element in names:
  if element != "Lee":
    print("searching Lee.."
    continue
  print("We found Mr.Lee!")

Nested for loop :

  • for loop 안에 for loop 을 작성하여 처리.
  • 이차원적인 데이터(행,열 존재)를 처리할때 사용.
    • 바깥의 for문은 세로줄(행), 안쪽의 for문은 가로줄(열) 을 처리
      image.png
  • 2차원 리스트: 리스트안에 리스트를 작성.
접근방법:
 a =[[10,20], 
     [30,40], 
     [50,60]]
 >>> a[0] [0]            # 세로 인덱스 0, 가로 인덱스 0인 요소 출력
10
>>> a[1][1]           # 세로 인덱스 1, 가로 인덱스 1인 요소 출력
40
>>> a[2][1]           # 세로 인덱스 2, 가로 인덱스 0인 요소 출력
60
>>> a[0][1] = 1000    # 세로 인덱스 0, 가로 인덱스 1인 요소에 값 할당
>>> a[0][1]
1000

https://dojang.io/mod/page/view.php?id=2291
https://wikidocs.net/3094

While loop

  • 특정 조건문이 True 일동안 코드블록을 반복 실행.
  • 기본구조 :
    • for 과 같이 break, continue 사용 가능.
    • while..else : if..else와 비슷. while의 조건문이 False일때, 실행된다.
#기본구조
while n != 5:      #True/False로 판단할수 있는 조건
    print(n)      #위의 조건이 True일동안 반복할 코드..1
    n += 1        #위의 조건이 True일동안 반복할 코드..2
  
    
#break,continue의 사용    
number = 0
while number <= 10:
    if number == 9:
        break
    elif number <= 5:
        number += 1
        continue            
    else:
        print(number)
        number += 1
> 6
7
8 


#while..else 의 사용
def find_smallest_integer_divisor(numb): 
    divisor = 2
    while numb % divisor != 0:
      divisor += 1
    else:
      return divisor
>find_smallest_integer_divisor(15)      #3

Looping dictionary

  • Default로 각 요소의 key값만 리턴:
customers = { "name" : "Kim" , "gender" : "female" , "birthday" : 1025 }
for each_key in customers:
    print(f"The {each_key} of our first customer is {customers[each_key]}.")
> The name of our first customer is Kim.
  • value값으로 리턴하는 방법 : .value()
for each_value in customers.value()
    print(f"Our first customer is {each_value}.")
  • key & value 값으로 리턴하는 방법 : .items()를 사용하고 두개의 element를 입력
for each_key, each_value in customers.items()
    print(f"The {each_key} of our first customer is {each_value}.")

Complex dictionary

  • list를 dictionary로 구성하여 dictionary를 grouping => for 구문 사용하여 로직 실행 가능
bts = [
	{
		"실명" : "김남준",
		"가명" : "RM",
		"생년월일" : "1994년 9월 12일",
	},
	{
		"실명" : "김석진",
		"가명" : "진",
		"생년월일" : "1992년 12월 4일",
	}
]

Nested Function

def parent_function():
    def child_function():
        print("this is a child function")

     child_function()

parent_function()
> "this is a child function"
  • 함수 안에 함수 (child function in parent function)
  • 사용 이유:
    1. 가독성
    2. Closure : Nested function이 parent function 의 정보(변수)를 가두어 두는것.
  • parent function 의 return 은 nested(child) function=> 이미 function 을 return했으므로, 직접적으로 변수에 접근 불가.
  • When to use closure?
    • 접근이 제한된 정보를 이용하여 연산을 실행할 때.
예제 : 설정되는 수의 승을 구하는 함수
def generate_power(base_num):   #base가 되는 수를 지정하는 함수 - parent function
  def nth_power(power):         #base수를 지정한 후에만 access가능 - child function
    return base_num ** power    #base_num이 없으면 접근이 제한되는 정보
  
  return nth_power  #generate_power = parent 이므로, return은  child function = nth_power
calculate_power_of_two = generate_power(2)   #base_num을 지정하여 변수만듦
calculate_power_of_two(7)  #base_num을 지정한 상태이므로, power에 접근 가능
> 128

calculate_power_of_seven = generate_power(7)
calculate_power_of_seven(3)
> 343

Decorator

  • 함수를 "장식" 해서 decorator 라고 불린다.
    • 어떠한 함수가 호출되기전에 @decorator function 이 먼저 호출된다
    • 여러개의 함수가 연속적으로 자동 호출 되기 때문에 chain of functions 이라고도 불린다.
def is_paid_user():
    return True
  
@is_paid_user      #항상 이 함수가 먼저 호출된다
def jackpot_stock_information():
    return "계시가 내려졌습니다. 삼성전자를 사세요!"
  • Decorator 함수 구현 방법 :
    • 중첩 함수(nested function)를 리턴하는 함수만 Decorator로 장식할 수 있다
    • 함수의 "연속적 자동 호출" 이기에, 모든 함수는 다음 함수를 리턴해주어야만 제대로 작동
def is_paid_user(func):
    user_paid = True # 간단화 하기 위해 무조건 True

    def wrapper(*args, **kwargs):
        if user_paid:
            func() 
        else:
            return

    return wrapper   #중첩 함수를 리턴하는 함수

Arugument와 return값을 처리하는 데코레이터 :

#decorate할 함수
def add(a, b):
  return a + b

#a, b 와 add함수의 return값을 처리하는 decorator 
def decorator(func): # 호출할 함수를 argument로 받음
  def wrapper(a, b): # 호출할 함수와 같은 argument를 지정
    r = func(a, b) # 호출할 함수에 argument를 넣어서 호출하고 반환값을 변수r에 저장
    return r #호출할 함수의 반환값을 반환
  return wrapper #wrapper함수 반환

@decorator
def add(a,b):
  return a + b

print(add(10,20))
> 30
    

Argument가 있는 데코레이터 :

# decorate할 함수
def greeting()
  return "Hello, "

def name_decorator(name): # decorator가 사용할 argument지정(=name) !this is the extra layer! 
  def real_decorator(func): # 호출할 함수를 argument로 받음 !greeting() 을 받는 함수!
    def wrapper():
      r = func() + name # 호출할 함수에 decorator의 argument가 할일을 저장하고 반환값을 r변수에 저장
      return r
    return wrapper
  return real_decorator

@name_decorator("정우성")
def greeting():
  return "Hello, "
  
greeting()

Scope

  • 범위 : 어떠한 객체(변수,함수)가 유효한 범위. 범위를 벗어나면 해당 객체는 사용불가.

image.png

Local Scope

  • 주로 함수 안에 선언된 변수나 함수는 해당 함수 안에서만 유효한 local
def func():
  a = 1
  print(a)
  
print(a) # 함수 바깥에서 호출했으므로 유효 범위 벗어남, *NameError*

Non-local(enclosing) Scope

  • nested function이 있을때 적용되는 범위: 부모 함수에서 선언된 변수가 nested 에서도 유효
def func():
  a = 1
  print(a)
  
  def inner():
    b = 7    # b는 inner안에서만 유효한 local scope
    print(a * b) # a는 부모에서 선언된 변수이므로 nested에서도 유효
    
inner()
print(b) # inner함수 바깥에서 호출했으므로 유효 범위 벗어남, *NameError*

Module(global) Scope

  • 함수 밖에서 선언된 변수나 함수
  • 가장 바깥쪽에서 선언되므로 선언된 후 아래로는 모두 유효 범위 안
k = 9       # global scope
def func():
  a = 1
  print(a + k)
  
print(k) # 9

Builtin Scope

  • 가장 광범위한 scope, 파이썬의 내장함수나 속성이 여기에 속함

shadowing

  • 변수,함수를 찾는 순서 : Local => Enclosing => Global => Built-in
    + 좁은범위 => 넓은 범위
    • 동일한 이름의 변수들이 서로 다른 범위에 선언될 경우, 좁은범위 변수가 적용됨

image.png

profile
🔰

0개의 댓글