diff --git a/php.html.markdown b/php.html.markdown
index 18324736..947ee4a7 100644
--- a/php.html.markdown
+++ b/php.html.markdown
@@ -4,8 +4,6 @@ author: Malcolm Fell
author_url: http://emarref.net/
---
-# PHP
-
This document describes PHP 5+.
## [Basic Syntax](http://www.php.net/manual/en/language.basic-syntax.php)
@@ -74,7 +72,7 @@ $sgl_quotes
END; // Nowdoc syntax is available in PHP 5.3.0
// Manipulation
-$concatinated = $sgl_quotes + $dbl_quotes;
+$concatenated = $sgl_quotes + $dbl_quotes;
```
### Compound
@@ -471,4 +469,4 @@ Visit the [official PHP documentation](http://www.php.net/manual/) for reference
If you're interested in up-to-date best practices, visit [PHP The Right Way](http://www.phptherightway.com/).
-If you're coming from a language with good package management, check out [Composer](http://getcomposer.org/).
\ No newline at end of file
+If you're coming from a language with good package management, check out [Composer](http://getcomposer.org/).
diff --git a/python.html.markdown b/python.html.markdown
index 8a9ea48f..5c0dc0d8 100644
--- a/python.html.markdown
+++ b/python.html.markdown
@@ -1,20 +1,25 @@
---
-language: Python
+language: python
author: Louie Dinh
author_url: http://ldinh.ca
---
-Python was created by Guido Van Rossum in the early 90's. It is now one of the most popular languages in existence. I fell in love with Python for it's syntactic clarity. It's basically executable pseudocode.
+Python was created by Guido Van Rossum in the early 90's. It is now one of the most popular
+languages in existence. I fell in love with Python for it's syntactic clarity. It's basically
+executable pseudocode.
-```Python
+Note: This article applies to Python 2.7 specifically, but should be applicable
+to Python 2.x. Look for another tour of Python 3 soon!
+
+```python
# Single line comments start with a hash.
""" Multiline comments can we written
using three "'s
"""
-----------------------------------------------------
--- 1. Primitive Datatypes and Operators
-----------------------------------------------------
+####################################################
+## 1. Primitive Datatypes and Operators
+####################################################
# You have numbers
3 #=> 3
@@ -25,7 +30,8 @@ Python was created by Guido Van Rossum in the early 90's. It is now one of the m
10 * 2 #=> 20
35 / 5 #=> 7
-# Division is a bit tricky. It is integer division and floors the results automatically.
+# Division is a bit tricky. It is integer division and floors the results
+# automatically.
11 / 4 #=> 2
# Enforce precedence with parentheses
@@ -58,16 +64,16 @@ not False #=> True
None #=> None
-----------------------------------------------------
--- 2. Variables and Collections
-----------------------------------------------------
+####################################################
+## 2. Variables and Collections
+####################################################
# Printing is pretty easy
print "I'm Python. Nice to meet you!"
# No need to declare variables before assigning to them.
-some_var = 5 # Convention is to use lower_case_with_underscores for variables
+some_var = 5 # Convention is to use lower_case_with_underscores
some_var #=> 5
# Accessing a previously unassigned variable is an exception
@@ -97,7 +103,7 @@ del li[2] # li is now [1, 2, 3]
li + other_li #=> [1, 2, 3, 4, 5, 6] - Note: li and other_li is left alone
# Concatenate lists with extend
-li.extend(other_li) # Now li is [1 ,2 ,3 ,4 ,5 ,6]
+li.extend(other_li) # Now li is [1, 2, 3, 4, 5, 6]
# Check for existence in a list with in
1 in li #=> True
@@ -120,10 +126,13 @@ filled_dict = {"one": 1, "two": 2, "three": 3}
filled_dict["one"] #=> 1
# Get all keys as a list
-filled_dict.keys() #=> ["three", "two", "one"] Note - Dictionary key ordering is not guaranteed. Your results might not match this exactly.
+filled_dict.keys() #=> ["three", "two", "one"]
+# Note - Dictionary key ordering is not guaranteed.
+# Your results might not match this exactly.
# Get all values as a list
-filled_dict.values() #=> [3, 2, 1] Note - Same as above regarding key ordering.
+filled_dict.values() #=> [3, 2, 1]
+# Note - Same as above regarding key ordering.
# Check for existence of keys in a dictionary with in
"one" in filled_dict #=> True
@@ -150,9 +159,9 @@ filled_set | other_set #=> set([1, 2, 3, 4, 5, 6])
10 in filled_set #=> False
-----------------------------------------------------
--- 3. Control Flow
-----------------------------------------------------
+####################################################
+## 3. Control Flow
+####################################################
# Let's just make a variable
some_var = 5
@@ -175,7 +184,8 @@ prints:
mouse is a mammal
"""
for animal in ["dog", "cat", "mouse"]:
- print "%s is a mammal" % animal # You can use % to interpolate formatted strings
+ # You can use % to interpolate formatted strings
+ print "%s is a mammal" % animal
"""
While loops go until a condition is no longer met.
@@ -188,7 +198,7 @@ prints:
x = 0
while x < 4:
print x
- x += 1 # Short hand for x = x + 1
+ x += 1 # Shorthand for x = x + 1
# Handle exceptions with a try/except block
try:
@@ -197,9 +207,9 @@ except IndexError as e:
pass # Pass is just a no-op. Usually you would do recovery here.
-----------------------------------------------------
--- 4. Functions
-----------------------------------------------------
+####################################################
+## 4. Functions
+####################################################
# Use def to create new functions
def add(x, y):
@@ -209,9 +219,9 @@ def add(x, y):
# Calling functions with parameters
add(5, 6) #=> 11 and prints out "x is 5 and y is 6"
# Another way to call functions is with keyword arguments
-add(y=6, x=5) # Equivalent to above. Keyword arguments can arrive in any order.
+add(y=6, x=5) # Keyword arguments can arrive in any order.
-# You can define functions that take a variable number of positional arguments
+# You can define functions that take a variable number of arguments
def varargs(*args):
return args
@@ -232,7 +242,6 @@ def create_adder(x):
return x + y
return adder
-# Let's create a new function that always adds 10 to the argument
add_10 = create_adder(10):
add_10(3) #=> 13
@@ -247,15 +256,11 @@ filter(lambda x: x > 5, [3, 4, 5, 6, 7]) #=> [6, 7]
[add_10(i) for i in [1, 2, 3]] #=> [11, 12, 13]
[x for x in [3, 4, 5, 6, 7] if x > 5] #=> [6, 7]
-----------------------------------------------------
--- 5. Classes
-----------------------------------------------------
+####################################################
+## 5. Classes
+####################################################
-# We can define classes with the class statement
-class Human(): # By convention CamelCase is used for classes.
- pass
-
-# We subclass from object to get a "new-style class". All your code should do this.
+# We subclass from object to get a class.
class Human(object):
# A class attribute. It is shared by all instances of this class
@@ -263,18 +268,20 @@ class Human(object):
# Basic initializer
def __init__(self, name):
- self.name = name # We are assigning the argument to the instance's name attribute
+ # Assign the argument to the instance's name attribute
+ self.name = name
- # A method. All methods take self as the first argument, including the initializer
+ # A method. All methods take self as the first argument
def say(self, msg):
return "%s: %s" % (self.name, msg)
# A class method is shared among all instances
+ # They are called with the calling class as the first argument
@classmethod
def get_species(cls):
return cls.species
- # Static methods are called without a parameter reference to the class or instance
+ # Static methods are called without a class or instance reference
@staticmethod
def grunt():
return "*grunt*"
@@ -283,6 +290,7 @@ class Human(object):
# Instantiate a class
h = Human(name="Harry")
print h.say("hi") # prints out "Harry: hi"
+
i = Human("Ian")
print i.say("hello") #prints out "Ian: hello"