Python Data Science Jobs & Interviews
19.6K subscribers
186 photos
4 videos
24 files
292 links
Your go-to hub for Python and Data Science—featuring questions, answers, quizzes, and interview tips to sharpen your skills and boost your career in the data-driven world.

Admin: @Hussein_Sheikho
Download Telegram
🐍 Python Tip of the Day: Decorators — Enhance Function Behavior

🧠 What is a Decorator in Python?
A decorator lets you wrap extra logic before or after a function runs, without modifying its original code.

🔥 A Simple Example

Imagine you have a basic greeting function:

def say_hello():
print("Hello!")


You want to log a message before and after it runs, but you don’t want to touch say_hello() itself. Here’s where a decorator comes in:

def my_decorator(func):
def wrapper():
print("Calling the function...")
func()
print("Function has been called.")
return wrapper


Now “decorate” your function:

@my_decorator
def say_hello():
print("Hello!")


When you call it:

say_hello()


Output:
Calling the function...
Hello!
Function has been called.




💡 Quick Tip:
The @my_decorator syntax is just syntactic sugar for:
s
ay_hello = my_decorator(say_hello)

🚀 Why Use Decorators?
- 🔄 Reuse common “before/after” logic
- 🔒 Keep your original functions clean
- 🔧 Easily add logging, authentication, timing, and more



#PythonTips #Decorators #AdvancedPython #CleanCode #CodingMagic

🔍By: https://t.iss.one/DataScienceQ
👍5🔥2
🧠 What is a Generator in Python?
A generator is a special type of iterator that produces values lazily—one at a time, and only when needed—without storing them all in memory.

---

How do you create a generator?
Correct answer:
Option 1: Use the yield keyword inside a function.

🔥 Simple example:

def countdown(n):
while n > 0:
yield n
n -= 1


When you call this function:

gen = countdown(3)
print(next(gen)) # 3
print(next(gen)) # 2
print(next(gen)) # 1


Each time you call next(), the function resumes from where it left off, runs until it hits yield, returns a value, and pauses again.

---

Why are the other options incorrect?

- Option 2 (class with __iter__ and __next__):
It works, but it’s more complex. Using yield is simpler and more Pythonic.

- Options 3 & 4 (for or while loops):
Loops are not generators themselves. They just iterate over iterables.

---

💡 Pro Tip:
Generators are perfect when working with large or infinite datasets. They’re memory-efficient, fast, and clean to write.

---

📌 #Python #Generator #yield #AdvancedPython #PythonTips #Coding


🔍By: https://t.iss.one/DataScienceQ
👍62🔥2❤‍🔥1
How to Dynamically Create a Class at Runtime in Python?

You can dynamically create a class in Python using the built-in type() function. This is one of the simplest ways to leverage metaclasses.

Example:

# Create a new class dynamically
MyDynamicClass = type('MyDynamicClass', (object,), {
'say_hello': lambda self: print("Hello!")
})

# Use the dynamically created class
obj = MyDynamicClass()
obj.say_hello()

Explanation:

* 'MyDynamicClass': Name of the new class
* (object,): Tuple of base classes (here, just inheriting from object)
* {'say_hello': ...}: Dictionary of attributes/methods for the class

Output:

Hello!

This is a powerful feature used in metaprogramming and framework design.



#PythonTips #Metaclass #PythonOOP #DynamicClass #typeFunction #AdvancedPython #CodingTips

🌺https://t.iss.one/DataScienceQ
👍2🔥2
Advanced Python Test

1. What is the output of the following code?
def func(x, l=[]):
for i in range(x):
l.append(i * i)
return l

print(func(2))
print(func(3, []))
print(func(3))

A) [0, 1] [0, 1, 4] [0, 1, 4]
B) [0, 1] [0, 1, 4] [0, 1, 4, 0, 1, 4]
C) [0, 1] [0, 1, 4] [0, 1, 4, 0, 1, 4, 0, 1, 4]
D) [0, 1] [0, 1, 4] [0, 1, 4, 0, 1, 4, 0, 1, 4, 0, 1, 4]

2. Which statement about metaclasses in Python is TRUE?
A) A metaclass is used to create class instances
B) The __call__ method of a metaclass controls instance creation
C) All classes must explicitly specify a metaclass
D) Metaclasses cannot inherit from other metaclasses

3. What does this decorator do?
from functools import wraps

def debug(func):
@wraps(func)
def wrapper(*args, **kwargs):
print(f"Calling {func.__name__}")
return func(*args, **kwargs)
return wrapper

A) Measures function execution time
B) Logs function calls with arguments
C) Prints the function name when called
D) Prevents function execution in debug mode

4. What is the purpose of context managers?
A) To manage class inheritance hierarchies
B) To handle resource allocation and cleanup
C) To create thread-safe operations
D) To optimize memory usage in loops

#Python #AdvancedPython #CodingTest #ProgrammingQuiz #PythonDeveloper #CodeChallenge


By: t.iss.one/DataScienceQ 🚀
3