TIl

모듈, 제어문

아크몽 2024. 1. 18. 23:45

모듈

생산성을 위해서 타인의 코드를 사용하는 것

  • 파일로 묶인 변수와 함수의 모음
  • 특정한 기능을 하는 코드가 작성된 파이썬 파일(.py)

파이썬의 math 모듈 : 파이썬이 미리 작성 해 둔 수학과 관련된 모듈

가져오기

내장함수 help 를 통해 모듈에 무엇이 들어있는지 확인 가능

help(math) 을 통해 모듈에 무엇이 들어있는지 확인 가능

사용하기

.(dot) : 모듈.모듈 내장 함수 ex) math.pi math.sqrt(4)

sqrt() 하면 float 값으로 나온다

모듈을 import하는 다른 방법

from 절을 활용해 특정 모듈을 미리 참조하고 어떤 요소를 import할지 명시

from math import pi, sqrt 
print(pi)
print(sqrt(4))

from pprint impoert pprint as print 에서 as는 별명이다. pprint를 print로 쓰는것

어떤 방법이 좋을 까?

  • 명시적인 관점에서는 import을 쓰는것이 권장 됨
  • 명시성이 가독성 보다 중요하다
  • 실수로 모듈의 함수와 같은 이름을 써버릴 경우 덮어쓰기가 발생해버린다.

주의 사항

만약 서로 다른 모듈이 같은 이름의 함수를 제공할 경우 문제 발생

마지막에 import된 이름으로 대체됨

그래서 모듈 내 모든 요소를 한번에 import 하는 * 표기는 권장하지 않음

= from math import *

from math import pi,sqrt
from my_math import sart
#그래서 모듈 내 모든 요소를 한번에 import 하는 * 표기는 권장하지 않음
from math import *

사용자 정의 모듈

직접 정의한 모듈 사용하기

  1. 모듈 my_math.py 작성
  2. 두 수의 합을 구하는 add 함수 작성
  3. my_math 모듈 import 후 add 함수 호출

파이썬 표준 라이브러리 ( PSL. Python Standart Library)

파이썬 언어와 함게 제공되는 다양한 모듈과 패키지의 모음

모듈들이 엄청 많아진다 ⇒ import 할게 많다 ⇒ 모듈의 모음을 패키지 ⇒ 패키지도 많아진다 ⇒ 라이브러리

모듈 < 패키지 < 라이브러리

Package패키지

관련된 모듈들을 하나의 디렉토리에 모아 놓은 것

my_package/math/mymath.py
def add(x, y):   return x + y

my_package/statistics/tools.py
def mod(x, y):   return x % y

from my_package.math import my_math
from my_package.statistics import tools 로 접근

PSL 내부 패키지

설치 없이 바로 import 가능

외부 패키지

pip를 사용하여 설치 후 import 필요

pip 파이썬 패키지 관리자

외부 패키지들을 설치하도록 도와주는 파이썬 패키지 관리 시스템

PyPI(Python Package Index)에 저장된 외부 패키지들을 설치 https://pypi.org/

# 이쁘게 보여주는 것
import pprint
pprint.pprint('fda') 

패키지 설치

pip install SomePackage
pip install SomePackage == 1.0.5
pip install SomePackage >=  1.0.4

requests 외부 패키지 설치 및 사용 예시

(터미널) pip install requests 
=> 
(문서) import requests

url = 'https://random-data-api.com/api/v2/users'
response = requests.get(url).json()

print(response)

패키지 사용 목적

모듈들의 이름공간을 구분하여 충돌을 방지

모듈들을 효율적으로 관리하고 재사용할 수 있도록 돕는 역할

Control Statement 제어문

코드의 실행 흐름을 제어하는 데 사용되는 구문

조건에 따라 코드 블록을 실행하거나 반복적으로 코드를 실행

조건 : if

반복 : for

조건문 Conditional Statement

주어진 조건식을 평가하여 해당 조건이 참(True)인 경우에만 코드 블록을 실행하거나 건너뜀

if /elif / else

if 표현식: // 1번째 평가
  코드블록
elif 표현식: // 2번째 평가
  코드 블록
else:    코드 블록

복수조건문 : elif 가 많은 것,

중첩 조건문 : if 안에 if

⇒ if - else 는 무조건 은 아니다

⇒ 조건문을 동시에 검사하는 것이 아니라 순차적으로 비교한다

Loop statement 반복문

주어진 코드 블록을 여러 번 반복해서 실행하는 구문

  1. 특정 작업을 반복적으로 수행 : 제한된 작업량이 존재함
  2. 주어진 조건이 참인 동안 반복해서 실행 : 제한된 작업량이 따로 없음 , 조건이 False가 될 때 까지 실행

for / while

for : 임의의 시퀀스 항목이나 반복 가능한 객체들을 들어있는 순서대로 반복

작업량 = 요소의 개수

for 변수 in 반복 가능한 객체: #반복가능한 객체? 시퀀스 + dict, set 
  코드 블록

반복 가능한 객체

for 문 원리 : iterable 의 길이만큼 반복한다

  • 리스트 내 첫 항목이 반복 변수에 할당되고 코드블록이 실행
  • 다음으로 반복 변수에 리스트의 2번째 항목이 할당되고 코드블록이 다시 실행
  • 마지막으로 반복 변수에 리스트의 마지막 n 번째 요소가 할당되고 코드블록이 실행

문자열 순회

리스트로 변경하지 않아도 가능하다

country = 'Korea'
for char in country:
  print(char)

range 순회

딕셔너리 순회

기본적으로 그냥 반복을 돌리면 만 나온다 ⇒ 나오는 키를 가지고 값을 출력해야 한다

my_dict = {'x':10, 'y':20,'z':30,}
for key in my_ddict:
print(key) # 키 출력
print(my_dict[key]) # 값 출력

인덱스로 리스트 순회

리스트의 요소가 아닌 인덱스로 접근하여 해당 요소들을 변경하기

range()len() 으로 접근한다.

numbers = [4,6,10,-8,5]
for i in range(len(numbers)):
  numbers[i] = numbers[i] * 2

print(numbers)

중첩된 반복문

안쪽 반복문은 outers 리스트의 각 항목에 대해 한 번씩 실행함

print가 호출되는 횟수 ⇒ len(outers) * len(inners)

outers = ['A', 'B']
inners = ['c', 'd']     
for outer in outers:  for inner in inners:     print(outer, inner)

중첩된 리스트 순회

안쪽 리스트 요소에 접근하려면 바깥 리스트를 순회하면서 중첩 반복을 사용에 각 안쪽 반복을 순회

elements = [[’A’’B’],[’c’,’d’]]
# 올바르지 않은 것
for elem in elements:
  print(elem) # ['A','B'] ['c','d']

# 올바른 것
for elem in elements:
  for item in elem:
    print(item) # A B c d

While

주어진 조건 식이 참(True)인 동안 코드를 반복해서 실행

⇒ 조건 식이 거짓(False)가 될 때 까지 반복

⇒ 종료 조건(False가 될 때까지)이 필수다, 무한 루프에 빠질 수 있기 때문

a = 0
while a < 3:
  print(a)
  a += 1
# 0 1 2 

사용자 입력에 따른 반복

  • while 문을 사용한 특정 입력 값에 대한 종료 조건 활용하기

    ex) 양의 정수를 입력할 때까지 입력을 받기

반복문 선택 가이드

  • 반복 횟수가 명확히 정해져 있다 ⇒ for문
  • list, tuple, str 등과 같은 시퀀스 형식 ⇒ for문
  • 사용자의 입력을 받아서 특정 조건을 충족한다 ⇒ while
  • 조건에 따라 반복 종료해야 할 때 ⇒ while

반복 제어

for문과 while은 매 반복마다 본문 내 모든 코드를 실행하지만 때때로 일부만 실행하는 것이 필요할 때가 있음

  • break : 반복을 즉시 중시, 나머지는 반복 하지 않음
  • continue 다음 반복으로 건너 뜀, continue 하단의 코드는 실행하지 않고 그냥 다음 루프로 이동함
for num in numbers:
  if nm % 2 ==0:
    continue
  print(number)
  # continue가 if문 안에서 나와도 for문에 적용 시킨다.

break와 continue 주의 사항

  • 남용하는 것은 코드의 가독성을 저하 시킬 수 있음
  • 특정한 종료 조건을 만들어 break를 대신하거나, if문을 사용해 continue처럼 코드를 건너 뛸 수도 있음
  • 약간의 시간이 들더라도 가능한 코드의 가독성을 유지하고 코드의 의도를 명확히 전달하자

List Comprehension 간결하고 효율적인 리스트 생성 방법

[expression for 변수 in iterable] expression 이란? 표현식

list(expression for 변수 in iterable) 대체로 list로 묶어서 보여줌

  • 사용전
numbers = [1, 2, 3, 4, 5]
squared_numbers = []

for num in numbers:   squared_numbers.append(num**2)

print(squared_numbers)  # [1, 4, 9, 16, 25]
  • 사용 후
numbers = [1, 2, 3, 4, 5]
squared_numbers = [num**2 for num in numbers]

print(squared_numbers)  # [1, 4, 9, 16, 25]

List Comprehension과 if 조건문

[expression for 변수 in iterable if 조건식]
list(expression for 변수 in iterable if 조건식)

가독성을 위해서 남용하면 안된다

좋은 코드는 단순한 것이다, 간결한 것이 아니다

참고 사항

pass

아무런 동작도 수행하지 않고 넘어가는 역할

문법적으로 문장이 필요하지만 프로그램 실행에는 영향을 주지 않아야 할 때 사용

  1. 코드 작성 중 미완성 부분 (가장 많은 사용처)

    구현해야 할 부분이 나중에 추가될수도 있고,

    코드가 컴파일하는 동안 오류가 발생하지 않음

  2. 조건문에서 아무런 동작을 수행하지 않아야 할 때

    ex) else 일 때 동작을 수행하기 위해서 넣을 수 있음

  3. 무한 루프에서 조건이 충족되지 않을 때 pass를 사용해서 루프를 계속 진행하는 방법

enumerate(iterable, start=0)

iterable(반복가능한) 객체의 각 요소에 대해 인덱스와 함께 반환하는 내장 함수

fruits = ['apple','banana','cherry']
for index, fruit in enumerate(fruits):
  print(f'인덱스 {index}:{fruit}')
"""
인덱스 0: apple
인덱스 1: banana
인덱스 2: cherry

추가로 배운 것

터미널에서 help()로 모듈의 내용을 살피다가 q로 나갈 수 있음

딕셔너리에서 .get 으로 사용함으로 keyValueError가 아니라 None이 나오도록 할 수 있음

해야 되는 것

반복문 글 정리 ( 설문한다고 놓침)

for 문 안의 if문에서 break가 나왔다 ⇒ if문 안의 break가 for문까지 영향을 주는가?

⇒ 영향을 준다

3일 lv5 문제 풀기 ⇒ 해결함

requests 라이브러리 가이드 보기