A function is a block of reusable code that performs a specific task. Instead of repeating code, define it once and call it whenever needed.
🔍 Why Use Functions?
✅ Makes code reusable
✅ Improves readability
✅ Easier to test and debug
<div class="infographic-pyfunc">
<style>
.infographic-pyfunc {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--ok: #1a7f4e;
--ok-soft: #e3f5ec;
--c-keyword: #7c3aed;
--c-keyword-soft: #ede9fe;
--c-name: #2563eb;
--c-name-soft: #e3ebfd;
--c-params: #b45309;
--c-params-soft: #fdf0dc;
--c-body: #1a7f4e;
--c-body-soft: #e3f5ec;
--display-font: 'Fraunces', Georgia, serif;
--body-font: 'Inter', -apple-system, sans-serif;
--mono-font: 'IBM Plex Mono', 'Courier New', monospace;
max-width: 680px;
margin: 0 auto;
box-sizing: border-box;
font-family: var(--body-font);
color: var(--ink);
background: var(--paper);
}
.infographic-pyfunc[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--ok: #5cd6a0;
--ok-soft: #16342a;
--c-keyword: #a78bfa;
--c-keyword-soft: #2c2140;
--c-name: #5b8def;
--c-name-soft: #202942;
--c-params: #e0a458;
--c-params-soft: #3a2c14;
--c-body: #5cd6a0;
--c-body-soft: #16342a;
}
.infographic-pyfunc * { box-sizing: border-box; }
.infographic-pyfunc .ig-inner { padding: 1.75rem clamp(1.25rem, 5vw, 3rem) 2rem; }
.infographic-pyfunc .ig-title {
font-family: var(--display-font); font-size: clamp(1.4rem, 4.5vw, 1.9rem);
font-weight: 600; text-align: center; margin: 0 0 2rem;
}
/* Anatomy line */
.infographic-pyfunc .code-line {
font-family: var(--mono-font); font-size: clamp(0.92rem, 3.4vw, 1.15rem);
text-align: center; background: var(--paper-alt); border: 1px solid var(--line);
padding: 1.4rem 1rem; line-height: 1.8;
}
.infographic-pyfunc .part {
cursor: pointer; padding: 0.15rem 0.3rem; border-radius: 4px; transition: background 0.15s, color 0.15s;
}
.infographic-pyfunc .part[data-part="keyword"].is-active { background: var(--c-keyword-soft); color: var(--c-keyword); }
.infographic-pyfunc .part[data-part="name"].is-active { background: var(--c-name-soft); color: var(--c-name); }
.infographic-pyfunc .part[data-part="params"].is-active { background: var(--c-params-soft); color: var(--c-params); }
.infographic-pyfunc .part[data-part="body"].is-active { background: var(--c-body-soft); color: var(--c-body); }
.infographic-pyfunc .legend {
display: grid; grid-template-columns: repeat(4, 1fr); gap: 0.6rem; margin-top: 1rem;
}
@media (max-width: 560px) { .infographic-pyfunc .legend { grid-template-columns: repeat(2, 1fr); } }
.infographic-pyfunc .legend-item {
border: 1px solid var(--line); border-top: 3px solid transparent; background: var(--paper);
padding: 0.6rem 0.7rem; cursor: pointer; text-align: center;
}
.infographic-pyfunc .legend-item .lbl { font-size: 0.78rem; font-weight: 700; }
.infographic-pyfunc .legend-item .desc { font-size: 0.7rem; color: var(--ink-soft); margin-top: 0.15rem; }
.infographic-pyfunc .legend-item[data-part="keyword"].is-active { border-top-color: var(--c-keyword); background: var(--c-keyword-soft); }
.infographic-pyfunc .legend-item[data-part="keyword"].is-active .lbl { color: var(--c-keyword); }
.infographic-pyfunc .legend-item[data-part="name"].is-active { border-top-color: var(--c-name); background: var(--c-name-soft); }
.infographic-pyfunc .legend-item[data-part="name"].is-active .lbl { color: var(--c-name); }
.infographic-pyfunc .legend-item[data-part="params"].is-active { border-top-color: var(--c-params); background: var(--c-params-soft); }
.infographic-pyfunc .legend-item[data-part="params"].is-active .lbl { color: var(--c-params); }
.infographic-pyfunc .legend-item[data-part="body"].is-active { border-top-color: var(--c-body); background: var(--c-body-soft); }
.infographic-pyfunc .legend-item[data-part="body"].is-active .lbl { color: var(--c-body); }
/* Machine */
.infographic-pyfunc .machine-wrap {
margin-top: 2.5rem; display: flex; align-items: center; justify-content: center; gap: 0.75rem; flex-wrap: wrap;
}
.infographic-pyfunc .chip-slot { position: relative; display: flex; flex-direction: column; align-items: center; }
.infographic-pyfunc .slot-tag {
font-size: 0.65rem; font-family: var(--mono-font); color: var(--ink-soft); margin-bottom: 0.35rem;
}
.infographic-pyfunc .arg-input {
width: 6.5rem; height: 2.5rem; font-family: var(--mono-font); font-size: 0.95rem; text-align: center;
border: 1px solid var(--line); background: var(--paper-alt); color: var(--ink); outline: none;
}
.infographic-pyfunc .arg-input:focus { border-color: var(--accent); }
.infographic-pyfunc .flow-arrow {
font-size: 1.3rem; color: var(--line); transition: color 0.3s;
}
.infographic-pyfunc .flow-arrow.is-active { color: var(--accent); }
.infographic-pyfunc .machine-box {
display: flex; flex-direction: column; align-items: center; justify-content: center;
width: 8.5rem; height: 5rem; background: var(--accent-soft); border: 2px solid var(--accent);
border-radius: 10px; transition: box-shadow 0.3s, transform 0.3s;
}
.infographic-pyfunc .machine-box.is-running { box-shadow: 0 6px 16px rgba(37,99,235,0.35); }
.infographic-pyfunc .gear {
font-size: 1.4rem; display: inline-block; transition: transform 0.2s;
}
.infographic-pyfunc .machine-box.is-running .gear { animation: pyfunc-spin 0.6s linear infinite; }
@keyframes pyfunc-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
.infographic-pyfunc .machine-label {
font-family: var(--mono-font); font-size: 0.75rem; font-weight: 700; color: var(--accent); margin-top: 0.2rem;
}
.infographic-pyfunc .result-box {
width: 9rem; min-height: 2.5rem; display: flex; align-items: center; justify-content: center;
font-family: var(--mono-font); font-size: 0.85rem; font-weight: 700; text-align: center;
padding: 0.3rem 0.6rem; background: var(--ok-soft); color: var(--ok); border: 1px solid var(--ok);
border-radius: 6px; opacity: 0; transform: scale(0.85); transition: opacity 0.3s, transform 0.3s;
}
.infographic-pyfunc .result-box.is-visible { opacity: 1; transform: scale(1); box-shadow: 0 3px 10px rgba(0,0,0,0.15); }
.infographic-pyfunc .call-btn {
font: inherit; font-size: 0.85rem; font-weight: 600; border: none; background: var(--accent);
color: var(--paper); padding: 0.55rem 1.3rem; border-radius: 999px; cursor: pointer; margin-top: 1.5rem;
display: block; margin-left: auto; margin-right: auto;
}
.infographic-pyfunc .call-btn:disabled { opacity: 0.6; cursor: default; }
.infographic-pyfunc .call-btn:hover:not(:disabled) { opacity: 0.9; }
.infographic-pyfunc .caption {
text-align: center; font-size: 0.85rem; color: var(--ink-soft); margin-top: 1rem; min-height: 1.2em;
}
.infographic-pyfunc .caption strong { color: var(--ink); font-family: var(--mono-font); }
@media (prefers-reduced-motion: reduce) {
.infographic-pyfunc *, .infographic-pyfunc *::before, .infographic-pyfunc *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="ig-inner">
<h2 class="ig-title">Functions</h2>
<div class="code-line" id="codeLine">
<span class="part" data-part="keyword">def</span>
<span class="part" data-part="name">greet</span>(<span class="part" data-part="params">name</span>):
<span class="part" data-part="body">return "Hi, " + name + "!"</span>
</div>
<div class="legend">
<div class="legend-item" data-part="keyword">
<div class="lbl">Keyword</div>
<div class="desc">starts the definition</div>
</div>
<div class="legend-item" data-part="name">
<div class="lbl">Name</div>
<div class="desc">same rules as variables</div>
</div>
<div class="legend-item" data-part="params">
<div class="lbl">Parameters</div>
<div class="desc">inputs, comma-separated</div>
</div>
<div class="legend-item" data-part="body">
<div class="lbl">Body</div>
<div class="desc">the indented code that runs</div>
</div>
</div>
<div class="machine-wrap">
<div class="chip-slot">
<span class="slot-tag">name</span>
<input type="text" class="arg-input" id="argInput" value="Alice">
</div>
<span class="flow-arrow" id="arrowIn">→</span>
<div class="machine-box" id="machineBox">
<span class="gear" id="gear">⚙</span>
<span class="machine-label">greet()</span>
</div>
<span class="flow-arrow" id="arrowOut">→</span>
<div class="result-box" id="resultBox"></div>
</div>
<button class="call-btn" id="callBtn">Call greet("Alice")</button>
<p class="caption" id="caption">Give it a name, then call the function.</p>
</div>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-pyfunc')
|| document.querySelector('.infographic-pyfunc');
const bodyAttr = document.body.getAttribute('data-darkmode');
let dark;
if (bodyAttr === 'true') {
dark = true;
} else if (bodyAttr === 'false') {
dark = false;
} else {
const match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
// Anatomy click-to-highlight (bidirectional between code parts and legend)
function setActivePart(part) {
wrapper.querySelectorAll('[data-part]').forEach(el => {
el.classList.toggle('is-active', el.dataset.part === part);
});
}
wrapper.querySelectorAll('.part, .legend-item').forEach(el => {
el.addEventListener('click', () => setActivePart(el.dataset.part));
});
// The function machine
const argInput = wrapper.querySelector('#argInput');
const callBtn = wrapper.querySelector('#callBtn');
const arrowIn = wrapper.querySelector('#arrowIn');
const arrowOut = wrapper.querySelector('#arrowOut');
const machineBox = wrapper.querySelector('#machineBox');
const resultBox = wrapper.querySelector('#resultBox');
const caption = wrapper.querySelector('#caption');
function updateBtnLabel() {
const val = argInput.value || '';
callBtn.textContent = `Call greet("${val}")`;
}
argInput.addEventListener('input', updateBtnLabel);
updateBtnLabel();
function runMachine() {
const name = argInput.value || '';
callBtn.disabled = true;
resultBox.classList.remove('is-visible');
arrowOut.classList.remove('is-active');
caption.textContent = 'Passing the argument in…';
arrowIn.classList.add('is-active');
setTimeout(() => {
machineBox.classList.add('is-running');
caption.textContent = 'Running the function body…';
}, 250);
setTimeout(() => {
machineBox.classList.remove('is-running');
arrowIn.classList.remove('is-active');
arrowOut.classList.add('is-active');
resultBox.textContent = `"Hi, ${name}!"`;
resultBox.classList.add('is-visible');
caption.innerHTML = `<strong>greet("${name}")</strong> returned this string`;
callBtn.disabled = false;
}, 1050);
}
callBtn.addEventListener('click', runMachine);
})();
</script></div>🛠️ Function Syntax
def function_name(parameters):
# code block
return result💡 Example: Greet User
def greet(name):
return f"Hello, {name}!"
print(greet("Alice")) # Hello, Alice!🔄 Real-life Analogy
A function is like a coffee machine:
Press a button (call the function)
Coffee comes out (returns result)
You don’t need to know the internal workings every time ☕️