Learning to program is about understanding how to translate thoughts into source code that can be executed on computers to achieve one or more goals.
There are many steps in learning how to program, including
There are several schools of thought on how a person should start learning to program. One school of thought is that a lower-level programming language such as Assembly or C are the most appropriate languages to start with because they force new developers to write their own data structures, learn about pointers and generally work their way through the hard problems in computer science.
There's certainly wisdom in this "low-level first" philosophy because it forces a beginner to gain a strong foundation before moving on to higher level topics such as web and mobile application development. This philosophy is the one most commonly used in university computer science programs.
The atomic units of progress in the "low-level first" method of learning are
Another school of thought is that new developers should bootstrap themselves through working on projects in whatever programming language interests them enough to keep working through the frustrations that will undoubtably occur.
In this "project-based" line of thinking, the number of projects completed that expand a programmer's abilities are the units of progress. Extra value is placed on making the projects open source and working with experienced mentors to learn what he or she can improve on in their programs.
Python is good choice in the project-based approach because of the extensive availability of free and low cost introductory resources, many of which provide example projects to build upon.
Note that this question of whether or not Python is a good first language for an aspiring programmer is highly subjective and these approaches are not mutually exclusive. Python is also widely taught in universities to explain the fundamental concepts in computer science, which is in line with the "low-level first" philosophy than the projects-first method.
In a nutshell, whether Python is the right first programming language to learn is up to your own learning style and what feels right. If Ruby or Java seem like they are easier to learn than Python, go for those languages. Programming languages, and the ecosystems around them, are human-made constructs. Find one that appears to match your personal style and give it a try, knowing that whatever you choose you'll need to put in many long days and nights to really get comfortable as a software developer.
Working on practice programming challenges and studying their solutions in Python or another language is a great way to learn whether you are just starting or an experienced developer. Here are numerous open source repositories and sites with practice problems and solutions:
Pytudes are an awesome collection of Python programs to practice and demonstrate skills. These problems go above and beyond the common data structures and algorithm questions often found in other practice problem sets.
Python Programming Exercises is a free short PDF book with exercises across many standard Python language features such as dictionaries, classes and functions.
Code problems provides common algorithm and data structures challenges with solutions in several programming languages including Python.
Python basics contains materials and exercises to learn basic Python 3 syntax such as variables, functions and lists.
TeachCraft combines Minecraft with Python to learn coding.
500 Data Structures and Algorithms practice problems and their solutions covers a large swath of the computer science space. It is not important to know all of these algorithms and data structures but experience with many of them will be greatly beneficial in becoming a better developer.
These articles are written by programmers who explain how they learned to code. They should not be taken as "this is how you must learn" but instead give example paths you can think about taking as a beginner:
Learning to program is a long read but goes through Dan's experience in math and engineering before fully committing to software development.
Developing as a developer gives general advice on qualities necessary to become a programmer, including persistence, respecting others and considering ideas that are outside your comfort zone.
Are you an experienced programmer working with new and junior programmers? These articles give some insight into how you may want to structure your teaching experience:
Five Principles For Programming Languages For Learners is a perspective on teaching children to program but is good advice for an audience of any age.
Teach tech with cartoons is an awesome resource that explains how you can use simple but fun drawings to teach otherwise difficult technical concepts to students.
Teach Yourself Computer Science is intended as a self-teaching tool with many resources that are classic computer science textbooks. There are also nice explanations for why each resource is useful in your learning and teaching journey.