Data Management With Python, SQLite, and SQLAlchemy
In this tutorial, youβll learn how to use:
1β£ Flat files for data storage
π’ SQL to improve access to persistent data
π’ SQLite for data storage
π’ SQLAlchemy to work with data as Python objects
Enroll Free: https://realpython.com/python-sqlite-sqlalchemy/
In this tutorial, youβll learn how to use:
Enroll Free: https://realpython.com/python-sqlite-sqlalchemy/
#python #programming #developer #programmer #coding #coder #softwaredeveloper #computerscience #webdev #webdeveloper #webdevelopment #pythonprogramming #pythonquiz #ai #ml #machinelearning #datascience #django #SQLAlchemy #SQLite #SQL
https://t.me/DataScience4
Please open Telegram to view this post
VIEW IN TELEGRAM
π8
Forwarded from Machine Learning with Python
In Python, lists are versatile mutable sequences with built-in methods for adding, removing, searching, sorting, and moreβcovering all common scenarios like dynamic data manipulation, queues, or stacks. Below is a complete breakdown of all list methods, each with syntax, an example, and output, plus key built-in functions for comprehensive use.
π Adding Elements
β¦ append(x): Adds a single element to the end.
β¦ extend(iterable): Adds all elements from an iterable to the end.
β¦ insert(i, x): Inserts x at index i (shifts elements right).
π Removing Elements
β¦ remove(x): Removes the first occurrence of x (raises ValueError if not found).
β¦ pop(i=-1): Removes and returns the element at index i (default: last).
β¦ clear(): Removes all elements.
π Searching and Counting
β¦ count(x): Returns the number of occurrences of x.
β¦ index(x[, start[, end]]): Returns the lowest index of x in the slice (raises ValueError if not found).
π Ordering and Copying
β¦ sort(key=None, reverse=False): Sorts the list in place (ascending by default; stable sort).
β¦ reverse(): Reverses the elements in place.
β¦ copy(): Returns a shallow copy of the list.
π Built-in Functions for Lists (Common Cases)
β¦ len(lst): Returns the number of elements.
β¦ min(lst): Returns the smallest element (raises ValueError if empty).
β¦ max(lst): Returns the largest element.
β¦ sum(lst[, start=0]): Sums the elements (start adds an offset).
β¦ sorted(lst, key=None, reverse=False): Returns a new sorted list (non-destructive).
These cover all standard operations (O(1) for append/pop from end, O(n) for most others). Use slicing
#python #lists #datastructures #methods #examples #programming
β @DataScience4
π Adding Elements
β¦ append(x): Adds a single element to the end.
lst = [1, 2]
lst.append(3)
print(lst) # Output: [1, 2, 3]
β¦ extend(iterable): Adds all elements from an iterable to the end.
lst = [1, 2]
lst.extend([3, 4])
print(lst) # Output: [1, 2, 3, 4]
β¦ insert(i, x): Inserts x at index i (shifts elements right).
lst = [1, 3]
lst.insert(1, 2)
print(lst) # Output: [1, 2, 3]
π Removing Elements
β¦ remove(x): Removes the first occurrence of x (raises ValueError if not found).
lst = [1, 2, 2]
lst.remove(2)
print(lst) # Output: [1, 2]
β¦ pop(i=-1): Removes and returns the element at index i (default: last).
lst = [1, 2, 3]
item = lst.pop(1)
print(item, lst) # Output: 2 [1, 3]
β¦ clear(): Removes all elements.
lst = [1, 2, 3]
lst.clear()
print(lst) # Output: []
π Searching and Counting
β¦ count(x): Returns the number of occurrences of x.
lst = [1, 2, 2, 3]
print(lst.count(2)) # Output: 2
β¦ index(x[, start[, end]]): Returns the lowest index of x in the slice (raises ValueError if not found).
lst = [1, 2, 3, 2]
print(lst.index(2)) # Output: 1
π Ordering and Copying
β¦ sort(key=None, reverse=False): Sorts the list in place (ascending by default; stable sort).
lst = [3, 1, 2]
lst.sort()
print(lst) # Output: [1, 2, 3]
β¦ reverse(): Reverses the elements in place.
lst = [1, 2, 3]
lst.reverse()
print(lst) # Output: [3, 2, 1]
β¦ copy(): Returns a shallow copy of the list.
lst = [1, 2]
new_lst = lst.copy()
print(new_lst) # Output: [1, 2]
π Built-in Functions for Lists (Common Cases)
β¦ len(lst): Returns the number of elements.
lst = [1, 2, 3]
print(len(lst)) # Output: 3
β¦ min(lst): Returns the smallest element (raises ValueError if empty).
lst = [3, 1, 2]
print(min(lst)) # Output: 1
β¦ max(lst): Returns the largest element.
lst = [3, 1, 2]
print(max(lst)) # Output: 3
β¦ sum(lst[, start=0]): Sums the elements (start adds an offset).
lst = [1, 2, 3]
print(sum(lst)) # Output: 6
β¦ sorted(lst, key=None, reverse=False): Returns a new sorted list (non-destructive).
lst = [3, 1, 2]
print(sorted(lst)) # Output: [1, 2, 3]
These cover all standard operations (O(1) for append/pop from end, O(n) for most others). Use slicing
lst[start:end:step] for advanced extraction, like lst[1:3] outputs ``.#python #lists #datastructures #methods #examples #programming
Please open Telegram to view this post
VIEW IN TELEGRAM
β€6
In Python, the collections module offers specialized container datatypes that solve real-world coding challenges with elegance and efficiency. These tools are interview favorites for optimizing time complexity and writing clean, professional code! π‘
By: @DatascienceNπ
#Python #CodingInterview #DataStructures #collections #Programming #TechJobs #Algorithm #LeetCode #DeveloperTips #CareerGrowth
import collections
# defaultdict - Eliminate key errors with auto-initialization
from collections import defaultdict
gradebook = defaultdict(int)
gradebook['Alice'] += 95
print(gradebook['Alice']) # Output: 95
print(gradebook['Bob']) # Output: 0
# defaultdict for grouping operations
anagrams = defaultdict(list)
words = ["eat", "tea", "tan"]
for w in words:
key = ''.join(sorted(w))
anagrams[key].append(w)
print(anagrams['aet']) # Output: ['eat', 'tea']
# Counter - Frequency analysis in one line
from collections import Counter
text = "abracadabra"
freq = Counter(text)
print(freq['a']) # Output: 5
print(freq.most_common(2)) # Output: [('a', 5), ('b', 2)]
# Counter arithmetic for problem-solving
inventory = Counter(apples=10, oranges=5)
sales = Counter(apples=3, oranges=2)
print(inventory - sales) # Output: Counter({'apples': 7, 'oranges': 3})
# namedtuple - Self-documenting data structures
from collections import namedtuple
Employee = namedtuple('Employee', 'name role salary')
dev = Employee('Alex', 'Developer', 95000)
print(dev.role) # Output: Developer
print(dev[2]) # Output: 95000
# deque - Optimal for BFS and sliding windows
from collections import deque
queue = deque([1, 2, 3])
queue.append(4)
queue.popleft()
print(queue) # Output: deque([2, 3, 4])
queue.rotate(1)
print(queue) # Output: deque([4, 2, 3])
# OrderedDict - Track insertion order (LRU cache essential)
from collections import OrderedDict
cache = OrderedDict()
cache['A'] = 1
cache['B'] = 2
cache.move_to_end('A')
cache.popitem(last=False)
print(list(cache.keys())) # Output: ['B', 'A']
# ChainMap - Manage layered configurations
from collections import ChainMap
defaults = {'theme': 'dark', 'font': 'Arial'}
user_prefs = {'theme': 'light'}
settings = ChainMap(user_prefs, defaults)
print(settings['font']) # Output: Arial
# Practical Interview Tip: Anagram detection
print(Counter("secure") == Counter("rescue")) # Output: True
# Pro Tip: Sliding window maximum
def max_sliding_window(nums, k):
dq, result = deque(), []
for i, n in enumerate(nums):
while dq and nums[dq[-1]] < n:
dq.pop()
dq.append(i)
if dq[0] == i - k:
dq.popleft()
if i >= k - 1:
result.append(nums[dq[0]])
return result
print(max_sliding_window([1,3,-1,-3,5,3,6,7], 3)) # Output: [3,3,5,5,6,7]
# Expert Move: Custom LRU Cache implementation
class LRUCache:
def __init__(self, capacity):
self.cache = OrderedDict()
self.capacity = capacity
def get(self, key):
if key not in self.cache:
return -1
self.cache.move_to_end(key)
return self.cache[key]
def put(self, key, value):
if key in self.cache:
del self.cache[key]
self.cache[key] = value
if len(self.cache) > self.capacity:
self.cache.popitem(last=False)
cache = LRUCache(2)
cache.put(1, 10)
cache.put(2, 20)
cache.get(1)
cache.put(3, 30)
print(list(cache.cache.keys())) # Output: [2, 1, 3] β Wait! Correction: Should be [1, 3] (capacity=2 triggers eviction of '2')
# Bonus: Multiset operations with Counter
primes = Counter([2, 3, 5, 7])
odds = Counter([1, 3, 5, 7, 9])
print(primes | odds) # Output: Counter({3:1, 5:1, 7:1, 2:1, 9:1, 1:1})
By: @DatascienceNπ
#Python #CodingInterview #DataStructures #collections #Programming #TechJobs #Algorithm #LeetCode #DeveloperTips #CareerGrowth
β€1
# Django ORM Comparison - Know both frameworks
# Django model (contrast with SQLAlchemy)
from django.db import models
class Department(models.Model):
name = models.CharField(max_length=50)
class Employee(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(unique=True)
department = models.ForeignKey(Department, on_delete=models.CASCADE)
# Django query (similar but different syntax)
Employee.objects.filter(department__name="HR").select_related('department')
# Async ORM - Modern Python requirement
# Requires SQLAlchemy 1.4+ and asyncpg
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
async_engine = create_async_engine(
"postgresql+asyncpg://user:pass@localhost/db",
echo=True,
)
async_session = AsyncSession(async_engine)
async with async_session.begin():
result = await async_session.execute(
select(Employee).where(Employee.name == "Alice")
)
employee = result.scalar_one()
# Testing Strategies - Interview differentiator
from unittest import mock
# Mock database for unit tests
with mock.patch('sqlalchemy.create_engine') as mock_engine:
mock_conn = mock.MagicMock()
mock_engine.return_value.connect.return_value = mock_conn
# Test your ORM-dependent code
create_employee("Test", "test@company.com")
mock_conn.execute.assert_called()
# Production Monitoring - Track slow queries
from sqlalchemy import event
@event.listens_for(engine, "before_cursor_execute")
def before_cursor(conn, cursor, statement, params, context, executemany):
conn.info.setdefault('query_start_time', []).append(time.time())
@event.listens_for(engine, "after_cursor_execute")
def after_cursor(conn, cursor, statement, params, context, executemany):
total = time.time() - conn.info['query_start_time'].pop(-1)
if total > 0.1: # Log slow queries
print(f"SLOW QUERY ({total:.2f}s): {statement}")
# Interview Power Move: Implement caching layer
from functools import lru_cache
class CachedEmployeeRepository(EmployeeRepository):
@lru_cache(maxsize=100)
def get_by_id(self, employee_id):
return super().get_by_id(employee_id)
def invalidate_cache(self, employee_id):
self.get_by_id.cache_clear()
# Reduces database hits by 70% in read-heavy applications
# Pro Tip: Schema versioning in CI/CD pipelines
# Sample .gitlab-ci.yml snippet
deploy_db:
stage: deploy
script:
- alembic upgrade head
- pytest tests/db_tests.py # Verify schema compatibility
only:
- main
# Real-World Case Study: E-commerce inventory system
class Product(Base):
__tablename__ = 'products'
id = Column(Integer, primary_key=True)
sku = Column(String(20), unique=True)
stock = Column(Integer, default=0)
# Atomic stock update (prevents race conditions)
def decrement_stock(self, quantity, session):
result = session.query(Product).filter(
Product.id == self.id,
Product.stock >= quantity
).update({"stock": Product.stock - quantity})
if not result:
raise ValueError("Insufficient stock")
# Usage during checkout
product.decrement_stock(2, session)
By: @DATASCIENCE4 π
#Python #ORM #SQLAlchemy #Django #Database #BackendDevelopment #CodingInterview #WebDevelopment #TechJobs #SystemDesign #SoftwareEngineering #DataEngineering #CareerGrowth #APIs #Microservices #DatabaseDesign #TechTips #DeveloperTools #Programming #CareerTips
β€3