Top 20+ Python Interview Q&A with Practical Test | Try Personalized AI Help

Join our community to see how developers are using Workik AI everyday.

Interview Question & Answers for Python Developers

Q1: What are Python's built-in data types and how do you convert between them?

Python offers various built-in data types such as numeric ( int , float , complex ), sequences ( list , tuple , range ), text ( str ), mapping ( dict ), set types ( set , frozenset ), boolean ( bool ), and binary types ( bytes , bytearray , memoryview ). Conversion between these data types is done using built-in functions like int() , float() , str() , list() , tuple() , dict() , and set() , allowing for dynamic data manipulation and transformation in Python.

Q2: How do you implement conditionals and exception handling in Python?

Conditionals in Python are managed with if , elif , and else statements, allowing different code executions based on certain conditions. Exception handling is done using try and except blocks to manage errors during runtime. Additional else (runs if no exceptions) and finally (executes after all other blocks regardless of the outcome) blocks can be used for comprehensive error management.

Q3: What is the difference between lists, tuples, and dictionaries?

  • List: A mutable sequence used for storing an ordered collection of items, defined with square brackets [] .
  • Tuple: An immutable sequence typically used for storing a heterogeneous mix of items, defined with parentheses () .
  • Dictionary: A mutable, unordered collection of key-value pairs, allowing fast retrieval, addition, and deletion of items, defined with curly braces {} . These structures are fundamental for data storage and manipulation in Python programming.

Q4: Explain Python decorators and their usage.

Python decorators are functions that modify the behavior of another function or method without permanently modifying it. They are used for extending the functionality of an existing function through a wrapper. This pattern is helpful for adding functionality like logging, access controls, and performance measurement, typically expressed with the @decorator_name syntax above the function definition.

Q5: What are context managers and why are they used?

Context managers in Python manage resources such as file streams or database connections with the with statement. They are designed to provide a setup and teardown utility for resources that need to be set up before use and cleaned up afterwards. Implementing a context manager involves defining __enter__() and __exit__() methods that handle the setup and teardown tasks, respectively.

Request question

Please fill in the form below to submit your question.

Q6: How does Python handle memory management?

Python employs an automatic memory management system that includes a built-in garbage collector to manage memory allocation and deallocation. The core of Python’s memory management is reference counting, where each object keeps track of how many references point to it. When an object’s reference count drops to zero, the memory allocator deallocates that object. Python also has a garbage collector to detect and collect circular references that cannot be freed by reference counting alone.

Q7: What is the Global Interpreter Lock (GIL) and how does it affect Python concurrency?

The Global Interpreter Lock (GIL) is a mutex that protects access to Python objects, preventing multiple native threads from executing Python bytecodes at once. This lock is necessary because Python's memory management is not thread-safe. The GIL allows only one thread to execute in the interpreter at any given time, which can be a bottleneck in CPU-bound and multi-threaded code. However, for I/O-bound multi-threading tasks, it allows high performance due to the nature of I/O and system calls releasing the GIL.

Q8: Describe the use and functionality of Python’s list comprehensions.

Python's list comprehensions provide a concise way to create lists. Common applications involve making new lists where each element is the result of some operations applied to each member of another sequence or iterable, or to create a subsequence of those elements that satisfy a certain condition. The syntax consists of brackets containing an expression followed by a for clause, then zero or more for or if clauses. They are more compact and faster than normal functions and loops for creating lists.

Q9: What are Python's lambda functions, and how are they different from regular functions?

Lambda functions in Python are small anonymous functions defined with the lambda keyword. They can have any number of arguments but only one expression. The main difference from regular functions (defined using def ) is that lambda functions are syntactically restricted to a single expression. This makes them syntactically simpler and is often used in situations where a simple function is required for a short period.

Q10: What is the difference between __str__ and __repr__ methods in Python?

Request question

Please fill in the form below to submit your question.

Q11: How do you reverse a list in Python?

You can reverse a list in Python using the reverse() method or the slicing technique. Here's how you can use both:

# Using the reverse() method
  my_list = [1, 2, 3, 4]
  my_list.reverse()
  print(my_list)  # Output: [4, 3, 2, 1]
  # Using slicing
  reversed_list = my_list[::-1]
  print(reversed_list)  # Output: [1, 2, 3, 4]

The reverse() method modifies the list in place, while slicing creates a new reversed list.

Q12: Explain the concept of "mutable vs immutable" objects in Python with examples.

In Python, mutable objects are those that can be changed after their creation, whereas immutable objects cannot be altered.

# Mutable example
mutable_list = [1, 2, 3]
mutable_list[0] = 100print(mutable_list)  # Output: [100, 2, 3]# Immutable example
immutable_string = "Hello"try:
    immutable_string[0] = "M"except TypeError as e:
    print(e)  # Output: 'str' object does not support item assignment

Common mutable types include lists and dictionaries, while immutables include strings and tuples.

Q13: How do you implement a function that calculates the factorial of a number recursively in Python?

A recursive function for calculating the factorial of a number is defined as calling itself to compute the product sequence from the number down to 1.

def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)

print(factorial(5))  # Output: 120

Q14: What are *args and **kwargs in Python, and how are they used?

The *args and **kwargs are used in function definitions. *args allows you to pass a variable number of non-keyword arguments to a function. **kwargs allows you to pass a variable number of keyword arguments (name-value pairs). They are useful when you want to create functions that handle a variable amount of input arguments.

Q15: Explain the use of the else clause in Python loops.

The else clause in a Python loop specifies a block of code that is executed after the loop's normal execution is finished, but only if the loop did not terminate by a break statement. This is unique to Python and useful to determine if a loop concluded naturally without external interruption.

for i in range(3):
    print(i)
else:
    print("Executed after the loop completes naturally.")

Request question

Please fill in the form below to submit your question.

Q16: How do you ensure thread safety in Python applications?

Thread safety in Python can be ensured by using locks, queues, or other synchronization mechanisms to prevent multiple threads from accessing the same resource simultaneously. The threading module includes Lock , RLock , and Semaphore classes that can be used to synchronize threads.


  import threading

lock = threading.Lock()

def safe_update():
    with lock:
        # perform thread-safe modifications
        pass

thread1 = threading.Thread(target=safe_update)
thread2 = threading.Thread(target=safe_update)
thread1.start()
thread2.start()
thread1.join()
thread2.join()

  

Q17: What are Python's metaclasses and what are they used for?

Metaclasses in Python are classes of classes; they define how classes behave. A metaclass in Python is most often used as a class-factory, or to modify class behavior. You can intercept the creation of a class and modify the class's definition by using metaclasses. They are somewhat advanced and are used in complex scenarios like enforcing API standards or modifying class properties dynamically.

Q18: Describe how the Python with statement works and provide an example of using it with file handling.

The with statement in Python is used for exception handling and simplifies the management of common resources such as file streams. It ensures that resources are properly cleaned up after use, regardless of whether an exception was thrown or not. The with statement eliminates the need for explicit acquisition and release of resources.


with open('example.txt', 'r') as file:
    content = file.read()
    print(content)
# The file is automatically closed outside the with block, even if an exception occurs.

Q19: What is the Python walrus operator (:=) and how can it be used to enhance code readability?

Introduced in Python 3.8, the walrus operator ( := ) allows you to assign values to variables as part of an expression. This can make certain constructs more concise, reducing the need for additional lines of code. It's particularly useful in loops or conditions where you want to assign a value to a variable and immediately check its truthiness or other properties in the same expression.


# Classic method
num = input("Enter a number: ")
while num.isdigit():
    num = input("Enter a number: ")

# Using the walrus operator
while (num := input("Enter a number: ")).isdigit():
    pass

Q20: Explain the concept of duck typing in Python and provide an example.

Duck typing is a concept related to dynamic typing, where the type or class of an object is less important than the methods it defines. In Python, if an object can perform a required behavior (i.e., "if it quacks like a duck"), that object can be used in any context expecting an object with that behavior. This allows for more flexibility and simplicity in code.


class Duck:
    def quack(self):
        print("Quack, quack!")

class Person:
    def quack(self):
        print("I'm pretending to be a duck!")

def make_it_quack(duck):
    duck.quack()

duck = Duck()
person = Person()
make_it_quack(duck)   # Output: Quack, quack!
make_it_quack(person) # Output: I'm pretending to be a duck!

Request question

Please fill in the form below to submit your question.

Request question

Please fill in the form below to submit your question.

Practical Assessment Based Questions & Answers

Q1: Identify and fix the error in the following Python code snippet.
(Basic)

def calculate_average(numbers):
sum_numbers = sum(numbers)
count = len(numbers)
average = sum_numbers // count
return average
print(calculate_average([10, 20, 30]))

The error in this code is in the integer division operator // , which should be replaced with the float division operator / to handle non-integer averages correctly.


def calculate_average(numbers):
sum_numbers = sum(numbers)
count = len(numbers)
average = sum_numbers / count  # Corrected division operator
return average
print(calculate_average([10, 20, 30]))  # Output: 20.0
Q2: Improve the performance of the following code that checks if a word is a palindrome.
(Intermediate)
def is_palindrome(word):
return word == ''.join(reversed(list(word)))
print(is_palindrome("radar"))
print(is_palindrome("hello"))

The current implementation unnecessarily converts the string to a list and then reverses it. This can be simplified by comparing the string directly with its reverse using slicing, which is more efficient.


def is_palindrome(word):
return word == word[::-1]
print(is_palindrome("radar"))  # Output: True
print(is_palindrome("hello"))  # Output: False
Q3: Write a Python function that removes vowels from a string.
(Basic)

def remove_vowels(s):
vowels = 'aeiouAEIOU'
return ''.join([char for char in s if char not in vowels])
print(remove_vowels("Hello World"))  # Output: "Hll Wrld"
Q4: Write a Python function that finds the second largest number in a list.
(Intermediate)

def second_largest(numbers):
unique_numbers = list(set(numbers))  # Remove duplicates
unique_numbers.sort()
return unique_numbers[-2] if len(unique_numbers) >= 2 else None
print(second_largest([10, 20, 30, 20, 10]))  # Output: 20
Q5: Predict the output of the following Python code.
(Basic)

def multiply_elements(lst):
result = 1
for num in lst:
result *= num
return result
print(multiply_elements([1, 2, 3, 4]))

The function multiplies all elements of the list together. The output of the provided list [1, 2, 3, 4] would be 1 * 2 * 3 * 4 = 24 .

Q6: The following Python code is intended to print the first character of each word in a sentence, but it contains an error. Identify and fix the error.
(Intermediate)
sentence = "Hello World from Python"
first_letters = [word[0] for word in sentence.split()]
print(first_letters)

The given code snippet is actually correct and should work as intended, printing ['H', 'W', 'f', 'P'] . If there's a specific error you encountered with a similar snippet, please provide that scenario!

Q7: Write a function in Python that converts a flat dictionary into a nested dictionary based on keys separated by dots. For example, {'a.b.c': 1} should become {'a': {'b': {'c': 1}}} .
(Advanced)

def nest_dict(flat_dict):
result = {}
for dotted_key, value in flat_dict.items():
parts = dotted_key.split('.')
d = result
for part in parts[:-1]:
if part not in d:
d[part] = {}
d = d[part]
d[parts[-1]] = value
return result
print(nest_dict({'a.b.c': 1}))  # Output: {'a': {'b': {'c': 1}}}
Q8: Optimize the following code that checks for duplicate characters in a string.
(Advanced)

def has_duplicates(s):
for char in s:
if s.count(char) > 1:
return True
return False
print(has_duplicates("hello"))

The original function inefficiently counts each character multiple times. A more efficient approach uses a set to track seen characters:


def has_duplicates(s):
seen = set()
for char in s:
if char in seen:
return True
seen.add(char)
return False
print(has_duplicates("hello"))  # Output: True
Q9: Write a Python function that merges two dictionaries by adding values of common keys.
(Intermediate)

def merge_dictionaries(dict1, dict2):
merged = dict1.copy()  # Start with a copy of the first dictionary
for key, value in dict2.items():
if key in merged:
merged[key] += value
else:
merged[key] = value
return merged
d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'c': 4}
print(merge_dictionaries(d1, d2))  # Output: {'a': 1, 'b': 5, 'c': 4}
Q10: Predict the output of the following code snippet that uses list comprehension with a conditional statement.
(Basic)
numbers = [1, 2, 3, 4, 5, 6]
even_squares = [x**2 for x in numbers if x % 2 == 0]
print(even_squares)

The list comprehension filters even numbers from the numbers list and squares them. The output will be [4, 16, 36] , representing the squares of 2, 4, and 6.

Request question

Please fill in the form below to submit your question.

Discover the True Potential of AI in Development with Workik

Join developers who are using Workik’s AI assistance everyday for programming

Sign Up Now

Overview of Python

What is Python?

What is the history and what are the latest trends in Python development?

List Some Popular Frameworks, Libraries & tools associated with Python.

What are the use cases of Python?

What are the tech roles associated with Python Expertise?

What Pay Package can be expected with experience in Python?