<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: otololism</title>
    <description>The latest articles on DEV Community by otololism (@otololism).</description>
    <link>https://dev.to/otololism</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3896891%2F070bc98e-8cd9-479c-a9dd-4baeea0213ed.jpg</url>
      <title>DEV Community: otololism</title>
      <link>https://dev.to/otololism</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/otololism"/>
    <language>en</language>
    <item>
      <title>RAG201 의 개념과 필요성</title>
      <dc:creator>otololism</dc:creator>
      <pubDate>Sat, 25 Apr 2026 06:09:39 +0000</pubDate>
      <link>https://dev.to/otololism/rag201-yi-gaenyeomgwa-pilyoseong-2pej</link>
      <guid>https://dev.to/otololism/rag201-yi-gaenyeomgwa-pilyoseong-2pej</guid>
      <description>&lt;p&gt;1️⃣ &lt;strong&gt;섹션 1. 교재 다운로드~섹션 4. Langchain 프레임워크 소개&lt;/strong&gt; 수강&lt;/p&gt;

&lt;h1&gt;
  
  
  RAG201 의 개념과 필요성
&lt;/h1&gt;

&lt;p&gt;개요&lt;/p&gt;

&lt;p&gt;LLM이 거짓말을 하는 이유?&lt;/p&gt;

&lt;p&gt;GAG란?&lt;/p&gt;

&lt;p&gt;개요&lt;/p&gt;

&lt;p&gt;RAG(Retrieval-Augmented Generation, 검색 증강 생성) 서비스는 대규모 언어 모델(LLM)의 hallucination(환각 현상)을 최소화하며 외부 지식 베이스를 실시간 검색해 컨텍스트를 증강하는 AI 아키텍처이다.&lt;/p&gt;

&lt;p&gt;필요성&lt;/p&gt;

&lt;p&gt;&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;기본 나이브 서비스 방식으로는 충분하지 않기 때문에 다양한 방법으로 설계한다.&lt;/p&gt;

&lt;p&gt;그럼 LLM 언어모델이 무엇인지 알아보자.&lt;/p&gt;

&lt;h2&gt;
  
  
  LLM의 이해
&lt;/h2&gt;

&lt;p&gt;초기 인코더+디코더의 구조를 활용하여 번역소프트웨어엔진을 개발하던 중 디코더 부분 (다음 단어가 나올 수 있는 확률의 프로세싱)만가지고 여러 레이어를 쌓아 Text Prediction + Tack Classifier으로 GPT란 소프트웨어를 개발 하였음.&lt;/p&gt;

&lt;p&gt;학습량을 늟리고 디코더의 새수를 개속적으로 늟기게 되면서 메모리의 증가로 GPT의 모델이 발전함.&lt;/p&gt;

&lt;p&gt;초기에는 인코더–디코더 구조의 트랜스포머를 이용하여 기계번역 엔진을 개발했다. 인코더는 입력 문장을 의미 공간의 표현(continuous representation)으로 압축하고, 디코더는 이 표현을 참고하면서 번역 결과 문장을 한 토큰씩 생성한다.&lt;/p&gt;

&lt;p&gt;이후 연구에서는 이 구조 중 디코더가 담당하던 “이전 단어들을 기반으로 다음 단어의 확률 분포를 예측하는” 언어 모델링 부분에 주목했다. 이 디코더만을 여러 층으로 깊게 쌓은 디코더 전용(Decoder-only) 트랜스포머 구조를 사용해, 텍스트 생성(Text Prediction)과 텍스트 분류(Task Classification)을 수행하는 GPT(Generative Pre-trained Transformer) 계열 모델이 개발되었다.&lt;/p&gt;

&lt;p&gt;GPT는 대규모 코퍼스에 대해, 주어진 토큰 시퀀스가 올 때 다음 토큰의 조건부 확률을 최대화하도록 사전학습(pre-training)된 언어 모델이다. 이렇게 학습된 표현을 기반으로 프롬프트 설계나 간단한 미세조정(fine-tuning)만으로 번역·요약·질의응답·분류 등 다양한 다운스트림 태스크에 활용할 수 있다.&lt;/p&gt;

&lt;p&gt;모델의 성능은 크게 두 방향으로 확장되었다. 하나는 학습 데이터의 양과 학습 스텝을 증가시키는 것이고, 다른 하나는 디코더 블록(레이어)의 개수, 임베딩 차원, 어텐션 헤드 수 등을 늘려 파라미터 수를 키우는 것이다. 이러한 스케일 업은 메모리 사용량과 연산량을 크게 증가시키지만, 손실 감소 및 다양한 벤치마크에서의 성능 향상으로 이어지며 GPT-1, GPT-2, GPT-3, GPT-4 등 대형 언어 모델로 발전하는 데 핵심적인 역할을 했다.&lt;/p&gt;

&lt;h2&gt;
  
  
  LLM의 한계
&lt;/h2&gt;

&lt;h3&gt;
  
  
  개요
&lt;/h3&gt;

&lt;p&gt;GPT3의 버젼 업에서 GPT4로 넘어가지 않고 3.5의 이름으로 버젼 이름을 사용한 이유로 볼 수 있다.&lt;/p&gt;

&lt;p&gt;GPT-3.5라는 이름은 GPT-3와 GPT-4 사이의 &lt;strong&gt;중간 세대(Intermediate iteration)&lt;/strong&gt;를 나타내는 버전명이다.&lt;/p&gt;

&lt;p&gt;GPT-3와 동일하게 디코더 전용 트랜스포머 구조와 다음 토큰 예측 목표를 유지한다.&lt;br&gt;
다만 모델 크기, 학습 데이터, 미세 튜닝 방식(RLHF 기반 정렬 등)이 개선되면서 성능이 향상된 “개선형 GPT-3”에 가깝다.&lt;br&gt;
“GPT-3에서 전혀 새로운 개념이 추가되지 않았다”라고 단정하기보다는, “기존 아키텍처와 학습 목표를 유지한 채, 사람 선호도에 맞게 정렬하고 성능을 튜닝한 강화 버전”이라고 표현하는 것이 더 정확하다.&lt;br&gt;
GPT-3.5 계열(ChatGPT 초기 모델 포함)은 대규모 감독 학습 + 강화학습(RLHF)으로 인간 선호를 반영한 응답을 내도록 추가 학습된 것이 핵심 차별점이다.&lt;br&gt;
여전히 모델의 내부는 “조건부 확률&lt;br&gt;
P(next token ∣ previous tokens)을 최대화하도록 학습된 언어 모델”이라는 구조를 유지한다.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;확각현상 : 학습이 없는 자료에도 강제 답변을 요구에 의해서 이전 대이터를 활용한 답변&lt;/li&gt;
&lt;li&gt;기억불가: 사전학습에서 배운 것 외의 자료는 기억을 못함.&lt;/li&gt;
&lt;li&gt;토큰제한: 입력값이 길어지면 계산량이 크게 증가하므로 모델별 토큰에 제한을 두게 됨.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  RAG의 개념
&lt;/h2&gt;

&lt;p&gt;LLM의 한계를 극복하기 위한 방법으로 &lt;/p&gt;

&lt;p&gt;RAG에서 증강(augmentation)은 검색된 정보를 AI에게 공부 자료처럼 제공하여 답변의 정확성을 높이는 단계이다.&lt;/p&gt;
&lt;h3&gt;
  
  
  간단한 비유
&lt;/h3&gt;

&lt;p&gt;AI가 시험 문제에 책 지식만으로 대응할 때 잘못된 답을 만들어낼 수 있다. RAG는 그 순간 책에서 문제와 딱 맞는 페이지를 복사해 AI 책상에 놓아주는 과정이다. AI는 이 자료를 보고 정확한 답변을 생성한다.&lt;/p&gt;
&lt;h3&gt;
  
  
  설명
&lt;/h3&gt;

&lt;p&gt;질문 → 책장 검색 → 관련 페이지 3장 추출(질문)&lt;br&gt;
↓&lt;br&gt;
AI 책상에 페이지 제공(증강) ← 증강 단계(힌트)&lt;br&gt;
↓&lt;br&gt;
AI가 자료 보고 답변 생성&lt;/p&gt;
&lt;h3&gt;
  
  
  RAG파이프라인 개요와 핵심 컴포턴트
&lt;/h3&gt;

&lt;p&gt;데이터 인덱싱 과정&lt;br&gt;
PDF, 워드, 파워포인트, 웹링크 같은 문서(Document) 를 먼저 작은 조각으로 나눈다(Chunk).&lt;/p&gt;

&lt;p&gt;각 조각을 벡터 임베딩(Vector Embedding)으로 바꾼 뒤, 이 벡터들을 벡터 데이터베이스(Vector DB)에 저장해 둔다.&lt;/p&gt;

&lt;p&gt;질의·검색·답변 생성 과정&lt;br&gt;
사용자가 “현재 갤럭시 Z 시리즈의 최신 모델은 뭐야?” 같은 질문(Query) 을 입력한다.&lt;br&gt;
이 질문도 벡터 임베딩으로 바꾼 뒤, 벡터 DB에서 비슷한 의미의 문서 조각들을 검색(Retrieval)하고 Top‑K 조각을 가져온다.&lt;/p&gt;

&lt;p&gt;이렇게 찾은 관련 문서 조각들을 LLM에게 함께 넘겨, LLM이 이를 참고하여 최종 답변(Answer) 을 생성하는 흐름을 보여준다.&lt;/p&gt;

&lt;p&gt;&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  “자료 찾아서 똑똑하게 대답해 주는 챗봇(RAG)”만들기
&lt;/h3&gt;

&lt;p&gt;RAG 기반 챗봇은 문서 내용을 미리 벡터로 인덱싱하여 벡터 DB에 저장해 두고, 질의 시 의미적으로 유사한 문서를 검색하여 이를 힌트로 포함한 프롬프트를 LLM에 제공함으로써 보다 정확한 답변을 생성하는 시스템이다.&lt;/p&gt;
&lt;h3&gt;
  
  
  1단계: 문서 불러오기 (Document Loader)
&lt;/h3&gt;

&lt;p&gt;문서 로더는 PDF, 워드, PPT, 웹페이지 등 다양한 형태의 문서를 읽어 텍스트로 변환하는 역할을 한다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;오픈 소스

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LangChain Document Loaders&lt;/strong&gt;: PDF, Word, HTML, Notion, Google Drive 등 수십 종의 로더 제공.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unstructured.io&lt;/strong&gt;: PDF, 스캔 이미지, 슬라이드 등을 구조화된 텍스트로 변환하는 파이프라인.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;상용/클라우드 API

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft Graph / Google Drive API&lt;/strong&gt;: OneDrive, SharePoint, Google Drive에 저장된 문서를 불러올 때 사용.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Textract / Azure Form Recognizer&lt;/strong&gt;: 스캔 문서·이미지(PDF, 스캔된 계약서 등)를 텍스트로 OCR 추출하는 서비스.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2단계: 문서 임베딩 (Embedding Model)
&lt;/h3&gt;

&lt;p&gt;문서·질문을 의미 벡터로 바꾸는 단계이며, 검색 정확도에 직접적인 영향을 준다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;오픈 소스

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sentence Transformers&lt;/strong&gt; (&lt;strong&gt;&lt;code&gt;all-MiniLM-L6-v2&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;all-mpnet-base-v2&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;paraphrase-multilingual-MiniLM-L12-v2&lt;/code&gt;&lt;/strong&gt; 등): 파이썬 &lt;strong&gt;&lt;code&gt;sentence-transformers&lt;/code&gt;&lt;/strong&gt; 라이브러리로 사용, 로컬 RAG에서 가장 널리 쓰이는 계열.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;nomic-embed-text&lt;/strong&gt;, &lt;strong&gt;gte-small/large&lt;/strong&gt; 등: RAG 벤치마크에서 성능이 좋은 범용 임베딩 모델.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;상용 API

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI Embeddings&lt;/strong&gt; (&lt;strong&gt;&lt;code&gt;text-embedding-3-small&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt;&lt;/strong&gt;): 검색·클러스터링·추천 등 범용 용도로 가장 많이 사용되는 상용 임베딩 API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cohere Embed API&lt;/strong&gt;: 의미 검색·추천 시스템에 최적화된 상용 임베딩 서비스.&lt;/li&gt;
&lt;li&gt;(참고) Google Gemini, Voyage AI, Mistral 등도 각각 임베딩 API를 제공하며, 비용·언어지원·성능 기준으로 선택한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  3단계: 벡터 DB 저장 및 검색 (Vector DB)
&lt;/h3&gt;

&lt;p&gt;생성된 임베딩 벡터를 저장하고, 질문 임베딩과의 유사도(코사인, 내적 등)를 기준으로 Top‑K 문서를 검색하는 역할이다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;오픈 소스

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FAISS&lt;/strong&gt; (Meta): CPU/GPU에서 대규모 벡터 검색을 지원하는 라이브러리로, 로컬 RAG에서 표준처럼 사용된다.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qdrant&lt;/strong&gt;, &lt;strong&gt;Milvus&lt;/strong&gt;, &lt;strong&gt;Weaviate&lt;/strong&gt;: gRPC/REST API를 제공하는 오픈 소스 벡터 데이터베이스.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;상용/매니지드 서비스

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pinecone&lt;/strong&gt;: 완전 관리형 벡터 DB 서비스로, OpenAI·LangChain과 연동 예제가 매우 많다.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure AI Search / Elasticsearch + vector&lt;/strong&gt;: 기존 검색 인프라에 벡터 검색 기능을 추가한 형태로 엔터프라이즈에서 자주 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  4단계: LLM 프롬프트 구성 및 답변 생성
&lt;/h3&gt;

&lt;p&gt;검색된 유사 문장(힌트 문장)을 사용자 질문과 함께 하나의 프롬프트로 구성하여 LLM에 전달하고, LLM이 이를 바탕으로 최종 답변을 생성한다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;오픈 소스 LLM

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Llama 3 / Llama 2&lt;/strong&gt;: 메타의 오픈 소스 LLM으로, 8B·70B 등 다양한 크기와 Chat/Instruction 튜닝 버전이 있어 RAG 백엔드로 많이 사용된다.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mistral / Mixtral&lt;/strong&gt;, &lt;strong&gt;Qwen&lt;/strong&gt;, &lt;strong&gt;Gemma&lt;/strong&gt;: 다국어 지원·긴 컨텍스트·경량성을 강점으로 갖는 최신 오픈 소스 LLM들로, 로컬·온프렘 RAG에서 인기 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;OpenAI GPT 계열

&lt;ul&gt;
&lt;li&gt;대표 모델: GPT‑4.1, GPT‑4o, o3‑mini 등.&lt;/li&gt;
&lt;li&gt;특징: 생태계·예제가 풍부하고, RAG용 프롬프트 패턴이 가장 많이 축적되어 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Anthropic Claude 계열

&lt;ul&gt;
&lt;li&gt;대표 모델: Claude 3.5 Sonnet, Claude 3 Opus, Claude 3 Haiku 등.&lt;/li&gt;
&lt;li&gt;특징: 최대 200K 이상 컨텍스트 윈도우를 지원하여 긴 문서 기반 RAG에 유리하고, 안전성·환각 감소에 초점을 둔 설계가 강점.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Google Gemini 계열

&lt;ul&gt;
&lt;li&gt;대표 모델: Gemini 1.5 Pro, Gemini 1.5 Flash 등.&lt;/li&gt;
&lt;li&gt;특징: 텍스트·이미지·코드 등 멀티모달 입력을 지원하고, Vertex AI RAG Engine·File Search 도구를 통해 임베딩·벡터 검색·컨텍스트 주입까지 통합 제공.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  전체 흐름 한 줄 정리
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;문서 로더·임베딩 모델·벡터 DB·LLM을 조합하여, &lt;strong&gt;문서를 로드하고 → 임베딩으로 변환해 벡터 DB에 저장한 뒤 → 질문 임베딩으로 유사 문서를 검색하고 → 그 문맥을 포함한 프롬프트를 LLM에 전달하여 답변을 생성하는 구조&lt;/strong&gt;가 RAG의 기본 파이프라인이며, 각 단계에서 위와 같은 오픈 소스 컴포넌트와 상용 API가 널리 활용된다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  RAG를 활용하는 기업과 이에 산악협력하는 벤쳐기업들
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;
&lt;th&gt;이름&lt;/th&gt;
&lt;th&gt;연구기관·Labs&lt;/th&gt;
&lt;th&gt;설명 (20자 내)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;금융&lt;/td&gt;
&lt;td&gt;KB국민카드&lt;/td&gt;
&lt;td&gt;스켈터랩스&lt;/td&gt;
&lt;td&gt;이벤트 Q&amp;amp;AI RAG 챗봇skelterlabs+1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;금융&lt;/td&gt;
&lt;td&gt;신한투자증권&lt;/td&gt;
&lt;td&gt;스켈터랩스&lt;/td&gt;
&lt;td&gt;사내 RAG 챗봇 ‘챗프로’skelterlabs+1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;금융&lt;/td&gt;
&lt;td&gt;BC카드&lt;/td&gt;
&lt;td&gt;내부 데이터팀&lt;/td&gt;
&lt;td&gt;약관·리포트용 RAG 논의&lt;a href="https://bcif.bccard.com/content/detail/422" rel="noopener noreferrer"&gt;bcif.bccard&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;금융&lt;/td&gt;
&lt;td&gt;다수 금융사&lt;/td&gt;
&lt;td&gt;올거나이즈&lt;/td&gt;
&lt;td&gt;금융 RAG 리더보드·PoCblog-ko.allganize+1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;법률&lt;/td&gt;
&lt;td&gt;로톡(로앤컴퍼니)&lt;/td&gt;
&lt;td&gt;로앤굿·AI팀&lt;/td&gt;
&lt;td&gt;AI 변호사 추천·검색aidev+1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;법률&lt;/td&gt;
&lt;td&gt;로앤굿(로앤봇)&lt;/td&gt;
&lt;td&gt;내부 변호사·AI팀&lt;/td&gt;
&lt;td&gt;RAG 기반 법률상담 챗봇&lt;a href="http://aidev.co.kr/chatbots/13415" rel="noopener noreferrer"&gt;aidev&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;법률&lt;/td&gt;
&lt;td&gt;빅케이스GPT&lt;/td&gt;
&lt;td&gt;법무법인·데이터팀&lt;/td&gt;
&lt;td&gt;판결문 요약·유사판례techsuda+1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;법률&lt;/td&gt;
&lt;td&gt;한국 법률 RAG 챗봇 예제&lt;/td&gt;
&lt;td&gt;GitHub law_chatbot&lt;/td&gt;
&lt;td&gt;한국어 법률 RAG 예제&lt;a href="https://github.com/kimpubao/law_chatbot" rel="noopener noreferrer"&gt;github&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;공공&lt;/td&gt;
&lt;td&gt;통계청&lt;/td&gt;
&lt;td&gt;민간 AI 기업&lt;/td&gt;
&lt;td&gt;통계 챗봇에 RAG 도입&lt;a href="https://www.beyondpost.co.kr/view.php?ud=20240206135731829aeda69934_30" rel="noopener noreferrer"&gt;beyondpost&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;공공&lt;/td&gt;
&lt;td&gt;법제처&lt;/td&gt;
&lt;td&gt;민간 AI 컨소시엄&lt;/td&gt;
&lt;td&gt;AI 법령 RAG 서비스lawtalknews+1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;공공&lt;/td&gt;
&lt;td&gt;K-water&lt;/td&gt;
&lt;td&gt;그리드원&lt;/td&gt;
&lt;td&gt;K‑water GPT 공공 RAG&lt;a href="https://blog.naver.com/simula/223879344365?fromRss=true&amp;amp;trackingCode=rss" rel="noopener noreferrer"&gt;naver&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;공공&lt;/td&gt;
&lt;td&gt;국가기록원&lt;/td&gt;
&lt;td&gt;솔트룩스&lt;/td&gt;
&lt;td&gt;기록물 지능형 검색·RAG&lt;a href="https://www.saltlux.com/kor/board/view.do?mId=65&amp;amp;brdIdx=7271" rel="noopener noreferrer"&gt;saltlux&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;공공&lt;/td&gt;
&lt;td&gt;공공기관 다수&lt;/td&gt;
&lt;td&gt;안랩클라우드메이트&lt;/td&gt;
&lt;td&gt;규정 관리 RAG 어시스턴트&lt;a href="https://techinterviewblog.com/1616/" rel="noopener noreferrer"&gt;techinterviewblog&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;헬스케어&lt;/td&gt;
&lt;td&gt;메이크봇H&lt;/td&gt;
&lt;td&gt;국내 대형병원 다수&lt;/td&gt;
&lt;td&gt;병원 예약·문의 RAG 챗봇asiae+1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;헬스케어&lt;/td&gt;
&lt;td&gt;메이크봇 HybridRAG&lt;/td&gt;
&lt;td&gt;자체 연구랩&lt;/td&gt;
&lt;td&gt;HybridRAG 프레임워크makebot+1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;헬스케어&lt;/td&gt;
&lt;td&gt;의료 RAG PoC들&lt;/td&gt;
&lt;td&gt;대학병원·연구소&lt;/td&gt;
&lt;td&gt;진단 보조·문서 RAG 실험&lt;a href="https://seo.goover.ai/report/202407/go-public-report-ko-1249671a-3bb9-4069-bc28-ee0b96237d64-0-0.html" rel="noopener noreferrer"&gt;seo.goover&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;범용&lt;/td&gt;
&lt;td&gt;AIFRICA Gazelle RAG&lt;/td&gt;
&lt;td&gt;AIFRICA Lab&lt;/td&gt;
&lt;td&gt;폐쇄망용 Gazelle RAG&lt;a href="https://blog.aifrica.co.kr/rag%EC%9D%98-%EA%B5%AC%EC%B2%B4%EC%A0%81%EC%9D%B8-%EC%9E%A5%EC%A0%90%EA%B3%BC-%EC%8B%A4%EC%A0%9C-%EC%A0%81%EC%9A%A9-%EC%82%AC%EB%A1%80%EB%8A%94-33093" rel="noopener noreferrer"&gt;aifrica&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;범용&lt;/td&gt;
&lt;td&gt;Konan RAG‑X&lt;/td&gt;
&lt;td&gt;Konan LLM Lab&lt;/td&gt;
&lt;td&gt;기업용 RAG‑X 패키지&lt;a href="https://www.konantech.com/konanllm/konanragx" rel="noopener noreferrer"&gt;konantech&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;범용&lt;/td&gt;
&lt;td&gt;WISE iRAG V2&lt;/td&gt;
&lt;td&gt;WISENUT R&amp;amp;D&lt;/td&gt;
&lt;td&gt;검색 기반 iRAG 솔루션wisenut+1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;범용&lt;/td&gt;
&lt;td&gt;LUXIA A.RAG&lt;/td&gt;
&lt;td&gt;솔트룩스 연구소&lt;/td&gt;
&lt;td&gt;공공·엔터프라이즈 RAG&lt;a href="https://www.saltlux.com/kor/board/view.do?mId=65&amp;amp;brdIdx=7281" rel="noopener noreferrer"&gt;saltlux&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h1&gt;
  
  
  Langchain 개념과 아키텍처
&lt;/h1&gt;
&lt;h2&gt;
  
  
  LangChain 개념
&lt;/h2&gt;

&lt;p&gt;LangChain은 LLM을 단독으로 사용하는 대신, 여러 컴포넌트를 연결하여 실세계 애플리케이션을 구축한다. 핵심 아이디어는 '체인화'로, 입력에서 출력까지 순차적 또는 병렬적 처리를 지원한다. 예를 들어, 텍스트 입력 → 검색 → 요약 → 응답 과정을 자동화한다.&lt;/p&gt;
&lt;h3&gt;
  
  
  주요 아키텍처 컴포넌트
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Models&lt;/strong&gt;: LLM(예: GPT 시리즈) 또는 임베딩 모델을 추상화한 인터페이스.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompts&lt;/strong&gt;: 입력 템플릿을 관리하며, 동적 변수 삽입을 지원.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chains&lt;/strong&gt;: 컴포넌트를 순차 연결하는 기본 단위(예: LLMChain).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agents&lt;/strong&gt;: 도구(검색, 계산기 등)를 동적으로 선택·실행하는 지능형 체인.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory&lt;/strong&gt;: 대화 히스토리나 벡터 저장소를 통해 상태 유지.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  동작 원리
&lt;/h3&gt;

&lt;p&gt;입력 데이터를 프롬프트로 변환한 후 체인 내 모델에 전달하고, 출력은 다음 컴포넌트로 전달된다. 예: RetrievalQA 체인은 벡터 DB에서 관련 문서를 검색·회수한 후 LLM으로 답변 생성. 이는 모듈러 설계로 확장성과 디버깅을 용이하게 한다.&lt;/p&gt;
&lt;h3&gt;
  
  
  실무 예시
&lt;/h3&gt;

&lt;p&gt;&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;질의응답 시스템에서 LangChain은 문서 로더 → 임베딩 → 벡터 저장소 → 리트리버 → LLM 체인을 구성한다. 이는 RAG(Retrieval-Augmented Generation) 패턴의 표준 구현으로, 환각(hallucination) 감소와 정확도 향상을 이룬다.&lt;/p&gt;
&lt;h3&gt;
  
  
  LLM의 발전과 함께 중요해진 프롬프트 엔지니어링을 보조할 수 있다.
&lt;/h3&gt;
&lt;h3&gt;
  
  
  프롬프트 엔지니어링이란?
&lt;/h3&gt;

&lt;p&gt;AI의 언어와 인간의 언어사이에 인간이 편하게 이해 할 수 있도록 목적에 맞는 답변을 해주는 문장을 만들어 주는 역활을 한다.&lt;/p&gt;

&lt;p&gt;&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img alt="Gemini_Generated_Image_hoo8h3hoo8h3hoo8 (1).png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Langchain을 사용한 RAG구현 워크플로우
&lt;/h2&gt;

&lt;p&gt;&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  RAG(Retrieval-Augmented Generation) 시스템의 단계별 공정
&lt;/h2&gt;

&lt;p&gt;RAG 시스템은 데이터를 저장 가능한 형태로 가공하는 &lt;strong&gt;인덱싱(Indexing)&lt;/strong&gt; 과정과 사용자의 질문에 맞춰 최적의 답변을 도출하는 &lt;strong&gt;검색 및 생성(Retrieval &amp;amp; Generation)&lt;/strong&gt; 과정으로 나뉜다.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. 문서 로드 및 수집 (Document Loading)
&lt;/h3&gt;

&lt;p&gt;시스템 구축의 첫 단계는 PDF, 워드, 웹페이지 등 다양한 형식의 원천 데이터를 확보하는 것이다. 이 단계에서는 외부 소스로부터 데이터를 가져와 시스템이 처리할 수 있는 문서 객체로 변환한다.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. 텍스트 분할 (Text Splitting)
&lt;/h3&gt;

&lt;p&gt;불러온 방대한 양의 문서를 효율적으로 처리하기 위해 '청크(Chunk)'라고 불리는 작은 단위로 세분화한다. 이는 정보의 탐색 속도를 높이고 인공지능이 한 번에 이해할 수 있는 적절한 정보량을 유지하기 위함이다.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. 벡터 임베딩 (Vector Embedding)
&lt;/h3&gt;

&lt;p&gt;분할된 텍스트 데이터는 임베딩 모델을 거쳐 수치화된 데이터인 '벡터(Vector)'로 변환된다. 이는 컴퓨터가 텍스트의 의미적 유사성을 계산할 수 있도록 기계어로 바꾸는 핵심 공정이다.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. 벡터 데이터베이스 저장 (Vector Store)
&lt;/h3&gt;

&lt;p&gt;수치화된 데이터는 검색 최적화 과정을 거쳐 벡터 데이터베이스(Vector Database)에 저장된다. 이 저장소는 사용자의 질문이 입력되었을 때 가장 연관성이 높은 데이터를 신속하게 찾아낼 수 있는 역할을 수행한다.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. 검색 및 유사 문장 추출 (Retrieval)
&lt;/h3&gt;

&lt;p&gt;사용자가 질문(Query)을 입력하면 해당 질문 역시 수치(벡터)로 변환된다. 이후 시스템은 데이터베이스 내에서 질문의 수치와 가장 유사한 정보를 담은 문장들을 선별하여 추출한다.&lt;/p&gt;
&lt;h3&gt;
  
  
  6. 답변 생성 (Generation)
&lt;/h3&gt;

&lt;p&gt;최종적으로 대형언어모델(LLM)은 사용자의 질문과 시스템이 찾아낸 관련 정보를 결합한다. 모델은 제공된 힌트 문장들을 바탕으로 근거에 기반한 정확한 답변을 생성하여 사용자에게 전달한다.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;## **Langchain을 표현하는 언어, LCEL&lt;/strong&gt;**
&lt;/h2&gt;
&lt;h3&gt;
  
  
  *&lt;strong&gt;&lt;em&gt;[LCEL로 기본 체인 구성하기]&lt;/em&gt;&lt;/strong&gt;*
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#필수 라이브러리 설치
&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;upgrade&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;quiet&lt;/span&gt; &lt;span class="n"&gt;langchain&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="n"&gt;langchain&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt; &lt;span class="n"&gt;langchain&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;openai&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;rom&lt;/span&gt; &lt;span class="n"&gt;langchain_core&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output_parsers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StrOutputParser&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_core.prompts&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChatPromptTemplate&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChatOpenAI&lt;/span&gt;

&lt;span class="c1"&gt;#프롬프트 템플릿 설정
&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ChatPromptTemplate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_template&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tell me a short joke about {topic}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;#LLM 호출
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;#출력 파서 설정
&lt;/span&gt;&lt;span class="n"&gt;output_parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StrOutputParser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;#LCEL로 프롬프트템플릿-LLM-출력 파서 연결하기
&lt;/span&gt;&lt;span class="n"&gt;chain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;output_parser&lt;/span&gt;

&lt;span class="c1"&gt;#invoke함수로 chain 실행하기
&lt;/span&gt;&lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;topic&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ice cream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  *&lt;strong&gt;&lt;em&gt;[Streaming 기능 추가를 더욱 쉽게, stream()]&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_core.prompts&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChatPromptTemplate&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChatOpenAI&lt;/span&gt;

&lt;span class="c1"&gt;#Chain 선언
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ChatPromptTemplate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_template&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tell me a joke about {topic}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;chain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;

&lt;span class="c1"&gt;#Chain의 stream()함수를 통해 스트리밍 기능 추가
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;topic&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bears&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  *&lt;strong&gt;&lt;em&gt;[한꺼번에 여러 개 API 요청하고 답변 받기, batch()]&lt;/em&gt;&lt;/strong&gt;*
&lt;/h3&gt;
&lt;h3&gt;
  
  
  - 5개 문장 번역 batch 수행
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="o"&gt;%%&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ChatPromptTemplate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_template&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;다음 한글 문장을 프랑스어로 번역해줘 {sentence}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;chain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;

&lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentence&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;그녀는 매일 아침 책을 읽습니다.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentence&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;오늘 날씨가 참 좋네요.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentence&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;저녁에 친구들과 영화를 볼 거예요.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentence&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;그 학생은 매우 성실하게 공부합니다.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentence&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;커피 한 잔이 지금 딱 필요해요.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  - 1개 문장 번역 invoke 수행
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="o"&gt;%%&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ChatPromptTemplate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_template&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;다음 한글 문장을 프랑스어로 번역해줘 {sentence}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;chain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;

&lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentence&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;그녀는 매일 아침 책을 읽습니다.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;## **RunnablePassthrough, RunnableLambda, RunnableParallel&lt;/strong&gt;**
&lt;/h1&gt;
&lt;h2&gt;
  
  
  *&lt;strong&gt;&lt;em&gt;[RunnablePassthrough]&lt;/em&gt;&lt;/strong&gt;*
&lt;/h2&gt;

&lt;p&gt;*&lt;strong&gt;&lt;em&gt;RunnablePassthrough는 가장 단순한 Runnable 객체로, 들어온 입력을 그대로 전달합니다.&lt;/em&gt;&lt;/strong&gt;*&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="n"&gt;langchain&lt;/span&gt; &lt;span class="n"&gt;langchain&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt; &lt;span class="n"&gt;langchain&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;openai&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_core.runnables&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;RunnablePassthrough&lt;/span&gt;

&lt;span class="nc"&gt;RunnablePassthrough&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;안녕하세요&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Langchain을 표현하는 언어, LCEL&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;[LCEL로 기본 체인 구성하기]&lt;/strong&gt;&lt;br&gt;
import os&lt;br&gt;
os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY"&lt;/p&gt;
&lt;h1&gt;
  
  
  필수 라이브러리 설치
&lt;/h1&gt;

&lt;p&gt;!pip install --upgrade --quiet langchain openai langchain-core langchain-openai&lt;br&gt;
from langchain_core.output_parsers import StrOutputParser&lt;br&gt;
from langchain_core.prompts import ChatPromptTemplate&lt;br&gt;
from langchain_openai import ChatOpenAI&lt;/p&gt;
&lt;h1&gt;
  
  
  프롬프트 템플릿 설정
&lt;/h1&gt;

&lt;p&gt;prompt = ChatPromptTemplate.from_template("tell me a short joke about {topic}")&lt;/p&gt;
&lt;h1&gt;
  
  
  LLM 호출
&lt;/h1&gt;

&lt;p&gt;model = ChatOpenAI(model="gpt-4o-mini")&lt;/p&gt;
&lt;h1&gt;
  
  
  출력 파서 설정
&lt;/h1&gt;

&lt;p&gt;output_parser = StrOutputParser()&lt;/p&gt;
&lt;h1&gt;
  
  
  LCEL로 프롬프트템플릿-LLM-출력 파서 연결하기
&lt;/h1&gt;

&lt;p&gt;chain = prompt | model | output_parser&lt;/p&gt;
&lt;h1&gt;
  
  
  invoke함수로 chain 실행하기
&lt;/h1&gt;

&lt;p&gt;chain.invoke({"topic": "ice cream"})&lt;br&gt;
&lt;strong&gt;[Streaming 기능 추가를 더욱 쉽게, stream()]&lt;/strong&gt;&lt;br&gt;
from langchain_core.prompts import ChatPromptTemplate&lt;br&gt;
from langchain_openai import ChatOpenAI&lt;/p&gt;
&lt;h1&gt;
  
  
  Chain 선언
&lt;/h1&gt;

&lt;p&gt;model = ChatOpenAI(model="gpt-4o-mini")&lt;br&gt;
prompt = ChatPromptTemplate.from_template("tell me a joke about {topic}")&lt;br&gt;
chain = prompt | model&lt;/p&gt;
&lt;h1&gt;
  
  
  Chain의 stream()함수를 통해 스트리밍 기능 추가
&lt;/h1&gt;

&lt;p&gt;for s in chain.stream({"topic": "bears"}):&lt;br&gt;
print(s.content, end="", flush=True)&lt;br&gt;
&lt;strong&gt;[한꺼번에 여러 개 API 요청하고 답변 받기, batch()]&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;5개 문장 번역 batch 수행
%%time
model = ChatOpenAI(model="gpt-4o-mini")
prompt = ChatPromptTemplate.from_template("다음 한글 문장을 프랑스어로 번역해줘 {sentence}")
chain = prompt | model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;chain.batch([&lt;br&gt;
{"sentence": "그녀는 매일 아침 책을 읽습니다."},&lt;br&gt;
{"sentence": "오늘 날씨가 참 좋네요."},&lt;br&gt;
{"sentence": "저녁에 친구들과 영화를 볼 거예요."},&lt;br&gt;
{"sentence": "그 학생은 매우 성실하게 공부합니다."},&lt;br&gt;
{"sentence": "커피 한 잔이 지금 딱 필요해요."}&lt;/p&gt;

&lt;p&gt;])&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1개 문장 번역 invoke 수행
%%time
prompt = ChatPromptTemplate.from_template("다음 한글 문장을 프랑스어로 번역해줘 {sentence}")
chain = prompt | model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;chain.invoke({"sentence": "그녀는 매일 아침 책을 읽습니다."})&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;RunnablePassthrough, RunnableLambda, RunnableParallel&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;[RunnablePassthrough]RunnablePassthrough는 가장 단순한 Runnable 객체로, 들어온 입력을 그대로 전달합니다.&lt;/strong&gt;&lt;br&gt;
pip install -q langchain langchain-core langchain-openai&lt;br&gt;
import os&lt;br&gt;
os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY"&lt;br&gt;
from langchain_core.runnables import RunnablePassthrough&lt;/p&gt;

&lt;p&gt;RunnablePassthrough().invoke("안녕하세요")&lt;br&gt;
from langchain_core.prompts import ChatPromptTemplate&lt;br&gt;
from langchain_openai import ChatOpenAI&lt;br&gt;
from langchain_core.output_parsers import StrOutputParser&lt;/p&gt;

&lt;p&gt;prompt = ChatPromptTemplate.from_template("다음 한글 문장을 프랑스어로 번역해줘 {sentence} \n French sentence: (print from here)")&lt;br&gt;
model = ChatOpenAI(model="gpt-4o-mini")&lt;br&gt;
output_parser = StrOutputParser()&lt;/p&gt;

&lt;p&gt;runnable_chain = {"sentence": RunnablePassthrough()} | prompt | model | output_parser&lt;/p&gt;

&lt;p&gt;runnable_chain.invoke({"sentence": "그녀는 매일 아침 책을 읽습니다."})&lt;br&gt;
RunnablePassthrough는 assin 함수를 통해 새로운 변수에 계산된 값을 입력할 수 있습니다.&lt;br&gt;
(RunnablePassthrough.assign(mult=lambda x: x["num"]*3)).invoke({"num":3})&lt;br&gt;
from langchain_core.runnables import RunnableParallel, RunnablePassthrough&lt;/p&gt;

&lt;p&gt;runnable = RunnableParallel(&lt;br&gt;
extra=RunnablePassthrough.assign(mult=lambda x: x["num"] * 3),&lt;br&gt;
modified=lambda x: x["num"] + 1,&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;runnable.invoke({"num": 1})&lt;br&gt;
&lt;strong&gt;[RunnableLambda]RunnableLambda는 임의의 함수를 Chain에 결합할 수 있게 Runnable 객체로 변환합니다..&lt;/strong&gt;&lt;br&gt;
def add_smile(x):&lt;br&gt;
return x + ":)"&lt;br&gt;
from langchain_core.runnables import RunnableLambda&lt;/p&gt;

&lt;p&gt;add_smile = RunnableLambda(add_smile)&lt;br&gt;
from langchain.prompts import ChatPromptTemplate&lt;br&gt;
from langchain_openai import ChatOpenAI&lt;br&gt;
from langchain.schema.output_parser import StrOutputParser&lt;/p&gt;

&lt;p&gt;prompt_str = "{topic}의 역사에 대해 세문장으로 설명해주세요."&lt;br&gt;
prompt = ChatPromptTemplate.from_template(prompt_str)&lt;/p&gt;

&lt;p&gt;model = ChatOpenAI(model_name = 'gpt-4o-mini')&lt;/p&gt;

&lt;p&gt;output_parser = StrOutputParser()&lt;/p&gt;

&lt;p&gt;chain = prompt | model | output_parser&lt;br&gt;
from langchain_core.runnables import RunnableLambda&lt;/p&gt;

&lt;p&gt;def add_thank(x):&lt;br&gt;
return x + " 들어주셔서 감사합니다 :)"&lt;/p&gt;

&lt;p&gt;add_thank = RunnableLambda(add_thank)&lt;br&gt;
chain = prompt | model | output_parser | add_thank&lt;br&gt;
chain.invoke("반도체")&lt;br&gt;
pip install -q grandalf&lt;br&gt;
chain.get_graph().print_ascii()&lt;br&gt;
&lt;strong&gt;[RunnableParallel]RunnableParallel은 여러 요소가 병렬 처리되도록 처리합니다.&lt;/strong&gt;&lt;br&gt;
from langchain_core.runnables import RunnableParallel, RunnablePassthrough&lt;/p&gt;

&lt;p&gt;runnable = RunnableParallel(&lt;br&gt;
passed=RunnablePassthrough(),&lt;br&gt;
modified=lambda x: x["num"] + 1,&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;runnable.invoke({"num": 1})&lt;br&gt;
runnable = RunnableParallel(&lt;br&gt;
passed=RunnablePassthrough(),&lt;br&gt;
modified=add_thank,&lt;br&gt;
)&lt;br&gt;
runnable.invoke("안녕하세요")&lt;br&gt;
from langchain_core.prompts import ChatPromptTemplate&lt;br&gt;
from langchain_core.runnables import RunnableParallel&lt;br&gt;
from langchain_openai import ChatOpenAI&lt;br&gt;
from langchain.schema.output_parser import StrOutputParser&lt;/p&gt;

&lt;p&gt;model = ChatOpenAI(model = 'gpt-4o-mini', max_tokens = 128, temperature = 0)&lt;/p&gt;

&lt;p&gt;history_prompt = ChatPromptTemplate.from_template("{topic}가 무엇의 약자인지 알려주세요.")&lt;br&gt;
celeb_prompt = ChatPromptTemplate.from_template("{topic} 분야의 유명인사 3명의 이름만 알려주세요.")&lt;/p&gt;

&lt;p&gt;output_parser = StrOutputParser()&lt;/p&gt;

&lt;p&gt;history_chain = history_prompt | model | output_parser&lt;br&gt;
celeb_chain = celeb_prompt | model | output_parser&lt;/p&gt;

&lt;p&gt;map_chain = RunnableParallel(history=history_chain, celeb=celeb_chain)&lt;/p&gt;

&lt;p&gt;result = map_chain.invoke({"topic": "AI"})&lt;br&gt;
result&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;LCEL로 RAG 구축하기&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;[기본 RAG 구축]&lt;/strong&gt;&lt;br&gt;
pip install -q langchain_chroma langchain_community langchainhub&lt;br&gt;
from langchain_openai import ChatOpenAI&lt;br&gt;
import bs4&lt;br&gt;
from langchain import hub&lt;br&gt;
from langchain_chroma import Chroma&lt;br&gt;
from langchain_community.document_loaders import WebBaseLoader&lt;br&gt;
from langchain_core.output_parsers import StrOutputParser&lt;br&gt;
from langchain_core.runnables import RunnablePassthrough&lt;br&gt;
from langchain_openai import OpenAIEmbeddings&lt;br&gt;
from langchain_text_splitters import RecursiveCharacterTextSplitter&lt;/p&gt;

&lt;p&gt;model = ChatOpenAI(model="gpt-4o-mini")&lt;/p&gt;
&lt;h1&gt;
  
  
  Load, chunk and index the contents of the blog.
&lt;/h1&gt;

&lt;p&gt;loader = WebBaseLoader(&lt;br&gt;
web_paths=("&lt;a href="https://n.news.naver.com/mnews/article/366/0001007619%22," rel="noopener noreferrer"&gt;https://n.news.naver.com/mnews/article/366/0001007619",&lt;/a&gt;),&lt;br&gt;
bs_kwargs=dict(&lt;br&gt;
parse_only=bs4.SoupStrainer(&lt;br&gt;
class_=("newsct_article _article_body")&lt;br&gt;
)&lt;br&gt;
),&lt;br&gt;
)&lt;br&gt;
docs = loader.load()&lt;/p&gt;

&lt;p&gt;text_splitter = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=50)&lt;br&gt;
splits = text_splitter.split_documents(docs)&lt;br&gt;
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())&lt;/p&gt;
&lt;h1&gt;
  
  
  Retrieve and generate using the relevant snippets of the blog.
&lt;/h1&gt;

&lt;p&gt;retriever = vectorstore.as_retriever()&lt;br&gt;
prompt = hub.pull("rlm/rag-prompt")&lt;/p&gt;

&lt;p&gt;def format_docs(docs):&lt;br&gt;
return "\n\n".join(doc.page_content for doc in docs)&lt;/p&gt;

&lt;p&gt;rag_chain = (&lt;br&gt;
{"context": retriever | format_docs, "question": RunnablePassthrough()}&lt;br&gt;
| prompt&lt;br&gt;
| model&lt;br&gt;
| StrOutputParser()&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;rag_chain.invoke("아까 내가 했던 질문이 뭐야?")&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;메모리를 추가한 RAG 구축하기&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;from langchain.chains import create_retrieval_chain&lt;br&gt;
from langchain.chains.combine_documents import create_stuff_documents_chain&lt;br&gt;
from langchain.chains import create_history_aware_retriever&lt;br&gt;
from langchain_core.prompts import MessagesPlaceholder&lt;br&gt;
from langchain_core.messages import HumanMessage&lt;/p&gt;

&lt;p&gt;loader = WebBaseLoader(&lt;br&gt;
web_paths=("&lt;a href="https://n.news.naver.com/mnews/article/366/0001007619%22," rel="noopener noreferrer"&gt;https://n.news.naver.com/mnews/article/366/0001007619",&lt;/a&gt;),&lt;br&gt;
bs_kwargs=dict(&lt;br&gt;
parse_only=bs4.SoupStrainer(&lt;br&gt;
class_=("newsct_article _article_body")&lt;br&gt;
)&lt;br&gt;
),&lt;br&gt;
)&lt;br&gt;
docs = loader.load()&lt;/p&gt;

&lt;p&gt;text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)&lt;br&gt;
splits = text_splitter.split_documents(docs)&lt;br&gt;
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())&lt;br&gt;
retriever = vectorstore.as_retriever()&lt;br&gt;
contextualize_q_system_prompt = (&lt;br&gt;
"Given a chat history and the latest user question "&lt;br&gt;
"which might reference context in the chat history, "&lt;br&gt;
"formulate a standalone question which can be understood "&lt;br&gt;
"without the chat history. Do NOT answer the question, "&lt;br&gt;
"just reformulate it if needed and otherwise return it as is."&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;contextualize_q_prompt = ChatPromptTemplate.from_messages(&lt;br&gt;
[&lt;br&gt;
("system", contextualize_q_system_prompt),&lt;br&gt;
MessagesPlaceholder("chat_history"),&lt;br&gt;
("human", "{input}"),&lt;br&gt;
]&lt;br&gt;
)&lt;br&gt;
history_aware_retriever = create_history_aware_retriever(&lt;br&gt;
model, retriever, contextualize_q_prompt&lt;br&gt;
)&lt;br&gt;
system_prompt = (&lt;br&gt;
"You are an assistant for question-answering tasks. "&lt;br&gt;
"Use the following pieces of retrieved context to answer "&lt;br&gt;
"the question. If you don't know the answer, say that you "&lt;br&gt;
"don't know. Use three sentences maximum and keep the "&lt;br&gt;
"answer concise."&lt;br&gt;
"\n\n"&lt;br&gt;
"{context}"&lt;br&gt;
)&lt;br&gt;
qa_prompt = ChatPromptTemplate.from_messages(&lt;br&gt;
[&lt;br&gt;
("system", system_prompt),&lt;br&gt;
MessagesPlaceholder("chat_history"),&lt;br&gt;
("human", "{input}"),&lt;br&gt;
]&lt;br&gt;
)&lt;br&gt;
question_answer_chain = create_stuff_documents_chain(model, qa_prompt)&lt;/p&gt;

&lt;p&gt;rag_chain = create_retrieval_chain(history_aware_retriever, question_answer_chain)&lt;/p&gt;

&lt;p&gt;chat_history = []&lt;/p&gt;

&lt;p&gt;question = "오픈AI 근황은 어때?"&lt;br&gt;
ai_msg_1 = rag_chain.invoke({"input": question, "chat_history": chat_history})&lt;br&gt;
chat_history.extend([HumanMessage(content=question), ai_msg_1["answer"]])&lt;br&gt;
ai_msg_1&lt;br&gt;
chat_history&lt;br&gt;
question = "다시 한번 설명해줄래?"&lt;br&gt;
ai_msg_2 = rag_chain.invoke({"input": question, "chat_history": chat_history})&lt;br&gt;
chat_history.extend([HumanMessage(content=question), ai_msg_2["answer"]])&lt;br&gt;
ai_msg_2&lt;br&gt;
from langchain_community.chat_message_histories import ChatMessageHistory&lt;br&gt;
from langchain_core.chat_history import BaseChatMessageHistory&lt;br&gt;
from langchain_core.runnables.history import RunnableWithMessageHistory&lt;/p&gt;

&lt;p&gt;store = {}&lt;/p&gt;

&lt;p&gt;def get_session_history(session_id: str) -&amp;gt; BaseChatMessageHistory:&lt;br&gt;
if session_id not in store:&lt;br&gt;
store[session_id] = ChatMessageHistory()&lt;br&gt;
return store[session_id]&lt;/p&gt;

&lt;p&gt;conversational_rag_chain = RunnableWithMessageHistory(&lt;br&gt;
rag_chain,&lt;br&gt;
get_session_history,&lt;br&gt;
input_messages_key="input",&lt;br&gt;
history_messages_key="chat_history",&lt;br&gt;
output_messages_key="answer",&lt;br&gt;
)&lt;br&gt;
conversational_rag_chain.invoke(&lt;br&gt;
{"input": "오픈AI의 근황이 어때?"},&lt;br&gt;
config={&lt;br&gt;
"configurable": {"session_id": "abc123"}&lt;br&gt;
},  # constructs a key "abc123" in &lt;code&gt;store&lt;/code&gt;.&lt;br&gt;
)["answer"]&lt;br&gt;
conversational_rag_chain.invoke(&lt;br&gt;
{"input": "앞으로 어떻게 될까?"},&lt;br&gt;
config={"configurable": {"session_id": "abc123"}},&lt;br&gt;
)["answer"]&lt;br&gt;
from langchain_core.messages import AIMessage&lt;/p&gt;

&lt;p&gt;for message in store["abc123"].messages:&lt;br&gt;
if isinstance(message, AIMessage):&lt;br&gt;
prefix = "AI"&lt;br&gt;
else:&lt;br&gt;
prefix = "User"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>ai</category>
      <category>deeplearning</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>파이썬의 주요 특징</title>
      <dc:creator>otololism</dc:creator>
      <pubDate>Sat, 25 Apr 2026 06:05:06 +0000</pubDate>
      <link>https://dev.to/otololism/paisseonyi-juyo-teugjing-2d9g</link>
      <guid>https://dev.to/otololism/paisseonyi-juyo-teugjing-2d9g</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;파이썬의 주요 특징&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;파이썬은 다음과 같은 다양한 특징과 장점을 가지고 있습니다:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;읽기 쉬운 문법&lt;/strong&gt;: 파이썬은 간결하고 읽기 쉬운 문법을 가지고 있어 초보자도 쉽게 배울 수 있습니다. 코드의 가독성이 높아 유지보수가 용이합니다.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;광범위한 라이브러리&lt;/strong&gt;: 파이썬은 데이터 분석, 웹 개발, 머신러닝, 과학 계산 등 다양한 분야에 활용할 수 있는 풍부한 라이브러리를 제공합니다. 예를 들어, 데이터 분석에는 pandas, 웹 개발에는 Django, 머신러닝에는 scikit-learn 등이 있습니다.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;플랫폼 독립성&lt;/strong&gt;: 파이썬은 운영 체제에 상관없이 동일한 코드를 실행할 수 있습니다. 이는 다양한 환경에서 개발과 배포를 용이하게 합니다.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;대화형 인터프리터&lt;/strong&gt;: 파이썬은 대화형 인터프리터를 제공하여, 즉시 결과를 확인하며 개발할 수 있습니다. 이를 통해 빠른 프로토타이핑과 디버깅이 가능합니다.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;커뮤니티 지원&lt;/strong&gt;: 파이썬은 전 세계적으로 활발한 개발자 커뮤니티를 가지고 있어, 다양한 자료와 도움을 쉽게 얻을 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  파이썬 설치하기
&lt;/h3&gt;

&lt;p&gt;공식홈페이지에 다운받아 설치합니다.&lt;/p&gt;

&lt;p&gt;주의사항: &lt;/p&gt;

&lt;p&gt;Add Pyhton 3.6 to PATH (패스경로) 옵션 체크, &lt;/p&gt;

&lt;p&gt;경로를 해매지 않으려면 커스텀으로 C:\Python36폴더에 설치하는 것이 편함.&lt;/p&gt;

&lt;p&gt;만약 설치가 꼬여서 매번 패스 찾기가 예매하면&lt;/p&gt;

&lt;p&gt;시스템 환경 고급에서&lt;/p&gt;

&lt;p&gt;환경 변수의 경로를 C:\Python36과C:\Python36\Scripts\를 추가해 주고 재부팅하면 됨.&lt;/p&gt;

&lt;h3&gt;
  
  
  변수와 값
&lt;/h3&gt;

&lt;p&gt;변수는 저장해 놓는 공간&lt;/p&gt;

&lt;p&gt;변수는 숫자가 될 수 없다.&lt;/p&gt;

&lt;p&gt;a = b&lt;/p&gt;

&lt;p&gt;a  = 1&lt;/p&gt;

&lt;h3&gt;
  
  
  파이썬의 자료형
&lt;/h3&gt;

&lt;p&gt;type(a)&lt;/p&gt;

&lt;p&gt;int실수&lt;/p&gt;

&lt;p&gt;flot정수&lt;/p&gt;

&lt;p&gt;+,-,*,/ 사칙연산&lt;/p&gt;

&lt;p&gt;//나누기의 몫&lt;/p&gt;

&lt;p&gt;%나누기의 나머지&lt;/p&gt;

&lt;p&gt;**제곱&lt;/p&gt;

&lt;p&gt;정수, 실수, 변수, 함수,&lt;/p&gt;

&lt;p&gt;type(a)&lt;/p&gt;

&lt;p&gt;True, Fale, None, Bool&lt;/p&gt;

&lt;h3&gt;
  
  
  자료형(str문자열)
&lt;/h3&gt;

&lt;p&gt;a = ’hello’&lt;/p&gt;

&lt;p&gt;print(a) #자료형을 출력해주는 함수&lt;/p&gt;

&lt;p&gt;/n 줄바꿈 /다음에 나오는 문자는 이스케이프 문자로 인식 /n 내림  /t 텝&lt;/p&gt;

&lt;p&gt;문자열 인덱싱&lt;/p&gt;

&lt;p&gt;문자열을 꺼내옴 ab cde 는 [a][b][_][c][d][e] 문자열의 번호는 &amp;gt; 0,1,2,3,4,5,6 &amp;lt;-의 순서 index라고 한다.&lt;/p&gt;

&lt;p&gt;문자열을 잘라오고 [시작:끝] 을 slice&lt;/p&gt;

&lt;p&gt;문자열 포멧 변수 format&lt;/p&gt;

&lt;p&gt;a= “나는 {1}살 이고 기록이 {0}입니다.”.format(old.s) # 1번{}&amp;lt;old로 2번{}&amp;lt;s로 {위치값}&lt;/p&gt;

&lt;p&gt;따라서 {변수}면 들어간다. 출력하면 알아서 나온다.&lt;/p&gt;

&lt;p&gt;“{0:=*^30}”.format(”안녕”) # ===============안녕=================&lt;/p&gt;

&lt;p&gt;”*15+ ”안녕” + “15” #===============안녕=================&lt;/p&gt;

&lt;h3&gt;
  
  
  문자열 함수(메서드) #변수=문자열
&lt;/h3&gt;

&lt;p&gt;찾는 함수 변수.find(”012345”) 찾는데 없으면 기본값은 -1&lt;/p&gt;

&lt;p&gt;순서 함수 변수,index(”012345”)  &lt;/p&gt;

&lt;p&gt;변수[변수.rfind(”특정값”):]&lt;/p&gt;

&lt;p&gt;찾을때,바꿀때 변수.replace("찾을문자", "바꿀문자", [바꿀횟수])&lt;/p&gt;

&lt;p&gt;자르기,매우기 변수.split(”자를변수값”)&lt;/p&gt;

&lt;p&gt;대문자함수 변수.upper() &lt;/p&gt;

&lt;p&gt;소문자함수 변수.low() &lt;/p&gt;

&lt;p&gt;문자열개수&amp;amp;카운터 z= “aaabbc” / z.count(”a”) / a = 3 / &lt;/p&gt;

&lt;p&gt;총단위수함수 변수.len(a) / 6&lt;/p&gt;

&lt;h3&gt;
  
  
  #리스트 list      표기[] 중괄호 설명: 내용가변
&lt;/h3&gt;

&lt;h3&gt;
  
  
  #소괄호 tuple 표기() 소괄호  설명: 내용불변
&lt;/h3&gt;

&lt;p&gt;패킹: 패키징하기  #변수선언과 같음.&lt;/p&gt;

&lt;p&gt;언패킹: 튜플에서 값을 꺼내오기 #순서를 가져&lt;/p&gt;

&lt;h3&gt;
  
  
  그밖의 함수
&lt;/h3&gt;

&lt;p&gt;문자 찾기 isalpha() &lt;/p&gt;

&lt;p&gt;정수? isdecimal()  &lt;/p&gt;

&lt;p&gt;10진수? isdigit() &lt;/p&gt;

&lt;p&gt;숫의개념? isnumeric()&lt;/p&gt;

&lt;p&gt;참고: 함수찾아 보기 dir(str) 함수의 디렉도리(매소드)를 출력해라!&lt;/p&gt;

&lt;p&gt;파이썬의 대이터 구조 (0부터 순서~)&lt;/p&gt;

&lt;h1&gt;
  
  
  대괄호 리스트[] 설명: 내용가변~  list
&lt;/h1&gt;

&lt;p&gt;추가함수 append([추가})  [추가] 객체 그 자체 추가&lt;/p&gt;

&lt;p&gt;추가함수. extend([추가])   추가 변수의 요소 추가&lt;/p&gt;

&lt;p&gt;삽입함수 insert(어디에,추가)&lt;/p&gt;

&lt;p&gt;삭제함수 del(번쩨:값)&lt;/p&gt;

&lt;p&gt;지우기함수 remove(값) &lt;/p&gt;

&lt;p&gt;꺼내기함수 pop(꺼내기)&lt;/p&gt;

&lt;p&gt;합치기 + 합치기함수 extend #참조: append()를 하면 문자열 자체로 결함&lt;/p&gt;

&lt;p&gt;정렬합수 sort() 역정렬함수 revesel()&lt;/p&gt;

&lt;p&gt;검출 in 값 in 변수 변수에 값을 확 True &amp;amp; False 로 확인&lt;/p&gt;

&lt;h3&gt;
  
  
  딕셔너리 dict()
&lt;/h3&gt;

&lt;h1&gt;
  
  
  중괄호 딕셔너리{}: key”키”와 value”값”이 쌍으로 하나의 객체(object)를 만든다. 키로 값에 접근
&lt;/h1&gt;

&lt;p&gt;a = {”키”:”값”} #키는 중복 될 수 없으며 값은 변한다. 변수a에 객체를 넣는다. &lt;/p&gt;

&lt;p&gt;이러한 객체는 함수del()로 지울수 있고 함수pop()으로 꺼낼 수 도 있다. &lt;/p&gt;

&lt;p&gt;객체도 함수를 통해 변수 처럼 사용 한다. update&lt;/p&gt;

&lt;p&gt;객체는 “,” 컴마로 이어쓸 수 있고 ⏎으로 내려 사용할 수 있다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;변수(Variable):&lt;/strong&gt; 특정 메모리 주소에 저장된 값을 가리키는 이름표(label) 또는 식별자(identifier)입니다. 새로운 값을 할당하여 변경할 수 있습니다.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;딕셔너리 값 (Dictionary Value):&lt;/strong&gt; 딕셔너리 내의 특정 키(key)와 연결된 실제 데이터(예: 숫자, 문자열, 다른 딕셔너리, 리스트 등 Values) 또는 해당 데이터가 저장된 메모리 위치를 가리키는 참조입니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;딕셔너리의 가져오는 함수들&lt;/p&gt;

&lt;p&gt;키 함수 key() 값 함수 values() 객체 함수 items() 없으면 오류 get()은 없어도 넘어간다. &lt;/p&gt;

&lt;h3&gt;
  
  
  집합의 함수
&lt;/h3&gt;

&lt;p&gt;set() 집합은 중복이 없다. set([]) &amp;amp;교 |합 -차 로 출력 된다. &lt;/p&gt;

&lt;p&gt;변수에 추가 .add(값)  업데이트 .updata() 삭제 .del() 하여 사용 된다.&lt;/p&gt;

&lt;h3&gt;
  
  
  형변환
&lt;/h3&gt;

&lt;p&gt;중복이 되어 있는 변수는 set() 함수를 통해 중복을 제거할 수 있다.&lt;/p&gt;

&lt;p&gt;“숫자” = str 형태 int( 숫자)는 정수(Integer) float(숫자)는 실수(Real Number)가 된다.&lt;/p&gt;

&lt;p&gt;함수의 성질의 값으로 객체를 변화 시킴 Int() float() type()&lt;/p&gt;

&lt;p&gt;int(문자)가 들어가면 “ValueError” 값오류가 나온다.&lt;/p&gt;

&lt;h3&gt;
  
  
  참고: 신택스에러,
&lt;/h3&gt;

&lt;p&gt;SyntaxError: invalid syntax: 문법:구문 오류&lt;/p&gt;

&lt;p&gt;IndentationError: unexpected inden: 들여쓰기 잘못, 탭과 공백이 혼합&lt;/p&gt;

&lt;p&gt;💡&lt;/p&gt;

&lt;p&gt;파이썬의 코드컨밴션 규칙 &lt;/p&gt;

&lt;p&gt;(AI에게 코드를 맡긴다고 하면 일관성 유지를 위해 코드컨밴센의 원칙을 프롬프트 해야 함.)&lt;/p&gt;

&lt;p&gt;공통 규칙&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;들여쓰기는 공백 4칸을 사용. tab 사용 불가&lt;/li&gt;
&lt;li&gt;각 줄의 최대 길이는 79자로 제한. 길어질 경우 \ 또는 괄호를 사용하여 다음줄로 나눔&lt;/li&gt;
&lt;li&gt;모듈 레벨 함수 및 클래스 정의는 두줄 간격으로 작성&lt;/li&gt;
&lt;li&gt;괄호, 중괄호, 대괄호 내부에는 공백 사용 금지&lt;/li&gt;
&lt;li&gt;쉼표, 콜론, 세미콜론 앞에 공백 사용 금지. 뒤에는 공백 사용&lt;/li&gt;
&lt;li&gt;주석은 한 줄의 경우 #을 사용하고 코드와 두칸의 공백을 둠. 여러 줄의 경우 """을 사용&lt;/li&gt;
&lt;li&gt;docstring 작성시 """을 사용&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;변수 및 함수&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;변수 및 함수명은 영어소문자 및 밑줄(_)로 구성된 snake_case로 작성&lt;/li&gt;
&lt;li&gt;상수는 영어대문자 및 밑줄(_)로 작성. 모듈 수준에서만 작성.&lt;/li&gt;
&lt;li&gt;연산자 앞뒤에 공백 사용&lt;/li&gt;
&lt;li&gt;문자열의 경우 쌍따옴표(")를 사용&lt;/li&gt;
&lt;li&gt;함수의 docstring은 함수에 대한 설명, args, return에 대한 설명을 포함&lt;/li&gt;
&lt;li&gt;함수 정의시 typing과 hint를 사용하여 타입 명명&lt;/li&gt;
&lt;li&gt;bool 값 비교시 is 또는 is not을 사용&lt;/li&gt;
&lt;li&gt;한 줄 조건문은 삼항 연산자를 사용&lt;/li&gt;
&lt;li&gt;간단한 함수의 경우 lambda 사용&lt;/li&gt;
&lt;li&gt;글로벌 변수의 경우 모듈내에서만 사용하고 g_로 시작
자료구조&lt;/li&gt;
&lt;li&gt;list와 dict 초기화시 list(), dict() 사용&lt;/li&gt;
&lt;li&gt;set과 tuple 초기화시 set(), tuple() 사용&lt;/li&gt;
&lt;li&gt;간단한 list의 경우 list comprehension을 사용&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;클래스&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;클래스명은 CamelCase로 작성&lt;/li&gt;
&lt;li&gt;클래스 상속시, 상위부모부터 순서대로 작성.&lt;/li&gt;
&lt;li&gt;클래스내 메서드는 한줄 간격으로 작성.&lt;/li&gt;
&lt;li&gt;메서드명은 snake_case로 작성&lt;/li&gt;
&lt;li&gt;private의 경우 두 개의 밑줄(__)로 시작&lt;/li&gt;
&lt;li&gt;protected의 경우 한 개의 밑줄(_)로 시작&lt;/li&gt;
&lt;li&gt;타입 검사시 isinstance()를 사용&lt;/li&gt;
&lt;li&gt;클래스 변수는 클래스명과 밑줄(_)로 구분&lt;/li&gt;
&lt;li&gt;클래스 정의시 생성자와 소멸자, &lt;strong&gt;str&lt;/strong&gt;은 필수로 작성
모듈 및 패키지&lt;/li&gt;
&lt;li&gt;각 패키지 및 모듈은 별도의 줄에 작성&lt;/li&gt;
&lt;li&gt;표준 라이브러리, 서드 파티 모듈, 로컬 모듈 순서로 작성&lt;/li&gt;
&lt;li&gt;모듈명은 영어 소문자로 작성&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;파일 입출력&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;파일을 열 때는 with을 사용하여 자동으로 닫히도록 함.&lt;/li&gt;
&lt;li&gt;로그 작성시 날짜와 시간은 반드시 포함할 것.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  조건문  :
&lt;/h3&gt;

&lt;p&gt;if 일때  조건 변수==(! =)값 : 같으면   다음으로   &lt;/p&gt;

&lt;h1&gt;
  
  
  &amp;gt; = 이상
&lt;/h1&gt;

&lt;h1&gt;
  
  
  &amp;lt; 이전
&lt;/h1&gt;

&lt;h1&gt;
  
  
  and 그리고
&lt;/h1&gt;

&lt;p&gt;and not 그렇지않고 &lt;/p&gt;

&lt;p&gt;or 또는&lt;/p&gt;

&lt;p&gt;elif 조건 그렇지 않고&lt;/p&gt;

&lt;p&gt;else:  위 전부 아니라면 다음으로&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;점수를 입력하세요 (0~100): &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;attendance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;출석률을 입력하세요 (0~100): &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# 1. 기본 범위 체크 (비교 연산자, 논리 연산자)
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;attendance&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;attendance&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;입력 값이 유효 범위를 벗어났습니다.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# 2. 중첩 if: 과락(40점 미만) 먼저 체크
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;결과: 불합격 (과락)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# 3. 다중 조건 if-elif-else로 등급 산정
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;attendance&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;grade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;attendance&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;grade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;B&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;attendance&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;grade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;C&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;grade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;D&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;grade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;F&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

        &lt;span class="c1"&gt;# 4. 추가 조건: 우수/경고 태그 부여 (중첩 if, not, 비교 연산자)
&lt;/span&gt;        &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;grade&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;B&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;attendance&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; (우수)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;grade&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;D&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attendance&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; (출석 경고)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;점수: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, 출석률: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;attendance&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;최종 등급: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;grade&lt;/span&gt;&lt;span class="si"&gt;}{&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;반복문 while :&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;while 조건에 맞을 때 까지 반복&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;guest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;guest&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;손님이 {} 명 입니다.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;guest&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;guest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;guest&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;guest&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;손님이 꽉 찼습니다.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;짝 {}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;홀 {}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;hap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;hap&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;
    &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;반복문 for :&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;for 순차적인 요소가 있을 경우 &lt;/p&gt;

&lt;p&gt;요소함수 enumerate(요소[,start=])&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;abcdef&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nx"&gt;는&lt;/span&gt; &lt;span class="nx"&gt;차순반복함수&lt;/span&gt;  &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;더하면서&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nx"&gt;를&lt;/span&gt; &lt;span class="nf"&gt;하면서 &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;부터&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="nx"&gt;까지&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nx"&gt;씩&lt;/span&gt; &lt;span class="nx"&gt;넘어가기의&lt;/span&gt; &lt;span class="nx"&gt;의미&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;  &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; 
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;student&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;홍길동&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;가체즈&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;가가멜&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerater&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;())[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{} 이름: {} 점수: {}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# 묶어쓰기
&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="c1"&gt;#풀어쓰기
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;
        &lt;span class="n"&gt;gugudan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{} X {} = {}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gugudan&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# gugudan = [i * j for i in range(2, 10) for j in range(1, 10)]
# print(gugudan)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;묶어쓰기와 풀어쓰기를 자유자제로 쓸 수 있도록 반복 훈련 중요&lt;/p&gt;

&lt;p&gt;cotinue 걸려저서 나온 것에 반복&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="n"&gt;hap&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;홀수의 합 {}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hap&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;break 조건에 걸리면 정지&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  사용자 입력 받기
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;사용자 이름을 입력하세요.&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;num1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;숫자1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;num2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;숫자2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;num2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;langs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;한국어&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;English&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;langs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;starts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{}. {}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;sel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;언어를 선택하세요.&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isnumeric&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="n"&gt;sel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;sel&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;사용자가 선택한 언어는 {} 입니다.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;langs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  파일 읽고 쓰기
&lt;/h3&gt;

&lt;h3&gt;
  
  
  내장함수 100선
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;No.&lt;/th&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example Code # 결과값&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Type Conversion&lt;/td&gt;
&lt;td&gt;abs()&lt;/td&gt;
&lt;td&gt;절대값 반환&lt;/td&gt;
&lt;td&gt;print(abs(-5))  # 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Type Conversion&lt;/td&gt;
&lt;td&gt;int()&lt;/td&gt;
&lt;td&gt;정수형으로 변환&lt;/td&gt;
&lt;td&gt;x = int('42'); print(x)  # 42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Type Conversion&lt;/td&gt;
&lt;td&gt;float()&lt;/td&gt;
&lt;td&gt;부동소수점으로 변환&lt;/td&gt;
&lt;td&gt;y = float('3.14'); print(y)  # 3.14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Type Conversion&lt;/td&gt;
&lt;td&gt;str()&lt;/td&gt;
&lt;td&gt;문자열로 변환&lt;/td&gt;
&lt;td&gt;s = str(123); print(s)  # '123'&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Type Conversion&lt;/td&gt;
&lt;td&gt;bool()&lt;/td&gt;
&lt;td&gt;부울값으로 변환&lt;/td&gt;
&lt;td&gt;b = bool(1); print(b)  # True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Type Conversion&lt;/td&gt;
&lt;td&gt;list()&lt;/td&gt;
&lt;td&gt;리스트로 변환&lt;/td&gt;
&lt;td&gt;lst = list('abc'); print(lst)  # ['a', 'b', 'c']&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Type Conversion&lt;/td&gt;
&lt;td&gt;tuple()&lt;/td&gt;
&lt;td&gt;튜플로 변환&lt;/td&gt;
&lt;td&gt;tpl = tuple([1, 2]); print(tpl)  # (1, 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Type Conversion&lt;/td&gt;
&lt;td&gt;dict()&lt;/td&gt;
&lt;td&gt;딕셔너리로 변환&lt;/td&gt;
&lt;td&gt;d = dict([('a', 1)]); print(d)  # {'a': 1}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Type Conversion&lt;/td&gt;
&lt;td&gt;set()&lt;/td&gt;
&lt;td&gt;집합으로 변환&lt;/td&gt;
&lt;td&gt;s = set([1, 2, 2]); print(s)  # {1, 2}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Type Conversion&lt;/td&gt;
&lt;td&gt;complex()&lt;/td&gt;
&lt;td&gt;복소수로 변환&lt;/td&gt;
&lt;td&gt;c = complex(1, 2); print(c)  # (1+2j)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Type Check&lt;/td&gt;
&lt;td&gt;type()&lt;/td&gt;
&lt;td&gt;객체의 타입 반환&lt;/td&gt;
&lt;td&gt;print(type(42))  # &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Type Check&lt;/td&gt;
&lt;td&gt;isinstance()&lt;/td&gt;
&lt;td&gt;객체가 특정 타입인지 확인&lt;/td&gt;
&lt;td&gt;print(isinstance(42, int))  # True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;Type Check&lt;/td&gt;
&lt;td&gt;callable()&lt;/td&gt;
&lt;td&gt;객체가 호출 가능한지 확인&lt;/td&gt;
&lt;td&gt;print(callable(print))  # True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;Sequence&lt;/td&gt;
&lt;td&gt;len()&lt;/td&gt;
&lt;td&gt;시퀀스 길이 반환&lt;/td&gt;
&lt;td&gt;print(len([1, 2, 3]))  # 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;Sequence&lt;/td&gt;
&lt;td&gt;max()&lt;/td&gt;
&lt;td&gt;최댓값 반환&lt;/td&gt;
&lt;td&gt;print(max([3, 1, 2]))  # 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Sequence&lt;/td&gt;
&lt;td&gt;min()&lt;/td&gt;
&lt;td&gt;최솟값 반환&lt;/td&gt;
&lt;td&gt;print(min([3, 1, 2]))  # 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;Sequence&lt;/td&gt;
&lt;td&gt;sum()&lt;/td&gt;
&lt;td&gt;요소의 합 반환&lt;/td&gt;
&lt;td&gt;print(sum([1, 2, 3]))  # 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;Sequence&lt;/td&gt;
&lt;td&gt;sorted()&lt;/td&gt;
&lt;td&gt;정렬된 리스트 반환&lt;/td&gt;
&lt;td&gt;print(sorted([3, 1, 2]))  # [1, 2, 3]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;Sequence&lt;/td&gt;
&lt;td&gt;reversed()&lt;/td&gt;
&lt;td&gt;역순 이터레이터 반환&lt;/td&gt;
&lt;td&gt;list(reversed([1, 2, 3]))  # [3, 2, 1]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;Sequence&lt;/td&gt;
&lt;td&gt;enumerate()&lt;/td&gt;
&lt;td&gt;인덱스와 값 반환&lt;/td&gt;
&lt;td&gt;for i, v in enumerate(['a']): print(i, v)  # 0 a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;Sequence&lt;/td&gt;
&lt;td&gt;zip()&lt;/td&gt;
&lt;td&gt;여러 시퀀스 묶음&lt;/td&gt;
&lt;td&gt;list(zip([1, 2], ['a', 'b']))  # [(1, 'a'), (2, 'b')]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;Iterator&lt;/td&gt;
&lt;td&gt;iter()&lt;/td&gt;
&lt;td&gt;이터레이터 객체 반환&lt;/td&gt;
&lt;td&gt;it = iter([1, 2]); next(it)  # 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;Iterator&lt;/td&gt;
&lt;td&gt;next()&lt;/td&gt;
&lt;td&gt;이터레이터의 다음 요소 반환&lt;/td&gt;
&lt;td&gt;it = iter([1, 2]); print(next(it))  # 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;Functional&lt;/td&gt;
&lt;td&gt;map()&lt;/td&gt;
&lt;td&gt;함수를 시퀀스에 적용&lt;/td&gt;
&lt;td&gt;list(map(str, [1, 2]))  # ['1', '2']&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;Functional&lt;/td&gt;
&lt;td&gt;filter()&lt;/td&gt;
&lt;td&gt;조건에 맞는 요소 필터링&lt;/td&gt;
&lt;td&gt;list(filter(lambda x: x &amp;gt; 1, [1, 2]))  # [2]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;Functional&lt;/td&gt;
&lt;td&gt;reduce()&lt;/td&gt;
&lt;td&gt;누적 함수 적용 (functools)&lt;/td&gt;
&lt;td&gt;reduce(lambda x, y: x+y, [1, 2, 3])  # 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;Functional&lt;/td&gt;
&lt;td&gt;lambda&lt;/td&gt;
&lt;td&gt;익명 함수 정의&lt;/td&gt;
&lt;td&gt;f = lambda x: x*2; print(f(5))  # 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;Functional&lt;/td&gt;
&lt;td&gt;all()&lt;/td&gt;
&lt;td&gt;모든 요소가 참인지 확인&lt;/td&gt;
&lt;td&gt;print(all([True, True]))  # True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;Functional&lt;/td&gt;
&lt;td&gt;any()&lt;/td&gt;
&lt;td&gt;하나 이상 참인지 확인&lt;/td&gt;
&lt;td&gt;print(any([False, True]))  # True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;ord()&lt;/td&gt;
&lt;td&gt;문자의 유니코드 값 반환&lt;/td&gt;
&lt;td&gt;print(ord('A'))  # 65&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;chr()&lt;/td&gt;
&lt;td&gt;유니코드 값의 문자 반환&lt;/td&gt;
&lt;td&gt;print(chr(65))  # 'A'&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;format()&lt;/td&gt;
&lt;td&gt;문자열 포맷팅&lt;/td&gt;
&lt;td&gt;'{} {}'.format('Hello', 'World')  # 'Hello World'&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;repr()&lt;/td&gt;
&lt;td&gt;객체의 문자열 표현 반환&lt;/td&gt;
&lt;td&gt;print(repr('hello'))  # "'hello'"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;ascii()&lt;/td&gt;
&lt;td&gt;ASCII 표현 반환&lt;/td&gt;
&lt;td&gt;print(ascii('café'))  # "'caf\xe9'"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;Numeric&lt;/td&gt;
&lt;td&gt;pow()&lt;/td&gt;
&lt;td&gt;거듭제곱 계산&lt;/td&gt;
&lt;td&gt;print(pow(2, 3))  # 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;Numeric&lt;/td&gt;
&lt;td&gt;round()&lt;/td&gt;
&lt;td&gt;숫자 반올림&lt;/td&gt;
&lt;td&gt;print(round(3.7))  # 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;Numeric&lt;/td&gt;
&lt;td&gt;divmod()&lt;/td&gt;
&lt;td&gt;몫과 나머지 반환&lt;/td&gt;
&lt;td&gt;print(divmod(10, 3))  # (3, 1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;Numeric&lt;/td&gt;
&lt;td&gt;hex()&lt;/td&gt;
&lt;td&gt;16진수 문자열 반환&lt;/td&gt;
&lt;td&gt;print(hex(255))  # '0xff'&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;td&gt;Numeric&lt;/td&gt;
&lt;td&gt;oct()&lt;/td&gt;
&lt;td&gt;8진수 문자열 반환&lt;/td&gt;
&lt;td&gt;print(oct(8))  # '0o10'&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;Numeric&lt;/td&gt;
&lt;td&gt;bin()&lt;/td&gt;
&lt;td&gt;2진수 문자열 반환&lt;/td&gt;
&lt;td&gt;print(bin(8))  # '0b1000'&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;td&gt;Dictionary&lt;/td&gt;
&lt;td&gt;dict.get()&lt;/td&gt;
&lt;td&gt;키 값 반환 (기본값 지정 가능)&lt;/td&gt;
&lt;td&gt;d = {'a': 1}; print(d.get('b', 0))  # 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;Dictionary&lt;/td&gt;
&lt;td&gt;dict.keys()&lt;/td&gt;
&lt;td&gt;모든 키 반환&lt;/td&gt;
&lt;td&gt;d = {'a': 1}; list(d.keys())  # ['a']&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;Dictionary&lt;/td&gt;
&lt;td&gt;dict.values()&lt;/td&gt;
&lt;td&gt;모든 값 반환&lt;/td&gt;
&lt;td&gt;d = {'a': 1}; list(d.values())  # [1]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;td&gt;Dictionary&lt;/td&gt;
&lt;td&gt;dict.items()&lt;/td&gt;
&lt;td&gt;키-값 쌍 반환&lt;/td&gt;
&lt;td&gt;d = {'a': 1}; list(d.items())  # [('a', 1)]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;Dictionary&lt;/td&gt;
&lt;td&gt;dict.pop()&lt;/td&gt;
&lt;td&gt;키 제거 및 값 반환&lt;/td&gt;
&lt;td&gt;d = {'a': 1}; d.pop('a')  # 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;td&gt;Dictionary&lt;/td&gt;
&lt;td&gt;dict.update()&lt;/td&gt;
&lt;td&gt;딕셔너리 업데이트&lt;/td&gt;
&lt;td&gt;d = {'a': 1}; d.update({'b': 2})  # {'a': 1, 'b': 2}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;List&lt;/td&gt;
&lt;td&gt;list.append()&lt;/td&gt;
&lt;td&gt;리스트 끝에 요소 추가&lt;/td&gt;
&lt;td&gt;lst = [1]; lst.append(2)  # [1, 2]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;List&lt;/td&gt;
&lt;td&gt;list.extend()&lt;/td&gt;
&lt;td&gt;리스트 확장&lt;/td&gt;
&lt;td&gt;lst = [1]; lst.extend([2, 3])  # [1, 2, 3]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;td&gt;List&lt;/td&gt;
&lt;td&gt;list.insert()&lt;/td&gt;
&lt;td&gt;특정 위치에 요소 삽입&lt;/td&gt;
&lt;td&gt;lst = [1, 3]; lst.insert(1, 2)  # [1, 2, 3]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;List&lt;/td&gt;
&lt;td&gt;list.remove()&lt;/td&gt;
&lt;td&gt;첫 번째 일치 요소 제거&lt;/td&gt;
&lt;td&gt;lst = [1, 2]; lst.remove(1)  # [2]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;td&gt;List&lt;/td&gt;
&lt;td&gt;list.pop()&lt;/td&gt;
&lt;td&gt;인덱스 요소 제거 및 반환&lt;/td&gt;
&lt;td&gt;lst = [1, 2]; lst.pop(0)  # 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;td&gt;List&lt;/td&gt;
&lt;td&gt;list.clear()&lt;/td&gt;
&lt;td&gt;모든 요소 제거&lt;/td&gt;
&lt;td&gt;lst = [1, 2]; lst.clear()  # []&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;td&gt;List&lt;/td&gt;
&lt;td&gt;list.index()&lt;/td&gt;
&lt;td&gt;요소의 인덱스 반환&lt;/td&gt;
&lt;td&gt;lst = [1, 2]; lst.index(2)  # 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;td&gt;List&lt;/td&gt;
&lt;td&gt;list.count()&lt;/td&gt;
&lt;td&gt;요소의 개수 반환&lt;/td&gt;
&lt;td&gt;lst = [1, 1, 2]; lst.count(1)  # 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;td&gt;List&lt;/td&gt;
&lt;td&gt;list.sort()&lt;/td&gt;
&lt;td&gt;리스트 정렬&lt;/td&gt;
&lt;td&gt;lst = [3, 1]; lst.sort()  # [1, 3]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;56&lt;/td&gt;
&lt;td&gt;List&lt;/td&gt;
&lt;td&gt;list.reverse()&lt;/td&gt;
&lt;td&gt;리스트 역순&lt;/td&gt;
&lt;td&gt;lst = [1, 2]; lst.reverse()  # [2, 1]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;str.split()&lt;/td&gt;
&lt;td&gt;문자열 분할&lt;/td&gt;
&lt;td&gt;s = 'a,b'; s.split(',')  # ['a', 'b']&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;str.join()&lt;/td&gt;
&lt;td&gt;문자열 결합&lt;/td&gt;
&lt;td&gt;''.join(['a', 'b'])  # 'ab'&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;str.strip()&lt;/td&gt;
&lt;td&gt;양쪽 공백 제거&lt;/td&gt;
&lt;td&gt;'  hello  '.strip()  # 'hello'&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;str.replace()&lt;/td&gt;
&lt;td&gt;문자열 대체&lt;/td&gt;
&lt;td&gt;'hello'.replace('h', 'H')  # 'Hello'&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;str.upper()&lt;/td&gt;
&lt;td&gt;대문자로 변환&lt;/td&gt;
&lt;td&gt;'hello'.upper()  # 'HELLO'&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;str.lower()&lt;/td&gt;
&lt;td&gt;소문자로 변환&lt;/td&gt;
&lt;td&gt;'HELLO'.lower()  # 'hello'&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;str.find()&lt;/td&gt;
&lt;td&gt;부분 문자열 위치 반환&lt;/td&gt;
&lt;td&gt;'hello'.find('ll')  # 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;str.startswith()&lt;/td&gt;
&lt;td&gt;문자열로 시작하는지 확인&lt;/td&gt;
&lt;td&gt;'hello'.startswith('he')  # True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;str.endswith()&lt;/td&gt;
&lt;td&gt;문자열로 끝나는지 확인&lt;/td&gt;
&lt;td&gt;'hello'.endswith('lo')  # True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;str.isdigit()&lt;/td&gt;
&lt;td&gt;모두 숫자인지 확인&lt;/td&gt;
&lt;td&gt;'123'.isdigit()  # True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;str.isalpha()&lt;/td&gt;
&lt;td&gt;모두 문자인지 확인&lt;/td&gt;
&lt;td&gt;'abc'.isalpha()  # True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;68&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;str.isalnum()&lt;/td&gt;
&lt;td&gt;모두 문자 또는 숫자인지 확인&lt;/td&gt;
&lt;td&gt;'abc123'.isalnum()  # True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;69&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;str.isspace()&lt;/td&gt;
&lt;td&gt;모두 공백인지 확인&lt;/td&gt;
&lt;td&gt;'   '.isspace()  # True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;Input/Output&lt;/td&gt;
&lt;td&gt;print()&lt;/td&gt;
&lt;td&gt;화면에 출력&lt;/td&gt;
&lt;td&gt;print('Hello', 'World')  # Hello World&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;71&lt;/td&gt;
&lt;td&gt;Input/Output&lt;/td&gt;
&lt;td&gt;input()&lt;/td&gt;
&lt;td&gt;사용자 입력 받음&lt;/td&gt;
&lt;td&gt;name = input('Name: ')  # 사용자 입력 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;td&gt;Input/Output&lt;/td&gt;
&lt;td&gt;open()&lt;/td&gt;
&lt;td&gt;파일 열기&lt;/td&gt;
&lt;td&gt;f = open('file.txt'); f.close()  # 파일 열고 닫기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;73&lt;/td&gt;
&lt;td&gt;Input/Output&lt;/td&gt;
&lt;td&gt;format()&lt;/td&gt;
&lt;td&gt;문자열 포맷팅&lt;/td&gt;
&lt;td&gt;f'{x:.2f}'  # 소수점 2자리로 표현&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;74&lt;/td&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;id()&lt;/td&gt;
&lt;td&gt;객체의 메모리 주소 반환&lt;/td&gt;
&lt;td&gt;print(id([1]))  # 메모리 주소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;hash()&lt;/td&gt;
&lt;td&gt;객체의 해시값 반환&lt;/td&gt;
&lt;td&gt;hash((1, 2))  # 해시값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;76&lt;/td&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;dir()&lt;/td&gt;
&lt;td&gt;객체의 속성 및 메서드 나열&lt;/td&gt;
&lt;td&gt;dir(list)  # 리스트의 메서드 리스트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;77&lt;/td&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;vars()&lt;/td&gt;
&lt;td&gt;객체의 &lt;strong&gt;dict&lt;/strong&gt; 반환&lt;/td&gt;
&lt;td&gt;vars(obj)  # 객체의 속성 딕셔너리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;globals()&lt;/td&gt;
&lt;td&gt;전역 심볼 테이블 반환&lt;/td&gt;
&lt;td&gt;print(globals()['&lt;strong&gt;name&lt;/strong&gt;'])  # '&lt;strong&gt;main&lt;/strong&gt;'&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;79&lt;/td&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;locals()&lt;/td&gt;
&lt;td&gt;지역 심볼 테이블 반환&lt;/td&gt;
&lt;td&gt;def f(): print(locals())  # 지역 변수 딕셔너리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;Iteration&lt;/td&gt;
&lt;td&gt;range()&lt;/td&gt;
&lt;td&gt;숫자 시퀀스 반환&lt;/td&gt;
&lt;td&gt;list(range(3))  # [0, 1, 2]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;81&lt;/td&gt;
&lt;td&gt;Iteration&lt;/td&gt;
&lt;td&gt;slice()&lt;/td&gt;
&lt;td&gt;슬라이스 객체 생성&lt;/td&gt;
&lt;td&gt;s = slice(1, 3); [0, 1, 2][s]  # [1, 2]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;82&lt;/td&gt;
&lt;td&gt;Object&lt;/td&gt;
&lt;td&gt;getattr()&lt;/td&gt;
&lt;td&gt;객체 속성값 반환&lt;/td&gt;
&lt;td&gt;getattr(obj, 'attr', None)  # 속성값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;83&lt;/td&gt;
&lt;td&gt;Object&lt;/td&gt;
&lt;td&gt;setattr()&lt;/td&gt;
&lt;td&gt;객체 속성값 설정&lt;/td&gt;
&lt;td&gt;setattr(obj, 'attr', value)  # 속성 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;84&lt;/td&gt;
&lt;td&gt;Object&lt;/td&gt;
&lt;td&gt;hasattr()&lt;/td&gt;
&lt;td&gt;객체가 속성을 가지는지 확인&lt;/td&gt;
&lt;td&gt;hasattr(obj, 'attr')  # True/False&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;td&gt;Object&lt;/td&gt;
&lt;td&gt;delattr()&lt;/td&gt;
&lt;td&gt;객체 속성 삭제&lt;/td&gt;
&lt;td&gt;delattr(obj, 'attr')  # 속성 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;86&lt;/td&gt;
&lt;td&gt;Object&lt;/td&gt;
&lt;td&gt;object&lt;/td&gt;
&lt;td&gt;모든 클래스의 기본 클래스&lt;/td&gt;
&lt;td&gt;class MyClass(object): pass  # 객체 상속&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;87&lt;/td&gt;
&lt;td&gt;Class&lt;/td&gt;
&lt;td&gt;super()&lt;/td&gt;
&lt;td&gt;부모 클래스 메서드 호출&lt;/td&gt;
&lt;td&gt;super().&lt;strong&gt;init&lt;/strong&gt;()  # 부모 클래스 초기화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;88&lt;/td&gt;
&lt;td&gt;Class&lt;/td&gt;
&lt;td&gt;classmethod&lt;/td&gt;
&lt;td&gt;클래스 메서드 데코레이터&lt;/td&gt;
&lt;td&gt;@classmethod def method(cls): pass&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;89&lt;/td&gt;
&lt;td&gt;Class&lt;/td&gt;
&lt;td&gt;staticmethod&lt;/td&gt;
&lt;td&gt;정적 메서드 데코레이터&lt;/td&gt;
&lt;td&gt;@staticmethod def method(): pass&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;90&lt;/td&gt;
&lt;td&gt;Class&lt;/td&gt;
&lt;td&gt;property&lt;/td&gt;
&lt;td&gt;속성 데코레이터&lt;/td&gt;
&lt;td&gt;@property def attr(self): return self._attr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;td&gt;Execution&lt;/td&gt;
&lt;td&gt;exec()&lt;/td&gt;
&lt;td&gt;파이썬 코드 실행&lt;/td&gt;
&lt;td&gt;exec('x = 1 + 1'); print(x)  # 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;92&lt;/td&gt;
&lt;td&gt;Execution&lt;/td&gt;
&lt;td&gt;eval()&lt;/td&gt;
&lt;td&gt;표현식 계산&lt;/td&gt;
&lt;td&gt;eval('2 + 2')  # 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;td&gt;Execution&lt;/td&gt;
&lt;td&gt;compile()&lt;/td&gt;
&lt;td&gt;파이썬 코드 컴파일&lt;/td&gt;
&lt;td&gt;code = compile('x=1', '', 'exec')&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;94&lt;/td&gt;
&lt;td&gt;Module&lt;/td&gt;
&lt;td&gt;import&lt;/td&gt;
&lt;td&gt;모듈 임포트&lt;/td&gt;
&lt;td&gt;import math; print(math.pi)  # 3.14159...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;95&lt;/td&gt;
&lt;td&gt;Module&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;import&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;모듈 동적 임포트&lt;/td&gt;
&lt;td&gt;mod = &lt;strong&gt;import&lt;/strong&gt;('math')  # 모듈 로드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;96&lt;/td&gt;
&lt;td&gt;Control&lt;/td&gt;
&lt;td&gt;exit()&lt;/td&gt;
&lt;td&gt;프로그램 종료&lt;/td&gt;
&lt;td&gt;exit()  # 프로그램 종료&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;97&lt;/td&gt;
&lt;td&gt;Control&lt;/td&gt;
&lt;td&gt;quit()&lt;/td&gt;
&lt;td&gt;인터프리터 종료&lt;/td&gt;
&lt;td&gt;quit()  # 대화형 모드 종료&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  사용자 함수
&lt;/h3&gt;

&lt;p&gt;기초지식&lt;/p&gt;

&lt;p&gt;매개변수(파라메타, 파람, 인지값): 함수에 인뭇 데이터를 전달하기 위한 변수&lt;/p&gt;

&lt;p&gt;지역변수 = 개인 사물함&lt;/p&gt;

&lt;p&gt;전역변수 = 공용 사물함&lt;/p&gt;

&lt;p&gt;집에서 방마다 사물함이 있다고 상상해 보자. &lt;strong&gt;지역변수&lt;/strong&gt;는 각 방(함수) 안의 &lt;strong&gt;개인 사물함&lt;/strong&gt;처럼 그 방에서만 쓸 수 있고, 방을 나가면 사라진다. 반대로 &lt;strong&gt;전역변수&lt;/strong&gt;는 집 전체(프로그램)의 &lt;strong&gt;공용 사물함&lt;/strong&gt;처럼 어느 방에서도 쓸 수 있고, 집이 문 닫힐 때까지 남아 있다.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 전역변수: 집 전체에서 공유 (공용 사물함)
# 이 코드에서 money(global variable)는 함수 밖에서 선언되어 모든 함수에서 접근 가능하며, 
# data segment에 저장되어 프로그램 lifetime 동안 지속된다. 
# 반면 candy_price, toy_price(local variables)는 함수 블록 내에서만 유효하며, 
# 함수 종료 시 stack에서 자동 해제된다.
&lt;/span&gt;
&lt;span class="n"&gt;money&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;  &lt;span class="c1"&gt;# 프로그램 시작 시 생성, 종료까지 유지
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;eat_candy&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;  &lt;span class="c1"&gt;# 방1: 사탕 사먹기
&lt;/span&gt;    &lt;span class="n"&gt;candy_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;  &lt;span class="c1"&gt;# 지역변수: 이 방에서만 (개인 사물함)
&lt;/span&gt;    &lt;span class="n"&gt;money&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="n"&gt;candy_price&lt;/span&gt;  &lt;span class="c1"&gt;# 공용 사물함에서 돈 빼기
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;사탕 사먹고 돈 남음: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;money&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;원&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 800원 출력
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;buy_toy&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;  &lt;span class="c1"&gt;# 방2: 장난감 사기
&lt;/span&gt;    &lt;span class="n"&gt;toy_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;  &lt;span class="c1"&gt;# 지역변수: 이 방에서만 (다른 방에선 못 봄)
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;장난감 가격: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;toy_price&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;원&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 500원 출력
&lt;/span&gt;    &lt;span class="c1"&gt;# candy_price는 여기서 못 씀! (NameError 발생)
&lt;/span&gt;
&lt;span class="nf"&gt;eat_candy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# 800원 출력
&lt;/span&gt;&lt;span class="nf"&gt;buy_toy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;    &lt;span class="c1"&gt;# 500원 출력
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;최종 돈: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;money&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;원&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 800원 출력 (전역변수 유지)
&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;구분&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;지역변수 (Local)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;전역변수 (Global)&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;선언 위치&lt;/td&gt;
&lt;td&gt;함수/블록 내부&lt;/td&gt;
&lt;td&gt;함수 외부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;접근 범위&lt;/td&gt;
&lt;td&gt;선언된 블록 내 한정&lt;/td&gt;
&lt;td&gt;프로그램 전체&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;수명&lt;/td&gt;
&lt;td&gt;블록 종료 시 소멸&lt;/td&gt;
&lt;td&gt;프로그램 종료 시 소멸&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;메모리&lt;/td&gt;
&lt;td&gt;Stack (빠름)&lt;/td&gt;
&lt;td&gt;Data segment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best Practice&lt;/td&gt;
&lt;td&gt;우선 사용 (모듈화 ↑)&lt;/td&gt;
&lt;td&gt;최소화 (버그 위험 ↓)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;****지역변수를 전역변수로 불러 오는 함수 global 변수&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_input_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;casting&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;user_input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="c1"&gt;# 이름 입력일 때, 빈 문자열이면 안내 후 다시 입력
&lt;/span&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;casting&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;user_inputstrs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
                &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;이름이 입력되지 않았습니다.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;continue&lt;/span&gt;

            &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;casting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;

&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_input_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;사용자 이름을 입력하세요&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_input_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;사용자 나이를 입렵하세요&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="c1"&gt;# 1.casting=int (,int)생략
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;뮤테이블(콜바이레퍼런스) List Dictionay&lt;/p&gt;

&lt;p&gt;독스트링&lt;/p&gt;

&lt;p&gt;포지셔널 아규먼트&lt;/p&gt;

&lt;p&gt;키워드 아큐먼트&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_input_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;casting&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;'''&lt;/span&gt;&lt;span class="s"&gt;독스트린: 리드미 사용자에게 msg를 출력하고 casting 형태를 확인하여 입력된 값을 리턴합니다.
    파이썬에서 독스트링(docstring)과 주석(comment)은 코드 가독성과 문서화를 위한 도구지만, 문법, 접근성, 용도에서 명확한 차이를 보인다.
    Args:
        msg (str) : input 시 출력할 문구
        castring (class) : 사용자에게 입력 받은 값
    &lt;/span&gt;&lt;span class="sh"&gt;'''&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;user_input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c1"&gt;# 공백만 입력했을 때는 다시 입력 요구
&lt;/span&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;casting&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
                &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;이름이 입력되지 않았습니다.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;continue&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;casting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# 형 변환 실패하면 다시 입력
&lt;/span&gt;            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;잘못된 입력입니다. 다시 입력하세요.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_prime_number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;prime_lists&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;primes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;prime_lists&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;prime_lists&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
    &lt;span class="n"&gt;primes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;prime_lists&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;primes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;

&lt;span class="c1"&gt;# 함수 밖에서 입력 및 출력 처리
&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_input_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2 이상의 숫자를 입력하세요&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;is_prime_number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{} 는 소수 입니다.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{} 는 소수가 아닙니다. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;save_winner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="c1"&gt;#튜플/ *args포지셔널 아규먼트 들어간 순서를 지켜 준다. *하나
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;save_winner2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="c1"&gt;#     **kwargs 키워드 아규먼트 이름을 키를 주고 값을 같이 넘긴다. **둘
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;kwrgs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;#파이썬의 함수의 특징은 일급객체라고 하는데 함수를 변수의 닮을 수 있는 것이 특징
&lt;/span&gt;


&lt;span class="nf"&gt;save_winner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;홍길동&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;save_winner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;홍길동&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;가가멜&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;save_winner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;홍길동&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;가가멜&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;아즈라엘&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;save_winner2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;namel1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;홍길동&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;가가멜&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;hello&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hi&lt;/span&gt; &lt;span class="c1"&gt;# 
&lt;/span&gt;&lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;   &lt;span class="c1"&gt;# hi함수는 ()로 닮을 수 있는 반면 hello라는 변수를 만들어서 hi를 직관적으로 닮을 수 있다.
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 오호~~~ 신기함. 진관적이라 이해가 좀 안감. 일단 암기
&lt;/span&gt;
&lt;span class="c1"&gt;##함수 안네 함수 넣기
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;outer_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;inner_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="c1"&gt;#만약 어떤 인자가 넘어 올지 모르는 상황이면~
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;함수명: )


              클로저 기술  일급 함수에 네임바인딩 기술?

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;파이썬 함수의 특징&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;(언젠가는 써먹는다 &amp;amp; 누군가(실력자)의 코드를 보고 대충 파악하려면 대충 알고 넘어가자~!)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;파이썬에서 &lt;strong&gt;클로저&lt;/strong&gt;는 “함수 + 그 함수가 기억해야 할 변수들(환경)을 한 덩어리로 묶어 둔 것”이고, &lt;strong&gt;일급 함수&lt;/strong&gt;는 “함수를 숫자처럼 변수에 넣고, 다른 함수에 주고, 다시 돌려줄 수 있는 것”을 말한다. 이름 바인딩(name binding)은 “이름(변수)이 실제 값(객체)을 가리키도록 연결하는 것”이고, 클로저는 그 연결을 함수 안에 꼭 붙들고 있는 기술이라고 보면 된다.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. 일급 함수: 함수도 ‘장난감’이다
&lt;/h3&gt;

&lt;p&gt;초등학생 비유로 설명해 보자.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“숫자”는 장난감처럼 상자에 넣을 수 있다 → &lt;strong&gt;&lt;code&gt;x = 10&lt;/code&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;파이썬에서는 “함수”도 장난감처럼 상자에 넣을 수 있다 → &lt;strong&gt;&lt;code&gt;f = hello&lt;/code&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;안녕, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;

&lt;span class="c1"&gt;# 1) 함수 이름을 변수에 넣기 (이름 바인딩)
&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;          &lt;span class="c1"&gt;# h라는 이름이 hello 함수를 가리킴
&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;민수&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# "안녕, 민수"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;여기서 &lt;strong&gt;&lt;code&gt;h = hello&lt;/code&gt;&lt;/strong&gt;는 “&lt;strong&gt;&lt;code&gt;h&lt;/code&gt;&lt;/strong&gt;라는 이름을 &lt;strong&gt;&lt;code&gt;hello&lt;/code&gt;&lt;/strong&gt;라는 함수 객체에 &lt;strong&gt;바인딩&lt;/strong&gt;한다(이름을 붙인다)”는 뜻이다.&lt;/li&gt;
&lt;li&gt;함수가 숫자처럼 변수에 들어가고, 다른 함수에 넘겨질 수 있으니까 “일급 함수(first-class function)”라고 부른다.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. 클로저: 기억을 가진 함수
&lt;/h3&gt;

&lt;p&gt;이제 “기억하는 함수” 예제를 보자.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pythondef&lt;/span&gt; &lt;span class="nf"&gt;make_adder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;        &lt;span class="c1"&gt;# x를 기억시키고 싶은 바깥 함수
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;adder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;         &lt;span class="c1"&gt;# 안쪽 함수(클로저가 될 후보)
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;      &lt;span class="c1"&gt;# 바깥의 x를 사용
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;adder&lt;/span&gt;          &lt;span class="c1"&gt;# 안쪽 함수를 그대로 돌려줌
&lt;/span&gt;
&lt;span class="n"&gt;add_5&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;make_adder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;# x = 5를 기억하는 adder를 하나 만듦
&lt;/span&gt;&lt;span class="n"&gt;add_10&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;make_adder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# x = 10을 기억하는 adder를 또 만듦
&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add_5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;           &lt;span class="c1"&gt;# 5 + 3 = 8
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add_10&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;          &lt;span class="c1"&gt;# 10 + 3 = 13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;make_adder(5)&lt;/code&gt;&lt;/strong&gt;를 호출할 때 &lt;strong&gt;&lt;code&gt;x&lt;/code&gt;&lt;/strong&gt;라는 이름은 값 &lt;strong&gt;&lt;code&gt;5&lt;/code&gt;&lt;/strong&gt;에 바인딩된다.&lt;/li&gt;
&lt;li&gt;파이썬은 &lt;strong&gt;&lt;code&gt;adder&lt;/code&gt;&lt;/strong&gt; 함수 객체 안에 “&lt;strong&gt;&lt;code&gt;x&lt;/code&gt;&lt;/strong&gt;라는 이름은 5를 가리켜야 해”라는 정보를 같이 저장해 둔다.&lt;/li&gt;
&lt;li&gt;이렇게 &lt;strong&gt;바깥 함수가 끝난 뒤에도, 안쪽 함수가 바깥 변수에 대한 이름 바인딩을 “기억”하는 것&lt;/strong&gt;이 클로저다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;초등학생 버전 비유:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;make_adder&lt;/code&gt;&lt;/strong&gt; = “숫자를 기억하는 로봇을 만드는 공장”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;add_5&lt;/code&gt;&lt;/strong&gt; = “5라는 숫자를 기억하는 로봇”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;add_10&lt;/code&gt;&lt;/strong&gt; = “10이라는 숫자를 기억하는 로봇”&lt;/li&gt;
&lt;li&gt;로봇 안에는 “내가 기억한 숫자” 칸이 있고, 이 칸을 통해 계속 계산을 한다 → 이 “내부 기억 칸”이 바로 클로저의 환경(environment)이다.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. 이름 바인딩 기술: 클로저 안에서 어떻게 기억하나?
&lt;/h3&gt;

&lt;p&gt;조금 더 “엔지니어 시점”으로 보면:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;클로저는 “&lt;strong&gt;렉시컬 스코프 기반 name binding을 유지하는 레코드(환경) + 함수 코드&lt;/strong&gt;”이다.&lt;/li&gt;
&lt;li&gt;파이썬 함수 객체에는 &lt;strong&gt;&lt;code&gt;__closure__&lt;/code&gt;&lt;/strong&gt;라는 속성이 있고, 여기에 캡처된 변수들이 &lt;strong&gt;cell 객체&lt;/strong&gt; 형태로 저장된다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;간단히 내부 구조를 엿보는 예:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pythondef&lt;/span&gt; &lt;span class="nf"&gt;outer&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;        &lt;span class="c1"&gt;# 이 변수를 클로저가 캡처
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;       &lt;span class="c1"&gt;# 바깥 변수 사용
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;inner&lt;/span&gt;

&lt;span class="n"&gt;fn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;outer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;             &lt;span class="c1"&gt;# 클로저 생성
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;              &lt;span class="c1"&gt;# "hello"
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__closure__&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;cell_contents&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# "hello" 를 내부에서 들고 있음
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;msg&lt;/code&gt;&lt;/strong&gt;라는 이름이 가리키는 실제 객체에 대한 참조가 &lt;strong&gt;&lt;code&gt;__closure__&lt;/code&gt;&lt;/strong&gt; 안의 cell에 저장되어 있어서, &lt;strong&gt;&lt;code&gt;outer&lt;/code&gt;&lt;/strong&gt;가 끝나도 GC로 날아가지 않고 계속 살아 있다.&lt;/li&gt;
&lt;li&gt;이 구조 덕분에 “클로저 = 함수가 만들어질 때의 이름 바인딩(환경)을 함께 싸서 들고 다니는 객체”로 동작한다.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. 한 줄 정의들
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;일급 함수: “함수도 숫자처럼 상자(변수)에 넣고, 친구한테 건네줄 수 있는 언어의 기능”이다.&lt;/li&gt;
&lt;li&gt;이름 바인딩: “이름표(변수)를 어떤 진짜 물건(값, 함수)에 붙여 주는 것”이다.&lt;/li&gt;
&lt;li&gt;클로저: “밖에서 가져온 값을 기억한 채로 계속 써 먹는 똑똑한 함수”이고, 이때 기억을 유지하는 방식이 바로 ‘렉시컬 스코프 기반 이름 바인딩을 저장하는 레코드(환경)를 함수와 같이 들고 다니는 것’이다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;원하면, 위 예제를 가지고 “파이썬 Tutor 스타일”로 호출 스택/환경 그림을 같이 그려 주면서 더 포멀하게 정리해 줄 수 있다&lt;/p&gt;




</description>
      <category>python</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
