 Getting started with a new programming language can be challenging. Whether you're a beginner or a grizzled veteran, there's a number of larger context questions to answer that go beyond simply learning the languages syntax. My name is Sajja Klaiber and today we're going to be talking about a high-level overview of five important things to keep in mind as you begin your journey into Python. Now, you're not going to learn the specifics of the language here, but you're going to gain a general picture of how Python works. Now, it's important to note that Python is in interpreted languages. And typically, programming languages fall into two categories. Those that require a compilation step prior to running, such as Java and C, and those that are interpreted directly from the source code like JavaScript and Ruby. Python falls into the latter category. So, Python source code files commonly referred to as scripts are used directly by a Python interpreter to execute. For example, let's take the following code, print hello world. Simple enough, and when saved to a file, for example, hello.py, it can be passed to a Python interpreter without the need for an explicit compilation step. So, if we were to run Python hello.py, we're going to get an output of hello world in our console. So, super fair, super simple. In addition, Python is object-oriented, but not exclusively. So, if you come from an object-oriented background, particularly Java, where everything is an object, the hello.py example might look a little strange. This single-line script not only doesn't define any classes, but isn't even inside of a method declaration. So, Python supports object-oriented programming, but you're not locked into it. So, you can add functions directly to a script when there isn't a need for the overhead and complication of defining a class. So, let's take the following obviously academic class, phone number. Let's take a look at this real quick. Because running the script provides the formatted output 9735551234, but if output is the only goal, it arguably doesn't even need to be a class. In fact, you could rewrite it as a function, instead, this code example, where it's a lot simpler. Now, a third option is to combine the two, defining stateless functions where appropriate and having objects use those methods. As we can see in this code example, we've combined both of these in order to make our class. Now, Python is not strongly typed, which is kind of a double-edged sword in our situation. So, let's take a look at this following perfectly valid Python code. That snippet assigns to the variable x a string literal, an integer, a function, and the Python value for null. On top of that, the variable didn't even need to be explicitly declared. So, Python uses the concept of duck typing. If it swims like a duck and it quacks like a duck, it probably is a duck. In other words, if the value of a variable has certain abilities, the actual type of object it is doesn't really matter. Take the concept of iteration, for example. The for built-in function iterates over a collection of items. How those items are stored is kind of irrelevant. The important part is that the object supports the ability to be iterated. This is kind of fairly obvious for simple constructs such as list and sets, as we can see in this code example. Now, for key value pairs, the for function will iterate over just the keys, producing the output a, b, and c from the following code snippet, as we can see. Now, there are times, however, where this power and flexibility can kind of produce interesting results. So, for example, a string is also considered iterable, meaning it can be passed into a for loop without producing a runtime error. But the results can be often unexpected. So, as we see in this code snippet, we're iterating through. But if we were to run this, it would run, of course, without error, but it would produce the following output. Not everything is on the same line. Now, it's important to note that white space matters in Python, and it kind of might seem a little bit odd to highlight something that seemingly trivils white space, but I promise it's an important aspect of Python's syntax that it warrants mentioning. Python uses indentation to indicate scope. Fring it from the arguments about curly brace placement that other languages often encounter. Generally speaking, a code block is defined by the statements that share the same indentation level. Let's look again at the phone number code example. As we can see, the two assignments in the init method, which is Python's implementation of a constructor, are considered part of the method definition. We know this because they're indented further than the declaration and share the same indentation level. Now, if the second statement, the self.number equals number, was offset by even a single space in either direction, the code would fail to run, with an error similar to something like indentation error. Now, among the same lines, the display underscore pn function is indented to the same level as the phone number class, indicating that is not part of the class definition. Finally, use virtual environments to prevent dependency conflicts. In many cases, you're going to already have a Python interpreter installed on your system. For development, however, you'll likely want to create a virtual environment, which is effectively a copy of the interpreter that is scoped specifically to that environment. The reason for using virtual environments largely revolves around installing dependencies. Without using a virtual environment, any dependencies that are installed for your project, such as the Django, Flask, Pandas, or Numpy libraries, are installed to the global interpreter. Having such dependencies installed system-wide is a risk for a number of reasons, including version compatibility issues. Instead, creating a virtual environment for your project provides an individually scoped interpreter to use. Any dependencies installed to the virtual environment only exist for that environment, allowing you to easily develop on multiple projects without fear of system-wide implications or conflicts. There's also a number of ways to manage Python virtual environments, including the built-in venv command, as well as the arguably more user-friendly utility packages, pyenv, and virtualenv. Now, while this isn't a comprehensive overview of the Python language or its syntax, it's going to help to set the stage for what to expect and how to best work with the language. With these basic concepts in mind, the next step is to dive in and start to experiment. So, have fun, visit developers.redhat.com for more resources, and thanks for watching. Take care.