Learn Python Coding
39.1K subscribers
636 photos
30 videos
24 files
391 links
Learn Python through simple, practical examples and real coding ideas. Clear explanations, useful snippets, and hands-on learning for anyone starting or improving their programming skills.

Admin: @HusseinSheikho || @Hussein_Sheikho
Download Telegram
Learning Common Algorithms with Python

• This lesson covers fundamental algorithms implemented in Python. Understanding these concepts is crucial for building efficient software. We will explore searching, sorting, and recursion.

Linear Search: This is the simplest search algorithm. It sequentially checks each element of the list until a match is found or the whole list has been searched. Its time complexity is O(n).

def linear_search(data, target):
for i in range(len(data)):
if data[i] == target:
return i # Return the index of the found element
return -1 # Return -1 if the element is not found

# Example
my_list = [4, 2, 7, 1, 9, 5]
print(f"Linear Search: Element 7 found at index {linear_search(my_list, 7)}")


Binary Search: A much more efficient search algorithm, but it requires the list to be sorted first. It works by repeatedly dividing the search interval in half. Its time complexity is O(log n).

def binary_search(sorted_data, target):
low = 0
high = len(sorted_data) - 1

while low <= high:
mid = (low + high) // 2
if sorted_data[mid] < target:
low = mid + 1
elif sorted_data[mid] > target:
high = mid - 1
else:
return mid # Element found
return -1 # Element not found

# Example
my_sorted_list = [1, 2, 4, 5, 7, 9]
print(f"Binary Search: Element 7 found at index {binary_search(my_sorted_list, 7)}")


Bubble Sort: A simple sorting algorithm that repeatedly steps through the list, compares adjacent elements and swaps them if they are in the wrong order. The process is repeated until the list is sorted. Its time complexity is O(n^2).

def bubble_sort(data):
n = len(data)
for i in range(n):
# Last i elements are already in place
for j in range(0, n-i-1):
if data[j] > data[j+1]:
# Swap the elements
data[j], data[j+1] = data[j+1], data[j]
return data

# Example
my_list_to_sort = [4, 2, 7, 1, 9, 5]
print(f"Bubble Sort: Sorted list is {bubble_sort(my_list_to_sort)}")


Recursion (Factorial): Recursion is a method where a function calls itself to solve a problem. A classic example is calculating the factorial of a number (n!). It must have a base case to stop the recursion.

def factorial(n):
# Base case: if n is 1 or 0, factorial is 1
if n == 0 or n == 1:
return 1
# Recursive step: n * factorial of (n-1)
else:
return n * factorial(n - 1)

# Example
num = 5
print(f"Recursion: Factorial of {num} is {factorial(num)}")


#Python #Algorithms #DataStructures #Coding #Programming #LearnToCode

━━━━━━━━━━━━━━━
By: @DataScience4
1
Exploring pathlib for Working with Paths!
Many projects still use os.path for path operations: join, dirname, exists, and more. It works, but the code quickly becomes cluttered with string manipulations and harder to read — especially when there are many paths being actively combined.

Since Python 3.4, there's pathlib — an object-oriented API for working with files and directories.

Importing the module is simple:

from pathlib import Path


You can create a path like any regular object:

path = Path("data/users.json")


When working with Path and the / operator, the correct separators for the current OS are used automatically. This keeps the code portable between Linux, macOS, and Windows without extra checks.

If you need an absolute path, use resolve():

print(path.resolve())


Very often when working with files, you need to check if a path exists:

if path.exists():
    print("File found")


Pathlib also lets you quickly determine the type of file system object:

path.is_file()
path.is_dir()


The Path object has convenient properties for getting path parts. This eliminates manual string parsing and working with split().

print(path.name)    # users.json
print(path.stem)    # users
print(path.suffix)  # .json
print(path.parent)  # data


For joining paths, the / operator is used, which looks noticeably cleaner and is easier to read compared to os.path.join:

base = Path("logs")
file_path = base / "2026" / "app.log"


Creating directories is also compact and convenient:

Path("backup/archive").mkdir(parents=True, exist_ok=True)


Here: parents=True creates nested directories; exist_ok=True doesn't raise an error if the folder already exists.

For reading and writing text files, there are built-in methods that cover most everyday tasks:

config = Path("config.txt")

config.write_text("debug=true", encoding="utf-8")

content = config.read_text(encoding="utf-8")
print(content)


For binary data, read_bytes() and write_bytes() methods are available.

You can iterate through directory contents using iterdir():

for file in Path("logs").iterdir():
    print(file)


If you need to search for files by pattern, use glob():

for py_file in Path(".").glob("*.py"):
    print(py_file)


And for recursive directory traversal, there's rglob():

for file in Path(".").rglob("*.json"):
    print(file)


Practical example — finding logs older than a certain date. This is a more real-world task:

from pathlib import Path
from datetime import datetime

logs = Path("logs")
limit_date = datetime(2026, 1, 1)

for file in logs.glob("*.log"):
    modified = datetime.fromtimestamp(file.stat().st_mtime)

    if modified < limit_date:
        print(file.name, modified)


The stat() method lets you get file metadata: size, modification time, permissions, and other system data.

Deleting files and directories is also built directly into the Path API:

path.unlink()  # file
path.rmdir()   # empty directory


It's important to note that pathlib doesn't fully replace shutil or os. For example, for copying files, recursive directory deletion, or complex permission operations, additional modules are usually used.



🔥 pathlib makes working with the file system noticeably cleaner: less string operations, better readability, and more predictable code when working with paths and files.



#Python #Pathlib #Programming #Coding #Developer #SoftwareEngineering #TechTips #LearnPython #PythonTips #FileSystem

https://t.me/pythonRe 🌟
Please open Telegram to view this post
VIEW IN TELEGRAM
7
If you work with Python, remember a simple rule: do not modify a list while iterating over it. 🐍🛑 This can lead to unexpected results because the iterator does not track structural changes.

Here is an example that looks logical but works incorrectly: 🤔

items = [1, 2, 2, 3, 4]
for item in items:
    if item == 2:
        items.remove(item)
print(items)
# Output: [1, 2, 3, 4]


It seems that all 2s should disappear, but one remains. Why?

After removing an element, the list shifts, but the loop moves on — as a result, some values are simply skipped. 🔄🚫

How to do it correctly — iterate over a copy:

for item in items[:]:
    if item == 2:
          items.remove(item)
print(items)
# Output: [1, 3, 4]


Even better — use list comprehension: 🚀

items = [x for x in items if x != 2]

Conclusion: 🏁 do not modify a collection during iteration. This can lead to skipped elements, duplication, or even errors during execution. 🛠️🚧

#Python #Coding #Programming #Debugging #TechTips #PythonTips
2
The Python library itertools contains many useful functions. 🐍

One of them is compress(), which returns an iterator over the elements from data, for which the corresponding element in selectors is equal to True. 🔍💻

Here's an example: 📝👇

#Python #Programming #Itertools #Coding #Tech #DataScience
🔥2
Cheat sheet on the basics of Python: 🐍📚

basic syntax and language rules 📝
scalar types — basic data types (int, float, bool, str, NoneType) 🔢

datetime — working with date and time 📅

data structures — Python data structures (list, tuple, dict, set) 🗄

list — mutable lists for storing data collections 📋
tuple — immutable sequences of values 🔒
dict (hash map) — storing data in a key-value format 🗝
set — unique elements without order 🔘

slicing — obtaining parts of sequences through indices and step ✂️

module/library — connecting modules and libraries 🔌

help functions — using help() and dir() to explore the Python API 🛠

#Python #Coding #DataScience #Programming #Tech #DevCommunity
5🔥3👍2
How to check for the presence of subclasses in Python? 🐍🧐

Here's how you can do it:

import inspect

def has_subclasses(cls):
return any(issubclass(sub, cls) for sub in inspect.getmembers(sys.modules[cls.__module__], inspect.isclass))

This function uses the inspect module to find all subclasses of the given class. 🛠️

#Python #Programming #Subclasses #Coding #Dev #Tech
5👍1
📂 Reminder about Python map()!

map() — a built-in function that applies the specified function to each element of an iterable object (list, tuple, set, etc.).

The picture shows the basic syntax, an example of use with lambda, and a typical case — data transformation without a manual for loop.

Save it to quickly remember the syntax!

🐍💻🗺️ #Python #Coding #Programming #LearnToCode #DevTips #Tech
7👍1
Why is enumerate() used in Python? 🤔🐍

It allows you to simultaneously obtain the value of an element and its index when iterating through a list. 📊

This is more convenient and more readable than manually working with a counter. 🚀

for i, item in enumerate(items):
print(i, item)


#Python #Coding #Programming #Dev #Tech #Code

Join Best TG Channels
https://t.me/addlist/0f6vfFbEMdAwODBk

⭐️ Join Our WhatsApp Channel
https://whatsapp.com/channel/0029VaC7Weq29753hpcggW2A
4👍1👏1
Data validation with Pydantic! 🐍

In the early stages of development, data validation usually doesn't cause problems. In many Python projects, validation initially looks simple:

if not isinstance(age, int):
raise ValueError("age must be an int")

But then come email, JSON from APIs, query parameters, nested objects, configs, nullable fields, and type conversion. At some point, the code turns into a set of if/else and manual checks.

For such tasks, Pydantic is often used. Installation:

pip install pydantic
pip install "pydantic[email]"

Create a model:

from pydantic import BaseModel

class User(BaseModel):
name: str
age: int

Now the data is validated automatically:

user = User(
name="Alex",
age="30"
)

print(user.age)
print(type(user.age))

The result:
30
<class 'int'>

Pydantic will automatically convert the string "30" to an int. If you pass an incorrect value, you'll get a ValidationError:

User(
name="Alex",
age="test"
)

This is especially convenient when working with APIs, JSON, query parameters, and incoming data from outside.

A common production case is checking email:

from pydantic import BaseModel, EmailStr

class User(BaseModel):
email: EmailStr

User(email="alex@test.com")

If the email is invalid, Pydantic will throw a ValidationError. You can set default values:

from pydantic import BaseModel

class Config(BaseModel):
host: str = "localhost"
port: int = 5432

And allow None:

from pydantic import BaseModel

class User(BaseModel):
nickname: str | None = None

This field becomes optional. A practical example is processing an API response:

from pydantic import BaseModel

class Product(BaseModel):
id: int
title: str
price: float

data = {
"id": "1",
"title": "Keyboard",
"price": "99.5"
}

product = Product(**data)

print(product)

The types will be automatically converted. For nested model structures, you can combine:

from pydantic import BaseModel

class Address(BaseModel):
city: str
zip_code: str

class User(BaseModel):
name: str
address: Address

user = User(
name="Alex",
address={
"city": "Berlin",
"zip_code": "10115"
}
)

print(user)

The nested object will also be validated. Serialization in Pydantic v2:

print(user.model_dump())
print(user.model_dump_json())

Pydantic is actively used in FastAPI, ETL, microservices, data pipelines, and API clients.

For working with environment variables in Pydantic v2, a separate package is usually used:

pip install pydantic-settings

It's important to understand: Pydantic is not an ORM and does not replace business logic. Its task is to validate data, convert types, and describe schemas.

🔥 Pydantic significantly reduces the amount of manual data validation and makes processing incoming structures more predictable.

#Python #Pydantic #DataValidation #FastAPI #Coding #DevOps

Join Best TG Channels https://t.me/addlist/0f6vfFbEMdAwODBk
⭐️ Join Our WhatsApp Channel https://whatsapp.com/channel/0029VaC7Weq29753hpcggW2A
3👍1
# Cheat sheet on high-order functions in Python:

🐍 map() - applies a function to every element of an iterable and returns an iterator with the results
🔍 filter() - filters elements based on a condition and leaves only those for which the function returns True
🔄 reduce() - successively combines all elements of an iterable into a single value
lambda functions - anonymous functions for short expressions and working with map/filter/reduce
📦 iterable objects - lists, tuples, and other collections for processing
📚 functools - a Python module that contains reduce()
🧠 functional programming - an approach to programming through functions and data processing without changing the state

```python
# Example usage
from functools import reduce

# map
squared = map(lambda x: x**2, [1, 2, 3, 4])
print(list(squared))

# filter
evens = filter(lambda x: x % 2 == 0, [1, 2, 3, 4, 5])
print(list(evens))

# reduce
total = reduce(lambda x, y: x + y, [1, 2, 3, 4])
pr
int(total)```

#Python #Programming #HighOrderFunctions #FunctionalProgramming #Coding #MapFilterReduce

Join Best TG Channels https://t.me/addlist/0f6vfFbEMdAwODBk
⭐️ Join Our WhatsApp Channel https://whatsapp.com/channel/0029VaC7Weq29753hpcggW2A
3🔥2👍1
This media is not supported in your browser
VIEW IN TELEGRAM
❤️ Architecture Patterns — an informative repository on backend architecture in Python!

Here, they excellently demonstrate how to properly separate application logic, work with complex architecture, build a scalable backend, and maintain a codebase in an adequate state as the project grows. Instead of dry theory, the authors gradually build a full-fledged application and show how the architecture evolves as the project grows.

I'll leave a link: https://github.com/cosmicpython/book

#Python #Backend #Architecture #Coding #DevCommunity #OpenSource

Join Best TG Channels https://t.me/addlist/0f6vfFbEMdAwODBk

⭐️ Join Our WhatsApp Channel https://whatsapp.com/channel/0029VaC7Weq29753hpcggW2A
2
Why in Python it is better to check None using is 🐍

In Python, you should not write obj == None, even if sometimes it works the same ⚠️

The reason is that == calls the comparison method eq, which can be overridden in the class — and then the behavior becomes unpredictable 🎲

For example:

class Weird:
def eq(self, other):
return True # always says "equal"

obj = Weird()

print(obj == None) # True
print(obj is None) # False

Here obj == None gives a false result due to custom logic 🤔

Instead:

obj is None

is checks the identity of the object and cannot be overridden. Since None is a singleton, such a check is always correct and predictable

Conclusion: to check for None always use is None — it is the right and safe approach 🛡️

Join Best TG Channels https://t.me/addlist/0f6vfFbEMdAwODBk

⭐️ Join Our WhatsApp Channel https://whatsapp.com/channel/0029VaC7Weq29753hpcggW2A

#Python #Programming #Coding #SoftwareDevelopment #TechTips #DevCommunity
4
Deep copying of objects with the copy module 🐍📦

import copy

# Original list with nested structure
original = [[1, 2, 3], [4, 5, 6]]

# 1. Shallow copy
shallow = copy.copy(original)
shallow[0][0] = 'X'
# Oh no! Both lists have changed, because the nested list wasn't copied, but passed by reference
print(f"Original after shallow: {original}") # [['X', 2, 3], [4, 5, 6]]

# Restore the data
original = [[1, 2, 3], [4, 5, 6]]

# 2. Deep copy
deep = copy.deepcopy(original)
deep[0][0] = 'X'
# Everything is fine! Only deep has changed, the original remains untouched
print(f"Original after deep: {original}") # [[1, 2, 3], [4, 5, 6]]

The link trap in Python 🔗🕳️

When you assign a list to another variable (A = B) or make a regular slice (A = B[:]), Python doesn't physically copy the data. It simply creates a new reference to the same objects in memory. If the list contains other mutable objects (lists, dictionaries, custom classes), standard copying methods will only create a shallow copy. The copy module allows you to control this process.

— Breaking the links: The deepcopy function recursively traverses the entire data structure and creates honest, independent duplicates for each nested element. This ensures that changes in the copy will not harm the original data. 🔓🔒
— Safe state: The use of deep copying is critical when implementing design patterns (for example, Snapshot/Memento), creating game state backups, or when you pass complex configurations to functions that may modify them accidentally. 🛡️💾
— A sensible balance: It's worth remembering that deepcopy works slower and consumes more memory than shallow copying, as it spends resources on creating new objects and checking for cyclic references. Use it specifically when there are nested mutable containers within the structure. ⚖️🧠

#Python #Programming #DeepCopy #Coding #Tech #Dev

Join Best TG Channels https://t.me/addlist/0f6vfFbEMdAwODBk

⭐️ Join Our WhatsApp Channel https://whatsapp.com/channel/0029VaC7Weq29753hpcggW2A
6
Regular for-loops are versatile but not always optimal: they add extra interpreter overhead, which is especially noticeable on large data 🐍

In such cases, it's better to use standard Python tools, for example itertools ⚙️

For example, to get all unique pairs from a list, nested loops are not needed — just combinations():

from itertools import combinations

def get_unique_pairs(items):
return list(combinations(items, 2))

print(get_unique_pairs(['A', 'B', 'C', 'D']))

# Output:
# [('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')]

Conclusion: instead of manual loops, it's better to use ready-made tools from the standard library — it's cleaner and more efficient 🚀

#Python #Coding #Programming #Developer #Tech #Optimization

Join Best TG Channels https://t.me/addlist/0f6vfFbEMdAwODBk

⭐️ Join Our WhatsApp Channel https://whatsapp.com/channel/0029VaC7Weq29753hpcggW2A
5👍1
🐍 Python Roadmap 2026: Finally, a comprehensive and up-to-date map for learning Python, not just a list of "figure it out yourself" links

A large Russian-language Python roadmap for 2026 has been posted on GitHub - from the first scripts to the Middle+/Senior level.

The route is compiled for modern Python:

- Python 3.13+
- free-threaded mode without GIL
- JIT
- uv instead of the hassle with pip/venv/poetry
- ruff, pyright, pytest, hypothesis
- async-first approach
- typing
- CPython inside
- web, databases, ML/AI, DevOps, and architecture

The roadmap has a logical sequence: first the environment and foundation, then idioms, OOP, types, the standard library, asynchrony, testing, CPython internals, web, databases, the AI direction, production, and architecture.

A particular plus is the practical format. At each stage, there are tasks, checklists, code examples, and free resources. This is not a motivational document, but a roadmap that you can actually follow for several months and see progress.

For beginners - a clear path without chaos.
For juniors - a way to fill in the gaps.
For those who already write in Python - a good checklist to understand where you're still struggling.

Python in 2026 is about tooling, types, async, infrastructure, AI, and production discipline. And this roadmap is exactly about such a Python.

https://github.com/justxor/pythonroamap2026

#Python #PythonRoadmap #Programming #2026 #Coding #DevOps

Join Best TG Channels https://t.me/addlist/0f6vfFbEMdAwODBk

⭐️ Join Our WhatsApp Channel https://whatsapp.com/channel/0029VaC7Weq29753hpcggW2A
2
5 More Must-Know Python Concepts 🐍

Let's take a look at five more fundamental concepts that every Python developer should have in their toolkit. 🛠️

Read: https://www.kdnuggets.com/5-more-must-know-python-concepts 🔗

#Python #Programming #Coding #Developer #TechTips #LearnPython

Join Best TG Channels https://t.me/addlist/0f6vfFbEMdAwODBk

⭐️ Join Our WhatsApp Channel https://whatsapp.com/channel/0029VaC7Weq29753hpcggW2A
1
When you're doing a parser or migrating a site, there's often a pile of unreadable HTML markup on the screen. Converting this into neat Markdown is usually a hassle.

In the open code, I found a convenient tool called python-markdownify, which precisely solves the problem of converting HTML to Markdown.

The logic is simple: you take bulky HTML and get a clear and well-structured Markdown as a result.

The tool is easily customizable. You can clean up the necessary tags, change the format of headings, and neatly process tables and images. All of this can be configured.

It's installed via pip. It can be used both from Python code and from the command line, converting files in batches.

pip install python-markdownify

If desired, you can inherit and redefine the conversion rules for your own cases. The extensibility is fine there.

If you have to process large amounts of text or migrate a blog, the library saves a lot of time that would otherwise be spent on tedious work with regular expressions.

➡️ Link to GitHub
http://github.com/matthewwithanm/python-markdownify

#python #markdown #html #coding #devtools #opensource

Join Best TG Channels https://t.me/addlist/0f6vfFbEMdAwODBk

⭐️ Join Our WhatsApp Channel https://whatsapp.com/channel/0029VaC7Weq29753hpcggW2A
4
Limiting program resources using the resource module 🛡️

import resource
import sys

# 1. Limiting the size of RAM (soft and hard limits in bytes)
# Limit the memory to ~50 MB
memory_limit = 50 * 1024 * 1024
resource.setrlimit(resource.RLIMIT_AS, (memory_limit, memory_limit))

# 2. Checking the protection's working
try:
print("Trying to allocate a huge array of memory...")
huge_list = [i for i in range(10_000_000)]
except MemoryError:
print("The limit worked! The program didn't crash, but caught the error.")

# 3. Finding out how many resources the script has already consumed
usage = resource.getrusage(resource.RUSAGE_SELF)
print(f"Peak memory consumption (in KB): {usage.ru_maxrss}")

Protecting the server from "greedy" code 🔧

When you run someone else's code, process user files, or write parsers, there's always a risk of a memory leak or an infinite loop. If such a script runs on the server, it can fill up all the RAM and bring down neighboring important processes (for example, the database). The built-in resource module (works on Unix/Linux/macOS) allows you to strictly limit the program's appetites.

Safe environment: You can limit not only RAM (RLIMIT_AS), but also CPU time (RLIMIT_CPU). If the code goes into an infinite loop, the system will gracefully terminate it after a specified number of seconds.

File system control: Using RLIMIT_FSIZE, you can prevent the script from creating files larger than a certain size. This will save the server's disks from being accidentally overwritten by gigantic logs.

Precise audit: The getrusage function provides detailed statistics on the current process: how much time the CPU spent on calculations, how many I/O operations there were, and what the maximum amount of memory used was during the entire operation.

#Python #ResourceManagement #ServerSafety #Coding #DevOps #Linux

Join Best TG Channels https://t.me/addlist/0f6vfFbEMdAwODBk

⭐️ Join Our WhatsApp Channel https://whatsapp.com/channel/0029VaC7Weq29753hpcggW2A

🚀 Level up your AI & Data Science skills with HelloEncyclo — a growing all-in-one platform featuring hands-on courses in LLMs, Deep Learning, MLOps, Data Engineering, and more.
13 courses live + 40+ coming soon
🎯 One access, lifetime updates
🔑 Use code: PRESALE-BOOK-WAVE-2GFG
👉 https://helloencyclo.com/?ref=HUSSEINSHEIKHO
4