learnxinyminutes-docs/python.html.markdown

284 lines
7.2 KiB
Markdown
Raw Normal View History

---
language: Python
author: Louie Dinh
author_url: http://ldinh.ca
---
2013-06-27 07:29:07 +00:00
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.
2013-06-27 07:29:07 +00:00
```Python
# Single line comments start with a hash.
""" Multiline comments can we written
using three "'s
"""
2013-06-27 07:29:07 +00:00
----------------------------------------------------
-- 1. Primitive Datatypes and Operators
----------------------------------------------------
2013-06-27 07:29:07 +00:00
# You have numbers
3 #=> 3
2013-06-27 07:29:07 +00:00
# Math is what you would expect
1 + 1 #=> 2
8 - 1 #=> 9
10 * 2 #=> 20
35 / 5 #=> 7
2013-06-27 07:29:07 +00:00
# Division is a bit tricky. It is integer division and floors the results automatically.
11 / 4 #=> 2
2013-06-27 07:29:07 +00:00
# Enforce precedence with parentheses
(1 + 3) * 2 #=> 8
2013-06-27 07:29:07 +00:00
# Boolean values are primitives
True
False
2013-06-27 07:29:07 +00:00
# negate with not
not True #=> False
not False #=> True
2013-06-27 07:29:07 +00:00
# Equality is ==
1 == 1 #=> True
2 == 1 #=> False
2013-06-27 07:29:07 +00:00
# Strings are created with " or '
"This is a string."
'This is also a string.'
2013-06-27 07:29:07 +00:00
# Strings can be added too!
"Hello " + "world!" #=> "Hello world!"
2013-06-27 07:29:07 +00:00
# A string can be treated like a list of characters
"This is a string"[0] #=> 'H'
2013-06-27 07:29:07 +00:00
# None is an object
None #=> None
2013-06-27 07:29:07 +00:00
----------------------------------------------------
-- 2. Variables and Collections
----------------------------------------------------
2013-06-27 07:29:07 +00:00
# Printing is pretty easy
print "I'm Python. Nice to meet you!"
2013-06-27 07:29:07 +00:00
# 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
2013-06-27 07:29:07 +00:00
# Accessing a previously unassigned variable is an exception
some_other_var # Will raise a NameError
2013-06-27 07:29:07 +00:00
# Lists store sequences
li = []
# You can start with a prefilled list
other_li = [4, 5, 6]
2013-06-27 07:29:07 +00:00
# Add stuff to the end of a list with append
li.append(1) #li is now [1]
li.append(2) #li is now [1, 2]
li.append(4) #li is now [1, 2, 4]
li.append(3) #li is now [1, 2, 4, 3]
2013-06-27 07:29:07 +00:00
# Access a list like you would any array
li[0] #=> 1
# Looking out of bounds is an IndexError
li[4] # Raises an IndexError
2013-06-27 07:29:07 +00:00
# Remove elements from a list with del
del li[2] # li is now [1, 2, 3]
2013-06-27 07:29:07 +00:00
# You can add lists
li + other_li #=> [1, 2, 3, 4, 5, 6] - Note: li and other_li is left alone
2013-06-27 07:29:07 +00:00
# Concatenate lists with extend
li.extend(other_li) # Now li is [1 ,2 ,3 ,4 ,5 ,6]
2013-06-27 07:29:07 +00:00
# Check for existence in a list with in
1 in li #=> True
2013-06-27 07:29:07 +00:00
# Examine the length with len
len(li) #=> 6
2013-06-27 07:29:07 +00:00
# Tuples are like lists but are immutable
tup = (1, 2, 3)
tup[0] #=> 1
tup[0] = 3 # Raises a TypeError
2013-06-27 07:29:07 +00:00
# Dictionaries store mappings
empty_dict = {}
# Here is a prefilled dictionary
filled_dict = {"one": 1, "two": 2, "three": 3}
2013-06-27 07:29:07 +00:00
# Look up values with []
filled_dict["one"] #=> 1
2013-06-27 07:29:07 +00:00
# Get all keys as a list
filled_dict.keys()
2013-06-27 07:29:07 +00:00
# Get all values as a list
filled_dict.values()
2013-06-27 07:29:07 +00:00
# Check for existence of keys in a dictionary with in
"one" in filled_dict #=> True
1 in filled_dict #=> False
2013-06-27 07:29:07 +00:00
# Sets store ... well sets
empty_set = set()
# Initialize a set with a bunch of values
filled_set = set([1,2,2,3,4]) # filled_set is now set([1, 2, 3, 4])
2013-06-27 07:29:07 +00:00
# Add more items to a set
filled_set.add(5) # filled_set is now set([1, 2, 3, 4, 5])
2013-06-27 07:29:07 +00:00
# Do set intersection with &
other_set = set([3, 4, 5 ,6])
filled_set & other_set #=> set([3, 4, 5])
2013-06-27 07:29:07 +00:00
# Do set union with |
filled_set | other_set #=> set([1, 2, 3, 4, 5, 6])
2013-06-27 07:29:07 +00:00
# Check for existence in a set with in
2 in filled_set #=> True
10 in filled_set #=> False
2013-06-27 07:29:07 +00:00
----------------------------------------------------
-- 3. Control Flow
----------------------------------------------------
2013-06-27 07:29:07 +00:00
# Let's just make a variable
some_var = 5
2013-06-27 07:29:07 +00:00
# Here is an if statement. INDENTATION IS SIGNIFICANT IN PYTHON!
if some_var > 10:
print "some_var is totally bigger than 10."
elif some_var < 10: # This elif clause is optional.
print "some_var is smaller than 10."
else: # This is optional too.
print "some_var is indeed 10."
2013-06-27 07:29:07 +00:00
# For loops iterate over lists
for animal in ["dog", "cat", "mouse"]:
print "%s is a mammal" % animal # You can use % to interpolate formatted strings
2013-06-27 07:29:07 +00:00
# While loops go until a condition is no longer met.
x = 0
while x < 10:
print x
x += 1 # Short hand for x = x + 1
2013-06-27 07:29:07 +00:00
# Handle exceptions with a try/except block
try:
raise IndexError("This is an index error") # Use raise to raise an error
except IndexError as e:
pass # Pass is just a no-op. Usually you would do recovery here.
2013-06-27 07:29:07 +00:00
----------------------------------------------------
-- 4. Functions
----------------------------------------------------
2013-06-27 07:29:07 +00:00
# Use def to create new functions
def add(x, y):
print "x is %s and y is %s" % (x, y)
return x + y # Return values with a return statement
2013-06-27 07:29:07 +00:00
# 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.
2013-06-27 07:29:07 +00:00
# You can define functions that take a variable number of positional arguments
def varargs(*args):
return args
2013-06-27 07:29:07 +00:00
varargs(1, 2, 3) #=> (1,2,3)
2013-06-27 07:29:07 +00:00
# You can define functions that take a variable number of keyword arguments
def keyword_args(**kwargs):
return kwargs
2013-06-27 07:29:07 +00:00
# Let's call it to see what happens
keyword_args(big="foot", loch="ness") #=> {"big": "foot", "loch": "ness"}
2013-06-27 07:29:07 +00:00
# Python has first class functions
def create_adder(x):
def adder(y):
return x + y
return adder
2013-06-27 07:29:07 +00:00
# Let's create a new function that always adds 10 to the argument
add_10 = create_adder(10):
add_10(3) #=> 13
2013-06-27 07:29:07 +00:00
# There are also anonymous functions
(lambda x: x > 2)(3) #=> True
2013-06-27 07:29:07 +00:00
# There are built-in higher order functions
map(add_10, [1,2,3]) #=> [11, 12, 13]
filter(lambda x: x > 5, [3, 4, 5, 6, 7]) #=> [6, 7]
2013-06-27 07:29:07 +00:00
# We can use list comprehensions for nice maps and filters
[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]
2013-06-27 07:29:07 +00:00
----------------------------------------------------
-- 5. Classes
----------------------------------------------------
2013-06-27 07:29:07 +00:00
# We can define classes with the class statement
class Human(): # By convention CamelCase is used for classes.
pass
2013-06-27 07:29:07 +00:00
# We subclass from object to get a "new-style class". All your code should do this.
class Human(object):
2013-06-27 07:29:07 +00:00
# A class attribute. It is shared by all instances of this class
species = "H. sapiens"
2013-06-27 07:29:07 +00:00
# Basic initializer
def __init__(self, name):
self.name = name # We are assigning the argument to the instance's name attribute
# A method. All methods take self as the first argument, including the initializer
def say(self, msg):
return "%s: %s" % (this.name, msg)
# A class method is shared among all instances
@classmethod
def get_species(cls):
return cls.species
# Static methods are called without a parameter reference to the class or instance
@staticmethod
def grunt(self):
return "*grunt*"
# 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"
# Call our class method
h.get_species() #=> "H. sapiens"
# Change the shared attribute
h.species = "H. neanderthalensis"
h.get_species() #=> "H. neanderthalensis"
i.get_species() #=> "H. neanderthalensis"
# Call the static method
Human.grunt() #=> "*grunt*"