Python

Woo Hwukjun·2020년 11월 19일

2020.11.19

목록 보기
2/2
post-thumbnail

if statement

def is_okay_to_drive(who):
  if who == 'son':
    return('Nope!') //리턴값을 넣는순간 값을 전달하고 종료된다.
  if who == 'dad':
    return('Good!')
  if who == 'grand father':
    return('Be careful!')
  else:
    return('Who are you?')

조건문 check_age

def check_age(name, age):
    if age >= 21:
      return("Nice to meet You, "+name +"!")
    if  age <= 20:
      return("Go home, "+ name+"!") 

check_age('John', 10);
check_age('Nick', 25)

why are we using return?

  • The return statement causes your function to exit and hand back a value to its caller.
  • The return statement is used when a function is ready to return a value to its caller.
def foo():
    print("hello from inside of foo")
    return 1

위대로 함수를 생성했을때 foo()들어가는 값은 1이다
즉 return을 사용했을때 함수값으로 들어간다.
또한 설정이 안되있으면 str(x)로 되있다.
data type을 바꿔줘야한다.

if (x % 2 == 0) and (y % 2 == 0):
  print("검은색 Box")
elif (x % 2 == 1) and (y % 2 == 1):
  print("검은색 Box")
else:
  print("흰색 Box")

다만 위의 if 구문 경우 and 와 or 가 너무 많이 섞여 있어서 정확히 어떠한 것을 테스트 하는지 명확하지 않아 가독성이 떨어집니다. 그러므로 가독성을 높이기 위해서 ( ) 괄호를 사용하는 것이 좋습니다

Multiline Comments
작은 따옴표 ' 3개 입니다.
참고로 파이썬에서는 주로 위의 방식 보다 그냥
#를 줄마다 사용하여 주석을 삽입하는 방식이 일반적입니다.

Functional Parameter

다만 여기서 중요한것은 keyword arguments 는 순서가 바뀌어도 상관 없지만 positional arguments 부분은 순서를 지켜줘야 한다는 것입니다. 에러가 나는 이유는 keyword argument가 positional argument 보다 더 앞으로 위치되어 함수가 호출되었기 때문입니다. Positional arguments 는 순서를 지켜주어야 하는데 순서가 틀렸기 때문에 에러가 나는것입니다.

맞는버젼
틀린버젼

tuple - list랑 비슷한데 리스트는 [] 이고 튜플은 ()
리스트는 그 값의 생성, 삭제, 수정이 가능하지만 튜플은 그 값을 바꿀 수 없다.

del 원본을 바꾼다.
slicing 원본은 그대로있고 프린트할때만 바뀐다.

다차원 리스트의 접

Manipulate Lists With append( )
리스트에 값을 추가하고싶을때 append값을 사용합니다.

Manipulate Lists With pop( )
뒤에서부터 요소를 제거하는 pop()이라는 메서드도 존재합니다.

ListList는 여러 string 이외에도 숫자, boolean 값 등 모든 type의 값을 저장 할 수 있으며 서로 다른 type의 값들을 저장하는것도 가능합니다.List는 값들이 순차적으로 저장됩니다. 즉 list에는 순서(ordering)가 존재 합니다.

list vs set

List와 다르게 요소들이 순서대로 저장되어 있지 않습니다. 즉 ordering이 없다. 그러므로 for 문에서 읽어들일때 요소들이 순서대로 나오는게 아니라 무작위 순서대로 나옵니다.
순서가 없으므로 indexing도 없습니다. 몇번째 요소를 읽어들이거나 할 수 없습니다.
동일한 값을 가지고 있는 요소가 1개 이상 존재 할 수 없습니다. 즉 중복된 값을 저장할 수 없습니다. 만일 새로 저장하려고 하는 요소와 동일한 값의 요소가 존재한다면 새로운 요소가 이 전 요소를 치환(replace)합니다.

앞서 말했듯이 set에서는 중복된 값은 저장이 안됩니다. 그러므로 동일한 값이 1이상 있다면 맨 나중에 저장되는 요소만 남아있게 됩니다.

set에서는 append를 안쓰고 add를 쓴다 set은 순서대로 저장이된다.
remove, lookup (in my_list), 교집합은 & 키워드 혹은 intersection 함수를 사용하면 됩니다.합집합은 | 키워드 혹은 union 함수를 사용하면 됩니다.

Dictionary

Calculator

numbers1 = [1, 2, 3, 4, 5]
numbers2 = [10, 20, 30, 40, 50]
 
for num1 in numbers1:
    for num2 in numbers2:
        print(f"{num1} * {num2} == {num1 * num2}")

While Loops

Looping Dictionary With Both Keys And Values
Key와 value 값 둘다 가지고 for 구문을 실행하기 위해서는 items 함수를 사용하면 됩니다.

Nested dictionary

일반적인 keyword arugments와의 차이점은:

  • Argument 수를 0부터 N까지 유동적으로 넘겨줄 수 있습니다.
  • Keyword가 미리 정해져 있지 않기때문에 원하는 keyword를 유동적으로 사용할 수 있습니다.
  • Keyworded variable length of arguments는 dictionary 형태로 지정됩니다.
    Variable arguments를 선언하는 방법은 별표 2개 대신에 1개를 사용해서 선언합니다.
    그리고 variable arguments는 tuple로 변환되어 함수에 전달됩니다.

Why use nested function?

  1. 가독성
  2. Closure

Scope

classParameter로 넘겨진 maker, model, 그리고 horse_power 값을 동일한 이름으로 self 에 저장 하는 것을 볼 수 있습니다.

왜 저러는 거죠??

self 는 객체라고 방금 배웠습니다. 그러므로 객체에 maker, model, 그리고 horse_power를 저장하는걸 알 수 있습니다. 근데 왜 저장하는 걸까요? 저장하는 이유는 나중에 다시 사용하기 위해서 입니다.
더 자세히 이야기하면 다른 메소드에서 사용하기 위함입니다!
먼저 init 메소드의 이름을 자세히 보겠습니다. init 이라는 단어의 앞 뒤에 밑줄 2개가 있습니다.
이렇게 앞뒤로 밑줄 2개가 있는 메소드들을 special methods라고 합니다. 이들은 특별 취급을 받습니다.
그 중 init 메소드는 class가 실체화 될때 사용되는 함수 입니다.
그렇다면 class에서 "self" 는 누구를 말하는 걸까요? Class 자체를 말하는것은 아닐겁니다.
왜냐하면 앞서 보았듯이 class 자체는 공통점이 있는 부류를 가리키는 개념 이기 때문입니다
self는 class의 실체(instance)인 객체(object)를 가르킵니다!
init 메소드는 클래스가 실체화 될때 자동으로 호출이 된다.
init 메소드의 self 파라미터는 클래스가 실체화된 객체를 넘겨주어야 하며, 파이썬이 자동으로 넘겨준다.
init 메소드의 self 파라미터는 항상 정의되어야 있어야 하며 맨 처음 파라미터로 정의 되어야 한다 (그래야 파이썬이 알아서 넘겨줄 수 있으므로)

코드를 클래스 위주로 작성하는 것을 object oriented programming(객체 지향 프로그래밍)

Modules


from import 키워드를 사용하여 모듈을 불러들이는 경우 모듈 이름을 붙이지 않고 곧바로 원하는 함수나 변수 그리고 클래스를 호출할 수 있습니다.
import as는 문자이길거나 이름이 같을때

Packages

Package는 module과 마찬가지로 다른 파일에서 불러와서 사용하는 개념인데요, 차이점은 module보다 더 크고 복잡한 코드라는 점입니다. 앞서 보았듯이 module은 단순한 파이썬 파일입니다.

PIP 라는 툴을 사용하면 됩니다. PIP는 파이썬의 package manager 입니다. 파이썬을 설치하면 같이 설치가 되며 pip은 터미널에서 다음 명령어를 사용하면 됩니다. 이부분은 일단 알고만 계시면 됩니다. 프로젝트를 할때 많이 해볼것입니다.

How import statement finds modules and packages

파이썬은 모듈/package를 어떻게 찾을까요?

파이썬은 다음 3가지 장소를 순서대로 보면서 찾습니다.

sys.modules
파이썬이 모듈이나 package를 찾기위해 가장 먼저 확인하는 곳입니다.
sys.modules는 단순한 dictionary 입니다. 그리고 이미 import된 모듈과 package들을 저장하고 있습니다.
즉, 한번 import된 모듈과 package들은 파이썬이 또 다시 찾지 않아도 되도록 하는 기능을 가지고 있습니다.
그러므로 새로 import 하는 모듈은 sys.modules 에서 찾을 수 없습니다.
built-in modules
파이썬에서 제공하는 파이썬 공식 라이브러리들 입니다.
Built-in 모듈들은 이미 파이썬에 포함되어 나오므로 파이썬이 쉽게 찾을 수 있습니다.
sys.path
마지막으로 보는 장소가 바로 sys.path 입니다.
sys.path는 기본적으로 list이며 string 요소들을 가지고 있는 list 입니다.
각 string 요소들은 다음 처럼 경로를 나타냅니다
정리를 하자면, 파이썬은 import 하고자 하는 모듈과 package를 찾을때에 먼저 sys.modules를 보고, 없으면 파이썬 built-in 모듈들을 확인 하고 마지막으로 sys.path에 지정되어 있는 경로들을 확인해서 찾습니다.

sys.path 에서도 못찾으면 ModuleNotFoundError 에러를 리턴합니다.

Absolute path는 이름 그대로 절대 경로 입니다. 왜 절대 경로인가 하니, import를 하는 파일이나 경로에 상관없이 항상 경로가 동일하기 때문입니다.
Relative path 는 absolute path와 다르게 프로젝트의 최상단 디렉토리를 기준으로 경로를 잡는게 아니라 import 하는 위치를 기준으로 경로를 정의합니다. 그래서 일반적으로 relative path는 local package 안에서 다른 local package를 import 할때 사용됩니다.

profile
미래 개발자

0개의 댓글