[TIL] Python generator / module πŸ“˜

dosilvΒ·2021λ…„ 3μ›” 23일
0
post-thumbnail
post-custom-banner

🎲 λͺ©ν‘œ: 이해가 κ°ˆλ“―λ§λ“―ν•œ μ œλ„ˆλ ˆμ΄ν„°μ™€ λͺ¨λ“ˆμ„ μ œλŒ€λ‘œ 정리해 보μž₯

β–Ά λͺ©μ°¨

πŸ”Ž μ œλ„ˆλ ˆμ΄ν„°(generator)
πŸ”Ž λͺ¨λ“ˆ(module)μ΄λž€?
πŸ”Ž λͺ¨λ“ˆ λ§Œλ“€κ³  뢈러였기
πŸ”Ž 파이썬 ν‘œμ€€ λͺ¨λ“ˆ


πŸ”Ž μ œλ„ˆλ ˆμ΄ν„°(generator)

  • ν•¨μˆ˜ 내뢀에 yield μ½”λ“œκ°€ ν¬ν•¨λœ ν•¨μˆ˜
  • ν˜ΈμΆœμ‹œ λ°”λ‘œ μ‹€ν–‰λ˜μ§€ μ•Šκ³  generatorλ₯Ό 생성함
  • generatorλ₯Ό 좜λ ₯ν•˜κΈ° μœ„ν•΄μ„œλŠ” next(func()) ν˜•νƒœλ‘œ 호좜
  • next(func())은 yieldμœ„κΉŒμ§€μ˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κ³ , 리턴값은 (μžˆλ‹€λ©΄) yield λ’€μ˜ 값이 됨
func():
    print("apple")
    print("orange")
    yield 1000

a = func()	#아무것도 좜λ ₯λ˜μ§€ μ•ŠμŒ
print(a)	#아무것도 좜λ ₯λ˜μ§€ μ•ŠμŒ
next(a)		#apple, orange
print(next(a))	#1000
  • yieldλ₯Ό μ—¬λŸ¬ 번 μ‚½μž…ν•΄μ„œ λ©ˆμΆ”λŠ” ꡬ간을 μ—¬λŸ¬ 개 λ§Œλ“€ 수 있음
  • λκΉŒμ§€ 좜λ ₯ν•˜λ €λ©΄ yield의 갯수 만큼 next() μ‚¬μš© ν•„μš”
func():
    print("happy")
    yield 100
    print("Monday")
    yield 200
    print("today")
    yield 300

 a = func()
 next(a)	#happy
 next(a)	#Monday
 next(a)	#today

일반적인 μ‚¬μš© 방법: λ°˜λ³΅λ¬Έμ„ 톡해 호좜

for i in a:
    pass	#happy, monday, today
for i in a:
    print(i)	#happy, 100, monday, 200, today, 300

ν•œλ§ˆλ””λ‘œ ν•œ λ²ˆμ”©λ§Œ 좜λ ₯ κ°€λŠ₯ν•œ 일회용 ν•¨μˆ˜λΌκ³  ν•  수 있음!

μ™œ μ“°λŠ”κ°€?

  • λ©”λͺ¨λ¦¬λ₯Ό μ ˆμ•½ν•  수 μžˆλ‹€
  • ν•¨μˆ˜ 호좜 μˆœκ°„μ— λ‚΄λΆ€ μ½”λ“œκ°€ μ‹€ν–‰λ˜μ§€ μ•Šκ³ , 반볡문 λ“±μœΌλ‘œ μ΄μš©ν•  λ•Œ μ‹€ν–‰λ˜λ―€λ‘œ μ§€μ—°λ‘œλ“œ(lazy load) 등을 μœ„ν•΄ ν™œμš©

πŸ”Ž λͺ¨λ“ˆμ΄λž€?

  • λ‹€λ₯Έ 파이썬 ν”„λ‘œκ·Έλž¨μ—μ„œ λΆˆλŸ¬μ™€ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•¨μˆ˜, λ³€μˆ˜, 클래슀 등을 λͺ¨μ•„놓은 파일!
  • κΈ΄ μ½”λ“œλ₯Ό λ‹€λ₯Έ νŒŒμΌμ— λ³΅μ‚¬ν•˜λŠ” λŒ€μ‹  λͺ¨λ“ˆλ‘œ λ§Œλ“€κ³  μž„ν¬νŠΈν•˜μ—¬ μ‚¬μš© κ°€λŠ₯
  • λ‹€λ₯Έ μ‚¬λžŒμ΄ λ§Œλ“  λͺ¨λ“ˆμ„ μ‚¬μš©ν•  μˆ˜λ„ 있고, 직접 λͺ¨λ“ˆμ„ λ§Œλ“€ μˆ˜λ„ 있음

πŸ”Ž λͺ¨λ“ˆ λ§Œλ“€κ³  뢈러였기

πŸ“Œ λͺ¨λ“ˆ μƒμ„±ν•˜κΈ°

  • 파일λͺ…은 "λͺ¨λ“ˆμ΄λ¦„.py"
  • 파일 μœ„μΉ˜λŠ” μž„ν¬νŠΈλ₯Ό μˆ˜ν–‰ν•  파일과 같은 디렉터리 or 파이썬 λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μ €μž₯된 디렉터리여야 함!
#pet.py
def dog():
    print("멍멍")

def cat():
    print("μ•Όμ˜Ή")

πŸ“Œ if name == "main":

λ§Œμ•½ λͺ¨λ“ˆ 내에 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” λ“±μ˜ μ½”λ“œκ°€ ν¬ν•¨λœ 경우, λ‹€λ₯Έ νŒŒμΌμ—μ„œ 뢈러올 λ•Œ ν•΄λ‹Ή μ½”λ“œκ°€ μ‹€ν–‰λœλ‹€.
if __name == "main": μ΄λΌλŠ” 쑰건문 μ•„λž˜μ— ν•¨μˆ˜ 호좜 μ½”λ“œλ₯Ό λ„£μœΌλ©΄ μ΄λŸ¬ν•œ ν˜„μƒμ„ 방지할 수 있음!

#pet.py
def dog():
    print("멍멍")

def cat():
    print("μ•Όμ˜Ή")

if __name == "main":	#λ‹€λ₯Έ νŒŒμΌμ—μ„œ μž„ν¬νŠΈμ‹œ 이 뢀뢄은 μ‹€ν–‰λ˜μ§€ μ•ŠμŒ
    dog()
    cat()

πŸ“Œ λͺ¨λ“ˆ λΆˆλŸ¬μ™€μ„œ μ‚¬μš©ν•˜κΈ°

  • import λͺ¨λ“ˆμ΄λ¦„
    • λͺ¨λ“ˆ 전체λ₯Ό λΆˆλŸ¬μ˜€λŠ” 방법
    • ν˜ΈμΆœμ‹œ λͺ¨λ“ˆμ΄λ¦„.ν•¨μˆ˜μ΄λ¦„ ν˜•νƒœλ‘œ μ‚¬μš©ν•΄μ•Ό 함
import pet
pet.dog()	#멍멍
pet.cat()	#μ•Όμ˜Ή
  • from λͺ¨λ“ˆμ΄λ¦„ import ν•¨μˆ˜μ΄λ¦„
    • νŠΉμ • ν•¨μˆ˜(λ“€)만 λΆˆλŸ¬μ˜€λŠ” 방법
    • ν˜ΈμΆœμ‹œ λͺ¨λ“ˆμ΄λ¦„을 뢙이지 μ•Šκ³  직접 μ‚¬μš© κ°€λŠ₯!
from pet import cat
cat()	#μ•Όμ˜Ή
  • from λͺ¨λ“ˆμ΄λ¦„ import *
    • ν•΄λ‹Ή λͺ¨λ“ˆμ˜ λͺ¨λ“  ν•¨μˆ˜λ₯Ό 뢈러였되, 직접 μ‚¬μš© κ°€λŠ₯
    • ν•¨μˆ˜λ‚˜ λ³€μˆ˜μ˜ 이름 좩돌이 λ°œμƒν•  수 있기 λ•Œλ¬Έμ— μ§€μ–‘ν•˜λŠ” 것이 μ’‹λ‹€
from pet import *
dog()	#멍멍
cat()	#μ•Όμ˜Ή
  • import λͺ¨λ“ˆμ΄λ¦„ as p
    • λͺ¨λ“ˆλͺ…이 κΈΈ 경우 λͺ¨λ“ˆλͺ… λŒ€μ‹  λ‹€λ₯Έ 문자λ₯Ό μ‚¬μš©ν•  수 있음
import pet as p
p.dog()	#멍멍

πŸ”Ž 파이썬 ν‘œμ€€ λͺ¨λ“ˆ

πŸ“Œ sys

파이썬 인터프리터와 κ΄€λ ¨λœ 정보 및 κΈ°λŠ₯ 제곡

  • sys.modules

    μž„ν¬νŠΈλœ λͺ¨λ“ˆκ³Ό νŒ¨ν‚€μ§€κ°€ μ €μž₯된 λ”•μ…”λ„ˆλ¦¬
  • sys.path

    νŒŒμ΄μ¬μ— path둜 μž‘ν˜€ μžˆλŠ” 디렉터리가 μ €μž₯된 리슀트
  • sys.argv

    • 파이썬 μŠ€ν¬λ¦½νŠΈμ— μ „λ‹¬λœ λͺ…λ Ήμ–΄ 라인 인자(command line arguments) 리슀트
    • 파이썬이 ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•  λ•Œλ§ˆλ‹€ μ»€λ§¨λ“œ 라인에 주어진 λͺ¨λ“  값을 λ°›μ•„μ„œ sys.argv λ¦¬μŠ€νŠΈμ— λ„£μŒ
    • sys.argv[0]은 항상 슀크립트의 전체 경둜 정보
    • sys.argv[1]λΆ€ν„° μ „λ‹¬λœ μΈμžκ°€ λ„μ–΄μ“°κΈ°λ‘œ κ΅¬λΆ„λ˜μ–΄ μ €μž₯됨

πŸ“Œ os

ν™˜κ²½λ³€μˆ˜, 디렉터리, 파일 λ“± 운영체제 μžμ› μ œμ–΄

  • os.getcwd()

    ν˜„μž¬ 디렉터리
  • os.chdir(경둜)

    디렉터리 μœ„μΉ˜ λ³€κ²½
  • os.mkdir(디렉터리)/rmdir(디렉터리)

    디렉터리 생성/μ‚­μ œ
  • os.system(λͺ…λ Ήμ–΄)

    νŒŒμ΄μ¬μ—μ„œ μ‹œμŠ€ν…œ λͺ…λ Ήμ–΄ μ‚¬μš©

πŸ“Œ math

μˆ˜ν•™κ³Ό κ΄€λ ¨λœ ν•¨μˆ˜ 제곡

  • math.ceil(n): 올림
  • math.floor(n): λ‚΄λ¦Ό
  • math.round(n): 반올림
  • math.fabs(n): μ ˆλŒ“κ°’
  • math.factorial(n): 1λΆ€ν„° nκΉŒμ§€μ˜ κ³±
  • math.pi: μ›μ£Όμœ¨

πŸ“Œ random

μž„μ˜μ˜ 수 생성, 리슀트 λ¬΄μž‘μœ„ μΆ”μΆœ λ“±

  • random.random(): 0.0 이상 1.0 미만의 μ‹€μˆ˜(float)
    * μ›ν•˜λŠ” 숫자λ₯Ό λ”ν•΄μ„œ λ²”μœ„λ₯Ό μ‘°μ ˆν•  수 있음
예) random.random()+5	#5.0 이상 6.0 미만의 κ°’ λ°˜ν™˜
  • random.uniform(x, y)
    : x 이상 y μ΄ν•˜μ˜ μ‹€μˆ˜
  • random.randint(x, y)
    : x 이상 y μ΄ν•˜μ˜ μ •μˆ˜(int)
  • random.randrange(x, y[, z])
    : (z κ°„κ²©μœΌλ‘œ) x 이상 y 미만의 μ •μˆ˜
  • random.choice(리슀트)
    : 리슀트 쀑 μž„μ˜μ˜ κ°’ λ°˜ν™˜
  • random.sample(리슀트, n)
    : 리슀트 쀑 μž„μ˜μ˜ κ°’ n개λ₯Ό ν¬ν•¨ν•œ 리슀트 λ°˜ν™˜
    * choice, sample은 리슀트뿐만 μ•„λ‹ˆλΌ νŠœν”Œ, λ¬Έμžμ—΄ λ“± μ‹œν€€μŠ€ μžλ£Œν˜•μ— λͺ¨λ‘ μ‚¬μš© κ°€λŠ₯
  • random.shuffle(리슀트)
    : 리슀트 μˆœμ„œ μ„žκΈ°
    * 리턴값이 μ—†κ³ , λ³€μˆ˜ 리슀트의 λ‚΄μš© 자체λ₯Ό 변경함

πŸ“Œ datetime

λ‚ μ§œ 및 μ‹œκ°„ 데이터 처리

  • datetime.datetime
    • datetime.datetime(yyyy, mm, dd, hh, mm, ss, microsec) ν˜•νƒœλ‘œ μ‹œκ°„μ„ λ‚˜νƒ€λ‚΄λŠ” 객체
    • printν•  경우 "yyyy-mm-dd hh:mm:ss.microsec" ν˜•μ‹μœΌλ‘œ λ‚˜νƒ€λ‚¨
    • 각 λ°μ΄ν„°λŠ” year, month, day, hour, minute, second 속성을 톡해 μ ‘κ·Ό κ°€λŠ₯
  • datetime.datetime.now()
    • ν˜„μž¬μ‹œκ°„μ„ datetime.datetime 객체둜 λ°˜ν™˜
  • datetime.timedelta
    • datetimeκ°μ²΄κ°„μ˜ μ‹œκ°„ 차이λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 객체
    • datetime.timedelta(days=0, seconds=0, microseconds=0) ν˜•νƒœ (μƒμ„±μ‹œμ—λŠ” hours="", minutes="" λ“±μ˜ λ‹¨μœ„λ‘œλ„ κ°€λŠ₯)
    • printμ‹œ "d days, hh:mm:ss.microsec" ν˜•μ‹μœΌλ‘œ λ‚˜νƒ€λ‚¨
  • strftime(포맷)
    • datetime객체λ₯Ό λ‹€μ–‘ν•œ 포맷의 λ¬Έμžμ—΄λ‘œ λ³€ν™˜
  • strptime(λ¬Έμžμ—΄, 포맷)
    • λ‹€μ–‘ν•œ 포맷의 λ¬Έμžμ—΄μ„ datetime객체둜 λ°˜ν™˜
      * ν¬λ§·μ½”λ“œλŠ” μ—¬κΈ° μ°Έμ‘°!

πŸ™‡β€β™€οΈμ°Έκ³ ν•œ 자료!

39. Generator(μ œλ„€λ ˆμ΄ν„°) - 파이썬 - 기본을 갈고 λ‹¦μž!
05-2 λͺ¨λ“ˆ - 점프 투 파이썬
5. λͺ¨λ“ˆ - μ™•μ΄ˆλ³΄λ₯Ό μœ„ν•œ Python
파이썬 μ½”λ”© 도μž₯: 47.4 λ‚ μ§œ/μ‹œκ°„ λͺ¨λ“ˆ ν™œμš©ν•˜κΈ°

profile
DevelOpErUN μ„±μž₯일기🌈
post-custom-banner

2개의 λŒ“κΈ€

comment-user-thumbnail
2021λ…„ 3μ›” 23일

μ—­μ‹œ λ„μ€λ‹˜ 잘보고 κ°‘λ‹ˆλ‹€! os와 python을 μ΄μ–΄μ£ΌλŠ” os λͺ¨λ“ˆκ³Ό sys λͺ¨λ“ˆμ€ 항상 ν—·κ°ˆλ¦¬λ„€μš”.. 덕뢄에 잘 보고 κ°‘λ‹ˆλ‹€!

1개의 λ‹΅κΈ€