• Professional Development
  • Medicine & Nursing
  • Arts & Crafts
  • Health & Wellbeing
  • Personal Development

Course Images

The Ultimate Guide to Python Programming with Python 3.10

The Ultimate Guide to Python Programming with Python 3.10

  • 30 Day Money Back Guarantee
  • Completion Certificate
  • 24/7 Technical Support

Highlights

  • On-Demand course

  • 14 hours 26 minutes

  • All levels

Description

Master Python 3.10 from the experts with this course and demonstrate programming wizardry in Python. Go from a geek to a wizard in no time with this well-structured video course and write Python code like a pro. Learn about the often-forgotten basics and special features of programming and Python in general.

Python is a fantastic object-oriented programming language that lets you use functional and OOP paradigms. Python offers several benefits compared to other programming languages such as Java, C++, or R. It is a dynamic language, with high-level datatypes. Python is easy to learn for beginners, being more readable and intuitive. With this course, you will learn about computer architecture, programming concepts, and what terminals are. You will install and set up Python on your computer and learn about hands-on programming with Python basics, client-info application, and console IO. You will code with data types, loops, functions, classes and objects, and modules and packages. Finally, you will learn about strings, stack and data structures, pip - python package manager, virtual environments, iterables, File IO, threading and multiprocessing, and debugging. Upon completion, you can easily handle any programming project and use core Python features. Create different array data structures, lists, tuples, sets, typed arrays, stacks, queues, and priority queues. Use structural pattern matching with match-case statements in Python 3.10 and third-party packages and create virtual environments for projects. All resources are available at: https://github.com/PacktPublishing/The-Ultimate-Guide-to-Python-Programming-With-Python-3.10

What You Will Learn

Implement basic data structures and basic programming with Python
Create array structures such as a list, tuple, set, stack, and queue
Learn object-oriented programming with Python classes and objects
Use structural pattern matching with case statement in Python 3.10
Use Python REPL to write code from the terminal and test ideas
Create virtual environments for projects with third-party packages

Audience

This course is beneficial for those with some skills in Python or if you are looking to refresh your skills and advance to the next level. Even if you can use a computer, that's completely fine as the course will train you to become a professional in coding. Complete newbies who want to learn to program or even beginner Python developers seeking expertise in Python programming can ace Python with this course. The course does not have any special requirements except turning the computer on and watching and learning from the course phase-by-phase.

Approach

The interactive and demonstrative video lectures are divided into four levels of Python programming. You will start from the novice level-from computer architecture to programming concepts-and move on to progress into a newbie, coder, and finally a wizard in Python coding. You will ace object-oriented programming and each level takes you a step further to Python mastery!

Key Features

Learn Python programming and ace coding from basics to developing real applications with Python * Use structural pattern matching, case statement, and Python REPL to write code from the terminal * Create virtual environments using third-party packages and use OOP with Python classes and objects

Github Repo

https://github.com/PacktPublishing/The-Ultimate-Guide-to-Python-Programming-With-Python-3.10

About the Author
Rahul Mula

Rahul Mula is a passionate developer with expertise in Python, Flutter, and web development. He was really intrigued the first time he learned about programming and realized what could be done with it. Rahul thrives on exploring diverse technologies and crafting innovative applications. He's the mastermind behind Keyviz, a remarkable open-source tool for real-time keystroke visualization. Rahul's contributions extend to the realm of education, where he has authored books and crafted courses on Python programming, benefiting thousands of eager learners.

Course Outline

1. Introduction

This section outlines the curriculum of the course benefits and briefly overviews about what you will learn from the course.

1. Curriculum Overview

A brief outline about the course content and what you will learn from this course.

2. How to Program

In this video, you will learn about the key principles to keep in mind before jumping into any kind of programming.

2. Generic Programming

Video 2.1: Computers and Data

1. Computers and Data

This video outlines the fundamentals of a computer's hardware that we must know about for troubleshooting.

2. Programming Language

In this video, we will briefly understand about bits and bytes of a general program and how a computer interprets your input to perform an output.

3. Terminal

Here, we will understand the concept of working on a terminal with programming and non-programming operations of a computer.

4. Navigation

In this lesson, we will look at navigating and exploring the various capabilities, applications, and folder structures of a personal computer.

5. Terminal Exercise

We will work on various exercises on the terminal by copying folders, working on text files, creating a backup directory, and so on.

6. File Operations

In this video, you will learn about how to create and edit the contents of a file.

7. Internet

In this lecture, we will explore what the Internet is and how it works more than just a network.

8. Community

Here, we will look at the resources available to help you out when having troubles with computing.

3. Programming with Python

In this section, we will look at installing and setting up the Python programming software.

1. Python Setup

You will learn to set up the Python interpreter in your computer to get started with programming.

2. Python Basics

Here, we will look at the kind of terms or language used to write code, special rules, syntaxes.

3. Python Datatypes

Understand what a data structure is, what data types are, and what are the kinds of datatypes used in Python.

4. Console IO

In the previous video, you learned about datatypes; now, we will look at inputs and outputs from the console.

5. if Statements

You will learn about the if statement in Python and how to input a statement/condition.

6. def-Keyword

Here, you will learn about functions and keywords using the ().

4. The Container - Variables

This section discusses the naming conventions followed in Python for variables.

1. The Global Object and Built-in Functions

Learn about the naming conventions followed in Python for data structures and variables.

5. Strings

This section focuses on strings and how to create them in Python.

1. The str Data Type

Let's learn about the textual data within codes and how to write them.

2. String Operations

After learning how to create a string, now we will look at performing various operations on them.

3. String Methods

You will learn about the built-in functions called methods to work on strings.

6. Numbers

This section discusses about how various kinds of numbers are handled by Python.

1. Numerical Datatypes

Let's learn about numbers such as integers, decimals, fractions, long integers, ands complex numbers.

2. Numerical Operations

After understanding all the different kinds of numbers, we will look at performing operations on these numbers.

7. Booleans

This section focuses on true and false values.

1. True or False Values

In this video, you will learn about the only two Boolean values in Python, true and false.

8. Lists

This section illustrates about lists in Python.

1. List

In this chapter, we will look at the list datatype in Python.

2. List Operations

Let's learn how to add, access, delete elements in a list with its respective access.

9. Tuples

This section discusses about the tuples datatype.

1. Immutable list - Tuple

You will learn about the tuples datatype, which is a list that cannot be altered after its creation.

10. Sets

This section discusses about an unordered data type like lists called a set.

1. Unordered Lists - set

You will learn about an unordered datatype, which is similar to a list, called the set.

2. Set Operations

Now that we have understood how to create a set, we will execute various operations on a set.

11. Dictionary

This section focuses on the powerful datatype called Dict in Python.

1. The dict Data Type

Let's learn about the dict datatype and one of the most important data structures called the dictionary.

2. Dictionary Operations

After learning how to create a dictionary, you will learn about the various operations we can perform over a dictionary.

12. Decision Control

This section is about conditional statements used in controlling the decision of the outcome.

1. elif Statements

In this video, you will learn to use the else-if condition statement to execute code.

2. Comparison Operators

Let's understand the equality operator or the == operator.

3. Joining Conditions Using AND Keyword

In this video, we will join two conditions using the AND keyword and execute.

4. Joining Conditions Using OR Keyword

In this video, we will join two conditions using the OR keyword and execute.

5. Conditional Operators

In this video, we will set conditions using the NOT keyword and execute.

6. Ternary Operators

In this video, we will use the if condition to convert complex numbers to integers.

13. Match Case Statements

This section focuses on using match case statements to avoid redundancy of code.

1. Using Python Match Case Statements and Match Default Case

We will use the match case statements to avoid redundancy and lengthy codes.

14. While Loops

This section focuses on what a loop means and how to operate with the while loop.

1. while Statements

You will learn about the while loop operation where a code executes until the condition holds true.

2. fire() rounds Argument

Here, we will look at the fire() arguments and its execution upon setting the number of iterations in a while loop.

3. The BREAK Keyword

Let's look at how to control the while loop using the BREAK keyword.

4. The CONTINUE Keyword

Let's learn about changing the control of the while loop using the CONTINUE Keyword.

15. For Loops

This section delves over the for loop in Python.

1. Iterating over Sequence Data Types

You will learn to manipulate data in a list using iterations and the for loop instead of the while loop and index.

16. Functions

This section illustrates a lot of built-in functions used in Python.

1. Upgrading Our print()

We will look at sprucing up our output so that it is more easier to look at.

2. Optional Arguments or Parameters

Let's look at the parameters that we can define to alter the way the output looks like further.

3. Keyword Arguments

You will learn to use keyword arguments to execute code and alter the behavior of the output.

4. Arbitrary Positional Arguments - *args

You will learn to use the arbitrary positional argument, which will allow us to accept any number of positional arguments.

5. print()'s Arguments

Let's look at the Keyword arguments that our print() functions also receive.

6. log(padding) Argument

We will look at the END argument in our function and execute code.

7. Arbitrary Keyword Arguments

Previously, you learned to use the arbitrary positional argument to accept any number of values; now, we will look at using arbitrary keywords to accept any number of keyword arguments.

8. The RETURN Keyword

Let's look at creating a function that performs a task; we will look at functions to return a value using the RETURN keyword.

9. Lambda Functions

You will learn about lambda functions or one-liner functions to minimize the amount of code writing.

17. Classes

This section illustrates classes, which are templates for objects.

1. Classes and Objects

In this video, we will know that classes are generally templates for creating objects, and also explain how to create our own class to create an object.

2. Object Attributes

In the previous lesson, we created our object and class; now, we will look at adding attributes to the variables in the objects or creating fields in the object.

3. Methods or Object Functions

You will learn to use keyword arguments to execute code and alter the behavior of the output.

18. Classes

This section focuses on inheriting attributes from one class to another in objects.

1. Classes and Objects

After learning about classes and how to create our own class to create an object, we will now look at inheriting the attributes from one class to another.

2. Object Attributes

In the previous lesson, we created our object and class; now, we will look at creating the cart class, which is useful for storing the objects that we have created.

19. Error Handling

In this section, you will learn about error handling and how to minimize errors while running code.

1. Handling Errors with try and except Statements

In this video, you will learn how to handle errors of code execution with the try and except statements.

2. Custom Error Classes

In the previous lesson, you learned how to handle errors; in this video, we will look at creating error classes that will handle exceptions.

20. Modules and Packages

In this section, you will learn about error handling and how to minimize errors while running code.

1. Reusing Code with Modules

In this video, you will learn to use the import statement to reuse a code instead of copy-pasting code. We will also look at creating modules to reuse code.

2. Organizing Modules into Packages

In the previous lesson, you learned how to create modules to reuse code; in this lesson, you will learn how to organize your modules into groups called packages.

21. Project: Prankster

This section demonstrates how to create a project called Prankster.

1. Prankster Program

In this video, you will learn to create an application called Prankster.

2. Rigging-up The Prankster

In the previous lesson, we created an application called Prankster; in this video, we will look at how we can rig or automate using a patch or a script file.

22. VS Code

This section focuses on the settings of Visual Studio Code.

1. VS Code Settings and Themes

This video demonstrates how to configure the settings and themes in Visual Studio Code.

23. Revisiting Strings

This section focuses on slashes, strings, format method, f-strings, and text alignment specifications.

1. Use of Slashes in Strings

In this video, you will learn about using slashes in Python strings and how we can use them to create slash codes.

2. Percent String Substitution

You will learn to concatenate a string and print the message that we created using string concatenation and a non-string datatype.

3. string.format() Method

In this video, you will learn to create a template string using the format() method.

4. Formatted Strings or f String

In this lesson, you will learn how to use the f{} to pass any value in a string.

5. String Format Specifiers

In this video, you will learn how to use the = format specifier that will do the same task as our {} to print any values.

6. Text Alignment Format Specifier

In this lesson, you will learn about the format specifier, that is, the text alignment, which we use to align our values when formatted in a string.

24. Arrays

This section focuses on creating an array, and empty and stacked arrays. We will also look at sorting and queuing arrays.

1. Empty and One-Element Arrays

In this video, you will learn how to create an empty and a single-element array.

2. Slicing with Steps

You will learn to slice or remove elements from an array using the slice method.

3. .sort(key) - Sorting Arrays of Class Objects

In this video, you will learn to sort arrays, elements, and variables in a class object.

4. The Array Data Type

In this lesson, we will look at the different sequence of elements or datatypes and the array as a datatype.

5. Stack Data Structure

In this video, you will learn about stacked elements or elements that are lined one above the other, which is a sequence of elements in an order.

6. Queue Data Structure

Here, we will look at the semantics of adding or deleting objects or modules in a queued data structure.

7. Collections Module

We will look at some other classes that can be used with our sequence datatypes, called the collection module.

25. Revisiting Dictionary

This section focuses on creating the dictionary and modifying the elements in the dictionary to eliminate duplicates.

1. Dictionaries or Hash-Tables

Hash-tables or lookup tables are nothing but dictionaries, usually compressed so that they are easier to store.

2. MappingProxyType

Similar to arrays, dictionaries come in different variations and are immutable or hashable, which can be done using the Mapping Proxytype.

3. SimpleNamespace

In this video, you will learn to use the license syntax to access a value from the dictionary using SimpleNamespace to access a value.

4. namedtuple Class

Here, we will look at creating a dictionary to store the information of an object and create a copy of this and change values.

5. .items() Method

We will look at running a for loop on the dictionary using the slice syntax and an often-forgotten method-item().

26. Iterators and Generators

This section focuses on lists, sequence datatypes, and iterables.

1. List Comprehension

Instead of filling values in an object, we will use the for loop to get the values from a list.

2. if Statements in List Comprehension

Here, you will learn to use if statements to append an actual list and set conditions that are true.

3. Set and Dictionary Comprehensions

We will look at the for outer loop, inner loop, and run the code. You will learn to set values in the loop.

4. Generators

Here, we will look at generators or comprehension expression, which is like an iterable.

5. Chaining Generators

We will run a for loop in generators that are chained to one another to yield the length of the iterables.

6. enumerate() Function

We will look at running a for loop to print the items on an object. You will also learn to use the range or length of a function or index.

7. zip() Function

You will learn to use the for loop and the built-in generator and pass any number of iterables using a zip function.

8. zip_longest() Function

Here, you will learn how to use the maximum number of elements taken into consideration using the itertools built in.

9. all() Function

In this video, you will learn to use all function to obtain true values.

10. any() function

Like the 'all' function, we have the any function, which, if any value is true, it will return the value true, or else will display false.

27. Iterators and Generators

This section focuses on a lot of handy functions that are in the itertools module, which can be used as iterators and generators.

1. Itertools Module

This video demonstrates the various iterators and generators available in the itertools module.

2. Cycle ()

Here, you will learn about the iterable class cycle ().

3. repeat ()

We will look at the repeat class, which helps repeat an iterable to the number of times specified.

4. Combinations ()

Here, we will look at a class that helps combine iterables together, called the combinations class.

5. Permutations ()

This class allows us to sort iterables in a class in various combinations.

6. product()

In order to obtain the product of different iterables, you will learn how to use the products class.

7. combinations_with_replacement()

You will learn about a class that combines different elements in an iterable.

8. Chain()

Here, you will learn how to join the elements of an iterable.

9. islice()

To remove an element from our list, you will learn how to use the slicing syntax.

10. compress()

Here, you will learn to use the for loop and run the if check to compress the values of two iterables or lists.

11. filter()

You will learn to filter elements of a list of iterables using the filter class.

12. filterfalse()

You will learn to filter elements of a list of iterables using the filter class when the result is false.

13. accumulate()

In this video, you will learn to use the accumulate generator to accumulate some values.

14. groupby()

Learn to use the groupby from itertools to sort out variables or elements based on criteria in a list.

28. High-Level Ops

This section focuses on various operators available in the built-in modules to perform various mathematical operations and comparisons.

1. is Operator

This video demonstrates the various use of the == operator to compare two lists and when the values are the same.

2. Shallow and Deep Copies

Here, you will learn to create pointers that will point at the variables in a list or in a list of iterables.

3. Tuple Unpacking

We will look at unpacking the values or elements of a tuple.

4. Dictionary Unpacking

Here, we will look at adding values from one dictionary to another using the update method.

5. Tuple Packing

You will learn how to pack the values or elements of an iterable such as the tuple.

6. Arguments Unpacking

To set conditions for dictionaries to be updated or modified, we will use arguments that sort the elements.

7. Packing or Unpacking

You will learn to define our function using an arbitrary number of positional arguments with the * operator.

8. Walrus := Operator

Here, you will learn how to return values such as true or false or a variable assignment such as num, then there is no return value.

9. Pipe | Operator

You will learn to use the pipe operator to join dictionaries of different variables or elements.

10. Variable Scope

Here, we will define a value set to 0 and then change it using a function called num using the print num function.

11. Python REPL

You will learn to use the Python REPL that displays the version, tags and date, and variable declarations.

29. Structural Pattern Matching

This section focuses on match case statements, matching objects, and matching dictionaries.

1. Pipe Operator in Case Statements

This video demonstrates match case statements and case creation.

2. Pattern Matching

Here, you will learn to create your own terminal simulation, which will create different statements and match the list directories.

3. Pipe Operator in Patterns

You will learn more about the pipe operator and how to use the pipe operator in patterns in case statements.

4. if Statements in Case Statements

Here, we will look at using the if statement within the case statements to obtain results.

5. Packing Operator in Case Statements

You will learn how to pack the values or elements using the *args.

6. Match Dictionary

In this video, you will learn how to match a dictionary to another and compare the elements.

7. Match Object

You will learn how to use the namedtuple to create a class to compare the list of objects in a class.

30. Functional Programming

This section focuses on functions in-depth and on functional programming.

1. Function Attributes

In this video, we will use the def key and pass an argument to define our function.

2. Recursive Functions

When a function calls itself, we call it recursive, where a function can call itself in a block of code.

3. Decorator Function

Here, we will use the decorator function to set designs around our variables or elements or even unnamed strings.

4. Creating Decorator Functions

You will learn to define decorator functions, which will decorate an output line by line; you will also learn to use the REPL.

5. functools.partial()

You will learn to use the built-in functools module, which has some utility functions that can be used with normal functions.

6. @wraps Decorator

In this video, you will learn how to decorate docstrings with the @wraps decorator.

31. Modules

This section focuses on attributes and adding documentation strings to our modules.

1. Module Attributes

Just like functions, we can add documentation strings to modules, which is highly recommended.

2. __main__ module

You will learn to add a module to another module, that is, another module to your primary or main module.

3. pip - Package Installer for Python

Before starting a project and implementing a functionality by ourselves, we can check third-party sites where such functionality can be implemented.

4. venv - Virtual Environments

After learning how to install a third-party package with pip, we can then create virtual environments such as Python REPL at any directory.

32. Modules

This section focuses on attributes and adding documentation strings to our modules.

1. Hinting Datatypes

In this video, you will learn about Python type hints, Python type hint list such as a list of strings, Python type for dictionary, or dict key value.

2. Type Hint Function Arguments and Return Type

You will learn to use arguments in a function for the best use of type hinting to hint on the type of an argument.

33. Object-Oriented Programming

This section focuses on object-oriented programming in Python.

1. object()

In this lesson, we will be introduced to object-oriented programming (OOP).

2. Naming Conventions

In this video, we will look at different naming conventions for objects.

3. Class Variables and Instance Variables

In this video, you will learn about class variables and variables created on an instance.

4. __new__() Method

Here, we will look at Python __new__ versus __init__ and their differences.

5. Singleton

We will look at creating single objects for single classes.

6. Operator Overloading

You will learn to overload operators using the symbol, init, and the show classes.

7. Iterable Classes

Here, you will learn to use the for loop to obtain values from the iterable classes.

8. Casting Type

We will look at methods to convert the datatypes of one class to another datatype.

9. Class __repr__

Here, we will look at using the built-in method for int, using underscores.

10. getattr() and setattr()

We will run functions using the get attribute and the set attribute.

11. getattr() Use Case

We will look at the importance of using the getattr() case.

12. __getitem__() and __setitem__()

You will learn to use the getitem and setitem functions with underscores.

13. @property decorator

In this video, you will learn to use the @property decorator.

14. Property Setter and Deleter

In this video, you will learn to use the @property decorator.

15. Class __slots__

In this video, you will learn how to create tuples with classes where we cannot add any attributes to the tuples; you will learn to use the slots function to define attributes.

16. @dataclass Decorator

This video demonstrates how to create a Python dataclass.

17. Python Enums

Here, you will learn about creating classes with attributes that are not used to create objects.

18. Sentinels

We will look at creating data classes that do not hold any value.

19. @classmethod Decorator

Here, we will look at creating a class that is a pointer to a class using (cls) and change instances.

20. @staticmethod Decorator

You will learn how to use the static method that does not take a self or class.

34. Metaclass

This section focuses on object-oriented programming in Python.

1. Type of a Class

In this lesson, we will be introduced to the behind-the-scenes operations when we create a class.

2. Creating Class with type()

In this video, we will look at the different types of classes we can create using the type function.

3. Metaclass

Just like decorator functions, we can define metaclasses that execute before the class creation.

4. ABCMeta

In this lecture, you will learn about Python ABC module, ABCMeta metaclass, abstractproperty decorator, and the abstractmethod decorator.

35. File IO

This section focuses on the input and output methods of files in Python.

1. open() File

In this lesson, you will learn how to perform the operations on a file with Python.

2. Reading File

In this video, we will look at the "with" context manager to read files.

3. Writing File

We will use the read mode and then, in the writing mode, we will use the "W" string to write text.

36. Data Preservation

This section focuses on preserving data in Python.

1. State of Data

You will learn to create a terminal application to use dictionaries to store and execute functions and use a while loop with inputs as a command.

2. JSON Data

In this video, we will look at JavaScript Object Notation.

3. JSON as a String

We will save changes to normal text files in the form of strings in JSON data storage.

37. Debugging

This section focuses on finding errors and debugging them.

1. Bare Except Statements

You will learn to find bugs and fix them, called debugging, and wrap all while loop codes to fix errors.

2. Custom Exception ExitPhonebook()

You will learn to make your code more consistent while debugging.

3. assert Statements

You will learn to ensure that statements remain true while debugging errors.

4. logging Module

You will learn to use the logging module to log messages based on situations such as warnings, debugs, and so on.

38. Threading and Multiprocessing

This section focuses on joining multiple lines of code using multiprocessing.

1. What Is Threading and Multiprocessing?

You will learn to join multiple lines of code using the threading and multiprocessing methods.

2. Threading Module

You will learn how to implement threading in Python.

3. Thread with Arguments

You will learn to call arguments using threads so we do not have to wait for the code to execute.

4. ThreadPoolExecutor

Here, you will learn to create multiple threads and use a better option using the thread pool executor class.

5. Multiprocessing

Just like threading, Python has a built-in multiprocessing module, which we can use to create a process.

6. ProcessPoolExecutor

You will learn to use a process pool executor to run a lot of processes simultaneously.

39. Tkinter

This section focuses on creating a graphical user interface using the built-in features of Python.

1. tkinter Module

You will learn to use the tkinter class to create a graphical user interface using the Python built-in GUI module.

2. Label and Button Widgets

You will learn how to create labels and button widgets in our interface.

3. Grid Layout

You will learn to use grids to create templates and layouts and add paddings around our widgets.

4. Entry Widget

Here, you will learn to create a GUI using the other widgets with tkinter.

5. .grid(columnspan) Argument

Just like threading, Python has a built-in multiprocessing module, which we can use to create a process.

6. OptionMenu Widget

You will learn to create dropdown menus using the OptionMenu class.

7. ttk - Themed Widgets

You will learn to create theme-based widgets using the tkinter themes with the ttk module.

40. Project Sedentary Alert

This section focuses on creating a graphical user interface using the built-in features of Python.

1. Introduction

This section focuses on creating our own application with notifications.

2. Project Setup

You will learn how to get started for the project work.

3. Interface: Root Window

We will create variables to hold our assets for our project work.

4. Interface: Checkbutton

Here, we will define our user interface code with the use of checkbuttons.

5. Interface: Dropdown

In this lesson, we will go ahead and add a dropdown menu as well.

6. Loading JSON Data

We will fetch data loaded where we have stored the JSON data files using the interface.

7. Updating JSON Data

You will learn how to update the intervals and checkbuttons and update the values in the JSON file.

8. Notification (For Windows)

You will learn how to define the actual code to send notifications from our project.

9. Notification (For Mac)

You will learn to send notifications from macOS.

10. Sending Alerts

Here, we will define intervals using a while loop to send notifications.

11. Threading

In this lesson, we will start sending us notifications from our sedentary alert project using the notifier function with the recursive call.

12. Application Executable

You will learn to install the Py installer and then convert our Python file into an executable.

Course Content

  1. The Ultimate Guide to Python Programming with Python 3.10

About The Provider

Packt
Packt
Birmingham
Founded in 2004 in Birmingham, UK, Packt’s mission is to help the world put software to work in new ways, through the delivery of effective learning and i...
Read more about Packt

Tags

Reviews