Table of Contents
Fundamental Questions Python
- What is Python, and what are its key features?
- Answer: Python is a high-level, interpreted programming language known for its simplicity, readability, and wide range of libraries. Key features include dynamic typing, automatic memory management, support for multiple programming paradigms, and extensive standard libraries.
- How do you create a virtual environment in Python?
- Answer: Use the command python -m venv <env_name> to create a virtual environment, and then activate it using source <env_name>/bin/activate on Unix/Mac or .\<env_name>\Scripts\activate on Windows.
- What is PEP 8, and why is it important?
- Answer: PEP 8 is the Python Enhancement Proposal that provides guidelines and best practices on how to write Python code. It is important for maintaining consistency, readability, and standardization in Python codebases.
- Explain the difference between == and is in Python.
- Answer: == checks for value equality, while is checks for identity, meaning it returns True if both variables point to the same object in memory.
- What is the difference between lists and tuples in Python?
- Answer: Lists are mutable, meaning their elements can be changed, added, or removed, while tuples are immutable, meaning once created, their elements cannot be altered.
- What is a Python decorator?
- Answer: A decorator is a function that takes another function as input and extends its behavior without explicitly modifying it, using the @decorator_name syntax.
- How does Python handle memory management?
- Answer: Python uses automatic memory management, which includes reference counting and a cycle-detecting garbage collector to manage memory.
- Explain the use of the self keyword in Python classes.
- Answer: self refers to the instance of the class and is used to access instance variables and methods within the class.
- What is a lambda function in Python?
- Answer: A lambda function is an anonymous function defined using the lambda keyword. It can take any number of arguments but has only one expression, which is evaluated and returned.
- What is the purpose of the __init__ method in a Python class?
- Answer: The __init__ method is the constructor in Python, used to initialize the instance variables when an object is created.
- How do you handle exceptions in Python?
- Answer: Exceptions are handled using the try…except block. Code that might raise an exception is placed in the try block, and the handling code is placed in the except block.
- What are Python’s built-in data types?
- Answer: Python’s built-in data types include int, float, str, list, tuple, set, dict, and bool.
- What is the difference between append() and extend() in Python lists?
- Answer: append() adds a single element to the end of the list, while extend() adds all elements of an iterable (like another list) to the end of the list.
- What are Python’s built-in functions for file handling?
- Answer: Python’s built-in functions for file handling include open(), read(), write(), close(), readlines(), and writelines().
- How do you install third-party libraries in Python?
- Answer: Third-party libraries can be installed using the package manager pip with the command pip install <library_name>.
- What is list comprehension in Python?
- Answer: List comprehension is a concise way to create lists in Python using a single line of code, typically with a loop and an optional condition.
- How do you define a class in Python?
- Answer: A class is defined using the class keyword, followed by the class name and a colon. The class body contains methods and variables.
- What is the purpose of the pass statement in Python?
- Answer: The pass statement is a null operation used as a placeholder in situations where a statement is syntactically required but no action is needed.
- What is a Python module?
- Answer: A module in Python is a file containing Python code (functions, variables, classes) that can be imported and used in other Python scripts.
- Explain the concept of namespace in Python.
- Answer: A namespace in Python is a space where names are mapped to objects. Different namespaces can include global, local, and built-in namespaces.

Intermediate Level Questions (20 Questions)
- How does Python’s Global Interpreter Lock (GIL) affect multithreading?
- Answer: The GIL in Python allows only one thread to execute at a time, which can be a limitation in CPU-bound multithreading tasks. It affects performance in multi-core systems but is less of an issue in I/O-bound tasks.
- What are Python iterators and generators?
- Answer: An iterator is an object that contains a countable number of values and can be iterated upon, returning one value at a time. A generator is a function that returns an iterator and uses yield to produce a sequence of results lazily, as needed.
- Explain Python’s garbage collection mechanism.
- Answer: Python’s garbage collection mechanism involves reference counting and a cyclic garbage collector that detects and collects cyclic references (circularly referenced objects).
- What is the difference between deepcopy and shallowcopy?
- Answer: A shallowcopy creates a new object but inserts references into it to the objects found in the original. A deepcopy creates a new object and recursively copies all objects found in the original, leading to a completely independent clone.
- How do you manage dependencies in a Python project?
- Answer: Dependencies can be managed using a requirements.txt file and virtual environments, which isolates project-specific dependencies.
- What is the difference between staticmethod and classmethod in Python?
- Answer: staticmethod does not receive an implicit first argument (like self or cls), while classmethod receives the class (cls) as its first argument, allowing it to modify class state.
- Explain how Python’s with statement works.
- Answer: The with statement is used for resource management, ensuring that resources like files or network connections are properly cleaned up after use. It abstracts the try-finally block, calling the __enter__ and __exit__ methods of the context manager.
- What is monkey patching in Python?
- Answer: Monkey patching refers to the practice of modifying or extending a module or class at runtime. It can be useful in testing or when applying temporary fixes.
- How do you handle large datasets in Python?
- Answer: Handling large datasets can involve using memory-efficient techniques like generators, chunking data, using optimized libraries like pandas, or offloading processing to a distributed computing framework like Dask or PySpark.
- What is Python’s asyncio library?
- Answer: asyncio is a library for writing concurrent code using the async/await syntax. It is used for asynchronous I/O, event loops, and coroutines, enabling the development of high-performance, non-blocking programs.
- Explain the difference between the filter(), map(), and reduce() functions in Python.
- Answer: filter() filters elements from an iterable based on a condition, map() applies a function to all items in an iterable, and reduce() performs a rolling computation to sequential pairs of values in an iterable.
- What are decorators in Python, and how do they work?
- Answer: Decorators are a way to modify or extend the behavior of functions or methods without modifying their code. They work by wrapping a function in another function that can add functionality before or after the original function is called.
- What is the purpose of __name__ == “__main__” in Python?
- Answer: This condition checks whether a Python script is being run as the main program or if it is being imported as a module. Code within this block will only run if the script is executed directly.
- How do you perform error handling in Python using try, except, finally, and else?
- Answer: try block is used to test code that might raise an exception, except block handles the exception, else block runs if no exception occurs, and finally block runs regardless of whether an exception occurred or not.
- What are *args and **kwargs in Python?
- Answer: *args is used to pass a variable number of non-keyword arguments to a function, while **kwargs allows passing a variable number of keyword arguments.
- Explain the difference between __str__() and __repr__() in Python.
- Answer: __str__() is used to define a human-readable string representation of an object, while __repr__() is used to define an unambiguous string representation, useful for debugging.
- What is a Python metaclass?
- Answer: A metaclass is a class of a class that defines how a class behaves. In Python, metaclasses can be used to create classes in a more dynamic manner.
- How do you perform unit testing in Python?
- Answer: Unit testing in Python can be performed using the unittest framework, which allows for the creation of test cases, test suites, and test runners.
- What are Python context managers, and how are they used?
- Answer: Context managers are used to manage resources, ensuring proper acquisition and release. They are typically used with the with statement, which handles setup and teardown.
- How can you profile a Python script’s performance?
- Answer: Profiling can be done using the cProfile module, which provides detailed statistics on the time spent in each function, or using the timeit module for timing execution of small code snippets.
Advanced Level Questions (20 Questions)
- What is the Global Interpreter Lock (GIL) in Python, and how does it affect concurrency?
- Answer: The GIL is a mutex that protects access to Python objects, preventing multiple threads from executing Python bytecodes simultaneously. It affects performance in CPU-bound multithreading but not I/O-bound tasks.
- How does Python’s multiprocessing module differ from threading?
- Answer: The multiprocessing module allows parallel execution of code by creating separate memory spaces for each process, avoiding the GIL issue, whereas threading shares the same memory space and is subject to the GIL.
- What are Python’s magic methods?
- Answer: Magic methods, or dunder methods, are special methods with double underscores at the beginning and end of their names. They allow customization of basic behavior, such as arithmetic operations (__add__), string representation (__str__), and object initialization (__init__).
- Explain the concept of metaprogramming in Python.
- Answer: Metaprogramming involves writing code that can manipulate code, such as creating classes or functions dynamically at runtime. It often involves using metaclasses, decorators, and functions that return functions.
- How do you optimize Python code for performance?
- Answer: Performance optimization can involve using built-in data structures, avoiding global variables, using list comprehensions, leveraging libraries like NumPy, profiling code with cProfile, and implementing parallelism with multiprocessing or concurrent.futures.
- What is a memory leak in Python, and how can it be prevented?
- Answer: A memory leak occurs when memory that is no longer needed is not released. In Python, it can be prevented by avoiding circular references, using weak references, and ensuring that objects are properly garbage collected.
- Explain the use of async and await in Python.
- Answer: async defines a coroutine, which is a special function that can be paused and resumed, while await is used to yield control back to the event loop, allowing other tasks to run while waiting for an asynchronous operation to complete.
- What is the __slots__ attribute in Python classes?
- Answer: __slots__ is used to declare a fixed set of attributes for a class, preventing the creation of a __dict__ and thus saving memory by restricting the attributes an instance can have.
- How do you implement a singleton pattern in Python?
- Answer: A singleton pattern can be implemented by overriding the __new__ method to ensure that only one instance of the class is created, or using a metaclass that controls instance creation.
- What is the difference between map() and list comprehensions in Python?
- Answer: Both can be used to apply a function to each item in an iterable. map() returns a map object (which can be converted to a list), while list comprehensions return a list. List comprehensions are generally considered more Pythonic and readable.
- What is the purpose of weakref in Python?
- Answer: weakref allows the creation of weak references to objects, which do not increase the reference count. This is useful in situations where you need to reference an object without preventing it from being garbage collected.
- How do you implement a cache in Python?
- Answer: A cache can be implemented using a dictionary or using the functools.lru_cache decorator, which caches the results of function calls based on their arguments.
- What are coroutines in Python, and how are they different from generators?
- Answer: Coroutines are similar to generators but can consume values as well as produce them. They are used for cooperative multitasking and asynchronous programming, supporting await, which generators do not.
- Explain Python’s concurrent.futures module.
- Answer: concurrent.futures provides a high-level interface for asynchronously executing function calls using threads or processes, with a ThreadPoolExecutor or ProcessPoolExecutor.
- What are contextlib and its use cases?
- Answer: contextlib is a module that provides utilities for working with context managers and the with statement. It includes tools like contextmanager decorator to create a context manager using a generator function.
- How do you handle deep recursion in Python?
- Answer: Python’s default recursion limit can be handled using the sys.setrecursionlimit() function to increase the recursion depth, or by converting recursive functions to iterative solutions.
- How do you implement a priority queue in Python?
- Answer: A priority queue can be implemented using the heapq module, which provides an efficient way to maintain a list in sorted order and allows for quick access to the smallest element.
- Explain the use of property() in Python.
- Answer: property() is a built-in function that returns a property object, which can be used to create managed attributes, allowing getter, setter, and deleter methods to be associated with an attribute.
- What is Python’s traceback module used for?
- Answer: The traceback module provides utilities to extract, format, and print stack traces of Python programs, which is useful for debugging and logging errors.
- How do you manage and deploy Python applications in a production environment?
- Answer: Managing and deploying Python applications involves using version control, virtual environments, dependency management (e.g., pip), containerization with Docker, automated testing, CI/CD pipelines, and monitoring in production.
Practical-Based Questions (20 Questions)
- Write a Python function to find the factorial of a number using recursion.
- Answer:
1. python
2.
3. def factorial(n):
4. if n == 0:
5. return 1
6. else:
7. return n * factorial(n-1)
- Write a Python program to check if a string is a palindrome.
- Answer:
1. python
2.
3. def is_palindrome(s):
4. return s == s[::-1]
- How would you implement a binary search algorithm in Python?
- Answer:
1. python
2.
3. def binary_search(arr, target):
4. left, right = 0, len(arr) - 1
5. while left <= right:
6. mid = (left + right) // 2
7. if arr[mid] == target:
8. return mid
9. elif arr[mid] < target:
10. left = mid + 1
11. else:
12. right = mid - 1
13. return -1
- Write a Python program to remove duplicates from a list while preserving order.
- Answer:
1. python
2.
3. def remove_duplicates(lst):
4. seen = set()
5. return [x for x in lst if not (x in seen or seen.add(x))]
- How would you reverse a linked list in Python?
- Answer:
1. python
2.
3. class ListNode:
4. def __init__(self, value=0, next=None):
5. self.value = value
6. self.next = next
7.
8. def reverse_linked_list(head):
9. prev = None
10. current = head
11. while current:
12. next_node = current.next
13. current.next = prev
14. prev = current
15. current = next_node
16. return prev
- Write a Python function to find the nth Fibonacci number using dynamic programming.
- Answer:
1. python
2.
3. def fibonacci(n):
4. fib = [0, 1]
5. for i in range(2, n + 1):
6. fib.append(fib[i - 1] + fib[i - 2])
7. return fib[n]
- How would you implement a queue using two stacks in Python?
- Answer:
1. python
2.
3. class Queue:
4. def __init__(self):
5. self.stack1 = []
6. self.stack2 = []
7.
8. def enqueue(self, x):
9. self.stack1.append(x)
10.
11. def dequeue(self):
12. if not self.stack2:
13. while self.stack1:
14. self.stack2.append(self.stack1.pop())
15. return self.stack2.pop() if self.stack2 else None
- Write a Python function to merge two sorted lists into a single sorted list.
- Answer:
1. python
2.
3. def merge_sorted_lists(lst1, lst2):
4. merged = []
5. i = j = 0
6. while i < len(lst1) and j < len(lst2):
7. if lst1[i] < lst2[j]:
8. merged.append(lst1[i])
9. i += 1
10. else:
11. merged.append(lst2[j])
12. j += 1
13. merged.extend(lst1[i:])
14. merged.extend(lst2[j:])
15. return merged
- How would you detect a cycle in a linked list in Python?
- Answer: This can be done using Floyd’s Tortoise and Hare algorithm:
1. python
2.
3. class ListNode:
4. def __init__(self, value=0, next=None):
5. self.value = value
6. self.next = next
7.
8. def has_cycle(head):
9. slow = fast = head
10. while fast and fast.next:
11. slow = slow.next
12. fast = fast.next.next
13. if slow == fast:
14. return True
15. return False
- Write a Python program to perform a depth-first search (DFS) on a graph.
- Answer:
1. python
2.
3. def dfs(graph, start, visited=None):
4. if visited is None:
5. visited = set()
6. visited.add(start)
7. for neighbor in graph[start]:
8. if neighbor not in visited:
9. dfs(graph, neighbor, visited)
10. return visited
- How would you implement a simple LRU (Least Recently Used) cache in Python?
- Answer:
1. python
2.
3. from collections import OrderedDict
4.
5. class LRUCache:
6. def __init__(self, capacity):
7. self.cache = OrderedDict()
8. self.capacity = capacity
9.
10. def get(self, key):
11. if key in self.cache:
12. self.cache.move_to_end(key)
13. return self.cache[key]
14. return -1
15.
16. def put(self, key, value):
17. if key in self.cache:
18. self.cache.move_to_end(key)
19. self.cache[key] = value
20. if len(self.cache) > self.capacity:
21. self.cache.popitem(last=False)
- Write a Python program to flatten a nested list.
- Answer:
1. python
2.
3. def flatten(lst):
4. flat_list = []
5. for item in lst:
6. if isinstance(item, list):
7. flat_list.extend(flatten(item))
8. else:
9. flat_list.append(item)
10. return flat_list
- How would you implement a max heap in Python?
- Answer:
1. python
2.
3. import heapq
4.
5. class MaxHeap:
6. def __init__(self):
7. self.heap = []
8.
9. def push(self, item):
10. heapq.heappush(self.heap, -item)
11.
12. def pop(self):
13. return -heapq.heappop(self.heap)
14.
15. def peek(self):
16. return -self.heap[0]
- Write a Python function to solve the knapsack problem using dynamic programming.
- Answer:
1. python
2.
3. def knapsack(weights, values, capacity):
4. n = len(weights)
5. dp = [[0] * (capacity + 1) for _ in range(n + 1)]
6. for i in range(1, n + 1):
7. for w in range(1, capacity + 1):
8. if weights[i - 1] <= w:
9. dp[i][w] = max(dp[i - 1][w], dp[i - 1][w - weights[i - 1]] + values[i - 1])
10. else:
11. dp[i][w] = dp[i - 1][w]
12. return dp[n][capacity]
- How would you serialize and deserialize a binary tree in Python?
- Answer:
1. python
2.
3. class TreeNode:
4. def __init__(self, value=0, left=None, right=None):
5. self.value = value
6. self.left = left
7. self.right = right
8.
9. def serialize(root):
10. def helper(node):
11. if not node:
12. return 'None,'
13. return str(node.value) + ',' + helper(node.left) + helper(node.right)
14. return helper(root)
15.
16. def deserialize(data):
17. def helper(data_list):
18. if data_list[0] == 'None':
19. data_list.pop(0)
20. return None
21. node = TreeNode(int(data_list.pop(0)))
22. node.left = helper(data_list)
23. node.right = helper(data_list)
24. return node
25. data_list = data.split(',')
26. return helper(data_list)
- Write a Python function to validate a binary search tree (BST).
- Answer:
1. python
2.
3. class TreeNode:
4. def __init__(self, value=0, left=None, right=None):
5. self.value = value
6. self.left = left
7. self.right = right
8.
9. def is_valid_bst(root, low=float('-inf'), high=float('inf')):
10. if not root:
11. return True
12. if not (low < root.value < high):
13. return False
14. return is_valid_bst(root.left, low, root.value) and is_valid_bst(root.right, root.value, high)
- How would you implement the merge sort algorithm in Python?
- Answer:
1. python
2.
3. def merge_sort(arr):
4. if len(arr) > 1:
5. mid = len(arr) // 2
6. left_half = arr[:mid]
7. right_half = arr[mid:]
8.
9. merge_sort(left_half)
10. merge_sort(right_half)
11.
12. i = j = k = 0
13. while i < len(left_half) and j < len(right_half):
14. if left_half[i] < right_half[j]:
15. arr[k] = left_half[i]
16. i += 1
17. else:
18. arr[k] = right_half[j]
19. j += 1
20. k += 1
21.
22. while i < len(left_half):
23. arr[k] = left_half[i]
24. i += 1
25. k += 1
26.
27. while j < len(right_half):
28. arr[k] = right_half[j]
29. j += 1
30. k += 1
- Write a Python program to find the longest common subsequence (LCS) of two strings.
- Answer:
1. python
2.
3. def lcs(X, Y):
4. m, n = len(X), len(Y)
5. dp = [[None] * (n + 1) for i in range(m + 1)]
6. for i in range(m + 1):
7. for j in range(n + 1):
8. if i == 0 or j == 0:
9. dp[i][j] = 0
10. elif X[i - 1] == Y[j - 1]:
11. dp[i][j] = dp[i - 1][j - 1] + 1
12. else:
13. dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
14. return dp[m][n]
- How would you implement a trie (prefix tree) in Python?
- Answer:
1. python
2.
3. class TrieNode:
4. def __init__(self):
5. self.children = {}
6. self.is_end_of_word = False
7.
8. class Trie:
9. def __init__(self):
10. self.root = TrieNode()
11.
12. def insert(self, word):
13. node = self.root
14. for char in word:
15. if char not in node.children:
16. node.children[char] = TrieNode()
17. node = node.children[char]
18. node.is_end_of_word = True
19.
20. def search(self, word):
21. node = self.root
22. for char in word:
23. if char not in node.children:
24. return False
25. node = node.children[char]
26. return node.is_end_of_word
27.
28. def starts_with(self, prefix):
29. node = self.root
30. for char in prefix:
31. if char not in node.children:
32. return False
33. node = node.children[char]
34. return True
- Write a Python program to find the first non-repeating character in a string.
- Answer:
1. python
2. def first_non_repeating_char(s):
3. char_count = {}
4. for char in s:
5. char_count[char] = char_count.get(char, 0) + 1
6. for char in s:
7. if char_count[char] == 1:
8. return char
9. return None
Miscellaneous Questions (20 Questions)
- What is __name__ == ‘__main__’ in Python?
- Answer: This construct is used to check whether a Python script is being run directly or imported as a module. If the script is run directly, the code under if __name__ == ‘__main__’ will execute.
- How do you handle exceptions in Python?
- Answer: Exceptions in Python are handled using try, except, else, and finally blocks. The try block contains the code that may raise an exception, except block handles the exception, else block runs if no exception occurs, and finally block runs no matter what.
- Explain the difference between deep copy and shallow copy in Python.
- Answer: A shallow copy creates a new object, but does not create copies of nested objects; instead, it copies references to them. A deep copy creates a new object and recursively copies all objects inside it, creating entirely independent copies.
- What are Python decorators and how are they used?
- Answer: Python decorators are functions that modify the behavior of another function or method. They are often used to add functionality, like logging or access control, without changing the original function’s code.
- How can you generate random numbers in Python?
- Answer: Python provides the random module to generate random numbers. Functions like random.random() for a float between 0 and 1, random.randint(a, b) for a random integer between a and b, and random.choice(list) for selecting a random element from a list are commonly used.
- What are Python generators and how do they differ from regular functions?
- Answer: Generators are functions that return an iterator and allow you to iterate through a sequence of values lazily, meaning they generate values on the fly and yield them one at a time using the yield statement, unlike regular functions which return a single value and terminate.
- Explain the Global Interpreter Lock (GIL) in Python.
- Answer: The GIL is a mutex in Python that allows only one thread to execute at a time, even on multi-core processors, which can be a bottleneck for CPU-bound multi-threaded programs. However, it does not affect multi-processing or I/O-bound multi-threading.
- What is __init__.py in Python?
- Answer: __init__.py is a special Python file used to indicate that a directory is a Python package. It can be an empty file, or it can execute initialization code for the package when the package is imported.
- How do you read and write files in Python?
- Answer: Files in Python can be read and written using the built-in open() function. For reading, you can use file.read(), file.readline(), or file.readlines(). For writing, you can use file.write() or file.writelines().
- Explain the difference between append() and extend() in Python.
- Answer: append() adds its argument as a single element to the end of a list, while extend() iterates over its argument, adding each element to the list, extending the list.
- What are lambda functions in Python?
- Answer: Lambda functions are small anonymous functions defined with the lambda keyword. They can have any number of arguments but only one expression, which is evaluated and returned.
- How do you reverse a string in Python?
- Answer: A string can be reversed using slicing: reversed_string = original_string[::-1]. Alternatively, the reversed() function can be used, though it returns an iterator that needs to be joined into a string.
- What are Python comprehensions?
- Answer: Comprehensions in Python provide a concise way to create lists, dictionaries, sets, or generators. List comprehensions, for example, follow the format [expression for item in iterable if condition].
- How would you connect to a database in Python?
- Answer: To connect to a database in Python, you can use libraries like sqlite3 for SQLite, PyMySQL or MySQLdb for MySQL, and psycopg2 for PostgreSQL. You typically use a connection object to interact with the database.
- What are Python magic methods?
- Answer: Magic methods are special methods in Python with double underscores at the beginning and end of their names. They are used to override or add new behavior to classes, such as __init__ for object initialization, __str__ for string representation, and __add__ for adding two objects.
- Explain the use of with statement in Python.
- Answer: The with statement in Python is used to wrap the execution of a block of code. It simplifies the management of resources like file streams. The with statement ensures that cleanup code, such as closing a file, is executed, even if an error occurs.
- What is the difference between is and == in Python?
- Answer: is checks for identity, meaning whether two references point to the same object, while == checks for equality, meaning whether the values of two objects are the same.
- How can you handle command-line arguments in Python?
- Answer: Command-line arguments in Python can be handled using the sys.argv list, where sys.argv[0] is the script name, and sys.argv[1:] are the arguments. The argparse module provides a more powerful way to handle command-line arguments.
- How would you measure the performance of your Python code?
- Answer: The performance of Python code can be measured using the timeit module, which runs code repeatedly and provides the execution time. Profiling can also be done using the cProfile module.
- What is a Python virtual environment and why is it useful?
- Answer: A virtual environment in Python is a self-contained directory that contains a Python installation for a particular version, along with a set of installed packages. It is useful for isolating dependencies for different projects, preventing conflicts, and managing packages more effectively.
Check out our Trending Courses Demo Playlist
Data Analytics with Power Bi and Fabric |
Could Data Engineer |
Data Analytics With Power Bi Fabic |
AWS Data Engineering with Snowflake |
Azure Data Engineering |
Azure & Fabric for Power bi |
Full Stack Power Bi |
Kick Start Your Career With Our Data Job
Social Media channels
► KSR Datavizon Website :- https://www.datavizon.com
► KSR Datavizon LinkedIn :- https://www.linkedin.com/company/datavizon/
► KSR Datavizon You tube :- https://www.youtube.com/c/KSRDatavizon
► KSR Datavizon Twitter :- https://twitter.com/ksrdatavizon
► KSR Datavizon Instagram :- https://www.instagram.com/ksr_datavision
► KSR Datavizon Face book :- https://www.facebook.com/KSRConsultingServices
► KSR Datavizon Playstore :- https://play.google.com/store/apps/details?id=com.datavizon.courses&hl=en-IN
► KSR Datavizon Appstore :- https://apps.apple.com/in/app/ksr-datavizon/id1611034268
Most Commented