forked from mattmakai/fullstackpython.com
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathall.html
7354 lines (7300 loc) · 362 KB
/
all.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Matt Makai">
<link rel="shortcut icon" href="theme/img/fsp-fav.png">
<title>Full Stack Python</title>
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
<![endif]-->
<link href="theme/css/f.min.css" rel="stylesheet">
</head>
<body>
<div style="padding: 0 0 20px 0; margin: 0 0 20px 0; background-color: #22B24C;">
<div class="container">
<h2 style="color: #fff; margin: 20px 40px 0 0;"><a href="https://www.gumroad.com/l/python-deployments" style="color: #fff">The Full Stack Python Guide to Deployments book</a> has been released!</h2>
</div>
</div> <a href="https://github.com/makaimc/fullstackpython.com"><img style="position: absolute; top: 0; right: 0; border: 0;" src="/theme/img/fork.png" alt="Fork me on GitHub"></a>
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="logo-header-section">
<a href="/" style="text-decoration: none; border: none;"><img src="theme/img/fsp-logo.png" height="52" width="52" class="logo-image" style="padding-top: 1px;" alt="Full Stack Python logo"></a>
<span class="logo-title"><a href="/">Full Stack Python</a></span>
</div>
</div>
</div><div class="row">
<div class="col-md-8">
<h1>Introduction</h1>
<p>You're knee deep in learning the <a href="http://www.python.org/">Python</a>
programming language. The syntax is starting to make sense. The first
few "<em>ahh-ha</em>!" moments are hitting you as you're learning conditional
statements, <code>for</code> loops and classes while playing around with the open source
libraries that make Python such an amazing language.</p>
<p>Now you want to take your initial Python knowledge and make something real,
like an application that's available on the web that you can show off or
sell as a service to other people. That's where Full Stack Python comes in.
You've come to the right place to learn everything you need to create, deploy
and run a production Python web application.</p>
<h1>Learning Programming</h1>
<p>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.</p>
<p>There are many steps in learning how to program, including</p>
<ol>
<li>setting up a <a href="/development-environments.html">development environment</a></li>
<li>selecting a programming language, such as Python</li>
<li>understanding the syntax and commands for the language</li>
<li>writing code in the language, often using
<a href="/application-dependencies.html">pre-existing code libraries</a> and
<a href="/web-frameworks.html">frameworks</a></li>
<li>executing the program</li>
<li>debugging errors and unexpected results</li>
<li><a href="/deployment.html">deploying</a> an application so it can run for intended
users</li>
</ol>
<h2>How should I learn programming?</h2>
<p>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.</p>
<p>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.</p>
<p>The atomic units of progress in the "low-level first" method of learning are </p>
<ol>
<li>aspects of programming language understood (type systems, syntax)</li>
<li>number of data structures coded and able to be used (stacks, queues)</li>
<li>algorithms in a developer's toolbelt (quicksort, binary search)</li>
</ol>
<p>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.</p>
<p>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. </p>
<h2>Should I learn Python first?</h2>
<p>Python is good choice in the project-based approach because of the extensive
availability of
<a href="/best-python-resources.html">free and low cost introductory resources</a>,
many of which provide example projects to build upon.</p>
<p>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.</p>
<p>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.</p>
<h1>Why Use Python?</h1>
<p>Python's expansive library of open source data analysis tools,
<a href="/web-frameworks.html">web frameworks</a>,
and testing instruments make its ecosystem one of the largest out of any
programming community. </p>
<p>Python is an accessible language for new programmers because the community
provides many <a href="/best-python-resources.html">introductory resources</a>. The
language is also widely taught in universities and used for working with
beginner-friendly devices such as the
<a href="http://www.raspberrypi.org/">Raspberry Pi</a>.</p>
<div class="well see-also">
If you're learning about why to use Python you should also take a look at
<a href="/best-python-resources.html">the best Python resources</a> and read
<a href="/what-full-stack-means.html">what "full stack" means</a>.
</div>
<h2>Python's programming language popularity</h2>
<p>Several programming language popularity rankings exist. While it's
possible to criticize that these guides are not exact, every ranking shows
Python as a top programming language within the top ten, if not the top five
of all languages. </p>
<p>Most recently, the
<a href="http://redmonk.com/sogrady/2015/01/14/language-rankings-1-15/">RedMonk January 2015 ranking</a> had Python at #4.</p>
<p>The
<a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">TIOBE Index</a>,
a long-running language ranking, has Python steady at #8. </p>
<p>The <a href="http://pypl.github.io/PYPL.html">PopularitY of Programming Language</a>
(PYPL), based on leading indicators from Google Trends search keyword
analysis, shows Python at #3.</p>
<p><a href="http://githut.info/">GitHut</a>, a visualization of GitHub language popularity,
pegs Python at #3 overall as well.</p>
<p>These rankings provide a rough measure for language popularity. They are not
intended as a precise measurement tool to determine exactly how many
developers are using a language. However, the aggregate view shows that Python
remains a stable programming language with a growing ecosystem.</p>
<h2>Why does the choice of programming language matter?</h2>
<p>Programming languages have unique ecosystems, cultures and philosophies
built around them. You will find friction with a community and difficulty
in learning if your approach to programming varies from the philosophy of
the programming language you've selected.</p>
<p>Python's culture values
<a href="https://github.com/trending?l=python&since=monthly">open source software</a>,
community involvement with
<a href="http://www.pycon.org/">local, national and international events</a> and
teaching to new programmers. If those values are also important to you and/or
your organization then Python may be a good fit. </p>
<p>The philosophy for Python is so strongly held that it's even embedded in
the language as shown when the interpreter executes "import this" and
displays <a href="https://www.python.org/dev/peps/pep-0020/">The Zen of Python</a>.</p>
<div class="highlight"><pre><span class="o">>>></span> <span class="kn">import</span> <span class="nn">this</span>
<span class="n">The</span> <span class="n">Zen</span> <span class="n">of</span> <span class="n">Python</span><span class="p">,</span> <span class="n">by</span> <span class="n">Tim</span> <span class="n">Peters</span>
<span class="n">Beautiful</span> <span class="ow">is</span> <span class="n">better</span> <span class="n">than</span> <span class="n">ugly</span><span class="o">.</span>
<span class="n">Explicit</span> <span class="ow">is</span> <span class="n">better</span> <span class="n">than</span> <span class="n">implicit</span><span class="o">.</span>
<span class="n">Simple</span> <span class="ow">is</span> <span class="n">better</span> <span class="n">than</span> <span class="nb">complex</span><span class="o">.</span>
<span class="n">Complex</span> <span class="ow">is</span> <span class="n">better</span> <span class="n">than</span> <span class="n">complicated</span><span class="o">.</span>
<span class="n">Flat</span> <span class="ow">is</span> <span class="n">better</span> <span class="n">than</span> <span class="n">nested</span><span class="o">.</span>
<span class="n">Sparse</span> <span class="ow">is</span> <span class="n">better</span> <span class="n">than</span> <span class="n">dense</span><span class="o">.</span>
<span class="n">Readability</span> <span class="n">counts</span><span class="o">.</span>
<span class="n">Special</span> <span class="n">cases</span> <span class="n">aren</span><span class="s">'t special enough to break the rules.</span>
<span class="n">Although</span> <span class="n">practicality</span> <span class="n">beats</span> <span class="n">purity</span><span class="o">.</span>
<span class="n">Errors</span> <span class="n">should</span> <span class="n">never</span> <span class="k">pass</span> <span class="n">silently</span><span class="o">.</span>
<span class="n">Unless</span> <span class="n">explicitly</span> <span class="n">silenced</span><span class="o">.</span>
<span class="n">In</span> <span class="n">the</span> <span class="n">face</span> <span class="n">of</span> <span class="n">ambiguity</span><span class="p">,</span> <span class="n">refuse</span> <span class="n">the</span> <span class="n">temptation</span> <span class="n">to</span> <span class="n">guess</span><span class="o">.</span>
<span class="n">There</span> <span class="n">should</span> <span class="n">be</span> <span class="n">one</span><span class="o">--</span> <span class="ow">and</span> <span class="n">preferably</span> <span class="n">only</span> <span class="n">one</span> <span class="o">--</span><span class="n">obvious</span> <span class="n">way</span> <span class="n">to</span> <span class="n">do</span> <span class="n">it</span><span class="o">.</span>
<span class="n">Although</span> <span class="n">that</span> <span class="n">way</span> <span class="n">may</span> <span class="ow">not</span> <span class="n">be</span> <span class="n">obvious</span> <span class="n">at</span> <span class="n">first</span> <span class="n">unless</span> <span class="n">you</span><span class="s">'re Dutch.</span>
<span class="n">Now</span> <span class="ow">is</span> <span class="n">better</span> <span class="n">than</span> <span class="n">never</span><span class="o">.</span>
<span class="n">Although</span> <span class="n">never</span> <span class="ow">is</span> <span class="n">often</span> <span class="n">better</span> <span class="n">than</span> <span class="o">*</span><span class="n">right</span><span class="o">*</span> <span class="n">now</span><span class="o">.</span>
<span class="n">If</span> <span class="n">the</span> <span class="n">implementation</span> <span class="ow">is</span> <span class="n">hard</span> <span class="n">to</span> <span class="n">explain</span><span class="p">,</span> <span class="n">it</span><span class="s">'s a bad idea.</span>
<span class="n">If</span> <span class="n">the</span> <span class="n">implementation</span> <span class="ow">is</span> <span class="n">easy</span> <span class="n">to</span> <span class="n">explain</span><span class="p">,</span> <span class="n">it</span> <span class="n">may</span> <span class="n">be</span> <span class="n">a</span> <span class="n">good</span> <span class="n">idea</span><span class="o">.</span>
<span class="n">Namespaces</span> <span class="n">are</span> <span class="n">one</span> <span class="n">honking</span> <span class="n">great</span> <span class="n">idea</span> <span class="o">--</span> <span class="n">let</span><span class="s">'s do more of those!</span>
</pre></div>
<h3>More perspectives on why to use Python</h3>
<ul>
<li>
<p>The Python documentation has a HOWTO section specifically for
<a href="https://docs.python.org/2/howto/advocacy.html">Python advocacy</a>.</p>
</li>
<li>
<p><a href="http://nothingbutsnark.svbtle.com/how-to-argue-for-pythons-use">How to argue for Python’s use</a>
explains that choosing a programming language can be complicated but that
Python is a very good option for many use cases.</p>
</li>
<li>
<p><a href="http://lorenabarba.com/blog/why-i-push-for-python/">Why I Push for Python</a>
explains one professor's rationale for promoting Python to teach programming
to undergraduates.</p>
</li>
<li>
<p>If you're wondering about the differences in Python's dynamically typed
system versus statically typed languages, be sure to
<a href="http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html">read this thorough explanation of the topic</a>.</p>
</li>
</ul>
<h1>Python 2 or 3?</h1>
<p>The Python programming language is currently in the midst of a long-term
transition from version 2 to version 3. New programmers typically have many
questions about which version they should learn. It's confusing to hear
that Python 3, which was originally released in 2008, is still not the default
installation on many operating systems.</p>
<p>Here's the good news: you can't go wrong starting with either version. While
there are differences in unicode and syntax, for the most part if you
start with Python 2 and then learn Python 3 you won't be starting from
scratch. Likewise, you'll be able to read and write Python 2 code if you
started with Python 3.</p>
<p>My personal recommendation for new programmers as of right now is to start
with Python 3. There are enough <a href="/best-python-resources.html">great resources</a>
out there that teach version 3 from the ground up.</p>
<p>However, if you are interested in DevOps-type work with
<a href="/configuration-management.html">configuration management tools</a> such as
Ansible or Fabric, then you'll have to stick to Python 2 because they have
yet to upgrade to support Python 3. If you know there are libraries you must
use in a project, check the
<a href="https://python3wos.appspot.com/">Python Walls of Superpowers</a>. If you're
using Django, there is also a wall specifically for
<a href="http://djangowos.com/">Python 3 compatibility of popular Django packages</a>.</p>
<h3>Python 2 to 3 resources</h3>
<ul>
<li>
<p>The official
<a href="https://wiki.python.org/moin/PortingToPy3k/">porting code to Python 3</a>
page links to resources on porting Python code as well as underlying C
implementations. There is also a
<a href="https://wiki.python.org/moin/PortingToPy3k/BilingualQuickRef">quick reference for writting code with Python 2 and 3 compatibility</a>.</p>
</li>
<li>
<p><a href="http://nothingbutsnark.svbtle.com/porting-to-python-3-is-like-eating-your-vegetables">Porting to Python 3 is like eating your vegetables</a>
explains that there are treats in Python 3 that are worth porting for and
has some tips on making the transition easier.</p>
</li>
<li>
<p><a href="http://ptgmedia.pearsoncmg.com/imprint_downloads/informit/promotions/python/python2python3.pdf">Moving from Python 2 to Python 3</a>
is a PDF cheatsheet for porting your Python code.</p>
</li>
<li>
<p><a href="https://godjango.com/96-django-and-python-3-how-to-setup-pyenv-for-multiple-pythons/">Django and Python 3 How to Setup pyenv for Multiple Pythons</a>
is a screencast showing how to run both Python 2 and 3 for different
projects using pyenv.</p>
</li>
<li>
<p><a href="http://blog.scrapinghub.com/2015/08/19/scrapy-on-the-road-to-python-3-support/">Scrapy on the road to Python 3 support</a>
explains from the perspective of a widely used Python project what their
plan is for supporting Python 3 and why it has taken so long to make it
happen.</p>
</li>
</ul>
<h1>Enterprise Python</h1>
<p>One of the misconceptions around Python and other dynamically-typed languages
is that they cannot be reliably used to build enterprise-grade software.
However, almost all commercial and government enterprises already use
Python in some capacity, either as glue code between disparate applications
or to build the applications themselves. </p>
<h2>What is enterprise software?</h2>
<p>Enterprise software is built for the requirements of an organization rather
than the needs of an individual. Software written for enterprises often
needs to integrate with legacy systems, such as existing databases and
non-web applications. There are often requirements to integrate with
authentication systems such as the
<a href="http://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol">Lightweight Directory Access Protocol (LDAP)</a>
and
<a href="https://msdn.microsoft.com/en-us/library/aa746492%28v=vs.85%29.aspx">Active Directory (AD)</a>.</p>
<p>Organizations develop enterprise software with numerous custom requirements
to fit the specific needs of their operating model. Therefore the software
development process often becomes far more complicated due to disparate
factions within an organization vying for the software to handle their
needs at the expense of other factions.</p>
<p>The complexity due to the many stakeholders involved in the building of
enterprise software leads to large budgets and extreme scrutiny by
non-technical members of an organization. Typically those non-technical
people place irrational emphasis on the choice of programming language and
frameworks when otherwise they should not make technical design decisions.</p>
<h2>Why are there misconceptions about Python in enterprise environments?</h2>
<p>Traditionally large organizations building enterprise software have used
statically typed languages such as C++, .NET and Java. Throughout the 1980s
and 1990s large companies such as Microsoft, Sun Microsystems and Oracle
marketed these languages as "enterprise grade". The inherent snub to other
languages was that they were not appropriate for CIOs' difficult technical
environments. Languages other than Java, C++ and .NET were seen as risky and
therefore not worthy of investment.</p>
<p>In addition, "scripting languages" such as Python, Perl and Ruby were not
yet robust enough in the 1990s because their core standard libraries were
still being developed. Frameworks such as <a href="/django.html">Django</a>,
<a href="/flask.html">Flask</a> and Rails (for Ruby) did not yet exist. The Web was
just beginning and most enterprise applications were desktop apps built
for Windows. Python simply wasn't made for such environments.</p>
<h2>Why is Python now appropriate for building enterprise software?</h2>
<p>From the early 2000s through today the languages and ecosystems for many
dynamically typed languages have greatly improved and often surpassed some
aspects of other ecosystems. Python, Ruby and other previously derided
languages now have vast, well-maintained open source ecosystems backed by
both independent developers and large companies including Microsoft, IBM,
Google, Facebook, Dropbox, Twilio and many, many others.</p>
<p>Python's open source libraries, especially for
<a href="/web-frameworks.html">web development</a> and data analysis, are some of the
best maintained and fully featured pieces of code for any language.</p>
<p>Meanwhile, some of the traditional enterprise software development languages
such as Java have languished due to underinvestment by their major corporate
backers. When <a href="http://www.oracle.com/us/corporate/press/018363">Oracle purchased Sun Microsystems in 2009</a>
there was a long lag time before Java was enhanced with new language features
in Java 7. Oracle also
<a href="http://www.engadget.com/2015/03/06/java-adware-mac/">bundles unwanted adware with the Java installation</a>,
whereas the Python community would never put up with such a situation because
the language is open source and does not have a single corporate controller.</p>
<p>Other ecosystems, such as the .NET platform by Microsoft have fared much
better. Microsoft continued to invest in moving the .NET platform along
throughout the early part of the new millennium.</p>
<p>However, Microsoft's enterprise products often have expensive licensing fees
for their application servers and associated software. In addition, Microsoft
is also a major backer of open source, <a href="http://www.hanselman.com/blog/OneOfMicrosoftsBestKeptSecretsPythonToolsForVisualStudioPTVS.aspx">especially Python</a>,
and their
<a href="https://www.visualstudio.com/en-us/features/python-vs.aspx">Python tools for Visual Studio</a>
provide a top-notch <a href="/development-environments.html">development environment</a>.</p>
<p>The end result is that enterprise software development has changed
dramatically over the past couple of decades. CIOs and technical executives
can no longer ignore the progress of Python and the great open source
community in the enterprise software development landscape if they want to
continue delivering business value to their business side customers.</p>
<h2>Open source enterprise Python projects</h2>
<ul>
<li>
<p><a href="https://github.com/cfpb/collab">Collab</a> by the
U.S. government's
<a href="http://www.consumerfinance.gov/">Consumer Financial Protection Bureau</a>
(CFPB) agency is a corporate intranet and collaboration platform for large
organizations. The project is currently running and in-use by thousands of
CFPB employees.</p>
</li>
<li>
<p><a href="https://github.com/twitter/pants">Pants</a> is a build system for software
projects with many distinct parts and built with many different programming
languages as is often the case in large organizations.</p>
</li>
</ul>
<h2>Enterprise Python software development resources</h2>
<ul>
<li>
<p>There are a couple of solid demystifying articles in CIO magazine including
<a href="http://www.cio.com/article/2437137/developer/you-used-python-to-write-what-.html">this broad overview of Python in enterprises</a>
and this article on
<a href="http://www.cio.com/article/2431212/developer/dynamic-languages--not-just-for-scripting-any-more.html">why dynamic languages are gaining share for enterprise development</a>.</p>
</li>
<li>
<p>JavaWorld wrote an interesting article about
<a href="http://www.javaworld.com/article/2078655/scripting-jvm-languages/python-coming-to-the-enterprise--like-it-or-not.html">Python's inroads into enterprise software development</a>.</p>
</li>
<li>
<p>I gave a talk at DjangoCon 2014 on
<a href="https://www.youtube.com/watch?v=aMtiCX38w20">How to Solve the Top 5 Headaches with Django in the Enterprise</a>
which covered both Python and Django in large organizations.</p>
</li>
<li>
<p>This <a href="http://programmers.stackexchange.com/questions/141411/what-is-enterprise-software-exactly">StackExchange answer</a>
contains a solid explanation what differentiates enterprise software
from traditional software.</p>
</li>
</ul>
<h1>Best Python Resources</h1>
<p>The Python community is amazing at sharing detailed resources and helping
beginners learn to program with the language. There are so many resources
out there though that it can be difficult to know how to find them. </p>
<p>This page aggregates the best general Python resources with descriptions of
what they provide to readers.</p>
<div class="well see-also">
If you prefer to learn by watching videos check out the
<a href="/best-python-videos.html">best Python videos</a>. You may
also be interested in reading about
<a href="/development-environments.html">development environments</a>
to use for coding.
</div>
<h2>New to programming</h2>
<p>If you're learning your first programming language these books were written
with you in mind. Developers learning Python as a second or later language
should skip down to the next section for "experienced developers".</p>
<ul>
<li>
<p>To get an introduction to Python, Django and Flask at the same time,
consider purchasing the
<a href="https://realpython.com/?utm_source=fsp&utm_medium=promo&utm_campaign=bestresources" onclick="trackOutboundLink('https://www.realpython.com/?utm_source=fsp&utm_medium=promo&utm_campaign=bestresources'); return false;">Real Python</a>
course by Fletcher, Michael and Jeremy.</p>
</li>
<li>
<p>This <a href="https://www.youtube.com/watch?v=mvK0UzFNw1Q">short 5 minute video</a>
explains why it's better to think of projects you'd like to build and
problems you want to solve with programming. Start working on those projects
and problems rather than jumping into a specific language that's recommended
to you by a friend.</p>
</li>
<li>
<p><a href="http://www.cs.hmc.edu/csforall/">CS for All</a> is an open book by professors
at Harvey Mudd College which teaches the fundamentals of computer science
using Python. It's an accessible read and perfect for programming beginners.</p>
</li>
<li>
<p>If you've never programmed before check out the
<a href="http://learntocodewith.me/getting-started/">Getting Started</a> page on
<a href="http://learntocodewith.me/">Learn To Code with Me</a>
by <a href="https://twitter.com/lebdev">Laurence Bradford</a>. She's done an
incredible job of breaking down the steps beginners should take when
they're uncertain about where to begin.</p>
</li>
<li>
<p><a href="http://learnpythonthehardway.org/book/">Learn Python the Hard Way</a> is a
free book by Zed Shaw.</p>
</li>
<li>
<p><a href="http://www.diveinto.org/python3/">Dive into Python 3</a> is an open source
book provided under the Creative Commons license and available in HTML or
PDF form.</p>
</li>
<li>
<p>While not Python-specific, Mozilla put together a
<a href="https://developer.mozilla.org/en-US/Learn">Learning the Web</a> tutorial
for beginners and intermediate web users who want to build websites.
It's worth a look from a general web development perspective.</p>
</li>
<li>
<p><a href="http://www.swaroopch.com/notes/python/">A Byte of Python</a> is a beginner's
tutorial for the Python language. </p>
</li>
<li>
<p>Code Academy has a <a href="http://www.codecademy.com/tracks/python">Python track</a>
for people completely new to programming.</p>
</li>
<li>
<p><a href="http://opentechschool.github.io/python-beginners/en/index.html">Introduction to Programming with Python</a>
goes over the basic syntax and control structures in Python. The free book
has numerous code examples to go along with each topic.</p>
</li>
<li>
<p>Google put together a great compilation of materials and subjects you
should read and learn from if you want to be a
<a href="https://www.google.com/about/careers/students/guide-to-technical-development.html">professional programmer</a>.
Those resources are useful not only for Python beginners but any developer
who wants to have a strong professional career in software.</p>
</li>
<li>
<p>The O'Reilly book
<a href="http://greenteapress.com/thinkpython/html/index.html">Think Python: How to Think Like a Computer Scientist</a>
is available in HTML form for free on the web.</p>
</li>
<li>
<p><a href="http://anandology.com/python-practice-book/index.html">Python Practice Book</a>
is a book of Python exercises to help you learn the basic language syntax.</p>
</li>
<li>
<p>Looking for ideas about what projects to use to learn to code? Check out
<a href="https://medium.com/learning-journalism-tech/five-mini-programming-projects-for-the-python-beginner-21492f6ce0f3">this list of 5 programming project for Python beginners</a>.</p>
</li>
<li>
<p>There's a Udacity course by one of the creators of Reddit that shows how to
<a href="https://www.udacity.com/course/web-development--cs253">use Python to build a blog</a>.
It's a great introduction to web development concepts through coding.</p>
</li>
<li>
<p>I wrote a quick blog post on
<a href="http://www.mattmakai.com/learning-python-for-non-developers.html">learning Python</a>
that non-technical folks trying to learn to program may find useful.</p>
</li>
</ul>
<h2>Experienced developers new to Python</h2>
<ul>
<li>
<p><a href="http://learnxinyminutes.com/docs/python/">Learn Python in y minutes</a>
provides a whirlwind tour of the Python language. The guide is especially
useful if you're coming in with previous software development experience
and want to quickly grasp how the language is structured.</p>
</li>
<li>
<p><a href="http://pymbook.readthedocs.org/en/latest/">Python for you and me</a> is an
approachable book with sections for Python syntax and the major language
constructs. The book also contains a short guide at the end to get
programmers to write their first Flask web application.</p>
</li>
<li>
<p>Kenneth Reitz's
<a href="http://docs.python-guide.org/en/latest/">The Hitchhiker’s Guide to Python</a>
contains a wealth of information both on the Python programming language and the community.</p>
</li>
<li>
<p><a href="https://districtdatalabs.silvrback.com/how-to-develop-quality-python-code">How to Develop Quality Python Code</a>
is a good read to begin learning about development environments,
application dependencies and project structure.</p>
</li>
</ul>
<h2>Beyond the basics</h2>
<ul>
<li>
<p><a href="http://mirnazim.org/writings/python-ecosystem-introduction/">The Python Ecosystem: An Introduction</a>
provides context for virtual machines, Python packaging, pip, virutalenv
and many other topics after learning the basic Python syntax. </p>
</li>
<li>
<p>The <a href="http://www.reddit.com/r/python">Python Subreddit</a> rolls up great
Python links and has an active community ready to answer questions from
beginners and advanced Python developers alike.</p>
</li>
<li>
<p><a href="http://jessenoller.com/good-to-great-python-reads/">Good to Great Python Reads</a>
is a collection of intermediate and advanced Python articles around the web
focused on nuances and details of the Python language itself.</p>
</li>
<li>
<p>The blog <a href="http://freepythontips.wordpress.com/">Free Python Tips</a> provides
posts on Python topics as well as news for the Python ecosystem.</p>
</li>
<li>
<p><a href="http://pythonbooks.revolunet.com/">Python Books</a> is a collection of freely
available books on Python, Django, and data analysis.</p>
</li>
<li>
<p><a href="http://norvig.com/python-iaq.html">Python IAQ: Infrequently Asked Questions</a>
is a list of quirky queries on rare Python features and why certain syntax
was or was not built into the language.</p>
</li>
</ul>
<h2>Videos, screencasts and presentations</h2>
<p>Videos from conferences and meetups along with screencasts are listed on
the <a href="/best-python-videos.html">best Python videos</a> page.</p>
<h2>Curated Python packages lists</h2>
<ul>
<li>
<p><a href="https://github.com/vinta/awesome-python">awesome-python</a> is an incredible
list of Python frameworks, libraries and software. I wish I had this
page when I was just getting started. </p>
</li>
<li>
<p><a href="http://easy-python.readthedocs.org/en/latest/">easy-python</a> is like
awesome-python although instead of just a Git repository this site is
in the Read the Docs format.</p>
</li>
</ul>
<h2>Podcasts</h2>
<ul>
<li>
<p><a href="http://www.talkpythontome.com/">Talk Python to Me</a> focuses on the
people and organizations coding on Python. Each episode features a
different guest interviewee to talk about his or her work.</p>
</li>
<li>
<p><a href="http://podcastinit.com/">Podcast.__init__</a> is another podcast on
"about Python and the people who make it great".</p>
</li>
</ul>
<h2>Newsletters</h2>
<ul>
<li>
<p><a href="http://www.pythonweekly.com/">Python Weekly</a> is a free weekly roundup
of the latest Python articles, videos, projects and upcoming events.</p>
</li>
<li>
<p><a href="http://pycoders.com/">PyCoder's Weekly</a> is another great free weekly
email newsletter similar to Python Weekly. The best resources are generally
covered in both newsletters but they often cover different articles
and projects from around the web.</p>
</li>
<li>
<p><a href="http://importpython.com/newsletter/">Import Python</a> is a newer newsletter
than Python Weekly and PyCoder's Weekly. So far I've found this newsletter
often pulls from different sources than the other two. It's well worth
subscribing to all three so you don't miss anything.</p>
</li>
</ul>
<h1>Best Python Videos</h1>
<p>If you prefer to learn Python programming by watching videos then this is the
resource for you. I've watched hundreds of live technical talks and combed
through videos to pick out the ones with great speakers who'll teach you the
most about the language and ecosystem. </p>
<p>This page links to the best free videos as well as other video lists so you
can do your own searching through the huge backlog of conference and meetup
talks from the past several years. </p>
<div class="well see-also">
Be sure to read the
<a href="/best-python-resources.html">best Python resources</a> for
links to books and articles as well as
<a href="/web-frameworks.html">web frameworks</a>
to learn more about web development.
</div>
<h2>Web development with Django, Flask and other frameworks</h2>
<ul>
<li>
<p><a href="https://twitter.com/heddle317">Kate Heddleston</a> gave a talk at PyCon 2014
called
"<a href="http://pyvideo.org/video/2591/so-you-want-to-be-a-full-stack-developer-how-to">Full-stack Python Web Applications</a>"
with clear visuals for how numerous layers of the Python web
stack fit together. There are also <a href="https://speakerdeck.com/pycon2014/so-you-want-to-be-a-full-stack-developer-how-to-build-a-full-stack-python-web-application-by-kate-heddleston">slides available from the talk</a>
with all the diagrams.</p>
</li>
<li>
<p>My <a href="https://www.youtube.com/watch?v=s6NaOKD40rY">EuroPython 2014 "Full Stack Python"</a>
talk goes over each topic from this guide and provides context for how the
pieces fit together.
The <a href="http://www.mattmakai.com/presentations/2014-full-stack-python-berlin.html">talk slides</a> are also available.</p>
</li>
<li>
<p>Kate Heddleston and I gave a talk at DjangoCon 2014 called
<a href="https://www.youtube.com/watch?v=QrFEKghISEI">Choose Your Own Django Deployment Adventure</a>
which walked through many of the scenarios you'd face when deploying your
first Django website.</p>
</li>
<li>
<p>The <a href="https://github.com/realpython/discover-flask">Discover Flask</a> series is
a detailed Flask tutorial on video with corresponding code examples on
GitHub.</p>
</li>
<li>
<p><a href="http://pyvideo.org/video/2630/designing-djangos-migrations">Designing Django's Migrations</a>
covers Django 1.7's new migrations from the main programmer
of South and now Django's built-in migrations, Andrew Godwin.</p>
</li>
<li>
<p><a href="https://godjango.com/">GoDjango</a> screencasts and tutorials are free short
videos for learning how to build Django applications.</p>
</li>
<li>
<p><a href="http://gettingstartedwithdjango.com/">Getting Started with Django</a> is a
series of video tutorials for the framework.</p>
</li>
<li>
<p>The videos and slides from
<a href="http://www.djangounderthehood.com/talks/">Django: Under the Hood 2014</a>
are from Django core committers and provide insight into the ORM,
internationalization, templates and other topics.</p>
</li>
<li>
<p>DjangoCon US videos from
<a href="https://www.youtube.com/playlist?list=PLE7tQUdRKcybbNiuhLcc3h6WzmZGVBMr3">2014</a>,
<a href="http://www.youtube.com/user/TheOpenBastion/videos">2013</a>,
<a href="http://pyvideo.org/category/23/djangocon-2012">2012</a>,
<a href="http://pyvideo.org/category/3/djangocon-2011">2011</a>, as well as<br />
<a href="http://pyvideo.org/category">earlier US and DjangoCon EU conferences</a> are
all available free of charge.</p>
</li>
</ul>
<h2>Core Python language videos</h2>
<ul>
<li>
<p>Jessica McKellar's
<a href="https://www.youtube.com/watch?v=sL_syMmRkoU">Building and breaking a Python sandbox</a>
is a fascinating walk through the lower layers of the Python interpreter.</p>
</li>
<li>
<p>Brandon Rhodes'
<a href="https://www.youtube.com/watch?v=fYlnfvKVDoM">All Your Ducks In A Row: Data Structures in the Std Lib and Beyond</a>
goes through how data structures are implemented, how to select a
data structure appropriate to your application and how the list and
dictionary can be used in many situations.</p>
</li>
<li>
<p>The talk <a href="https://www.youtube.com/watch?v=ZdvpNaWwx24">Python Descriptors</a>
by Simeon Franklin explains the what and why of this core Python language
feature.</p>
</li>
<li>
<p>David Beazley gives an amazing live coded performance to show
<a href="https://www.youtube.com/watch?v=MCs5OvhV9S4">Python concurrency</a>
using threads, event loops and coroutines. David makes the live coding
look easy but a whole lot of work must've gone into that talk.</p>
</li>
</ul>
<h2>Screencasts and class recordings</h2>
<ul>
<li>
<p><a href="https://www.neckbeardrepublic.com/">Neckbeard Republic</a> provides free
screencasts for learning intermediate topics. I typically prefer to learn
by reading. However, these videos are helpful in seeing the code on the
screen instead of just looking at static code snippets.</p>
</li>
<li>
<p><a href="https://developers.google.com/edu/python/">Google's Python Class</a> contains
lecture videos and exercises for learning Python.</p>
</li>
<li>
<p>While there aren't always live streams, it's worth checking out
<a href="http://www.watchpeoplecode.com/">Watch People Code</a> to see if anyone is
live coding or has a recording of working on a Python project. Even
experienced developers can learn a whole lot from watching other
developer's work on their projects.</p>
</li>
</ul>
<h2>Video compilations</h2>
<ul>
<li>
<p><a href="http://www.pyvideo.org/">PyVideo</a> organizes and indexes thousands of Python
videos from both major conferences and meetups.</p>
</li>
<li>
<p><a href="https://github.com/makaimc/incredible-technical-speakers">Incredible Technical Speakers</a>
is a repository I put together that features software developer speakers
talking about programming language agnostic topics. The list is intended
to emphasize professional software developers who also have the ability to
engage an audience of peers with an exciting talk.</p>
</li>
</ul>
<h1>Development Environments</h1>
<p>A development environment is a combination of a text editor and the Python
interpreter. The text editor allows you to write the code. The interpreter
provides a way to execute the code you've written. A text editor can be
as simple as Notepad on Windows or more complicated as a complete integrated
development environment (IDE) such as
<a href="https://www.jetbrains.com/pycharm/">PyCharm</a> which runs on any major
operating system.</p>
<h2>Why is a development environment necessary?</h2>
<p>Python code needs to be written, executed and tested to build
applications. The text editor provides a way to write the code. The
interpreter allows it to be executed. Testing to see if the code does what
you want can either be done manually or by unit and functional tests. </p>
<div class="well see-also">
While you're learning about development environments be sure to
check out information on <a href="/vim.html">Vim</a> and
<a href="/emacs.html">Emacs</a>.
</div>
<h2>A development environment example</h2>
<p>Here's what I (the author of Full Stack Python,
<a href="/about-author.html">Matt Makai</a>) use to develop most of my Python
applications. I have a Macbook Pro with Mac OS X as its base operating
system. <a href="/operating-systems.html">Ubuntu 14.04 LTS</a> is virtualized on top
with <a href="https://www.parallels.com/">Parallels</a>. My code is written in
<a href="http://www.vim.org/">vim</a> and executed with the
<a href="https://www.python.org/download/releases/2.7.8/">Python 2.7.x</a> interpreter
via the command line. I use virtualenv to create separate Python interpreters
with their own isolated
<a href="/application-dependencies.html">application dependencies</a> and
<a href="http://virtualenvwrapper.readthedocs.org/en/latest/">virtualenvwrapper</a>
to quickly switch between the interpreters created by virtualenv.</p>
<p>That's a common set up but you can certainly write great code with a much
less expensive set up or a cloud-based development environment.</p>
<h2>Open source text editors</h2>
<ul>
<li>
<p><a href="http://www.vim.org/">vim</a> is my editor of choice and installed by default
on most *nix systems.</p>
</li>
<li>
<p><a href="http://www.gnu.org/software/emacs/">emacs</a> is another editor often used
on *nix.</p>
</li>
<li>
<p><a href="https://atom.io/">Atom</a> is an open source editor built by the
<a href="https://github.com">GitHub</a> team.</p>
</li>
</ul>
<h2>Proprietary (closed source) editors</h2>
<ul>
<li>
<p><a href="http://www.sublimetext.com/">Sublime Text</a> versions 2 and 3 (currently
in beta) are popular text editors that can be extended with code completion,
linting, syntax highlighting and other features using plugins.</p>
</li>
<li>
<p><a href="http://komodoide.com/">Komodo</a> is a cross-platform text editor and IDE
for major languages including Python, Ruby, JavaScript, Go and more.</p>
</li>
</ul>
<h2>Python-specific IDEs</h2>
<ul>
<li>
<p><a href="https://www.jetbrains.com/pycharm/">PyCharm</a> is a Python-specific IDE
built on <a href="https://www.jetbrains.com/">JetBrains</a>' platform. There are
free editions for students and open source projects.</p>
</li>
<li>
<p><a href="https://wingware.com/">Wing IDE</a> is a paid development environment with
integrated debugging and code completion.</p>
</li>
<li>
<p><a href="http://pydev.org/">PyDev</a> is a Python IDE plug in for
<a href="https://www.eclipse.org/">Eclipse</a>.</p>
</li>
</ul>
<h2>Hosted development environment services</h2>
<p>In the past couple of years several cloud-based development environments
have popped up. These can work great for when you're learning or stuck on
a machine with only a browser but no way to install your own software. Most
of these have free tiers for getting started and paid tiers as you scale
up your application.</p>
<ul>
<li>
<p><a href="https://www.nitrous.io/">Nitrous.io</a></p>
</li>
<li>
<p><a href="https://c9.io/">Cloud9</a></p>
</li>
<li>
<p><a href="https://www.terminal.com/">Terminal</a></p>
</li>
<li>
<p><a href="https://koding.com/">Koding</a></p>
</li>
</ul>
<h2>Development environment resources</h2>
<ul>
<li>
<p>If you're considering the cloud-based development environment route, check
out this
<a href="http://readwrite.com/2014/08/14/cloud9-koding-nitrousio-integrated-development-environment-ide-coding">great article comparing Cloud9, Koding and Nitrous.io</a>
by Lauren Orsini. She also explains more about what a cloud IDE is and is
not.</p>
</li>
<li>
<p>Real Python has an awesome, detailed post on
<a href="https://realpython.com/blog/python/setting-up-sublime-text-3-for-full-stack-python-development/">setting up your Sublime Text 3 environment</a>
as a full-fledged IDE.</p>
</li>
<li>
<p>The <a href="http://docs.python-guide.org/en/latest/dev/env/">Hitchhiker's Guide to Python</a>
has a page dedicated to development environments.</p>
</li>
<li>
<p><a href="http://pedrokroger.net/choosing-best-python-ide/">Choosing the best Python IDE</a>
is a review of six IDEs. PyCharm, Wing IDE and PyDev stand out above the
other three in this review.</p>
</li>
<li>
<p><a href="http://nafiulis.me/pycharm-the-good-parts-i.html">PyCharm: The Good Parts</a>
shows you how to be more efficient and productive with that IDE if it's
your choice for writing Python code.</p>
</li>
<li>
<p>JetBrains' <a href="http://blog.jetbrains.com/pycharm/">PyCharm Blog</a> is required
reading if you're using the IDE or considering trying it.</p>
</li>
<li>
<p><a href="https://opensourcehacker.com/2015/05/02/pycharm-vs-sublime-text/">PyCharm vs Sublime Text</a>
has a comparison of several features between the two editors.</p>
</li>
</ul>
<h1>Vim</h1>
<p>Vim, short for Vi IMproved, is a configurable text editor often used as
a Python development environment. Vim proponents commonly cite the numerous
plugins, Vimscript and logical command language as major Vim strengths.</p>
<h2>Why is Vim a good Python development environment?</h2>
<p>Vim's philosophy is that developers are more productive when they avoid
taking their hands off the keyboard. Code should flow naturally from the
developer's thoughts through the keyboard and onto the screen. Using a mouse
or other peripheral is a detriment to the rate at which a developer's
thoughts become code.</p>
<p>Vim has a logical, structured command language. When a beginner is learning
the editor she may feel like it is impossible to understand all the key
commands. However, the commands stack together in a logical way so that over
time the editor becomes predictable.</p>
<div class="well see-also">
If you're interested in Vim you'll also want to read about
<a href="/development-environments.html">development environments for coding</a>
and learn
<a href="/why-use-python.html">what makes Python a great programming language</a>.
</div>
<h2>Configuring Vim with a Vimrc file</h2>
<p>The Vimrc file is used to configure the Vim editor. A Vimrc file can range
from nothing in it to very complicated with hundreds or thousands of lines
of configuration commands.</p>
<p>Here's a short, commented example .vimrc file I use for Python development
to get a feel for some of the configuration statements:</p>
<div class="highlight"><pre>" enable syntax highlighting
syntax enable
" show line numbers
set number
" set tabs to have 4 spaces
set ts=4
" indent when moving to the next line while writing code
set autoindent
" expand tabs into spaces
set expandtab
" when using the >> or << commands, shift lines by 4 spaces
set shiftwidth=4
" show a visual line under the cursor's current line
set cursorline
" show the matching part of the pair for [] {} and ()
set showmatch
" enable all Python syntax highlighting features
let python_highlight_all = 1
</pre></div>
<p>Here is how these configuration options look with a dark background on
Mac OS X while editing the markdown for this webpage (how meta!).</p>
<p><img src="theme/img/vim-dark-bg.jpg" width="100%" alt="Vim with basic configuration options on a dark background." class="technical-diagram" style="border-radius: 5px;"></p>
<p>Take a look at another example using these configuration options, this time
with a light background and editing Python code from my
<a href="https://github.com/makaimc/choose-your-own-adventure-presentations">Choose Your Own Adventures Presentations</a>
project.</p>
<p><img src="theme/img/vim-white-bg.png" width="100%" alt="Vim with basic configuration options on a white background." class="technical-diagram" style="border-radius: 5px; border: 1px solid #999;"></p>
<p>The Vimrc file lives under the home directory of the user account running
Vim. For example, when my user account is 'matt', on Mac OS X my Vimrc
file is found at <code>/Users/matt/.vimrc</code>. On Ubuntu Linux my .vimrc file
can be found within the <code>/home/matt/</code> directory. </p>
<p>If a Vimrc file does not already exist, just create it within the user's
home directory and it will be picked up by Vim the next time you open the
editor.</p>
<h2>Vim tutorials</h2>
<p>Vim has a reputation for a difficult learning curve, but it's much easier
to get started with these tutorials.</p>
<ul>
<li>
<p><a href="http://vim-adventures.com/">Vim Adventures</a> is a cute, fun browser-based
game that helps you learn Vim commands by playing through the adventure.</p>
</li>
<li>
<p><a href="http://yannesposito.com/Scratch/en/blog/Learn-Vim-Progressively/">Learn Vim Progressively</a>
is a wonderful tutorial that follows the path I took when learning Vim:
learn just enough to survive with it as your day-to-day editor then begin
adding more advanced commands on top.</p>
</li>
<li>
<p><a href="https://danielmiessler.com/study/vim/">A vim Tutorial and Primer</a> is an
incredibly deep study in how to go from beginner to knowledgeable in Vim.</p>
</li>
<li>
<p><a href="http://benmccormick.org/2014/07/02/learning-vim-in-2014-vim-as-language/">Vim as a Language</a>
explains the language syntax and how you can build up over time to master
the editor.</p>
</li>
<li>
<p><a href="https://www.digitalocean.com/community/tutorials/installing-and-using-the-vim-text-editor-on-a-cloud-server">How to install and use Vim on a cloud server</a>
along with <a href="https://www.digitalocean.com/community/tutorials/how-to-use-vim-for-advanced-editing-of-plain-text-or-code-on-a-vps--2">How to use Vim for advanced editing of code on a VPS</a>
are two detailed Digital Ocean guides for getting up and running with Vim,
regardless of whether you're using it locally or on a cloud server.</p>
</li>
<li>
<p>In <a href="http://mislav.uniqpath.com/2011/12/vim-revisited/">Vim: revisited</a> the
author explains his on-again off-again relationship with using Vim. He then
shows how he configures and uses the editor so it sticks as his primary
code editing tool.</p>
</li>
</ul>
<h2>Vim Python IDE bundles and resources</h2>
<p>Once you get comfortable with Vim as an editor, there are several
configuration options and plugins you can use to enhance your Python
productivity. These are the resources and tutorials to read when you're
ready to take that step.</p>
<ul>
<li>
<p>The <a href="https://github.com/klen/python-mode">python-mode</a> project is a Vim
plugin with syntax highlighting, breakpoints, PEP8 linting, code completion
and many other features you'd expect from an integrated development
environment.</p>
</li>
<li>
<p><a href="https://github.com/gmarik/Vundle.vim">Vundle</a> comes highly recommended
as a plug-in manager for Vim.</p>
</li>
<li>
<p><a href="http://haridas.in/vim-as-your-ide.html">Vim as Your IDE</a> discusses how to
set up Vim for greater productivity once you learn the initial Vim language
for using the editor.</p>
</li>
<li>
<p><a href="http://unlogic.co.uk/2013/02/08/vim-as-a-python-ide/">Vim as a Python IDE</a>
goes through the steps necessary to make Vim into a more comfortable
environment for Python development.</p>
</li>
<li>
<p><a href="http://stackoverflow.com/questions/9172802/setting-up-vim-for-python">Setting up Vim for Python</a>
has a well written answer on Stack Overflow for getting started with Vim.</p>
</li>
</ul>
<h2>Vim installation guides</h2>
<p>These installation guides will help you get Vim up and running on Mac OS X,
Linux and Windows.</p>
<ul>
<li>
<p><a href="http://prioritized.net/blog/upgrading-vim-on-os-x/">Upgrading Vim on OS X</a>
explains why to upgrade from Vim 7.2 to 7.3+ and how to do it using
<a href="http://brew.sh/">Homebrew</a>.</p>
</li>
<li>
<p>The easiest way to install Vim on Windows 7+ is to download and run the
<a href="http://www.vim.org/download.php#pc">gvim74.exe</a> file.</p>
</li>
<li>
<p>On Linux make sure to install the
<a href="https://launchpad.net/ubuntu/+source/vim">vim package</a> with
<code>sudo apt-get install vim</code>.</p>
</li>
<li>
<p>If you're using PyCharm as your IDE you won't need to install Vim as a
separate text editor - instead use the
<a href="https://plugins.jetbrains.com/plugin/164">IdeaVim</a> PyCharm plugin to get
Vim keybindings, visual/insert mode, configuration with ~/.ideavimrc and
other Vim emulation features. </p>
</li>
</ul>
<h2>Vimrc resources</h2>
<p>These are a few resources for learning how to structure a .vimrc file. I
recommend adding configuration options one at a time to test them
individually instead of going whole hog with a Vimrc you are unfamiliar with.</p>