본문 바로가기
SSAFY

[수업기록] 모듈과 제어문의 모든 것

by 주니코니 2024. 7. 18.

240718 파이썬반 

 

1. 모듈이란

 

1) 정의

한 파일로 묶인 변수와 함수의 묶음

즉, 특정한 기능들이 모여있는 파일

 

2) 모듈 예시

- math 내장 모듈 : 파이썬이 미리 작성해둔 수학 관련 변수와 함수가 작성된 모듈

 

 

3) 모듈 가져오는 방법

- import 문

import math

print(math.sqrt(4)) # 제곱근 함수 # 2.0

 

- from 절

from math import sqrt

print(sqrt(4))

 

- 그럼 둘중 어느 코드가 보기에 좋을까?

- import 문이 좋다 

 

 

4) dot(.) 연산자

점의 왼쪽 객체에서 점의 오른쪽 이름을 찾아라~라는 의미이다.

ex. print(math.pi)

 

5) 만일 서로 다른 모듈이 같은 이름의 함수를 제공할 경우

문제발생~ 마지막 import만 살아난다

이럴 때는 'as' 키워드를 넣어 별칭을 정하기

 

 

6) 사용자 정의 모듈

.py 형태

 

7) 모듈 내부 살펴보기

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

ex. help(math) 실행해보기 


 

2. 파이썬 표준 라이브러리

1)정의 : 파이썬 언어와 함께 제공되는 다양한 모듈과 패키지의 모음

 

 

3. 패키지란 ? 

1) 정의 :  연관된 모듈들을 하나의 디렉토리에 모아 놓은 것 

- 정리 : 패키지(여러 .py가 담김) < 모듈 < 라이브러리 

 

2) 패키지 종류

- PSL 내부 패키지 : 설치없이 바로 import하여 사용

-외부 패키지 : pip을 사용하여 설치 후 import  필요

*pip : 설치된 외부 패키지들 관리 시스템

*pip : 인터넷 연결 필수(웹에 있는 외부 패키지 다운이니까)

 

3) 패키지 설치 

- 최신버전/특정버전/최소버전 명시 가능

$ pip install SomePackage

$ pip install SomePackage == 1.0.5

$ pip install SomePackage>= 1.0.4

 

4) 가장 중요한 패키지는?

$ pip install requests #외부 api 요청 패키지

 

5) 패키지 사용 목적 

- 묘듈듈의 이름공간을 구분하여 충돌을 방지

- 모듈들을 효율적으로 관리하고 재사용되도록 


4. 제어문

 

1) 정의 : 

코드의 실행을 제어(control)함

 

2) 종류 : 

- 조건문, 반복문, 반복문 제어

 

3) 조건문

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

- 예시 코드 

a = 5

if a > 3:
	print('3 초과') # 3 초과

else : 
	print('3 이하')

print(a)

 

- 중첩 조건문

#간결하게 한줄 코드 

# 삼항 연산자 조건문
# 변수 = 참값 if 조건식 else 거짓인 경우 값

# 1) 숫자의 짝수 , 홀수 판별해서 타입을 얻음
num = 5
num_type = "짝수" if num % 2 == 0 else "홀수"
#if else까지만 가능

#동일코드(파이썬만의 특징)
if num % 2 ==0:
    num_type = "짝수"
else:
    num_type = "홀수"

 

4) 반복문

- for : 특정 작업 반복 수행, 

- while : 주어진 조건이 참인 동안 반복해서 수행

* 반복가능한 객체란(iterable) ? 반복문에서 순회할 수 있는 객체(시퀀스 객체 + dict ,set도 포함)

*시퀀스 객체 예시 : 문자열

 

- for문 예시

my_dict = {
    'x': 10,
    'y': 20,
    'z': 30,
}

for key in my_dict:
    print(key) #key
    print(my_dict[key]) #value
    
    
    
#출력
x
10
y
20
z
30

 

numbers = [4, 6, 10, -8, 5]
for i in range(len(numbers)): #인덱스 가져오기
    numbers[i] = numbers[i] * 3
print(numbers) #요소 3배 #

 

모든 for문은 while문으로 표현 가능하다(반대도 가능), 그 관계를 예제로 살펴보자

for문과 while의 리스트 순회

fruits = ['사과', '포도', '귤']
#1) for문을 통한 순회
for fruit in fruits :
    print(fruit)

#2) while문을 통한 순회
i=0
while i < len(fruits) :
    print(fruits[i])
    i+=1

 

- while문 : 

반드시 종료 조건이 필요하다(주어진 조건이 거짓이 될 때까지 반복한다)

사용자의 입력을 받아서 특정 조건이 충족될 때까지 반복하는 경우에 많이 씀

 

 

- 반복 제어 : 

for문과 while문은 매 반복마다 본문 내 모든 코드를 실행하기에 때때로 일부만 실행하도록 하는 게 필요함

->  break ,continue, pass

 

아 헷갈리넹 ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔

# break
for i in range(10):
    if i == 5:
        break
    print(i)
    
# break
for i in range(10):
    if i == 5:
        break
print(i)

 

# continue
for i in range(10):
    if i % 2 ==0:
        continue #짝수 #넘어감 #아래 실행안하고 다음 loop 으로
    print(i)
    

# pass
for i in range(10):
    pass # 패스하게끔 쓰는 것
def my_func(a):
    pass # 아무런 기능은 없음

 

*플래그 변수란?

# break 예시 2 - "리스트에서 첫번째 짝수만 찾은 후 반복 종료하기"
numbers = [1, 3, 5, 6, 7, 9, 10, 11]
found_even = False
for num in numbers:
    if num % 2 ==0:
        print(f'첫번째 짝수 {num}을 찾았습니다')
        found_even =True
        break
if found_even == False:
    print('짝수 아닙니다')
    
    

# continue 예시 - "리스트에서 홀수만 출력하기"
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
found_even = False #flag varibale 플래그 : 깃발을 꽂아놓다 (기준점이 되는 변수)

 

 

4. List Comprehension

 

1) 정의 : 간결하게 리스트를 생성하는 방법 -> 남용은 하지말자 -> 이유는? 아래 참고! 


아 헷갈리넹 ✔        

 

# List Comprehension 활용 예시 - "2차원 배열 생성 시 (인접행렬 생성 시)"
data1 = [[0] * (5) for _ in range(5)]
print(data1)

#출력 
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

# 또는 
data2 = [[0 for _ in range(5)] for _ in range(5)]
print(data2)

#출력 결과 같음

#_ 언더바 : 변수를 쓸일없을 때 반복횟수만 중요할 때



#어떤 코드가 가독성이 좋은가?
#모든 문제를 comprehension으로 바꾸려하지말자 
#comprehension의 목적은 리스트 생성
result = []
for i in range(10):
    if 1 % 2 == 1:
        result.append(i)
#위 코드를 list comprehension으로 바꿔보면?
#내 도전 # 틀림
[if i % 2 == 1 for i in range(10)]
# 답 (순서 잘보기)
[i for i in range(10) if i % 2 ==1]
[expression for 변수 in iterable if 조건식]

특정 조건 하에 특정 값을 넣다
#리스트 comprehension
nums = list(range(10))
nums = ['짝수' if n% 2 ==0 else "홀수" for n in nums]
print(nums)
#['짝수', '홀수', '짝수', '홀수', '짝수', '홀수', '짝수', '홀수', '짝수', '홀수']

nums =[]
for n in nums : 
    if num % 2 == 0:
        nums.append('짝수')

    else:
        nums.append('홀수')



## 앞 if믄 값자체 , 뒤 if는 필터(갯수를 바꿀 수 있음) 
nums = list(range(10))
nums = ['짝수' if n% 2 ==0 else "홀수" for n in nums if n >= 5]
print(nums)

nums2 =[]
for n in nums : 
    if n>=5 :
            
        if num % 2 == 0:
            nums2.append('짝수')

        else:
            nums2.append('홀수')
# 리스트를 생성하는 방법 비교(3가지)
# 다 결과가 같다


# 1. loop
result1 = []
for i in range(10):
    result1.append(i)

# 2. list comprehension
result2 = [i for i in range(10)]
# result2 = list(i for i in range(10))

# 3. map ✔✔✔✔✔✔✔✔✔✔✔✔✔✔✔✔✔✔
result3 = list(map(lambda i: i, range(10))) #이거어케해석함

print(result1)
print(result2)
print(result3)


"""
성능 비교

1. list comprehension
    - 대부분의 경우 가장 빠르고 파이썬스러운(Pythonic) 방법
    - 파이썬스러운이란? [] -> 리스트라 부름. 다른 언어는 배열(array)이라 부름
2. map
    - 특정 상황(예: 기존 함수를 사용할 때)에서 리스트 컴프리헨션과 비슷하거나 약간 더 빠를 수 있음
    - 즉 케바케, 천차만별
3. loop
    - 일반적으로 가장 느리다고 알려져 있지만,
      python 버전이 올라가면서 다른 방식과 비슷하거나 때로는 더 나은 결과를 보이기도 함✔✔✔✔✔
    - 복잡한 로직이 필요한 경우에는 여전히 유용하게 사용될 수 있음(직관적 코드 작성 가능)✔✔✔✔✔
	- 코드가 길어진다고 해서 나쁜 코드가 아님. 명시적 코드가 더 좋은 코드
    
결론
- 성능 차이는 대부분의 경우 미미하므로, 코드의 가독성,유지보수성 고려할 것!
"""

- 모든 map 함수, list comprehension으로 표현 가능

- 둘의 공통점은 새로운 리스트 생성에 필요하다


5. enumerate 내장함수

 

1) enumerate란

enumerate(iterable , start = 0)

start =0 은 기본 인자   ✔ ✔  ✔ ✔  ✔ ✔  ✔ ✔  ✔ ✔

즉 반복돌면서 idx값 같이 필요할 때 씀

 

 
fruits = ['apple', 'banana', 'grape']

# for idx, fruit in enumerate(fruits): # 기본값 0이 들어간것
#     print(f'인덱스{idx}:{fruit}')
#인덱스0:apple
#인덱스1:banana
#인덱스2:grape
   
   
for idx, fruit in enumerate(fruits,1): # 인덱스 1부터 출력x # 인덱스 변경(+1로 대체)
    print(f'인덱스{idx}:{fruit}'