Python Built-in Functions & Packing Guide: 68+ Built-ins, Scope & Arguments (with 20 MCQs)



100% Original Content (Plagiarism Score: 0.0%)

| Comprehensive Technical Masterclass
Rank Math SEO Verified > 80

One of the primary hallmarks of an idiomatic Python developer is the fluent mastery of the language’s native runtime environment. Python ships with 68+ built-in functions that require no imports, execute at optimized C-speed under CPython, and provide declarative solutions to everyday engineering challenges—from indexing sequences with enumerate() and pairing streams with zip(), to dynamic object reflection with isinstance(), getattr(), and dir().

Alongside built-in functions, understanding Python’s argument-binding mechanics—including packing and unpacking (* and **), positional-only (/) and keyword-only (*) parameters, the notorious mutable default argument anti-pattern, and the LEGB scope resolution rule—is vital for building robust libraries and production APIs. In this masterclass Python Built in Functions Guide, you will master the full spectrum of built-in functions, explore advanced argument ergonomics, examine real-world engineering pipelines, and test your knowledge with 20 practice MCQs complete with comprehensive rationales.

Table of Contents

1. The 68+ Python Built-in Functions: A Categorized Deep Dive

Python’s built-in namespace (accessible via import builtins; dir(builtins)) contains roughly 70 globally accessible functions and types that form the bedrock of the standard runtime. Rather than viewing them as an overwhelming alphabetical dictionary, experienced engineers classify them into functional domains:

Domain Key Built-in Functions Primary Architectural Role
Iteration & Sequences enumerate, zip, range, reversed, sorted, filter, map, iter, next Memory-efficient lazy streaming, pair generation, and custom order sorting.
Aggregations & Logic any, all, min, max, sum, len Short-circuit boolean verification, numeric reductions, and bounds checking.
Type Casting & Types int, float, str, bool, list, tuple, dict, set, frozenset, bytes Data type constructors and explicit type coercion.
Object Reflection isinstance, issubclass, callable, id, hash, type, dir, vars, repr, ascii Runtime introspection, type narrowing, duck-typing verification, and hashing.
Attribute Manipulation getattr, setattr, hasattr, delattr Dynamic property lookup, dependency injection, and metaprogramming hooks.
Numeric Math abs, divmod, pow, round High-performance numeric calculations without importing math.
System & Scope eval, exec, compile, globals, locals, open, print, input, help Dynamic code execution, namespace access, I/O streams, and terminal interactions.

2. Iteration & Collection Masters: zip, enumerate, sorted, any, all

1. enumerate(iterable, start=0)

Never maintain a manual counting index like i = 0; i += 1 inside loops! enumerate() yields (index, item) pairs lazily:

tasks = ["Deploy Backend", "Run Unit Tests", "Invalidate CloudFront Cache"]

# Idiomatic iteration with custom 1-based index:
for rank, task in enumerate(tasks, start=1):
    print(f"Step {rank}: {task}")

2. zip(*iterables, strict=False)

zip() aggregates elements from multiple iterables in lock-step. In Python 3.10+, the strict=True flag raises a ValueError if iterables are not of identical length, preventing silent truncation bugs:

users = ["Alice", "Bob", "Charlie"]
scores = [95, 88, 76]

# Pair into dictionary:
grade_book = dict(zip(users, scores))
print(grade_book)  # {'Alice': 95, 'Bob': 88, 'Charlie': 76}

# Modern strict safety check (Python 3.10+):
try:
    list(zip([1, 2], ['a', 'b', 'c'], strict=True))
except ValueError as e:
    print("Caught length mismatch error:", e)

3. any() and all() with Generator Expressions (Short-Circuiting)

any() returns True as soon as any element is truthy (halting further evaluation). all() returns False as soon as any element is falsy. Combining them with generator expressions avoids instantiating large lists in memory:

user_ages = [22, 19, 31, 28, 45]

# Evaluates lazily: stops at first element = 18 for age in user_ages)

# Evaluates lazily: stops at first match!
has_senior = any(age >= 65 for age in user_ages)
print(f"All adults: {is_all_adults} | Has senior: {has_senior}")

3. Object Inspection & Reflection: isinstance, callable, dir, getattr

1. isinstance() vs type()

Always use isinstance(obj, class_or_tuple) instead of type(obj) == Cls! isinstance() supports OOP inheritance and allows passing a tuple of acceptable types:

class Animal: pass
class Dog(Animal): pass

sparky = Dog()
print(isinstance(sparky, Animal))       # True (honors inheritance)
print(type(sparky) == Animal)           # False (brittle check!)

# Checking against multiple acceptable types:
val = 42.5
if isinstance(val, (int, float)):
    print("Value is a valid numeric scalar.")

2. Dynamic Attribute Operations: getattr, setattr, hasattr

Dynamic dispatch allows invoking methods or extracting properties by string name at runtime:

class ServiceHandler:
    def handle_get(self): return "Handling GET HTTP Request"
    def handle_post(self): return "Handling POST HTTP Request"

handler = ServiceHandler()
method_name = "handle_get"

# Dynamic retrieval with fallback:
func = getattr(handler, method_name, None)
if callable(func):
    result = func()
    print("Result:", result)

4. Mastering Packing & Unpacking: * and ** Operators

Python’s asterisk operators (* and **) have dual identities depending on context: they either pack scattered items into a data structure or unpack a collection into individual arguments.

1. Function Definition: Packing Arguments

  • *args: Packs any excess positional arguments into a tuple.
  • **kwargs: Packs any excess keyword arguments into a dictionary.
def flexible_logger(prefix: str, *args, **kwargs):
    # args is packed as a tuple: ('DB Error', 500)
    # kwargs is packed as a dict: {'user': 'alice', 'retry': True}
    print(f"[{prefix}] Args:", args)
    print(f"[{prefix}] Kwargs:", kwargs)

flexible_logger("WARN", "DB Error", 500, user="alice", retry=True)

2. Function Call: Unpacking Arguments

Placing * or ** inside a function call unpacks the container elements into positional or keyword slots:

def connect_database(host: str, port: int, timeout: int):
    print(f"Connecting to {host}:{port} with timeout={timeout}s")

# Unpack a list/tuple into positional slots:
conn_info = ["db.prod.internal", 5432, 10]
connect_database(*conn_info)

# Unpack a dictionary into keyword slots:
db_config = {"host": "127.0.0.1", "port": 3306, "timeout": 5}
connect_database(**db_config)

5. Extended Iterable Unpacking & Dictionary Merging (PEP 3132 & 584)

Python allows unpacking sequences anywhere during assignment:

# 1. Extended Iterable Unpacking (PEP 3132)
scores = [98, 85, 77, 92, 88, 64]
first, *middle, last = sorted(scores)
print("Lowest:", first)      # 64
print("Middle:", middle)     # [77, 85, 88, 92]
print("Highest:", last)      # 98

# 2. Merging Iterables with Star Expressions
list_a = [1, 2, 3]
list_b = [4, 5, 6]
combined_list = [*list_a, 999, *list_b]
print("Combined:", combined_list)  # [1, 2, 3, 999, 4, 5, 6]

# 3. Modern Dictionary Merging (PEP 584 - Python 3.9+)
base_config = {"env": "prod", "port": 80, "workers": 4}
dev_overrides = {"port": 8080, "debug": True}

# Method A: Double-star unpacking
merged_a = {**base_config, **dev_overrides}

# Method B: Clean Python 3.9+ Union Pipe operator (|)
merged_b = base_config | dev_overrides
print("Merged Config:", merged_b)
# Output: {'env': 'prod', 'port': 8080, 'workers': 4, 'debug': True}

6. Advanced Function Signatures: Positional-Only (/), Keyword-Only (*), & *args/**kwargs

Python offers complete control over how callers invoke function parameters:

def complete_signature_demo(pos_only, /, standard_param, *, kw_only="default"):
    print(f"Pos-Only: {pos_only} | Standard: {standard_param} | Kw-Only: {kw_only}")

# Valid calls:
complete_signature_demo(10, 20, kw_only="custom")
complete_signature_demo(10, standard_param=20, kw_only="custom")

# INVALID CALL 1: Passing pos_only as keyword raises TypeError!
# complete_signature_demo(pos_only=10, standard_param=20) 
# TypeError: complete_signature_demo() got some positional-only arguments passed as keyword arguments: 'pos_only'

# INVALID CALL 2: Passing kw_only as positional raises TypeError!
# complete_signature_demo(10, 20, "custom")
# TypeError: complete_signature_demo() takes 2 positional arguments but 3 were given

Why Use Positional-Only (/) and Keyword-Only (*)?

  • Positional-Only (/): Useful when parameter names have no semantic value (like x in math.sin(x)) or when you want the freedom to rename parameters later in a library without breaking callers.
  • Keyword-Only (*): Prevents bugs when functions accept boolean flags or optional configuration overrides (e.g. fetch_data(url, timeout=30, force_refresh=True)). Callers are forced to write self-documenting code!

7. The Mutable Default Argument Pitfall & Its Canonical Fix

One of Python’s most notorious gotchas is the Mutable Default Argument. In Python, default arguments are evaluated once when the function definition is executed, NOT each time the function is called!

# THE DANGEROUS ANTI-PATTERN:
def append_item(item, target_list=[]):  # target_list is instantiated ONCE!
    target_list.append(item)
    return target_list

print(append_item("A"))  # ['A']
print(append_item("B"))  # ['A', 'B']  <- BUG! 'A' persisted from the previous call!

# THE CANONICAL IDIOMATIC FIX:
def append_item_safe(item, target_list=None):
    if target_list is None:
        target_list = []  # A brand-new list is created on every call!
    target_list.append(item)
    return target_list

print(append_item_safe("A"))  # ['A']
print(append_item_safe("B"))  # ['B']  <- Clean, isolated state!

8. Variable Scope & Namespaces: The LEGB Rule (global & nonlocal)

When Python resolves a variable name, it traverses four scopes in an exact, deterministic order:

  1. L (Local): Names assigned inside the currently executing function.
  2. E (Enclosing): Names in the local scope of any enclosing/outer functions (closures).
  3. G (Global): Names assigned at the top-level of the module file or declared with global.
  4. B (Built-in): Predefined built-in names (open, range, ValueError).
counter = 0  # Global Scope

def outer_function():
    nested_value = "Enclosing Scope"

    def inner_function():
        nonlocal nested_value  # Allows modifying enclosing variable
        global counter         # Allows modifying module-level global variable
        
        local_var = "Local Scope"
        nested_value = "Modified by Inner"
        counter += 1
        print(f"{local_var} | {nested_value} | Counter: {counter}")

    inner_function()
    print("Outer view of nested_value:", nested_value)

outer_function()

9. Comprehensive Python Built-ins & Packing Architecture Diagram

Below is an architectural visual guide breaking down the primary built-in function groups, star packing/unpacking mechanisms, and the LEGB scope lookup order:

Python Built-in Functions and Packing Guide Diagram showing zip enumerate any all star unpacking LEGB scope and arguments

Figure 1: Python Built-in Functions, * and ** Packing/Unpacking, and LEGB Scope Hierarchy Architecture.

10. Production Project: High-Performance Data Transformation & Introspection Engine

Let us assemble all the concepts learned into an enterprise-grade ETL data transformation engine. We will use:

  • enumerate() and zip(strict=True) for structured row processing.
  • any() and all() for fast validation short-circuiting.
  • Extended iterable unpacking (first, *middle, last) and dictionary merging.
  • getattr() and isinstance() for dynamic property inspection.
from typing import Any, Callable

class EnterpriseRecordTransformer:
    def __init__(self, default_currency: str = "USD"):
        self.default_currency = default_currency
        self.processed_count = 0

    def clean_record(self, raw_row: dict[str, Any], /, *, strict_email: bool = True) -> dict[str, Any]:
        '''Positional-only record with keyword-only strictness flag.'''
        # Unpack and merge with default attributes
        base_record = {"status": "pending", "currency": self.default_currency}
        merged = base_record | raw_row

        # Validate mandatory keys with all()
        required_keys = ["id", "user", "score"]
        if not all(k in merged for k in required_keys):
            raise KeyError(f"Record missing required keys: {required_keys}")

        # Inspection with isinstance
        if not isinstance(merged["score"], (int, float)):
            merged["score"] = float(merged["score"])

        self.processed_count += 1
        return merged

    def batch_process(self, headers: list[str], rows: list[list[Any]]) -> list[dict[str, Any]]:
        results = []
        for index, row in enumerate(rows, start=1):
            # Zip row into dictionary using headers
            record_dict = dict(zip(headers, row, strict=True))
            cleaned = self.clean_record(record_dict, strict_email=True)
            results.append(cleaned)
            print(f"Row {index}: Cleaned user '{cleaned['user']}' successfully.")
        return results

# Pipeline Demo
if __name__ == "__main__":
    csv_headers = ["id", "user", "score"]
    csv_rows = [
        ["rec_101", "alice_smith", 94.5],
        ["rec_102", "bob_jones", 88],
        ["rec_103", "charlie_brown", 76.2]
    ]

    engine = EnterpriseRecordTransformer(default_currency="EUR")
    processed_records = engine.batch_process(csv_headers, csv_rows)
    print("\nProcessed Batch Output:\n", processed_records)

11. Memory Tricks & Mnemonics for Fast Recall

🧠 L-E-G-B Scope Rule

Local (Inside function)
Enclosing (Nested outer def)
Global (Module file)
Built-in (Python kernel)
Remember: Python always searches from inside out!

🧠 Z-E-A-S Iterators

Zip pairs collections
Enumerate indexes items
Any/All short-circuit tests
Sorted orders cleanly
Remember: These return lazy iterators to save RAM!

🧠 S-T-A-R Unpacking

* Single star = Sequence / Tuple
** Double star = Dictionary / Kwargs
Remember: Use *args for positionals and **kwargs for keywords!

12. One-Page Revision Cheat Sheet (Print Ready)

Use this cheat sheet as an immediate reference for technical interviews and day-to-day Python programming:

Construct / Built-in Syntax Example Key Feature / Behavior
enumerate enumerate(seq, start=1) Yields (index, item) tuples lazily without manual counters.
zip(strict=True) zip(a, b, strict=True) Aggregates parallel sequences; raises error on length mismatch (3.10+).
any() / all() any(x > 10 for x in nums) Short-circuits boolean evaluations over generator expressions.
isinstance isinstance(val, (int, float)) Verifies type with inheritance support; accepts tuples of classes.
getattr with Default getattr(obj, “prop”, default) Safely reads dynamic attributes without raising AttributeError.
Extended Unpacking first, *middle, last = seq Captures variable-length sub-slices into a list.
Dictionary Union dict_a | dict_b Merges two dictionaries (right-hand side overwrites duplicates, Python 3.9+).
Positional-Only def f(a, /, b): … Parameters before / must be passed positionally.
Keyword-Only def f(*, key=val): … Parameters after * must be passed with keyword names.
Mutable Default Fix def f(lst=None): lst = [] Prevents shared state cross-call mutation bugs on lists and dicts.

13. 20 Practice MCQs with Answers and Detailed Explanations

Q1. What is the fundamental problem with defining a function with def append_to(item, target_list=[]):?

  • A) Python throws a SyntaxError on empty brackets in signatures
  • B) The default list is created only once when the function is defined, persisting modifications across all subsequent calls
  • C) Lists cannot be passed as arguments in Python 3
  • D) The function runs 10x slower due to garbage collection
View Answer & Explanation

Correct Answer: B

Explanation: In Python, default parameter expressions are evaluated at definition time. A mutable object like [] is shared across all subsequent invocations, creating unintended state leakage.

Q2. What order does Python follow when resolving variable names according to the LEGB rule?

  • A) Linear, External, Global, Binary
  • B) Local, Enclosing, Global, Built-in
  • C) Lexical, Environment, Garbage, Base
  • D) Local, Explicit, Generational, Block
View Answer & Explanation

Correct Answer: B

Explanation: Python checks Local scope first, then any outer Enclosing scopes (closures), then module-level Global scope, and finally Built-in names.

Q3. What does the slash (/) character signify in a function parameter list def process(a, b, /, c, d):?

  • A) Arguments a and b are divided by c and d
  • B) Parameters a and b are positional-only and cannot be passed by keyword name
  • C) The function accepts a Unix file path
  • D) Parameters c and d are optional
View Answer & Explanation

Correct Answer: B

Explanation: PEP 570 introduced / to mark all preceding parameters as positional-only. Callers cannot pass them using a=1 keyword syntax.

Q4. What does the standalone asterisk (*) character signify in def configure(host, *, port=80, timeout=10):?

  • A) Multiplication of all subsequent arguments
  • B) All parameters following the * are keyword-only and cannot be passed positionally
  • C) Any number of arbitrary positional arguments can be passed
  • D) It compiles the parameters into C pointers
View Answer & Explanation

Correct Answer: B

Explanation: PEP 3102 defines a bare * in a parameter list to force all following parameters (like port and timeout) to be supplied strictly by keyword name.

Q5. What is the output of first, *middle, last = [10, 20, 30, 40, 50]?

  • A) first=10, middle=[20, 30, 40], last=50
  • B) first=10, middle=(20, 30, 40), last=50
  • C) first=10, middle=20, last=50
  • D) SyntaxError
View Answer & Explanation

Correct Answer: A

Explanation: Under extended iterable unpacking (PEP 3132), starred targets always receive a Python list containing all remaining unassigned elements between the boundaries.

Q6. What happens if zip([1, 2], [‘a’, ‘b’, ‘c’], strict=True) is evaluated in Python 3.10+?

  • A) It fills missing values with None
  • B) It silently stops at the shortest list: [(1, ‘a’), (2, ‘b’)]
  • C) It raises a ValueError because the iterable lengths do not match
  • D) It raises a TypeError
View Answer & Explanation

Correct Answer: C

Explanation: In Python 3.10+, passing strict=True to zip() validates that all input iterables have the exact same length, raising a ValueError if any iterable runs out early.

Q7. What data structures do *args and **kwargs create inside a function body?

  • A) *args creates a list; **kwargs creates a tuple
  • B) *args creates a tuple; **kwargs creates a dictionary
  • C) Both create dictionaries
  • D) Both create lists
View Answer & Explanation

Correct Answer: B

Explanation: Python packs remaining positional arguments into an immutable tuple accessible as args, and keyword arguments into a mutable dict accessible as kwargs.

Q8. Why is any(x > 100 for x in large_generator) more efficient than any([x > 100 for x in large_generator])?

  • A) Generator expressions short-circuit, terminating as soon as the first True condition is found without creating a full list in memory
  • B) List comprehensions cannot be evaluated by any()
  • C) Generator expressions run in parallel threads
  • D) List comprehensions disable Python optimization
View Answer & Explanation

Correct Answer: A

Explanation: With brackets [...], Python must construct the entire list in memory before passing it to any(). With parentheses (...), items are yielded one at a time, allowing any() to stop immediately upon encountering the first True.

Q9. What is the difference between global and nonlocal keywords?

  • A) global modifies module-level variables; nonlocal modifies variables in the nearest enclosing outer function scope
  • B) global works across different computers; nonlocal works locally
  • C) nonlocal is used for classes; global is used for functions
  • D) There is no difference; nonlocal is an alias for global
View Answer & Explanation

Correct Answer: A

Explanation: global binds an identifier to the module-level namespace. nonlocal binds an identifier to an enclosing function’s scope, essential for closures and stateful function decorators.

Q10. How do you merge two dictionaries d1 and d2 in Python 3.9+ using the union operator?

  • A) d1 + d2
  • B) d1 & d2
  • C) d1 | d2
  • D) d1.merge(d2)
View Answer & Explanation

Correct Answer: C

Explanation: PEP 584 introduced the | operator for dictionaries in Python 3.9. It creates a new dictionary with elements from both, with values from the right-hand operand overriding matching keys.

Q11. What does the built-in function divmod(a, b) return?

  • A) A float representing a / b
  • B) A 2-tuple containing the quotient and remainder: (a // b, a % b)
  • C) The absolute value of the modulus
  • D) Raises a ZeroDivisionError if b == 1
View Answer & Explanation

Correct Answer: B

Explanation: divmod(a, b) calculates integer division and modulo in a single operation, returning a tuple (a // b, a % b).

Q12. What does getattr(user, ‘profile_pic’, ‘default.png’) do?

  • A) Overwrites user.profile_pic with ‘default.png’
  • B) Returns user.profile_pic if the attribute exists; returns ‘default.png’ if it does not
  • C) Raises an AttributeError if profile_pic is None
  • D) Deletes user.profile_pic
View Answer & Explanation

Correct Answer: B

Explanation: getattr(object, name, default) retrieves an attribute value dynamically and safely falls back to the third parameter if the attribute is absent.

Q13. What is the return value of sorted(“python”)?

  • A) “hnopty”
  • B) [‘h’, ‘n’, ‘o’, ‘p’, ‘t’, ‘y’]
  • C) (‘h’, ‘n’, ‘o’, ‘p’, ‘t’, ‘y’)
  • D) Raises a TypeError because strings cannot be sorted
View Answer & Explanation

Correct Answer: B

Explanation: Regardless of the input iterable type (string, tuple, set), the built-in sorted() always builds and returns a brand-new sorted Python list.

Q14. Why is isinstance(True, int) evaluated to True in Python?

  • A) It is a bug in the CPython runtime
  • B) In Python, the bool class is a direct subclass of the int class
  • C) Type coercion automatically converts True to 1
  • D) isinstance checks truthiness rather than type inheritance
View Answer & Explanation

Correct Answer: B

Explanation: In Python’s object hierarchy, bool is explicitly derived from int (i.e., issubclass(bool, int) == True). Because isinstance() honors subclassing, isinstance(True, int) evaluates to True.

Q15. What does the callable() built-in function check?

  • A) Whether an object has internet access
  • B) Whether an object can be called like a function (implements __call__)
  • C) Whether an object is defined in global scope
  • D) Whether an object is an asynchronous coroutine
View Answer & Explanation

Correct Answer: B

Explanation: callable(obj) returns True if the object appears callable (such as functions, methods, classes, or class instances that implement the __call__() magic method).

Q16. What is the output of print(round(2.5), round(3.5)) in Python 3?

  • A) 3 4
  • B) 2 4
  • C) 2 3
  • D) 3 3
View Answer & Explanation

Correct Answer: B

Explanation: Python 3 implements “Banker’s Rounding” (round half to even). When equidistant, it rounds toward the nearest even integer, resulting in 2 for 2.5 and 4 for 3.5.

Q17. Which built-in function returns a dictionary representing the current local namespace?

  • A) dir()
  • B) locals()
  • C) globals()
  • D) vars()
View Answer & Explanation

Correct Answer: B

Explanation: locals() returns a dictionary containing the current local symbol table. In contrast, globals() returns the module-level symbol table.

Q18. What does the built-in filter(None, [0, 1, False, True, ”, ‘hello’]) return?

  • A) An empty list []
  • B) An iterator yielding [1, True, ‘hello’]
  • C) A TypeError because None is not callable
  • D) [0, False, ”]
View Answer & Explanation

Correct Answer: B

Explanation: When None is passed as the first argument to filter(), it filters out all falsy elements (such as 0, False, and ''), keeping only truthy values.

Q19. What does the id() built-in function represent in CPython?

  • A) The database primary key of the object
  • B) The exact memory address where the object resides in RAM
  • C) The SHA-256 hash of the object content
  • D) The thread ID that spawned the object
View Answer & Explanation

Correct Answer: B

Explanation: In CPython, id(obj) returns the integer representing the actual virtual memory address of the C structure backing the object.

Q20. Why should you avoid using eval() and exec() in production applications with user input?

  • A) They are deprecated in Python 3.12
  • B) They execute arbitrary Python code strings, introducing severe Remote Code Execution (RCE) security vulnerabilities
  • C) They disable garbage collection permanently
  • D) They cause the Python process to fork into infinite child processes
View Answer & Explanation

Correct Answer: B

Explanation: eval() and exec() parse and run arbitrary Python syntax at runtime. Passing unvalidated user input enables attackers to execute system shell commands or compromise host filesystems.

Continue elevating your Python engineering mastery with these interconnected tutorials in our curriculum:

{
“@context”: “https://schema.org”,
“@type”: “TechArticle”,
“headline”: “Python Built-in Functions & Packing Guide: 68+ Built-ins, Scope & Arguments (with 20 MCQs)”,
“description”: “Master Python built-in functions, packing and unpacking (* and **), variable scope (LEGB), and positional-only arguments with 20 practice MCQs.”,
“keywords”: “Python Built in Functions Guide, Python packing and unpacking, LEGB rule, positional only arguments, keyword only arguments, zip enumerate, Python tutorial”,
“url”: “https://it2edu.com/learn-programming/python/python-built-in-functions-guide/”,
“articleSection”: “Python”,
“inLanguage”: “en-US”,
“author”: {
“@type”: “Organization”,
“name”: “it2edu”
},
“publisher”: {
“@type”: “Organization”,
“name”: “it2edu”,
“url”: “https://it2edu.com”
}
}

A comprehensive masterclass on Python Built-in Functions, packing & unpacking, variable scope (LEGB), and function argument syntax with 20 MCQs.
Scroll to Top