Functions and Object-Oriented Programming (OOP) in Python

Functions and Object-Oriented Programming (OOP) are key concepts in Python that help organize and structure code efficiently. Understanding these concepts will improve code reusability, maintainability, and readability.

In this post, we’ll cover:

Functions in Python – Defining, calling, and using arguments
Lambda functions – Writing concise, one-liner functions
Object-Oriented Programming (OOP) – Classes, objects, inheritance, and encapsulation

Let’s get started!

1️⃣ Functions in Python

What is a Function?

A function is a block of reusable code that performs a specific task.

Defining and Calling Functions

<span>def</span> <span>greet</span><span>(</span><span>name</span><span>):</span> <span># Function definition </span> <span>return</span> <span>f</span><span>"</span><span>Hello, </span><span>{</span><span>name</span><span>}</span><span>!</span><span>"</span>
<span>print</span><span>(</span><span>greet</span><span>(</span><span>"</span><span>Alice</span><span>"</span><span>))</span> <span># Calling the function </span>
<span>def</span> <span>greet</span><span>(</span><span>name</span><span>):</span>  <span># Function definition </span>    <span>return</span> <span>f</span><span>"</span><span>Hello, </span><span>{</span><span>name</span><span>}</span><span>!</span><span>"</span>

<span>print</span><span>(</span><span>greet</span><span>(</span><span>"</span><span>Alice</span><span>"</span><span>))</span>  <span># Calling the function </span>
def greet(name): # Function definition return f"Hello, {name}!" print(greet("Alice")) # Calling the function

Enter fullscreen mode Exit fullscreen mode

Function Arguments and Return Values

Python functions support different types of arguments:

1. Positional Arguments

<span>def</span> <span>add</span><span>(</span><span>a</span><span>,</span> <span>b</span><span>):</span>
<span>return</span> <span>a</span> <span>+</span> <span>b</span>
<span>print</span><span>(</span><span>add</span><span>(</span><span>5</span><span>,</span> <span>3</span><span>))</span> <span># Output: 8 </span>
<span>def</span> <span>add</span><span>(</span><span>a</span><span>,</span> <span>b</span><span>):</span>
    <span>return</span> <span>a</span> <span>+</span> <span>b</span>

<span>print</span><span>(</span><span>add</span><span>(</span><span>5</span><span>,</span> <span>3</span><span>))</span>  <span># Output: 8 </span>
def add(a, b): return a + b print(add(5, 3)) # Output: 8

Enter fullscreen mode Exit fullscreen mode

2. Default Arguments

<span>def</span> <span>power</span><span>(</span><span>base</span><span>,</span> <span>exponent</span><span>=</span><span>2</span><span>):</span> <span># Default value for exponent </span> <span>return</span> <span>base</span> <span>**</span> <span>exponent</span>
<span>print</span><span>(</span><span>power</span><span>(</span><span>3</span><span>))</span> <span># Output: 9 (3^2) </span><span>print</span><span>(</span><span>power</span><span>(</span><span>3</span><span>,</span> <span>3</span><span>))</span> <span># Output: 27 (3^3) </span>
<span>def</span> <span>power</span><span>(</span><span>base</span><span>,</span> <span>exponent</span><span>=</span><span>2</span><span>):</span>  <span># Default value for exponent </span>    <span>return</span> <span>base</span> <span>**</span> <span>exponent</span>

<span>print</span><span>(</span><span>power</span><span>(</span><span>3</span><span>))</span>  <span># Output: 9 (3^2) </span><span>print</span><span>(</span><span>power</span><span>(</span><span>3</span><span>,</span> <span>3</span><span>))</span>  <span># Output: 27 (3^3) </span>
def power(base, exponent=2): # Default value for exponent return base ** exponent print(power(3)) # Output: 9 (3^2) print(power(3, 3)) # Output: 27 (3^3)

Enter fullscreen mode Exit fullscreen mode

3. Keyword Arguments (Named Arguments)

<span>def</span> <span>introduce</span><span>(</span><span>name</span><span>,</span> <span>age</span><span>):</span>
<span>print</span><span>(</span><span>f</span><span>"</span><span>My name is </span><span>{</span><span>name</span><span>}</span><span> and I</span><span>'</span><span>m </span><span>{</span><span>age</span><span>}</span><span> years old.</span><span>"</span><span>)</span>
<span>introduce</span><span>(</span><span>age</span><span>=</span><span>25</span><span>,</span> <span>name</span><span>=</span><span>"</span><span>Bob</span><span>"</span><span>)</span> <span># Order doesn't matter </span>
<span>def</span> <span>introduce</span><span>(</span><span>name</span><span>,</span> <span>age</span><span>):</span>
    <span>print</span><span>(</span><span>f</span><span>"</span><span>My name is </span><span>{</span><span>name</span><span>}</span><span> and I</span><span>'</span><span>m </span><span>{</span><span>age</span><span>}</span><span> years old.</span><span>"</span><span>)</span>

<span>introduce</span><span>(</span><span>age</span><span>=</span><span>25</span><span>,</span> <span>name</span><span>=</span><span>"</span><span>Bob</span><span>"</span><span>)</span>  <span># Order doesn't matter </span>
def introduce(name, age): print(f"My name is {name} and I'm {age} years old.") introduce(age=25, name="Bob") # Order doesn't matter

Enter fullscreen mode Exit fullscreen mode

4. Arbitrary Arguments (args and kwargs)

<span>def</span> <span>multiply</span><span>(</span><span>*</span><span>args</span><span>):</span> <span># Accepts multiple arguments </span> <span>result</span> <span>=</span> <span>1</span>
<span>for</span> <span>num</span> <span>in</span> <span>args</span><span>:</span>
<span>result</span> <span>*=</span> <span>num</span>
<span>return</span> <span>result</span>
<span>print</span><span>(</span><span>multiply</span><span>(</span><span>2</span><span>,</span> <span>3</span><span>,</span> <span>4</span><span>))</span> <span># Output: 24 </span>
<span>def</span> <span>describe_person</span><span>(</span><span>**</span><span>kwargs</span><span>):</span> <span># Accepts key-value pairs </span> <span>for</span> <span>key</span><span>,</span> <span>value</span> <span>in</span> <span>kwargs</span><span>.</span><span>items</span><span>():</span>
<span>print</span><span>(</span><span>f</span><span>"</span><span>{</span><span>key</span><span>}</span><span>: </span><span>{</span><span>value</span><span>}</span><span>"</span><span>)</span>
<span>describe_person</span><span>(</span><span>name</span><span>=</span><span>"</span><span>Alice</span><span>"</span><span>,</span> <span>age</span><span>=</span><span>30</span><span>,</span> <span>country</span><span>=</span><span>"</span><span>USA</span><span>"</span><span>)</span>
<span>def</span> <span>multiply</span><span>(</span><span>*</span><span>args</span><span>):</span>  <span># Accepts multiple arguments </span>    <span>result</span> <span>=</span> <span>1</span>
    <span>for</span> <span>num</span> <span>in</span> <span>args</span><span>:</span>
        <span>result</span> <span>*=</span> <span>num</span>
    <span>return</span> <span>result</span>

<span>print</span><span>(</span><span>multiply</span><span>(</span><span>2</span><span>,</span> <span>3</span><span>,</span> <span>4</span><span>))</span>  <span># Output: 24 </span>
<span>def</span> <span>describe_person</span><span>(</span><span>**</span><span>kwargs</span><span>):</span>  <span># Accepts key-value pairs </span>    <span>for</span> <span>key</span><span>,</span> <span>value</span> <span>in</span> <span>kwargs</span><span>.</span><span>items</span><span>():</span>
        <span>print</span><span>(</span><span>f</span><span>"</span><span>{</span><span>key</span><span>}</span><span>: </span><span>{</span><span>value</span><span>}</span><span>"</span><span>)</span>

<span>describe_person</span><span>(</span><span>name</span><span>=</span><span>"</span><span>Alice</span><span>"</span><span>,</span> <span>age</span><span>=</span><span>30</span><span>,</span> <span>country</span><span>=</span><span>"</span><span>USA</span><span>"</span><span>)</span>
def multiply(*args): # Accepts multiple arguments result = 1 for num in args: result *= num return result print(multiply(2, 3, 4)) # Output: 24 def describe_person(**kwargs): # Accepts key-value pairs for key, value in kwargs.items(): print(f"{key}: {value}") describe_person(name="Alice", age=30, country="USA")

Enter fullscreen mode Exit fullscreen mode

2️⃣ Lambda Functions: One-Liner Functions

Lambda functions are anonymous, inline functions used for short operations.

Basic Syntax:

lambda arguments: expression

Example:

<span>square</span> <span>=</span> <span>lambda</span> <span>x</span><span>:</span> <span>x</span> <span>**</span> <span>2</span>
<span>print</span><span>(</span><span>square</span><span>(</span><span>4</span><span>))</span> <span># Output: 16 </span>
<span>add</span> <span>=</span> <span>lambda</span> <span>a</span><span>,</span> <span>b</span><span>:</span> <span>a</span> <span>+</span> <span>b</span>
<span>print</span><span>(</span><span>add</span><span>(</span><span>3</span><span>,</span> <span>5</span><span>))</span> <span># Output: 8 </span>
<span>square</span> <span>=</span> <span>lambda</span> <span>x</span><span>:</span> <span>x</span> <span>**</span> <span>2</span>
<span>print</span><span>(</span><span>square</span><span>(</span><span>4</span><span>))</span>  <span># Output: 16 </span>
<span>add</span> <span>=</span> <span>lambda</span> <span>a</span><span>,</span> <span>b</span><span>:</span> <span>a</span> <span>+</span> <span>b</span>
<span>print</span><span>(</span><span>add</span><span>(</span><span>3</span><span>,</span> <span>5</span><span>))</span>  <span># Output: 8 </span>
square = lambda x: x ** 2 print(square(4)) # Output: 16 add = lambda a, b: a + b print(add(3, 5)) # Output: 8

Enter fullscreen mode Exit fullscreen mode

Use Case: Lambda functions are often used in sorting, filtering, and mapping data.

<span>numbers</span> <span>=</span> <span>[</span><span>3</span><span>,</span> <span>1</span><span>,</span> <span>4</span><span>,</span> <span>1</span><span>,</span> <span>5</span><span>,</span> <span>9</span><span>]</span>
<span>sorted_numbers</span> <span>=</span> <span>sorted</span><span>(</span><span>numbers</span><span>,</span> <span>key</span><span>=</span><span>lambda</span> <span>x</span><span>:</span> <span>-</span><span>x</span><span>)</span> <span># Sort in descending order </span><span>print</span><span>(</span><span>sorted_numbers</span><span>)</span> <span># Output: [9, 5, 4, 3, 1, 1] </span>
<span>numbers</span> <span>=</span> <span>[</span><span>3</span><span>,</span> <span>1</span><span>,</span> <span>4</span><span>,</span> <span>1</span><span>,</span> <span>5</span><span>,</span> <span>9</span><span>]</span>
<span>sorted_numbers</span> <span>=</span> <span>sorted</span><span>(</span><span>numbers</span><span>,</span> <span>key</span><span>=</span><span>lambda</span> <span>x</span><span>:</span> <span>-</span><span>x</span><span>)</span>  <span># Sort in descending order </span><span>print</span><span>(</span><span>sorted_numbers</span><span>)</span>  <span># Output: [9, 5, 4, 3, 1, 1] </span>
numbers = [3, 1, 4, 1, 5, 9] sorted_numbers = sorted(numbers, key=lambda x: -x) # Sort in descending order print(sorted_numbers) # Output: [9, 5, 4, 3, 1, 1]

Enter fullscreen mode Exit fullscreen mode

3️⃣ Introduction to Object-Oriented Programming (OOP)

OOP is a programming paradigm that models real-world entities using classes and objects.

Why Use OOP?

Encapsulation – Grouping related data and functions together
Inheritance – Reusing and extending functionality
Polymorphism – Writing flexible code that works across different types

4️⃣ Classes and Objects in Python**

Defining a Class and Creating Objects

<span>class</span> <span>Person</span><span>:</span>
<span>def</span> <span>__init__</span><span>(</span><span>self</span><span>,</span> <span>name</span><span>,</span> <span>age</span><span>):</span> <span># Constructor </span> <span>self</span><span>.</span><span>name</span> <span>=</span> <span>name</span> <span># Instance variable </span> <span>self</span><span>.</span><span>age</span> <span>=</span> <span>age</span>
<span>def</span> <span>introduce</span><span>(</span><span>self</span><span>):</span> <span># Method </span> <span>return</span> <span>f</span><span>"</span><span>My name is </span><span>{</span><span>self</span><span>.</span><span>name</span><span>}</span><span> and I</span><span>'</span><span>m </span><span>{</span><span>self</span><span>.</span><span>age</span><span>}</span><span> years old.</span><span>"</span>
<span># Creating an object (instance) </span><span>alice</span> <span>=</span> <span>Person</span><span>(</span><span>"</span><span>Alice</span><span>"</span><span>,</span> <span>25</span><span>)</span>
<span>print</span><span>(</span><span>alice</span><span>.</span><span>introduce</span><span>())</span> <span># Output: My name is Alice and I'm 25 years old. </span>
<span>class</span> <span>Person</span><span>:</span>
    <span>def</span> <span>__init__</span><span>(</span><span>self</span><span>,</span> <span>name</span><span>,</span> <span>age</span><span>):</span>  <span># Constructor </span>        <span>self</span><span>.</span><span>name</span> <span>=</span> <span>name</span>  <span># Instance variable </span>        <span>self</span><span>.</span><span>age</span> <span>=</span> <span>age</span>

    <span>def</span> <span>introduce</span><span>(</span><span>self</span><span>):</span>  <span># Method </span>        <span>return</span> <span>f</span><span>"</span><span>My name is </span><span>{</span><span>self</span><span>.</span><span>name</span><span>}</span><span> and I</span><span>'</span><span>m </span><span>{</span><span>self</span><span>.</span><span>age</span><span>}</span><span> years old.</span><span>"</span>

<span># Creating an object (instance) </span><span>alice</span> <span>=</span> <span>Person</span><span>(</span><span>"</span><span>Alice</span><span>"</span><span>,</span> <span>25</span><span>)</span>
<span>print</span><span>(</span><span>alice</span><span>.</span><span>introduce</span><span>())</span>  <span># Output: My name is Alice and I'm 25 years old. </span>
class Person: def __init__(self, name, age): # Constructor self.name = name # Instance variable self.age = age def introduce(self): # Method return f"My name is {self.name} and I'm {self.age} years old." # Creating an object (instance) alice = Person("Alice", 25) print(alice.introduce()) # Output: My name is Alice and I'm 25 years old.

Enter fullscreen mode Exit fullscreen mode

Instance Variables vs. Class Variables

<span>class</span> <span>Counter</span><span>:</span>
<span>count</span> <span>=</span> <span>0</span> <span># Class variable (shared among all instances) </span>
<span>def</span> <span>__init__</span><span>(</span><span>self</span><span>):</span>
<span>Counter</span><span>.</span><span>count</span> <span>+=</span> <span>1</span>
<span>obj1</span> <span>=</span> <span>Counter</span><span>()</span>
<span>obj2</span> <span>=</span> <span>Counter</span><span>()</span>
<span>print</span><span>(</span><span>Counter</span><span>.</span><span>count</span><span>)</span> <span># Output: 2 (shared across all objects) </span>
<span>class</span> <span>Counter</span><span>:</span>
    <span>count</span> <span>=</span> <span>0</span>  <span># Class variable (shared among all instances) </span>
    <span>def</span> <span>__init__</span><span>(</span><span>self</span><span>):</span>
        <span>Counter</span><span>.</span><span>count</span> <span>+=</span> <span>1</span>

<span>obj1</span> <span>=</span> <span>Counter</span><span>()</span>
<span>obj2</span> <span>=</span> <span>Counter</span><span>()</span>
<span>print</span><span>(</span><span>Counter</span><span>.</span><span>count</span><span>)</span>  <span># Output: 2 (shared across all objects) </span>
class Counter: count = 0 # Class variable (shared among all instances) def __init__(self): Counter.count += 1 obj1 = Counter() obj2 = Counter() print(Counter.count) # Output: 2 (shared across all objects)

Enter fullscreen mode Exit fullscreen mode

Key Difference:

Instance Variables (self.name) are unique to each object.
Class Variables (count) are shared across all instances.
Instance Variables (self.name) are unique to each object.
Class Variables (count) are shared across all instances.
Instance Variables (self.name) are unique to each object. Class Variables (count) are shared across all instances.

Enter fullscreen mode Exit fullscreen mode

5️⃣ Inheritance: Reusing Code

Inheritance allows one class (child class) to inherit the properties of another (parent class).

<span>class</span> <span>Animal</span><span>:</span>
<span>def</span> <span>speak</span><span>(</span><span>self</span><span>):</span>
<span>return</span> <span>"</span><span>I make sounds</span><span>"</span>
<span>class</span> <span>Dog</span><span>(</span><span>Animal</span><span>):</span> <span># Dog class inherits from Animal </span> <span>def</span> <span>speak</span><span>(</span><span>self</span><span>):</span>
<span>return</span> <span>"</span><span>Woof!</span><span>"</span>
<span>dog</span> <span>=</span> <span>Dog</span><span>()</span>
<span>print</span><span>(</span><span>dog</span><span>.</span><span>speak</span><span>())</span> <span># Output: Woof! </span>
<span>class</span> <span>Animal</span><span>:</span>
    <span>def</span> <span>speak</span><span>(</span><span>self</span><span>):</span>
        <span>return</span> <span>"</span><span>I make sounds</span><span>"</span>

<span>class</span> <span>Dog</span><span>(</span><span>Animal</span><span>):</span>  <span># Dog class inherits from Animal </span>    <span>def</span> <span>speak</span><span>(</span><span>self</span><span>):</span>
        <span>return</span> <span>"</span><span>Woof!</span><span>"</span>

<span>dog</span> <span>=</span> <span>Dog</span><span>()</span>
<span>print</span><span>(</span><span>dog</span><span>.</span><span>speak</span><span>())</span>  <span># Output: Woof! </span>
class Animal: def speak(self): return "I make sounds" class Dog(Animal): # Dog class inherits from Animal def speak(self): return "Woof!" dog = Dog() print(dog.speak()) # Output: Woof!

Enter fullscreen mode Exit fullscreen mode

6️⃣ Encapsulation: Hiding Data with Private Variables

Encapsulation prevents direct modification of attributes.

<span>class</span> <span>BankAccount</span><span>:</span>
<span>def</span> <span>__init__</span><span>(</span><span>self</span><span>,</span> <span>balance</span><span>):</span>
<span>self</span><span>.</span><span>__balance</span> <span>=</span> <span>balance</span> <span># Private variable (cannot be accessed directly) </span>
<span>def</span> <span>deposit</span><span>(</span><span>self</span><span>,</span> <span>amount</span><span>):</span>
<span>self</span><span>.</span><span>__balance</span> <span>+=</span> <span>amount</span>
<span>def</span> <span>get_balance</span><span>(</span><span>self</span><span>):</span>
<span>return</span> <span>self</span><span>.</span><span>__balance</span> <span># Provide controlled access </span>
<span>account</span> <span>=</span> <span>BankAccount</span><span>(</span><span>1000</span><span>)</span>
<span>account</span><span>.</span><span>deposit</span><span>(</span><span>500</span><span>)</span>
<span>print</span><span>(</span><span>account</span><span>.</span><span>get_balance</span><span>())</span> <span># Output: 1500 </span>
<span># print(account.__balance) # This will raise an AttributeError </span>
<span>class</span> <span>BankAccount</span><span>:</span>
    <span>def</span> <span>__init__</span><span>(</span><span>self</span><span>,</span> <span>balance</span><span>):</span>
        <span>self</span><span>.</span><span>__balance</span> <span>=</span> <span>balance</span>  <span># Private variable (cannot be accessed directly) </span>
    <span>def</span> <span>deposit</span><span>(</span><span>self</span><span>,</span> <span>amount</span><span>):</span>
        <span>self</span><span>.</span><span>__balance</span> <span>+=</span> <span>amount</span>

    <span>def</span> <span>get_balance</span><span>(</span><span>self</span><span>):</span>
        <span>return</span> <span>self</span><span>.</span><span>__balance</span>  <span># Provide controlled access </span>
<span>account</span> <span>=</span> <span>BankAccount</span><span>(</span><span>1000</span><span>)</span>
<span>account</span><span>.</span><span>deposit</span><span>(</span><span>500</span><span>)</span>
<span>print</span><span>(</span><span>account</span><span>.</span><span>get_balance</span><span>())</span>  <span># Output: 1500 </span>
<span># print(account.__balance) # This will raise an AttributeError </span>
class BankAccount: def __init__(self, balance): self.__balance = balance # Private variable (cannot be accessed directly) def deposit(self, amount): self.__balance += amount def get_balance(self): return self.__balance # Provide controlled access account = BankAccount(1000) account.deposit(500) print(account.get_balance()) # Output: 1500 # print(account.__balance) # This will raise an AttributeError

Enter fullscreen mode Exit fullscreen mode

7️⃣ Polymorphism: Methods with the Same Name but Different Behavior

<span>class</span> <span>Bird</span><span>:</span>
<span>def</span> <span>speak</span><span>(</span><span>self</span><span>):</span>
<span>return</span> <span>"</span><span>Chirp!</span><span>"</span>
<span>class</span> <span>Dog</span><span>:</span>
<span>def</span> <span>speak</span><span>(</span><span>self</span><span>):</span>
<span>return</span> <span>"</span><span>Woof!</span><span>"</span>
<span>animals</span> <span>=</span> <span>[</span><span>Bird</span><span>(),</span> <span>Dog</span><span>()]</span>
<span>for</span> <span>animal</span> <span>in</span> <span>animals</span><span>:</span>
<span>print</span><span>(</span><span>animal</span><span>.</span><span>speak</span><span>())</span> <span># Calls the correct method for each object </span>
<span>class</span> <span>Bird</span><span>:</span>
    <span>def</span> <span>speak</span><span>(</span><span>self</span><span>):</span>
        <span>return</span> <span>"</span><span>Chirp!</span><span>"</span>

<span>class</span> <span>Dog</span><span>:</span>
    <span>def</span> <span>speak</span><span>(</span><span>self</span><span>):</span>
        <span>return</span> <span>"</span><span>Woof!</span><span>"</span>

<span>animals</span> <span>=</span> <span>[</span><span>Bird</span><span>(),</span> <span>Dog</span><span>()]</span>
<span>for</span> <span>animal</span> <span>in</span> <span>animals</span><span>:</span>
    <span>print</span><span>(</span><span>animal</span><span>.</span><span>speak</span><span>())</span>  <span># Calls the correct method for each object </span>
class Bird: def speak(self): return "Chirp!" class Dog: def speak(self): return "Woof!" animals = [Bird(), Dog()] for animal in animals: print(animal.speak()) # Calls the correct method for each object

Enter fullscreen mode Exit fullscreen mode

Why Polymorphism?

Allows different classes to share the same method name, making code more flexible.

Conclusion

Functions improve reusability and structure.
Lambda functions allow writing concise, one-liner expressions.
OOP (Classes, Inheritance, Encapsulation, Polymorphism) models real-world entities effectively.

Mastering these concepts will help you write cleaner and more maintainable Python code.

What’s Next?

In the next post, we’ll explore Python’s Modules and Packages, learning how to organize code effectively. Stay tuned!

What Do You Think?

Do you use OOP in your projects? What’s your favorite Python feature? Let’s discuss in the comments!

原文链接:Functions and Object-Oriented Programming (OOP) in Python

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
Remember happiness doesn't depend upon who you are or what you have; it depends solely on what you think.
幸福不在于你是谁,你拥有什么,而仅仅在于你自己怎么看待
评论 抢沙发

请登录后发表评论

    暂无评论内容