Day 2 Continued: Multiple Assignment & Unpacking) 🐍📘 Python Refresher — Day 2 Continued: Multiple Assignment & Unpacking ✅🧠 As part of my Python fundamentals refresh, I practiced multiple assignment, variable swapping, and sequence unpacking (tuples & lists). Instead of immediately running code, I tried to predict outputs and write solutions based on understanding — and I ran into a few errors that turned into solid learning moments 💡🙂 Here are the exercises I worked on 👇 🔹 Multiple Assignment Basics ✍️ # Q1: Assign a = 1, b = 2, c = 3 in one line a, b, c = 1, 2, 3 # Q2: Assign x, y = 10, 20 and print both x, y = 10, 20 print(x, y) # Q3: Swap values of x and y without using a third variable. x, y = 10, 20 x, y = y, x print(x, y) # Q4: Assign x = y = z = 100 and print all. x = y = z = 100 print(x, y, z) # Q5: Unpack: t = (5, 6) into a and b. t = (5, 6) a, b = t print(a, b) # Q6: Unpack: values = [1, 2, 3] into a, b, c. values = [1, 2, 3] a, b, c = values print(a, b, c) # Q7: Use _ to ignore a value: unpack (1, 2, 3) into a, _, c. a, _, c = (1, 2, 3) print(a, c) 🔸 Where I Learned the Most: Unpacking ✅ ✅ Learning 1: Swapping doesn’t need a “swap” keyword 🔁 I initially assumed Python might have a swap keyword (it doesn’t). Python swaps using tuple unpacking / multiple assignment — a very clean and readable (Pythonic) approach ✅ # Q3: Swap values without using a third variable x, y = y, x print(x, y) ✅ Learning 2: Correct way to unpack a tuple 🎯 For: Unpack t = (5, 6) into a and b I first wrote an incorrect assignment and hit: SyntaxError: cannot assign to literal ❌ ✅ Correct approach is to assign variables to the tuple: # Q5: Unpack tuple t = (5, 6) a, b = t print(a, b) # 5 6 ✅ Learning 3: Unpacking works for lists too (sequence unpacking) 📌 For: Unpack values = [1, 2, 3] into a, b, c Key rule: the number of variables must match the number of elements ✅ # Q6: Unpack list values = [1, 2, 3] a, b, c = values print(a, b, c) ✅ Learning 4: Using _ to ignore a value 🙈✅ For: Unpack (1, 2, 3) into a, _, c I mistakenly used "_” as a string, which causes syntax issues ❌ ✅ _ must be used as a variable name, not a string literal. # Q7: Ignore a value while unpacking val = (1, 2, 3) a, _, c = val print(a, c) # 1 3 📌 Key Takeaways (in one view) 🧠✅ ✅ Python supports multiple assignment for clean, readable code ✅ Swapping is done via unpacking, not a special keyword ✅ Unpacking applies to tuples and lists (and generally sequences) ✅ _ is a common convention to intentionally ignore values ✅ Errors are feedback — they help build stronger foundations 💪🙂 “Progress often looks small at the beginning — but consistency makes it undeniable.” 📈✅ #Python #PythonLearning #Programming #Fundamentals #MultipleAssignment #Unpacking #ProblemSolving #ContinuousLearning #Kaizen #ProfessionalDevelopment Monal S.
Python Fundamentals: Multiple Assignment & Unpacking
More Relevant Posts
-
⚡ I reduced 10 lines of Python code to just 1 line today. ❎Not using AI. ❎Not using complex libraries. ✅Just Python functions + map() + lambda(). And it reminded me how powerful clean logic can be. 🐍 1️⃣ Functions – The core building blocks of Python Functions help us organize logic and reuse code. Example: def square(num): return num * num Instead of repeating calculations, we simply call the function whenever needed. ✔ Cleaner code ✔ Reusable logic ✔ Easier debugging ⚡ 2️⃣ Lambda Functions – Quick one-line functions Sometimes we don’t need a full function definition. Python allows lambda functions for short operations. Example: square = lambda x: x*x print(square(5)) Output → 25 🔄 3️⃣ map() – Apply a function to an entire list Instead of writing loops, we can transform lists instantly. Example: numbers = [1,2,3,4] squares = list(map(lambda x: x*x, numbers)) print(squares) Output → [1,4,9,16] This makes data processing fast and elegant. 🧠 4️⃣ Small logic exercises that build real coding skills ✔ Check if a number is positive def check_number(n): Example: if n > 0: return "Positive" elif n == 0: return "Zero" else: return "Negative" ✔ Find the longest word in a list Example: words = ["python","data","programming","AI"] longest = max(words, key=len) print(longest) Output → programming ✔ Get unique sorted numbers numbers = [5,2,7,2,5,9] unique_sorted = sorted(set(numbers)) print(unique_sorted) Output → [2,5,7,9] 💡 Key takeaway Learning Python isn’t about memorizing syntax. It’s about thinking in logic blocks: • Functions • Lambda • map() • Smart data handling Master these… and Python becomes 10× more powerful. 💬 Let’s discuss Which Python concept helped you the most when learning? 1️⃣ Functions 2️⃣ Lambda 3️⃣ map() 4️⃣ Data logic Drop your answer in the comments 👇 #Python #PythonLearning #Coding #Programming #LearnToCode #PythonFunctions #Lambda #TechLearning
To view or add a comment, sign in
-
*Day 26 - The 30-Day AI & Analytics Sprint* 🚀 Python supports multiple inheritance, which allows a class to inherit from multiple parent classes. However, this can create ambiguity in method resolution. Question? Explain: What is MRO (Method Resolution Order) in Python? How does Python decide which parent method to call first? Why does Python use the C3 Linearization algorithm? Give a real example where multiple inheritance may cause confusion. MRO ==> is the order in which Python searches for a method or attribute in a class hierarchy This becomes important when multiple inheritance is used Python determines this order using the .mro() method or the __mro__ attribute When you call a method on an object, Python needs to know which class to check first Example: class A: def show(self): print("A") class B(A): pass class C(B): pass print(C.mro()) Output: [C, B, A, object] Python will search for the method in this order - Python decide which parent method to call Python follows the MRO list from left to right - Why does Python use the C3 Linearization Algorithm? Python uses C3 Linearization to create a consistent and predictable order for method lookup. It guarantees three important rules: 1- Child classes come before parents 2- The order of parent classes is respected 3- A class appears only once in the hierarchy - Real Example of Confusion (Diamond Problem) class A: def show(self): print("A") class B(A): pass class C(A): def show(self): print("C") class D(B, C): pass obj = D() obj.show() Let's check the MRO: print(D.mro()) Output: [D, B, C, A, object] Result: C How??? Python checks: D B C ✅ (method found) A object Even though B inherits from A, Python does not go to A first. It follows the C3 MRO order MRO determines the order Python searches for methods. Python checks classes from left to right based on the MRO list. Python uses C3 Linearization to avoid ambiguity in multiple inheritance Mariam Metawe'e Muhammed Al Reay Instant Software Solutions
To view or add a comment, sign in
-
Python Learning Plan |-- Week 1: Introduction to Python | |-- Python Basics | | |-- What is Python? | | |-- Installing Python | | |-- Introduction to IDEs (Jupyter, VS Code) | |-- Setting up Python Environment | | |-- Anaconda Setup | | |-- Virtual Environments | | |-- Basic Syntax and Data Types | |-- First Python Program | | |-- Writing and Running Python Scripts | | |-- Basic Input/Output | | |-- Simple Calculations | |-- Week 2: Core Python Concepts | |-- Control Structures | | |-- Conditional Statements (if, elif, else) | | |-- Loops (for, while) | | |-- Comprehensions | |-- Functions | | |-- Defining Functions | | |-- Function Arguments and Return Values | | |-- Lambda Functions | |-- Modules and Packages | | |-- Importing Modules | | |-- Standard Library Overview | | |-- Creating and Using Packages | |-- Week 3: Advanced Python Concepts | |-- Data Structures | | |-- Lists, Tuples, and Sets | | |-- Dictionaries | | |-- Collections Module | |-- File Handling | | |-- Reading and Writing Files | | |-- Working with CSV and JSON | | |-- Context Managers | |-- Error Handling | | |-- Exceptions | | |-- Try, Except, Finally | | |-- Custom Exceptions | |-- Week 4: Object-Oriented Programming | |-- OOP Basics | | |-- Classes and Objects | | |-- Attributes and Methods | | |-- Inheritance | |-- Advanced OOP | | |-- Polymorphism | | |-- Encapsulation | | |-- Magic Methods and Operator Overloading | |-- Design Patterns | | |-- Singleton | | |-- Factory | | |-- Observer | |-- Week 5: Python for Data Analysis | |-- NumPy | | |-- Arrays and Vectorization | | |-- Indexing and Slicing | | |-- Mathematical Operations | |-- Pandas | | |-- DataFrames and Series | | |-- Data Cleaning and Manipulation | | |-- Merging and Joining Data | |-- Matplotlib and Seaborn | | |-- Basic Plotting | | |-- Advanced Visualizations | | |-- Customizing Plots | |-- Week 6-8: Specialized Python Libraries | |-- Web Development | | |-- Flask Basics | | |-- Django Basics | |-- Data Science and Machine Learning | | |-- Scikit-Learn | | |-- TensorFlow and Keras | |-- Automation and Scripting | | |-- Automating Tasks with Python | | |-- Web Scraping with BeautifulSoup and Scrapy | |-- APIs and RESTful Services | | |-- Working with REST APIs | | |-- Building APIs with Flask/Django | |-- Week 9-11: Real-world Applications and Projects | |-- Capstone Project | | |-- Project Planning | | |-- Data Collection and Preparation | | |-- Building and Optimizing Models | | |-- Creating and Publishing Reports Like this post for more resources like this 👍♥️ Hope it helps :)
To view or add a comment, sign in
-
-
💡A Clear Guide to *args and **kwargs in Python When designing functions in Python, there are situations where the number of arguments passed to the function is unknown in advance. To handle such cases, Python provides two powerful features: *args and **kwargs. Understanding how they work can make your functions far more flexible. 1️⃣ *args • args is short for arguments. • *args allows a function to accept multiple positional arguments without specifying their number beforehand. • All additional positional arguments are automatically collected into a tuple. Example: def numbers(*args): print(args) ➡️ Function call: numbers(1, 2, 3, 4) ➡️ Inside the function: args = (1, 2, 3, 4) This means the function can handle any number of positional inputs. 2️⃣ **kwargs • kwargs stands for keyword arguments. • **kwargs allows a function to accept arguments that are passed with names. • These values are stored in a dictionary, where each key represents the argument name and each value represents the corresponding input. Example: def info(**kwargs): print(kwargs) ➡️ Function call: info(name="Ahmed", age=24) ➡️ Inside the function: kwargs = {'name': 'Ahmed', 'age': 24} This allows the function to handle a flexible number of named arguments. 🔹 Step-by-Step Example def func(a, *args, **kwargs): total = a for i in args: total += i for k, v in kwargs.items(): total += v return total print(func(1, 2, 3, x=4, y=5)) 1️⃣ Function Call func(1, 2, 3, x=4, y=5) Python distributes the arguments as follows: a = 1 args = (2, 3) kwargs = {'x': 4, 'y': 5} • The first value is assigned to a. • The remaining positional values are stored in args. • The named arguments are collected in kwargs. 2️⃣ Initializing the Total total = a So the initial value becomes: total = 1 3️⃣ Processing Positional Arguments for i in args: total += i Since: args = (2, 3) First iteration ➡️ total = 1 + 2 = 3 Second iteration ➡️ total = 3 + 3 = 6 Now: total = 6 4️⃣ Processing Keyword Arguments for k, v in kwargs.items(): total += v kwargs contains: {'x': 4, 'y': 5} Iterating through the dictionary provides the key-value pairs: ('x', 4) ('y', 5) First iteration ➡️ total = 6 + 4 = 10 Second iteration ➡️ total = 10 + 5 = 15 5️⃣ Returning the Result return total The function returns: 15 And the final output is: 15 🔹Summary • *args and **kwargs make Python functions more flexible. • *args collects extra positional arguments into a tuple, while **kwargs collects keyword arguments into a dictionary. • These features allow functions to handle a dynamic number of inputs and make code more reusable and adaptable. #Python #PythonProgramming #Coding #SoftwareDevelopment #AI #MachineLearning #LearningPython
To view or add a comment, sign in
-
Day 27 --Lambda Functions in Python Lambda Functions are small, anonymous functions that can be written in a single line. They are useful when you need a quick function for a short period of time and don’t want to formally define it using def. 🔹 Basic Syntax lambda arguments: expression 🔹 Example add = lambda a, b: a + b print(add(5, 3)) Output: 8 Here, the lambda function takes two arguments and returns their sum. 🔹 Using Lambda with map() map()--->The map() function is used to apply a specific function to every item in an iterable such as a list, tuple, or set. It returns a map object, so we usually convert it to a list to see the result. MAP SYNTAX:-map(function, iterable) function → the function you want to apply iterable → the list, tuple, or other collection of items EXAMPLE : Using Lambda with map() numbers = [1, 2, 3, 4, 5] squared = list(map(lambda x: x**2, numbers)) print(squared) Output: [1, 4, 9, 16, 25] 🔹 Using Lambda with filter() FILTER()--->The filter() function is used to select elements from an iterable based on a condition. It returns only the elements that satisfy the condition. SYNTAX:-filter(function, iterable) function → a function that returns True or False iterable → the collection of items to filter EXAMPLE : Using Lambda with filter() numbers = [1, 2, 3, 4, 5, 6] even_numbers = list(filter(lambda x: x % 2 == 0, numbers)) print(even_numbers) Output: [2, 4, 6] EXAMPLE : Using Lambda with sorted() numbers =[1,2,3,4,5,6] sorted(numbers, key=lambda x:-x)# [6, 5, 4, 3, 2, 1] Key Points *Lambda functions are anonymous functions. *They are written in a single expression. *Commonly used with functions like map(), filter(), and sorted(). *Useful for short, simple operations. Learning concepts like this helps me understand how Python can write clean and concise code. Do you prefer lambda or regular def functions? Drop your answer below 👇 #Python #PythonLearning #CodingJourney #Programming
To view or add a comment, sign in
-
-
⚡ How do loops affect performance and memory usage in Python? When working with large datasets, the way we write loops can affect both performance and memory usage. A loop simply repeats the same operation over multiple elements. As the dataset grows, the number of operations grows as well, so choosing the right approach becomes important. 🔹 Traditional loop vs List Comprehension Suppose we want to compute the square of numbers in a list. A traditional loop might look like this: numbers = [1,2,3,4,5] squares = [ ] for n in numbers: squares.append(n**2) This works fine, but each iteration performs several steps: 1️⃣ Access the element 2️⃣ Compute the value 3️⃣ Append it to the list Python offers a cleaner and often faster approach called List Comprehension: squares = [n**2 for n in numbers] ✅ Same result ✅ Shorter, more readable code ✅ Often faster due to internal optimizations 🔹 Nested loops and Time Complexity ⏱ Performance issues become more noticeable with nested loops: for i in range(n): for j in range(n): print(i, j) If the input size is n, the number of operations becomes: n × n 📊 Time Complexity = O(n²) This means execution time grows rapidly as the dataset increases. Example: • n = 10 → ~100 operations • n = 100 → ~10,000 operations • n = 1000 → ~1,000,000 operations ⚠️ That’s why nested loops can slow down programs when dealing with large datasets. 🔹 Using built-in functions instead of loops Sometimes we don’t need to write loops at all, since Python provides optimized built-in functions. Example: numbers = [1,2,3,4] total = sum(numbers) Other useful functions include: • map() → applies a function to every element: squares = list(map(lambda x: x**2, numbers)) • filter() → selects elements that satisfy a condition: even_numbers = list(filter(lambda x: x % 2 == 0, numbers)) These approaches often produce cleaner and more expressive code. 🔹 Memory efficiency with Generators 💡 With very large datasets, memory usage becomes critical. numbers = [x for x in range(1000000)] This stores all values in memory. Using a generator instead: numbers = (x for x in range(1000000)) Values are generated one at a time during iteration, reducing memory usage. ➡️ This is especially useful when processing large data streams. 💡Python Performance Tips ✔ Use List Comprehensions for cleaner, faster loops ✔ Be careful with nested loops (O(n²)) ✔ Use built-in functions like sum(), map(), filter() ✔ Use generators for better memory efficiency Efficient code in Python is about choosing the right tool for the task. #Python #PythonProgramming #LearnPython #SoftwareEngineering #Coding
To view or add a comment, sign in
-
One of the most misunderstood concepts for beginners in Python is how variables actually work. 🔎Objects & Variables An object is a piece of data stored somewhere in memory. It has an identity (memory address), a type, and a value. Variables are symbolic names (references) that point to objects stored in memory. Example: x = 10 - 10 is an object in memory. - x is not the value itself; it is just a reference (label/pointer) pointing to that object in memory. 🔹Shared Reference in Python A shared reference happens when two variables point to the same object in memory. Example: x = 10 y = x In the first line, Python creates an object representing the value 10, and makes x point to that object. In the second line, Python does not copy the value. Instead, it makes y point to the same object that x refers to. Now both variables reference the same object. Important note: modifying one variable affects the other when the object is mutable, because both point to the same object. 🆚 Now let’s understand is vs == list1 = [1,2,3,4] list2 = [1,2,3,4] print(list1 is list2) print(list1 == list2) Output: False True Why? 🔹is operator checks object identity, not equality. It returns True only when both variables refer to the exact same object in memory. Even if two objects look identical, it returns False unless both variables literally point to the same memory location. 🔹== operator checks value equality. It returns True when both objects contain the same data, regardless of their memory location. So: list1 is list2 -> False Because they refer to two different objects in memory. list1 == list2 -> True Because their values are equal. 🔹In a nutshell, - Variables are labels, not containers. They point to objects in memory. - Understanding the difference between identity (is) and equality (==) helps you avoid unexpected behavior, especially when working with mutable objects like lists and dictionaries. #Python #SoftwareDevelopment #MachineLearning #DataScience #AI
To view or add a comment, sign in
-
STOP overcomplicating Python! Learn and Master these 5 topics: ☝️ 𝗗𝗮𝘁𝗮 𝗧𝘆𝗽𝗲𝘀 & 𝗢𝗽𝗲𝗿𝗮𝘁𝗼𝗿𝘀 - Arithmetic (+, -, *, /), - Logical (and, or, not). - Comparison (==, !=, <, >) - Strings, Integers, Floats, Booleans, and NoneType. ✌️ 𝗗𝗮𝘁𝗮 𝗦𝘁𝗿𝘂𝗰𝘁𝘂𝗿𝗲𝘀 - Lists: Mutable and ordered sequences. - Sets: Unordered collections of unique elements. - Tuples: Immutable and ordered (set them and forget) - Dictionaries: Key-Value pairs for lightning-fast lookups. 🤟 𝗖𝗼𝗻𝘁𝗿𝗼𝗹 𝗙𝗹𝗼𝘄 - Conditionals: If, Elif, and Else blocks. - Loops: For loops (for iterating) and While loops. 🖖 𝗙𝘂𝗻𝗰𝘁𝗶𝗼𝗻𝘀 & 𝗖𝗼𝗺𝗽𝗿𝗲𝗵𝗲𝗻𝘀𝗶𝗼𝗻𝘀 - Functions: Use def to create reusable blocks of code. - List Comprehensions: The Pythonic way to create lists. ✋ 𝗘𝗿𝗿𝗼𝗿 𝗛𝗮𝗻𝗱𝗹𝗶𝗻𝗴 & 𝗙𝗶𝗹𝗲 𝗜/𝗢 - Try / Except: Catch errors without crashing. - File Handling: Reading and writing files using with. --- With these 5 core pillars you'll have the foundation to build almost anything in Python 🐍 All the necessary code down below 👇 --- ♻️ Repost if you found it useful, please! Follow 👉 José for more about Data, Python and AI
To view or add a comment, sign in
-
-
What really happens when we pass an integer vs a list to a function? In Python, passing an integer to a function does not behave the same way as passing a list. Let’s see why. Example 1: Passing an Integer def change_value(x): x = x + 10 return x num = 5 change_value(num) print(num) ➡️Output: 5 At first glance, this might seem confusing. Here’s what actually happens: 1. num references the integer object 5 in memory. 2. When we call change_value(num), the value 5 is passed to the function. 3. Inside the function, a new local variable x is created, referencing the same object 5. At this moment: num → 5 x → 5 Now comes the important part: x = x + 10 Integers in Python are immutable, meaning they cannot be modified after creation. So Python does not change the value 5. Instead: 1. It calculates 5 + 10. 2. It creates a new integer object 15. 3. It makes x reference this new object. Now: num → 5 x → 15 The original 5 is still in memory, unchanged. This is called rebinding (the variable x was redirected to a new object). And because we did not assign the returned value back to num: ❌ num = change_value(num) ➡️ num remains 5. Example 2: Passing a List def add_item(lst): lst.append(10) numbers = [1, 2, 3] add_item(numbers) print(numbers) ➡️Output: [1, 2, 3, 10] Why did this one change? Because lists are mutable. When we pass numbers to the function: 1. lst references the same list object. 2. When we call lst.append(10), we modify the same object in place. No new list is created. Before: numbers → [1, 2, 3] After: numbers → [1, 2, 3, 10] The variable still points to the same object, but that object was directly modified. This is called modification (in place). 💡 The Core Difference When passing data to a function in Python: • If the object is immutable (like int),the function cannot modify it. Any change creates a new object (rebinding). • If the object is mutable (like list),the function can modify the same object in place. That is why the integer stayed 5, while the list was successfully updated. Understanding this difference is essential to understanding how Python handles memory and variable references. #Python #SoftwareDevelopment #CodingTips #MachineLearning #AI
To view or add a comment, sign in
-
🐍 Python Practice day 5– Here are some problems I solved today: ✅ Find the frequency of elements in a list ✅ Convert a list into a tuple ✅ Find common elements between two sets ✅ Remove duplicates from a list using a set ✅ Find union and intersection of two sets ✅ Create a dictionary from two lists (keys and values) ✅ Count frequency of characters in a string using a dictionary ✅ Merge two dictionaries ----------------------------------Day ----------------- Find the frequency of elements in a list. try: list1=[1,11,1,22,11,1,33,4,5,66,77,66,4,5] frequency_count={} for i in list1: if i in frequency_count: frequency_count[i]=frequency_count[i]+1 else: frequency_count[i]=1 print(frequency_count) except ValueError: print("Error occured") ==Tuples, Sets, Dictionaries == Convert a list into a tuple. list1=[1,2,3,4] tuple1=tuple(list1) print(tuple1) Find common elements between two sets. set1={1,2,3,3,4,4} set2={1,2,4,7} print(set1.intersection(set2)) Remove duplicates from a list using set. list1=[11,11,1,1,1,1,2,3,3] set1=set(list1) print(set1) list1=[11,11,1,1,1,1,2,3,3] unique_list=[] for i in list1: if i not in unique_list: unique_list.append(i) print(unique_list) Find union and intersection of two sets. set1={1,2,3,4,} set2={4,5,6,7,1} union1=set1.union(set2) inter_sec=set1.intersection(set2) print(union1) print(inter_sec) Create dictionary from two lists (keys and values) keys1=[1,2,3,4,5,6,7,8,9] values1=[9,8,7,6,5,4,3,2,1] dict_1={} for i in range(len(keys1)): dict_1[keys1[i]]=values1[i] print(dict_1) # Create dictionary from two lists (keys and values) keys1=[1,2,3,4,5,6,7,8,9] values1=[9,8,7,6,5,4,3,2,1] dict_1=dict(zip(keys1,values1)) print(dict_1) Count frequency of characters in a string using dictionary. str1="DpkWtmVMwwids.MMpAMLPlz" dict1={} for i in str1: if i in dict1: dict1[i]=dict1[i]+1 else: dict1[i]=1 print(dict1) # Merge two dictionaries. dict1={"Name":"Deepak", "Subject":"DataScience" } dict2={ "Designation":"DataEngineer", "Salary":"Ye batein btayi ni jati" } dict1.update(dict2) print(dict1) Working through these problems again helped reinforce concepts like: • Iteration and loops • Dictionary operations • Set theory in Python • Clean and Pythonic approaches like zip() and built-in methods #Python #Learning #Programming #DataScienceJourney #CodingPractice
To view or add a comment, sign in
Explore related topics
Explore content categories
- Career
- Productivity
- Finance
- Soft Skills & Emotional Intelligence
- Project Management
- Education
- Technology
- Leadership
- Ecommerce
- User Experience
- Recruitment & HR
- Customer Experience
- Real Estate
- Marketing
- Sales
- Retail & Merchandising
- Science
- Supply Chain Management
- Future Of Work
- Consulting
- Writing
- Economics
- Artificial Intelligence
- Employee Experience
- Workplace Trends
- Fundraising
- Networking
- Corporate Social Responsibility
- Negotiation
- Communication
- Engineering
- Hospitality & Tourism
- Business Strategy
- Change Management
- Organizational Culture
- Design
- Innovation
- Event Planning
- Training & Development