B. 모듈에 포함된 함수 중에서 특정 함수만 골라서 가져오는 방법 ex. from 모듈 import 함수 from 모듈 import 함수1, 함수2 from 모듈 import *
from converter import kilometer_to_miles # 모듈은 가져오지 않고 특정 함수만 가져옴
miles = kilometer_to_miles(150) # 모듈명을 명시하지 않고 사용
print(f'150km={miles}miles') # 150km=93.20565miles
print()
from converter import * # 모듈은 가져오지 않고 모듈의 모든 함수 가져옴
miles = kilometer_to_miles(150) # 모듈명을 명시하지 않고 사용
print(f'150km={miles}miles')
pounds = gram_to_pounds(1000)
print(f'1000g={pounds}pounds') # 모듈명을 명시하지 않고 사용
2) 별명 사용
👾 모듈이나 함수를 import 하는 경우에 원래 이름 대신 별명 alias를 지정하고 사용 👾 모듈이나 함수의 이름이 긴 경우에 주로 짧은 별명을 지정하고 긴 본래 이름 대신 사용 👾 별명을 지정할 때는 as 키워드를 사용
import converter as cvt # converter 모듈에 cvt라는 별명을 지정
miles = cvt.kilometer_to_miles(150) # 별명을 이용해서 함수 사용
print(f'150km={miles}miles')
pounds = cvt.gram_to_pounds(1000)
print(f'1000g={pounds}pounds')
print()
from converter import kilometer_to_miles as k_to_m # 함수에도 별명을 지정 가능
miles = k_to_m(150) # 함수 이름 대신 별명을 사용
print(f'150km={miles}miles')
2. math 모듈
📁 말 그대로 수학과 관련된 기능을 가지고 있다
변수 또는 함수
설명
원주율 pi
더 정확한 파이 값을 사용하기 위해
ceil() & floor()
전달된 값을 정수로 올림 처리하거나 내림 처리
trunc()
전달된 값을 정수로 절사, 양수를 처리할 때는 차이가 없지만 음수를 처리할 때는 결과의 차이가 있다
sqrt()
제곱근 구함
pow()
제곱을 구함
import math # import 후 사용
# 1) 원주율 pi
print(math.pi) # 3.141592653589793
# 2) ceil() 함수와 floor() 함수
print(math.ceil(1.1)) # 2 / 정수로 올림 처리
print(math.floor(1.9)) # 1 / 정수로 내림 처리
# 3) trunc() 함수
print(math.trunc(-1.9)) # -1 / 절사이므로 소수점 이하를 잘라버림
print(math.floor(-1.9)) # -2 / 내림이므로 -1.9 보다 작은 정수로 내림
# 4) sqrt() 함수
print(math.sqrt(25)) # 5.0 / 루트 25를 의미
3. random 모듈
📁 난수 random number 를 생성하는 모듈 📁 난수를 통해서 간단한 게임을 제작할 수 있고 확률 처리도 할 수 있다
변수 또는 함수
설명
randint()
전달하는 두 인수 사이의 정수를 임의로 생성
randrange()
range() 함수는 특정범위의 정숫값들을 모두 생성할 수 있지만, randrange() 함수는 그 특정 범위에 속한 정수중 하나만 임의로 생성
random()
0이상 1미만 범위에서 임의의 실수를 생성 0이상 1미만 범위를 백분율로 환산하면 0%이상 100%미만이기 때문에 확률을 처리할 때도 사용
choice(list)
전달된 시퀀스 자료형에 속한 요소 중에서 하나를 임의로 반환
sample(list, k=<숫자>)
전달된 시퀀스 자료형에 속한 요소 중 지정된 개수의 요소를 임의로 반환 반환 결과는 리스트 list 자료형이며 중복없이 임의의 요소가 선택
shuffle(list)
전달된 시퀀스 자료형에 속한 요소의 순서를 임의로 조정하여 다시 재배치하는 함수 호출하면 실제 전달된 시퀀스 자료형의 순서가 재배치
import random
# 1) randint() 함수
print(random.randint(1,10)) # 1이상 10이하의 정수
# 2) randrange() 함수
print(random.randrange(10)) # 0이상 10미만의 정수
print(random.randrange(1,10)) # 1이상 10미만의 정수
print(random.randrange(1,10,2)) # 1이상 10미만의 홀수
# 3) random() 함수
print(random.random()) # 0.1859815803780659
# 50% 확률로 '안녕하세요' 출력
if random.random() < 0.5:
print('안녕하세요')
rand = random.randint(1,2)
print(rand)
if rand == 1:
print('안녕하세요')
# 4) choice() 함수
seasons = ['spring', 'summer', 'fall', 'winter']
print(random.choice(seasons)) # fall
idx = random.randint(0, len(seasons) - 1)
print(seasons[idx])
# 5) sample() 함수
print(random.sample(range(1, 46), 6)) # [36, 4, 14, 35, 12, 16]
seasons = ['spring', 'summer', 'fall', 'winter']
print(random.sample(seasons, 3))
seasons = ['summer', 'summer', 'summer', 'winter']
print(random.sample(seasons, 3))
# 6) shuffle() 함수
my_list = [1, 2, 3, 4, 5]
random.shuffle(my_list)
print(my_list) # [4, 2, 3, 1, 5]
4. sys 모듈
📁 시스템과 관련된 정보를 가지고 있는 모듈
📁 명령 매개변수를 받을 때 많이 사용
import sys
# 명령 매개변수 출력
print(sys.argv) # ['/Users/Desktop/pycharm/pythonProject/book/1.py']
print("----")
# 컴퓨터 환경과 관련된 정보 출력
print("copyright:", sys.copyright)
print("----")
print("version:", sys.version)
'''
copyright: Copyright (c) 2001-2023 Python Software Foundation.
All Rights Reserved.
... 생략 ...
----
version: 3.10.13 (main, Sep 11 2023, 08:16:02) [Clang 14.0.6 ]
'''
# 프로그램 강제 종료
sys.exit()
5. os 모듈
📁 운영체제와 관련된 기능을 가진 모듈
import os
# 기본 정보 출력
print("현재 운영체제:", os.name)
print("현재 폴더:", os.getcwd())
print("현재 폴더 내부의 요소:", os.listdir())
'''
현재 운영체제: posix
현재 폴더: /Users/Desktop/pycharm/pythonProject/book
현재 폴더 내부의 요소: ['1.py']
'''
# 폴더 만들고 제거(폴더가 비어있을 때만 가능)
os.mkdir("hello")
os.rmdir("hello")
# 파일 생성하고 파일 이름 변경
with open("original.txt", "w") as file:
file.write("hello")
os.rename("original.txt", "new.txt")
# 파일 제거
os.remove("new.txt")
# 시스템 명령어 실행
os.system("dir")
1970년 1월 1일 0시 0분 0초 부터 현재까지 경과된 시간 timestamp을 반환 소수점 이하는 마이크로 초를 의미
ctime()
인수로 전달된 시간 timestamp을 형식에 갖춰 반환
strftime()
인수로 전달된 날짜와 지시자를 이용하여 형식을 갖춘 날짜 데이터가 문자열로 반환
sleep()
인수로 전달된 초 second 만큼 시스템을 일시 정지
import time
# 1) time() 함수
print(time.time()) # 1645240996.2733545
# 2) ctime() 함수
print(time.ctime(time.time())) # Sat Feb 19 12:23:16 2022
# 3) strftime() 함수
# 년 : %y : 2자리 날짜로 표시
# 년 : %Y : 4자리 날짜로 표시
# 월 : %m : 2자리 숫자로 표시 (01 ~ 12)
# 월 : %b : 3자리 영문으로 표시 (Jan ~ Dec)
# 월 : %B : 전체 영문으로 표시 (January ~ December)
# 일 : %d : 2자리 숫자로 표시 (01 ~ 31)
# 요일 : %a : 3자리 영문으로 표시 (Sun ~ Sat)
# 요일 : %A : 전체 영문으로 표시 (Sunday ~ Saturdy)
# 시 : %l : 12시간제로 표시 (01 ~ 12)
# 시 : %H : 24시간제로 표시 (00 ~ 23)
# 분 : %M : 2시간제로 표시 (00 ~ 59)
# 초 : %S : 2시간제로 표시 (00 ~ 59)
# 오전 / 오후 : %p : AM 또는 PM
print(time.strftime('%Y-%m-%d %H:%M:%S'))
# 4) sleep() 함수
time.sleep(1)
8. urllib 모듈
📁 URL을 다루는 라이브러리
📁 URL : Uniform Rssource Locator, 네트워크의 자원이 어디에 위치하는지 확인할 때 사용하는 것
📁 리스트와 마찬가지로 각 요소를 구분하기 위한 인덱스가 부여되고 슬라이싱도 지원 📁 튜플은 소괄호() 나 tuple() 함수를 이용해서 생성 📁 값들을 콤마(,)로 분리하여 전달하면 자동으로 튜플이 생성
t1 = (1,2,3)
print(t1) # (1,2,3)
# 괄호 없이 사용 가능
t2 = 1,2,3
print(t2) #(1,2,3)
def sample():
return (1,2)
print(sample()) #(1, 2)
# 값이 2개 반환된 것이 아니라 튜플을 자동으로 적용해서 반환함
# 리스트를 튜플로 변경
t3 = tuple([100, 3.14, 'hello'])
print(t3) # (100, 3.14, 'hello')
# 값을 1개만 보관하는 튜플을 생성할 경우에는 값과 콤마(,)를 반드시 함께 작성
t4 = (100)
print(t4) # 100 / 값으로 인식
print(type(t4)) # <class 'int'>
t5 = (100, )
print(t5) # (100, ) / 튜플로 인식
print(type(t5)) # <class 'tuple'>
# 값을 swap 교환
a = 10
b = 20
print(a, b) # 10 20
a, b = b, a # (a, b) = (b, a)
print(a, b) # 20 10
a, b = 100, '홍길동'
print(a) # 100
print(b) # 홍길동
2. 람다 lambda
📁 함수를 짧게 쓸 수 있는 파이썬의 문법
1) 콜백 함수 callback function
⚡️ 함수의 매개변수에 사용하는 함수
# 매개변수로 받은 함수를 10번 호출하는 함수
def call_10_times(func):
for i in range(10):
func()
# 간단한 출력하는 함수
def print_hello():
print("안녕하세요")
# 조합하기
call_10_times(print_hello)
# -> print_hello() 함수를 10번 실행
2) filter() 함수와 map() 함수
⚡️ 함수를 매개변수로 사용하는 대표적인 표준함수
⚡️ map() 함수는 리스트의 요소를 함수에 넣고 리턴된 값으로 새로운 리스트를 구성
⚡️ filter() 함수는 리스트의 요소를 함수에 넣고 리턴된 값이 True인 것으로, 새로운 리스트를 구성
list_input_a = [1, 2, 3, 4, 5]
# map() 함수
output_a = map(lambda x: x * x, list_input_a)
print(output_a) # <map object at 0x102d12860>
print(list(output_a)) # [1, 4, 9, 16, 25]
# filter() 함수
output_b = filter(lambda x: x < 3, list_input_a)
print(output_b) # <filter object at 0x102d61810>
print(list(output_b)) # [1, 2]
3. 제너레이터 generator
📁 이터레이터를 직접 만들 때 사용하는 코드
📁 함수 내부에 yield 키워드를 사용하면 해당 함수는 제너레이터 함수가 된다.
📁 일반 함수와 달리 함수를 호출해도 함수 내부의 코드가 실행되지 않는다.
def test():
print("함수가 호출되었습니다")
yield "test"
print("A 지점 통과") # A 지점 통과
test()
print("B 지점 통과") # B 지점 통과
test()
print(test()) # <generator object test at 0x104ceda10>
📌 위 예제에서 test()함수는 출력되지 않고, 제너레이터를 리턴한다.
📌 제너레이터 객체는 next() 함수를 사용해 함수 내부 코드를 실행한다.
➡️ 이때 yield 키워드 부분까지만 실행하며, next() 함수의 리턴값으로 yield 키워드 뒤에 입력한 값이 출력된다
- 함수 내부에서 함수 외부에 있는 변수라는 것을 설명하려면 다음과 같은 구문을 사용해야 UnboundLocalError가 발생하지 않는다.
global 변수 이름
3. 메모화
👩🏻💻 한 번 계산한 값을 저장해 놓은 후, 이후에 다시 계산하지 않고 저장된 값을 활용하는 기술
# 메모 변수 생성
dic = {
1: 1,
2: 1
}
def fibonacci(n):
if n in dic:
# 메모가 되어 있으면 메모된 값을 리턴
return dic[n]
else:
# 메모가 되어 있지 않으면 값을 구함
output = fibonacci(n-1) + fibonacci(n-2)
dic[n] = output
return output
# 함수 호출
print("fibonnaci(10):", fibonacci(10))
print("fibonnaci(20):", fibonacci(20))
print("fibonnaci(30):", fibonacci(30))
print("fibonnaci(40):", fibonacci(40))
👾 딕셔너리를 사용해서 한 번 계산한 값을 저장, 이를 메모한다고 표현
👾 딕셔너리에 값이 메모되어 있으면 처리를 수행하지 않고 곧바로 메모된 값을 돌려주면서 코드 속도를 빠르게 만든다.
4. 리스트 평탄화
👩🏻💻 중첩된 리스트가 있을 때 중첩을 모두 제거하고 풀어서 1차원 리스트로 만드는 것을 의미
def flatten(data):
output = []
for item in data:
if type(item) == list:
output += flatten(item)
else:
output.append(item)
return output
example = [[1,2,3], [4,[5,6]], 7, [8, 9]]
print(flatten(example))
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
⚡️ append() 함수는 매개변수 하나를 리스트의 마지막 요소로 추가
➡️ append(리스트_자료형) 형태로 리스트를 전달하면 리스트 전체가 하나의 요소로서 추가됨
🚀 함수 용어 정리 a. 인수 : 함수에 전달할 입력(input)을 의미. argument b. 매개변수 : 인수를 받아서 저장하는 변수를 의미. parameter c. 반환값 : 함수의 출력(output)을 의미. return d. 함수 호출 : 만들어진 함수를 실제로 사용하는 것을 의미
1) 인수: x, 반환값: x 함수이름() 2) 인수: o, 반환값: x 함수이름(인수) 3) 인수: x, 반환값: o 변수 = 함수이름() 4) 인수: o, 반환값: o 변수 = 함수이름(인수)
# welcome() 함수 정의
def welcome():
print('Hello Python')
print('Nice to meet you')
welcome() # 함수가 정의된 후에 호출을 해야 함
# Hello Python
# Nice to meet you
# 파이썬 함수의 단점 : 데이터 타입이 없어서 다른 작업자가 만든 함수를 사용할 때 주의할 점이 많다.
def process(number):
return number / 1
process("hello") # TypeError: unsupported operand type(s) for /: 'str' and 'int'
# 어노테이션 사용 가능. 타입 강제는 아님
def process(number: int) -> float:
return number / 1
# 파이썬의 함수는 객체이고 자료형이다.
def charge(energy):
if energy < 0:
print('0보다 작은 에너지를 충전할 수 없습니다.')
return
print('에너지가 충전되었습니다.')
print(charge)
# <function charge at 0x10360dcf0>
def print_charge(fun):
fun(0) # 에너지가 충전되었습니다.
print_charge(charge) # 함수를 함수 호출시 인수로 사용이 가능.
# 함수안에 함수 선언도 가능하다.
def print_greet(name):
def get_greet():
return '안녕하세요'
print(name + "님 " + get_greet())
print_greet('김철수')
2. 인수와 매개변수
1) 인수가 있는 함수
def introduce(name: str, age: int) -> None:
print(f'내 이름은 {name}이고, 나이는 {age}살 입니다.')
introduce('james', 25) # 내 이름은 james이고, 나이는 25살 입니다.
introduce(age=25, name='james') # 내 이름은 james이고, 나이는 25살 입니다.
2) 가변 매개변수
🚀 함수로 전달해야 하는 인수의 개수가 정해지지 않아도 매개변수를 선언할 수 있음 🚀 가변 매개변수를 만드는 키워드는 애스터리스크(*) 🚀 매개변수 앞에 *를 붙이면 곧바로 가변 매개 변수가 되면서 전달되는 모든 인수를 하나의 튜플(tuple)로 만들어 줌
def show(*args):
for item in args:
print(item)
show('python') # show 함수 호출. 인수가 1개
show('happy', 'birthday') # show 함수 호출. 인수가 2개
def print_n(n, *values):
for i in range(n):
for value in values:
print(value)
print()
print_n(3, "안녕하세요", "파이썬 프로그래밍")
'''
안녕하세요
파이썬 프로그래밍
안녕하세요
파이썬 프로그래밍
안녕하세요
파이썬 프로그래밍
'''
👾 가변 매개변수 뒤에 일반 매개변수 올 수 x
👾 가변 매개변수는 하나만 사용 가능
3) 기본 매개변수
print(value, sep=' ', end='\n', file=sys.stdout)
🚀 가장 앞에 있는 value가 '가변 매개변수', 뒤에 '매개변수 = 값' 형태로 되어 있는 것이 '기본 매개변수'
🚀 매개변수를 입력하지 않았을 경우 매개변수에 들어가는 기본값을 말한다
🚀 기본 매개변수 뒤에 일반 매개변수가 올 수 없다
⚡️ end : value 출력 후 출력할 문자 ▶️ end 속성을 사용하지 않고 print() 함수를 사용하면 출력 후 자동으로 줄 바꿈이 진행 ⚡️ sep : 출력할 value의 구분자 ▶️ sep 속성을 사용하지 않고 print() 함수를 사용하면 출력 대상은 공백으로 구분 ⚡️ file : 출력 방향 지정 ▶️ file 속성을 사용하지 않고 print() 함수를 사용하면 출력 대상은 모니터에 출력
print('재미있는','파이썬') # sep 값을 지정하지 않으면 공백이 들어감.
print('재미있는', '파이썬', sep=' ') # 재미있는 파이썬 / 콤마(,)로 구분된 출력 대상은 공백으로 구분
print('Python','Java', 'C', sep=':') #Python:Java:C / sep 속성으로 구분
'''
재미있는 파이썬
재미있는 파이썬
Python:Java:C
'''
print('영화 타이타닉', end='\n') # 지정하지 않았을 때 기본값은 \n
print('평점', end=':')
print('5점') # 평점:5점 / value 출력 후 end 속성 출력. 줄 바꿈이 되지 않음
'''
영화 타이타닉
평점:5점
'''
fos = open('../02_21/sample.py', mode='wt')
print('print("Hello World")', file = fos) # file 속성으로 대상 출력. 파일 출력
fos.close()
4) 키워드 매개변수
A. 기본 매개변수가 가변 매개변수보다 앞에 오는 경우
- 기본 매개변수의 의미가 사라진다.
def print_n(n=2, *values):
for i in range(2):
for value in values:
print(value)
print_n('안녕하세요','즐거운','파이썬 프로그래밍')
# TypeError 발생
📌 n에는 안녕하세요가 들어가고, values에 즐거운, 파이썬 프로그래밍이 들어간다
📌 range() 함수의 매개변수에는 숫자만 가능하기 때문에 에러가 발생
∴ 기본 매개변수는 가변 매개변수 앞에 써도 의미가 없다.
B. 가변 매개변수가 기본 매개변수보다 앞에 오는 경우
def print_n(*values, n=2):
for i in range(2):
for value in values:
print(value)
print_n('안녕하세요','즐거운','파이썬 프로그래밍', 3)
📌 가변 매개변수가 우선이 되기 때문에 왼쪽과 같은 결과가 나온다.
C. 키워드 매개변수
- 매개변수 이름을 지정해서 입력하는 매개변수를 키워드 매개변수라고 한다
def print_n(*values, n=2):
for i in range(2):
for value in values:
print(value)
print_n('안녕하세요','즐거운','파이썬 프로그래밍', n=3)
# n=3은 키워드 매개변수
5) 디폴트 매개변수
🚀 매개변수로 전달되는 인수가 없는 경우에 기본적으로 사용할 수 있도록 매개변수에 기본값을 설정할 수 있음
def greet(message='안녕하세요'):
print(message)
greet('반갑습니다') # 반갑습니다
greet() # 안녕하세요
# -> 자바에서는 오버로딩이라 생각함. 파이썬에는 오버로딩 지원 x.
# 디폴트 매개변수와 일반 매개변수를 같이 사용하는 경우 디폴트 매개변수를 뒤(오른쪽)으로 배치
def greet(name, message= '안녕하세요'):
print(f'{name}님 {message}')
greet('김철수') # 김철수님 안녕하세요.
greet('김철수', '반갑습니다') # 김철수님 반갑습니다
# 복수의 디폴트 매개변수를 사용하는 경우
def greet(name='이철수', message='안녕하세요'):
print(f'{name}님 {message}.')
greet() # 이철수님 안녕하세요.
greet('김철수') # 김철수님 안녕하세요. / 왼쪽 부터 적용.
greet('김철수', '반갑습니다') # 김철수님 반갑습니다.
3. 리턴
🚀 함수 호출 결과를 반환값(return value)이라 한다. 🚀 반환값이 있으면 함수 내부에서 return문을 통해 값을 반환할 수 있고, 반환값이 없으면 함수 내부에 return문을 작성할 필요가 없음
def calculator(*args):
return sum(args), sum(args) / len(args), max(args), min(args)
a, b, c, d = calculator(1, 2, 3, 4, 5) # 4개의 반환값을 모두 저장하기 위해서 변수 4개 배치
print('합계', a) # 합계 15
print('평균', b) # 평균 3.0
print('최댓값', c) # 최댓값 5
print('최솟값', d) # 최솟값 1
# result는 4개의 반환값을 저장하는 튜플.
result = calculator(1, 2, 3, 4, 5)
print('합계', result[0]) # 합계 15
print('평균', result[1]) # 평균 3.0
print('최댓값', result[2]) # 최댓값 5
print('최솟값', result[3]) # 최솟값 1
2) 함수의 종료를 위한 return
- 반환값이 있으면 return문을 사용해 반환하고, 반환값이 없으면 return문을 생략하면 됨
def charge(energy):
if energy < 0:
print('0보다 작은 에너지를 충전할 수 없습니다.')
return # charge() 함수의 종료를 의미.
print('에너지가 충전되었습니다.')
charge(1) # 에너지가 충전되었습니다.
charge(-1) # 0보다 작은 에너지를 충전할 수 없습니다.