SlideShare a Scribd company logo
Intro to Python
   by Daniel Greenfeld
Intro to Python
                 a.k.a.
21 cool things you can do with Python
Tons of content
• Please hold your questions until the end
• Latest slides:           http://slidesha.re/intro-to-python

• Special thanks to:          http://bit.ly/x610Au
   • Raymond Hettinger
   • David Beazley
   • Audrey Roy
   • The Python community
Daniel Greenfeld
                                       • pydanny
                                       • twitter.com/pydanny
                                       • github.com/pydanny
                                       • pydanny.blogspot.com
                                       • pydanny-event-notes.rtfd.org
   IMG goes here


http://www.flickr.com/photos/pydanny/4442245488/
Daniel Greenfeld
                    • Python/Django Developer
                    • Cartwheel Web
                      • Makers of
                      • Makers of Open Comparison
                    • Los Angeles
   IMG goes here    • Capoeira
                    • Fiancee is Audrey Roy
http://www.flickr.com/photos/pydanny/4442245488/
Intro to Python
Who uses Python?
    All the cool kids do!
Who uses Python?
What is Python?
What is Python?
• Over 20 years old
• Dynamic, strongly typed scripting language
• Multi-paradigm programming language
 • Object Oriented
 • Functional
 • Procedural
 • Reflective
What is Python?
• Free and open source
• Fast enough
 • Check out PyPy
• Batteries included language
What is Python?




       http://en.wikipedia.org/wiki/File:Flyingcircus_2.jpg




It’s named after Monty Python
Python is similar to...
• Perl
• Ruby
• Lisp
• Java
Python is different than...
• Perl
• Ruby
• Lisp
• Java
Python Core Concepts
Whitespace!
""" whitespace.py """
from random import randrange

def numberizer():
    # Generate a random number from 1 to 10.
    return randrange(1, 11)

number = numberizer()
if number > 5:
    print("This number is big!")

class RandomNumberHolder(object):
    # Create and hold 20 random numbers using numberizer

    def __init__(self):
        self.numbers = [numberizer(x) for x in range(20)]

random_numbers = RandomNumberHolder()
Whitespace!


def numberizer():
    # Generate a random number from 1 to 10.
    return randrange(1, 11)
Whitespace!


number = numberizer()
if number > 5:
    print("This number is big!")
Whitespace!

class RandomNumberHolder(object):
    # Create and hold 20 random numbers
        # using numberizer

   def __init__(self):

       self.numbers = [numberizer(x) for x...

random_numbers = RandomNumberHolder()
Philosophy of
        Core Developers
• Conservative growth
• Aim for a simple implementation
• “We read Knuth so you don’t have to”
Zen of Python
>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
Culture of Documentation
• Django Web Framework
 • http://djangoproject.com
• Document everything and document well
• Make your documentation accessible
 • http://readthedocs.org
 • http://python-requests.org
 • http://bit.ly/oc_ref (Open Comparison reference)
Which Python?
For learning and simple scripting...

Use what is on your
 system by default.
    If you are running Linux or
   BSD you already have Python
$
$ python
Python 2.7.1+ (r271:86832, Apr 11 2011,
18:13:53)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or
"license" for more information.
>>>
>>> 3 + 4
7
>>> a = 5 * 10
>>> a
50
>>> def add(a, b):
...     return a + b
...
>>> add(3,4)
7
>>> add('Py','thon')
'Python'
Don’t have Python yet?


   Download 3.2
Unless you are working with a tool
with a specific Python dependency
 (e.g. Django requires Python 2.7)
21 cool things you
can do with Python
#1 Run it anywhere
  Linux                  Windows
FreeBSD                  Mac OS X                         JVM
OpenBSD                   Solaris                        .NET
NetBSD                    HP-UX                        Android OS
  BSD                      OS/2
     http://en.wikipedia.org/wiki/CPython#Supported_platforms
#2 Learn it fast
     Python is easy to learn but powerful.

Experienced developers get up to speed in days.

Lots of tutorials in the area taught by PyLadies.

      http://learnpythonthehardway.org/
#3 Introspect
                a.k.a Introducing the String type
>>> foo = 'bar'
>>> spam = 'eggs'
>>> fun = 'spam and EGGS   '
                                   dir() is a Python built-in function
>>> dir(fun)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__',
'__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__',
'__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__',
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__',
                                http://en.wikipedia.org/wiki/File:Flyingcircus_2.jpg
'__rmul__', '__setattr__', '__sizeof__', '__str__','__subclasshook__',
'_formatter_field_name_split', '_formatter_parser', 'capitalize',
'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs',
 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower',
'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip',
'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition',
'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip',
'swapcase', 'title', 'translate', 'upper','zfill']
#3 Introspect
                 a.k.a Introducing the String type
>>> fun
'spam and EGGS     '
>>> fun.strip()
'spam and EGGS'               type() returns the type of object
>>> spam.title()
'Spam And Eggs   '
>>> fun.capitalize()
'Spam and eggs   '
>>> fun.index('a')       Line comments start with ‘# ‘
2
>>> type(fun)
<type 'str'>
>>> len(fun) # built-in that gives length of object
16
>>> fun[0:5] # String slicing             help() is a
'spam '
>>> help(fun)                           Python built-in
no Python documentation found for 'spam and EGGS      '
>>> help(str)
                                     str is the Python
                                     string type object
#3 Introspect
                a.k.a Introducing the String type
>>> help(str)
Help on class str in module __builtin__:

class str(basestring)
 | str(object) -> string
 |
 | Return a nice string representation of the object.
 | If the argument is a string, the return value is the same object.
 |
 | Method resolution order:
 |      str
 |      basestring
 |      object
 |
 | Methods defined here:
 |
 | __add__(...)
 |      x.__add__(y) <==> x+y
 |
 | __contains__(...)
 |      x.__contains__(y) <==> y in x
#3 Introspect
                a.k.a Introducing the String type
>>> help(str)
| capitalize(...)
|      S.capitalize() -> string
|
|      Return a copy of the string S with only its first character
|      capitalized.
|
| center(...)
|      S.center(width[, fillchar]) -> string
|
|      Return S centered in a string of length width. Padding is
|      done using the specified fill character (default is a space)
|
| count(...)
|      S.count(sub[, start[, end]]) -> int
|
|      Return the number of non-overlapping occurrences of substring sub
in
|      string S[start:end]. Optional arguments start and end are
interpreted
|      as in slice notation.
#4 Things with Strings
>>> scale = 'Southern California Linux Expo'
>>> scale[0]
'S'
>>> scale[0:8]
'Southern'
>>> scale[:-5]
'Southern California Linux'
                                        Strings are immutable
>>> scale[0:8] = 'Northern'
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> scale.replace('Southern California','SoCal')
'SoCal Linux Expo'
>>> scale
'Southern California Linux Expo'
>>> scale = scale.replace('Southern California','SoCal')
>>> scale
'SoCal Linux Expo'
>>> scale.startswith('Windows')
False
>>> scale.endswith('Windows')
False
>>> scale.startswith('SoCal')
True
>>> 'Windows' in scale
False
>>> 'Linux' in scale
True
#5 String formatting
>>> a = "Daniel"
>>> b = "Adam"
>>> c = "Greenfeld"
>>> a + b + c
'DanielAdamGreenfeld'
>>> "{0} {1} {2}".format(a, b, c)
'Daniel Adam Greenfeld'
>>> "{first} {middle} {last}".format(first=a, middle=b, last=c)
'Daniel Adam Greenfeld'
>>> lst = [a,b,c]
>>> lst
['Daniel', 'Adam', 'Greenfeld']
>>> name =" ".join(lst)
>>> name
'Daniel Adam Greenfeld'
#6 Basic Operations
>>> x, y, z = 5, 10, 15
>>> 5 < 10
True
>>> 5 > 10
False
                             Python has advanced math
>>> True == False             features that comes with
False
>>> (5 == x) or (10 == x)        the standard library.
True
>>> (5 == x) and (10 == x)
False
>>> x + y - z
0
>>> 10 * 5                      For scientific needs,
50
>>> 10 / 5                      numpy is available.
2
>>> 10 + 5
15
>>> 10 ** 2
100
#7 Lists
>>> my_list = [1, 2, 3]
>>> my_list.append(4)
>>> my_list                           Lists are mutable
[1, 2, 3, 4]
>>> my_list.insert(2, 'dog')
>>> my_list
                                    Tuples are not mutable
[1, 2, 'dog', 3, 4]
>>> my_list.extend([5, 6])
>>> my_list
[1, 2, 'dog', 3, 4, 5, 6]
>>> my_list.append([7, 8])
>>> my_list
[1, 2, 'dog', 3, 4, 5, 6, [7, 8]]
>>> my_list.pop(2)
'dog'
>>> my_list
[1, 2, 3, 4, 5, 6, [7, 8]]
>>> my_list.reverse()
>>> my_list
[[7, 8], 6, 5, 4, 3, 2, 1]
#8 Lists + Functional Programming
>>>   def divisible_by_2(x):
...      return x % 2 == 0
...
>>>                                     Filter constructs a list from
>>>   def cube(x):
...      return x ** 3
                                       those elements of an iterable
...                                   for which the specified function
>>>
>>>   numbers = [1, 2, 3, 4, 6, 31]
                                                returns True.
>>>
>>>   filter(divisible_by_2, numbers)
[2,   4, 6]
>>>
>>>   map(cube, numbers)
[1,   8, 27, 64, 216, 29791]         Map applies the specified
                                   function to every item of the
                                 iterable and returns the results.
#9 List Comprehensions
                            Remember
""" whitespace.py """
from random import randrange                         this
def numberizer():                                 from the
    # Generate a random number from 1 to 10.
    return randrange(1, 11)
                                                 beginning?
number = numberizer()
if number > 5:
              List Comprehension!
    print("This number is big!")

class RandomNumberHolder(object):
    # Create and hold 20 random numbers using numberizer

    def __init__(self):
        self.numbers = [numberizer(x) for x in range(20)]

random_numbers = RandomNumberHolder()
#9 List Comprehensions
>>>   items = [x for x in range(20)]
>>>   items
[0,   1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>>   [x for x in range(20) if x % 2]
[1,   3, 5, 7, 9, 11, 13, 15, 17, 19]


                    List Comprehensions are
                   wonderful syntactical sugar.
>>> # Fizzbuzz solved using Python's List Comprehension
>>> lst = [(x, 'Fizz', 'Buzz', 'FizzBuzz') 
...            [(not x % 3) | (not x % 5) << 1] for x in range(20)]

                                        Backslash can be used to
                                        break up long statements.
                                           Please use sparingly!
#10 Generators
>>> def countdown(n):
...     print("Counting down from {0}".format(n))
...     while n > 0:
...        yield n             A generator evaluates only when the
...        n -= 1              iterable is at that iteration. This is really
                               powerful, especially when working with
>>> x = countdown(10)          large iterables.
>>> x
<generator object at 0x58490>
>>> x.next()
Counting down from 10
10                                       A billion iterations for
>>> x.next()
9                                      a generator is NOTHING.
>>> x.next()
8
>>> x.next()
7

                      http://dabeaz.com/generators/Generators.pdf
#11 Generator Expressions
>>> items = (str(x) for x in xrange(10000))         Generator expressions are
>>> items
<generator object <genexpr> at 0x100721460>         shorthand for generators. Just
                                                    like list comprehensions, but
                                                    with () instead of [].




                    http://dabeaz.com/generators/Generators.pdf
#11 Generator Expressions
Problem: count the bytes saved to huge apache access log.
wwwlog = open("access-log")
total = 0                                    Open the whole file, then
for line in wwwlog:
    bytestr = line.rsplit(None,1)[1]        iterate through the results.
    if bytestr != '-':
        total += int(bytestr)
                                              Lots of memory usage!
print "Total", total


            # generator expressions way
Generator   wwwlog     = open("access-log")
            bytecolumn = (line.rsplit(None,1)[1] for line in wwwlog)
  way       bytes      = (int(x) for x in bytecolumn if x != '-')
            print "Total", sum(bytes)

                  http://dabeaz.com/generators/Generators.pdf
#12 Sets
>>> lst = [1,1,1,1,1,2,2,2,3,3,3,3,3,3]
>>> s = set(lst)
>>> s
set([1,2,3])

  Counting unique words in the Gettysburg Address
>>>   address = """Four score and seven years ago our fathers brought..."""
>>>   for r in [',','.','-']:
...       address = address.replace(r,'')
>>>
>>>
      words = address.split(' ')
      len(words)
                                        All items in a set need to
278
>>>   unique_words = set(words)
                                          be of the same type.
>>>   len(unique_words)
143
>>> data = {                       #13 Dictionaries
       'name':'Daniel Greenfeld',
       'nickname':'pydanny',
       'states_lived':['CA','KS','MD','NJ','VA','AD'],
       'fiancee':'Audrey Roy'
       }
>>> data['name']
'Daniel Greenfeld'
>>> data['nickname'] = 'audreyr'       Mutable Key/Value objects
>>> data['nickname']
'audreyr'
>>> data['nickname'] = 'pydanny'
>>> data.keys()
['fiancee', 'nickname', 'name', 'states_lived']
>>> data.get('fiancee')
'Audrey Roy'
>>> data.get('fiance')
None
>>> data.pop('fiancee')
'Audrey Roy'
>>> data
{'nickname': 'pydanny', 'name': 'Daniel Greenfeld', 'states_lived': ['CA',
'KS', 'MD', 'NJ', 'VA']}
>>> data['fiancee'] = 'Audrey Roy'
>>> data
{'fiancee': 'Audrey Roy', 'nickname': 'pydanny', 'name': 'Daniel
Greenfeld', 'states_lived': ['CA', 'KS', 'MD', 'NJ', 'VA', 'AD']}
#14 Object-Oriented Programming
class Animal(object):
    def __init__(self, name):
        self.name = name
    def talk(self):
        raise NotImplementedError("Subclass must implement abstract method")

class Cat(Animal):
    def talk(self):
        return 'Meow!'

class Dog(Animal):                                       Missy: Meow!
    def talk(self):
        return 'Woof! Woof!'                             Mr. Mistoffelees: Meow!
animals = [Cat('Missy'),                                 Lassie: Woof! Woof!
           Cat('Mr. Mistoffelees'),
           Dog('Lassie')]

for animal in animals:
    print animal.name + ': ' + animal.talk()


                      Barely scratching the surface!
           http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming#Examples
#15 Isolate Environments
$ curl http://bit.ly/get-pip | python
$ pip install virtualenv
$ virtualenv my_env
$ source my_env/bin/activate
(my_env) $
           Pro Tip: easy_install is legacy. Use pip.
(my_env) $ pip install django==1.3.1
(my_env) $ pip install requests==0.9.1
(my_env) $ pip install mongoengine==0.5.2
                                                     Warning!
(my_env) $ pip install celery==2.4.6               Only installs
(my_env) $ pip freeze
celery==2.4.6                                     Python drivers!
django==1.3.1
mongoengine==0.5.2                                Not MongoDB
requests==0.9.1
(my_env) $ pip freeze > requirements.txt           or RabbitMQ
...
(another_env) $ pip install -r requirements.txt
#16 Colorize Code
                How Github and Bitbucket do it
$ pip install pygments
from pygments import highlight
from pygments.lexers import get_lexer_by_name
from pygments.formatters import HtmlFormatter

if __name__ == '__main__':
    # get this file
                                                    pygments_demo.py
    code = open("pygments_demo.py", "rw").read()

   # figure out the lexer
   lexer = get_lexer_by_name("python", stripall=True)

   # construct the formatter
   formatter = HtmlFormatter(linenos=False, cssclass="source")

   # style and formatting
   css = HtmlFormatter().get_style_defs('.source')
   highlighted_code = highlight(code, lexer, formatter)
   page = """
                             $ python pygments_demo.py > text.html
       <html>
           <head><style>{css}</style></head>
           <body>{highlighted_code}</body>
       </html>
       """.format(css=css, highlighted_code=highlighted_code)
   print(page)
Output of the program

from pygments import highlight
from pygments.lexers import get_lexer_by_name
from pygments.formatters import HtmlFormatter       text.html
if __name__ == '__main__':
    # get this file
    code = open("pygments_demo.py", "rw").read()

   # figure out the lexer
   lexer = get_lexer_by_name("python", stripall=True)

   # construct the formatter
   formatter = HtmlFormatter(linenos=False, cssclass="source")

   # style and formatting
   css = HtmlFormatter().get_style_defs('.source')
   highlighted_code = highlight(code, lexer, formatter)
   page = """
       <html>
           <head><style>{css}</style></head>
           <body>{highlighted_code}</body>
       </html>
       """.format(css=css, highlighted_code=highlighted_code)
   print(page)
#17 Work with Relational Databases
(my_env)$ pip install django
 from datetime import datetime           Internationalization!
 from django.contrib.auth.models import User
 from django.db import models
 from django.utils.translation import ugettext_lazy as _

 class Post(models.Model):

     author = models.ForeignKey(User)
     title = models.CharField(_('Title'), max_length=100)
     content = models.TextField(_("Content"))
     pub_date = models.DateTimeField(_("Publication date"))

 class Comment(models.Model):
     post = models.ForeignKey(Post)
     name = models.CharField(_('Title'), max_length=100)
     content = models.TextField(_("Content"))
#18 Work with NoSQL
(my_env)$ pip install pymongo
>>> import pymongo
>>> connection = pymongo.Connection("localhost", 27017)
>>> db = connection.test
>>> db.name
u'test'
>>> db.my_collection
Collection(Database(Connection('localhost', 27017), u'test'),
u'my_collection')
>>> db.my_collection.save({"x": 10})
ObjectId('4aba15ebe23f6b53b0000000')
>>> db.my_collection.save({"x": 8})
ObjectId('4aba160ee23f6b543e000000')
>>> db.my_collection.save({"x": 11})
ObjectId('4aba160ee23f6b543e000002')
>>> db.my_collection.find_one()
{u'x': 10, u'_id': ObjectId('4aba15ebe23f6b53b0000000')}
>>> db.my_collection.create_index("x")
u'x_1'
>>> [item["x"] for item in db.my_collection.find().limit(2).skip(1)]
[8, 11]
#19 Message Queues
(my_env)$ pip install celery==2.4.6
(my_env)$ pip install requests==0.9.2
   import logging                                 products/tasks.py
   import requests
   from celery import task

   from products.models import Product
                                                  Decorators wrap a
   logger = logging.getLogger('products.tasks')
                                                  function or method
   @task
   def check_all_images():
                                                    with a function.
       for product in Product.objects.all():
           response = request.get(product.medium_image.url)
           if response.status_code != 200:
               msg = "Product {0} missing image".format(product.id)
               logging.warning(msg)
   >>> from products.tasks import confirm_all_images
   >>> result = confirm_all_images.delay()
   >>> result.ready()
   False
   >>> result.ready()
   True
#20 Work with JSON
>>> import json
>>> data = {
    'name':'Daniel Greenfeld',
    'nickname':'pydanny',
    'states_lived':['CA','KS','MD','NJ','VA','AD'],
    'fiancee':'Audrey Roy'
    }
>>> type(data)
<type 'dict'>
>>> payload = json.dumps(data)
>>> payload
'{"fiancee": "Audrey Roy", "nickname": "pydanny", "name": "Daniel
Greenfeld", "states_lived": ["CA", "KS", "MD", "NJ", "VA", "AD"]}'
>>> type(payload)
<type 'str'>
>>> restored = json.loads(payload)
>>> type(restored)
<type 'dict'>
>>> restored
{u'fiancee': u'Audrey Roy', u'nickname': u'pydanny', u'name': u'Daniel
Greenfeld', u'states_lived': [u'CA', u'KS', u'MD', u'NJ', u'VA', u'AD'
]}
#21 Serve the Web
 $ pip install flask==0.8
  # webapp.py
  from flask import Flask
  app = Flask(__name__)

  @app.route("/")
  def hello():
      return "Hello World!"

  if __name__ == "__main__":
      app.run()


      flask.pocoo.org
#21 Serve the Web




 Lots more frameworks!
#21 Serve the Web




  http://science.nasa.gov/
#21 Serve the Web




http://djangopackages.com
http://opencomparison.org
#21 Serve the Web




http://consumernotebook.com
#21 Serve the Web




    http://grove.io

     Hosted IRC
Finis
• Learn more at the following booths:
 • Python
 • Django
 • Pyladies
Questions?

More Related Content

PDF
10 more-things-you-can-do-with-python
Daniel Greenfeld
 
PPTX
Introduction to Python
Bogdan Sabău
 
PDF
IT talk "Python language evolution"
DataArt
 
DOCX
เทคนิคการค้นหาด้วย Google
zerostart77777
 
PDF
Meet Couch DB
estialvarez
 
PDF
Introduction to python
Rajesh Rajamani
 
PDF
世界のどこかで楽しくRubyでお仕事するために
Kuniaki Igarashi
 
PDF
My talk on GitHub open data at ITGM #10
Alex Chistyakov
 
10 more-things-you-can-do-with-python
Daniel Greenfeld
 
Introduction to Python
Bogdan Sabău
 
IT talk "Python language evolution"
DataArt
 
เทคนิคการค้นหาด้วย Google
zerostart77777
 
Meet Couch DB
estialvarez
 
Introduction to python
Rajesh Rajamani
 
世界のどこかで楽しくRubyでお仕事するために
Kuniaki Igarashi
 
My talk on GitHub open data at ITGM #10
Alex Chistyakov
 

What's hot (6)

PPTX
How to train your python: iterables (FR)
Jordi Riera
 
PDF
Implementasi Full Textsearch pada Database
Dony Riyanto
 
PPTX
Python pandas Library
Md. Sohag Miah
 
PPTX
Intro to Google Docs
John Dorner
 
PDF
Introduction to Python for new beginner
Burasakorn Sabyeying
 
PPTX
Making Magic with F# Type Providers
dsyme
 
How to train your python: iterables (FR)
Jordi Riera
 
Implementasi Full Textsearch pada Database
Dony Riyanto
 
Python pandas Library
Md. Sohag Miah
 
Intro to Google Docs
John Dorner
 
Introduction to Python for new beginner
Burasakorn Sabyeying
 
Making Magic with F# Type Providers
dsyme
 
Ad

Viewers also liked (13)

KEY
The One Way
Daniel Greenfeld
 
KEY
PyCon Philippines 2012 Keynote
Daniel Greenfeld
 
PDF
Intro to Data Visualizations
Daniel Greenfeld
 
KEY
Lighting talk on django-social-auth
Daniel Greenfeld
 
KEY
Round pegs and square holes
Daniel Greenfeld
 
PDF
An Extreme Talk about the Zen of Python
Daniel Greenfeld
 
PPTX
Python Programming Essentials - M34 - List Comprehensions
P3 InfoTech Solutions Pvt. Ltd.
 
PPTX
Python Programming Essentials - M44 - Overview of Web Development
P3 InfoTech Solutions Pvt. Ltd.
 
PDF
How to Write a Popular Python Library by Accident
Daniel Greenfeld
 
PDF
Thinking hard about_python
Daniel Greenfeld
 
PDF
Intro to Python
Daniel Greenfeld
 
PDF
From NASA to Startups to Big Commerce
Daniel Greenfeld
 
PDF
Python Worst Practices
Daniel Greenfeld
 
The One Way
Daniel Greenfeld
 
PyCon Philippines 2012 Keynote
Daniel Greenfeld
 
Intro to Data Visualizations
Daniel Greenfeld
 
Lighting talk on django-social-auth
Daniel Greenfeld
 
Round pegs and square holes
Daniel Greenfeld
 
An Extreme Talk about the Zen of Python
Daniel Greenfeld
 
Python Programming Essentials - M34 - List Comprehensions
P3 InfoTech Solutions Pvt. Ltd.
 
Python Programming Essentials - M44 - Overview of Web Development
P3 InfoTech Solutions Pvt. Ltd.
 
How to Write a Popular Python Library by Accident
Daniel Greenfeld
 
Thinking hard about_python
Daniel Greenfeld
 
Intro to Python
Daniel Greenfeld
 
From NASA to Startups to Big Commerce
Daniel Greenfeld
 
Python Worst Practices
Daniel Greenfeld
 
Ad

Similar to Intro (20)

PDF
Python bootcamp - C4Dlab, University of Nairobi
krmboya
 
PDF
Python: an introduction for PHP webdevelopers
Glenn De Backer
 
PPTX
Python Demo.pptx
ParveenShaik21
 
PPTX
Python Demo.pptx
ParveenShaik21
 
PDF
First Steps in Python Programming
Dozie Agbo
 
PPT
Python
Kumar Gaurav
 
PDF
Python intro
Abhinav Upadhyay
 
PDF
Python 101 1
Iccha Sethi
 
PDF
Python Orientation
Pavan Devarakonda
 
PPT
Python study material
Satish Nagabhushan
 
PPTX
Python Workshop - Learn Python the Hard Way
Utkarsh Sengar
 
PPT
Python workshop intro_string (1)
Karamjit Kaur
 
PPT
Python course in_mumbai
vibrantuser
 
PPT
Python course in_mumbai
vibrantuser
 
PPTX
Learn python in 20 minutes
Sidharth Nadhan
 
PDF
Tutorial on-python-programming
Chetan Giridhar
 
ODP
An Intro to Python in 30 minutes
Sumit Raj
 
PPTX
2015 bioinformatics python_strings_wim_vancriekinge
Prof. Wim Van Criekinge
 
PPT
Python basics to advanced in on ppt is available
nexasbravo2000sep
 
Python bootcamp - C4Dlab, University of Nairobi
krmboya
 
Python: an introduction for PHP webdevelopers
Glenn De Backer
 
Python Demo.pptx
ParveenShaik21
 
Python Demo.pptx
ParveenShaik21
 
First Steps in Python Programming
Dozie Agbo
 
Python
Kumar Gaurav
 
Python intro
Abhinav Upadhyay
 
Python 101 1
Iccha Sethi
 
Python Orientation
Pavan Devarakonda
 
Python study material
Satish Nagabhushan
 
Python Workshop - Learn Python the Hard Way
Utkarsh Sengar
 
Python workshop intro_string (1)
Karamjit Kaur
 
Python course in_mumbai
vibrantuser
 
Python course in_mumbai
vibrantuser
 
Learn python in 20 minutes
Sidharth Nadhan
 
Tutorial on-python-programming
Chetan Giridhar
 
An Intro to Python in 30 minutes
Sumit Raj
 
2015 bioinformatics python_strings_wim_vancriekinge
Prof. Wim Van Criekinge
 
Python basics to advanced in on ppt is available
nexasbravo2000sep
 

More from Daniel Greenfeld (12)

KEY
Future of Collaboration
Daniel Greenfeld
 
KEY
Advanced Django Forms Usage
Daniel Greenfeld
 
KEY
Confessions of Joe Developer
Daniel Greenfeld
 
PDF
Django Worst Practices
Daniel Greenfeld
 
PDF
How to sell django panel
Daniel Greenfeld
 
PPT
Pinax Long Tutorial Slides
Daniel Greenfeld
 
PPT
Testing In Django
Daniel Greenfeld
 
PDF
Django Uni-Form
Daniel Greenfeld
 
PDF
Nova Django
Daniel Greenfeld
 
PPT
Pinax Introduction
Daniel Greenfeld
 
PDF
Why Django
Daniel Greenfeld
 
PDF
Pinax Tutorial 09/09/09
Daniel Greenfeld
 
Future of Collaboration
Daniel Greenfeld
 
Advanced Django Forms Usage
Daniel Greenfeld
 
Confessions of Joe Developer
Daniel Greenfeld
 
Django Worst Practices
Daniel Greenfeld
 
How to sell django panel
Daniel Greenfeld
 
Pinax Long Tutorial Slides
Daniel Greenfeld
 
Testing In Django
Daniel Greenfeld
 
Django Uni-Form
Daniel Greenfeld
 
Nova Django
Daniel Greenfeld
 
Pinax Introduction
Daniel Greenfeld
 
Why Django
Daniel Greenfeld
 
Pinax Tutorial 09/09/09
Daniel Greenfeld
 

Recently uploaded (20)

PDF
The Future of Mobile Is Context-Aware—Are You Ready?
iProgrammer Solutions Private Limited
 
PDF
How Open Source Changed My Career by abdelrahman ismail
a0m0rajab1
 
PDF
Presentation about Hardware and Software in Computer
snehamodhawadiya
 
PDF
Economic Impact of Data Centres to the Malaysian Economy
flintglobalapac
 
PDF
Peak of Data & AI Encore - Real-Time Insights & Scalable Editing with ArcGIS
Safe Software
 
PPTX
The Future of AI & Machine Learning.pptx
pritsen4700
 
PPTX
Agile Chennai 18-19 July 2025 | Emerging patterns in Agentic AI by Bharani Su...
AgileNetwork
 
PPTX
AI and Robotics for Human Well-being.pptx
JAYMIN SUTHAR
 
PDF
Make GenAI investments go further with the Dell AI Factory
Principled Technologies
 
PPTX
Applied-Statistics-Mastering-Data-Driven-Decisions.pptx
parmaryashparmaryash
 
PDF
A Strategic Analysis of the MVNO Wave in Emerging Markets.pdf
IPLOOK Networks
 
PDF
Automating ArcGIS Content Discovery with FME: A Real World Use Case
Safe Software
 
PDF
Responsible AI and AI Ethics - By Sylvester Ebhonu
Sylvester Ebhonu
 
PDF
How ETL Control Logic Keeps Your Pipelines Safe and Reliable.pdf
Stryv Solutions Pvt. Ltd.
 
PDF
Accelerating Oracle Database 23ai Troubleshooting with Oracle AHF Fleet Insig...
Sandesh Rao
 
PPTX
IT Runs Better with ThousandEyes AI-driven Assurance
ThousandEyes
 
PDF
Unlocking the Future- AI Agents Meet Oracle Database 23ai - AIOUG Yatra 2025.pdf
Sandesh Rao
 
PDF
Data_Analytics_vs_Data_Science_vs_BI_by_CA_Suvidha_Chaplot.pdf
CA Suvidha Chaplot
 
PDF
Oracle AI Vector Search- Getting Started and what's new in 2025- AIOUG Yatra ...
Sandesh Rao
 
PPTX
Dev Dives: Automate, test, and deploy in one place—with Unified Developer Exp...
AndreeaTom
 
The Future of Mobile Is Context-Aware—Are You Ready?
iProgrammer Solutions Private Limited
 
How Open Source Changed My Career by abdelrahman ismail
a0m0rajab1
 
Presentation about Hardware and Software in Computer
snehamodhawadiya
 
Economic Impact of Data Centres to the Malaysian Economy
flintglobalapac
 
Peak of Data & AI Encore - Real-Time Insights & Scalable Editing with ArcGIS
Safe Software
 
The Future of AI & Machine Learning.pptx
pritsen4700
 
Agile Chennai 18-19 July 2025 | Emerging patterns in Agentic AI by Bharani Su...
AgileNetwork
 
AI and Robotics for Human Well-being.pptx
JAYMIN SUTHAR
 
Make GenAI investments go further with the Dell AI Factory
Principled Technologies
 
Applied-Statistics-Mastering-Data-Driven-Decisions.pptx
parmaryashparmaryash
 
A Strategic Analysis of the MVNO Wave in Emerging Markets.pdf
IPLOOK Networks
 
Automating ArcGIS Content Discovery with FME: A Real World Use Case
Safe Software
 
Responsible AI and AI Ethics - By Sylvester Ebhonu
Sylvester Ebhonu
 
How ETL Control Logic Keeps Your Pipelines Safe and Reliable.pdf
Stryv Solutions Pvt. Ltd.
 
Accelerating Oracle Database 23ai Troubleshooting with Oracle AHF Fleet Insig...
Sandesh Rao
 
IT Runs Better with ThousandEyes AI-driven Assurance
ThousandEyes
 
Unlocking the Future- AI Agents Meet Oracle Database 23ai - AIOUG Yatra 2025.pdf
Sandesh Rao
 
Data_Analytics_vs_Data_Science_vs_BI_by_CA_Suvidha_Chaplot.pdf
CA Suvidha Chaplot
 
Oracle AI Vector Search- Getting Started and what's new in 2025- AIOUG Yatra ...
Sandesh Rao
 
Dev Dives: Automate, test, and deploy in one place—with Unified Developer Exp...
AndreeaTom
 

Intro

  • 1. Intro to Python by Daniel Greenfeld
  • 2. Intro to Python a.k.a. 21 cool things you can do with Python
  • 3. Tons of content • Please hold your questions until the end • Latest slides: http://slidesha.re/intro-to-python • Special thanks to: http://bit.ly/x610Au • Raymond Hettinger • David Beazley • Audrey Roy • The Python community
  • 4. Daniel Greenfeld • pydanny • twitter.com/pydanny • github.com/pydanny • pydanny.blogspot.com • pydanny-event-notes.rtfd.org IMG goes here http://www.flickr.com/photos/pydanny/4442245488/
  • 5. Daniel Greenfeld • Python/Django Developer • Cartwheel Web • Makers of • Makers of Open Comparison • Los Angeles IMG goes here • Capoeira • Fiancee is Audrey Roy http://www.flickr.com/photos/pydanny/4442245488/
  • 7. Who uses Python? All the cool kids do!
  • 10. What is Python? • Over 20 years old • Dynamic, strongly typed scripting language • Multi-paradigm programming language • Object Oriented • Functional • Procedural • Reflective
  • 11. What is Python? • Free and open source • Fast enough • Check out PyPy • Batteries included language
  • 12. What is Python? http://en.wikipedia.org/wiki/File:Flyingcircus_2.jpg It’s named after Monty Python
  • 13. Python is similar to... • Perl • Ruby • Lisp • Java
  • 14. Python is different than... • Perl • Ruby • Lisp • Java
  • 16. Whitespace! """ whitespace.py """ from random import randrange def numberizer(): # Generate a random number from 1 to 10. return randrange(1, 11) number = numberizer() if number > 5: print("This number is big!") class RandomNumberHolder(object): # Create and hold 20 random numbers using numberizer def __init__(self): self.numbers = [numberizer(x) for x in range(20)] random_numbers = RandomNumberHolder()
  • 17. Whitespace! def numberizer(): # Generate a random number from 1 to 10. return randrange(1, 11)
  • 18. Whitespace! number = numberizer() if number > 5: print("This number is big!")
  • 19. Whitespace! class RandomNumberHolder(object): # Create and hold 20 random numbers # using numberizer def __init__(self): self.numbers = [numberizer(x) for x... random_numbers = RandomNumberHolder()
  • 20. Philosophy of Core Developers • Conservative growth • Aim for a simple implementation • “We read Knuth so you don’t have to”
  • 21. Zen of Python >>> import this The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. Special cases aren't special enough to break the rules. Although practicality beats purity. Errors should never pass silently. Unless explicitly silenced. In the face of ambiguity, refuse the temptation to guess. There should be one-- and preferably only one --obvious way to do it. Although that way may not be obvious at first unless you're Dutch. Now is better than never. Although never is often better than *right* now. If the implementation is hard to explain, it's a bad idea. If the implementation is easy to explain, it may be a good idea. Namespaces are one honking great idea -- let's do more of those!
  • 22. Culture of Documentation • Django Web Framework • http://djangoproject.com • Document everything and document well • Make your documentation accessible • http://readthedocs.org • http://python-requests.org • http://bit.ly/oc_ref (Open Comparison reference)
  • 24. For learning and simple scripting... Use what is on your system by default. If you are running Linux or BSD you already have Python
  • 25. $ $ python Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) [GCC 4.5.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> >>> 3 + 4 7 >>> a = 5 * 10 >>> a 50 >>> def add(a, b): ... return a + b ... >>> add(3,4) 7 >>> add('Py','thon') 'Python'
  • 26. Don’t have Python yet? Download 3.2 Unless you are working with a tool with a specific Python dependency (e.g. Django requires Python 2.7)
  • 27. 21 cool things you can do with Python
  • 28. #1 Run it anywhere Linux Windows FreeBSD Mac OS X JVM OpenBSD Solaris .NET NetBSD HP-UX Android OS BSD OS/2 http://en.wikipedia.org/wiki/CPython#Supported_platforms
  • 29. #2 Learn it fast Python is easy to learn but powerful. Experienced developers get up to speed in days. Lots of tutorials in the area taught by PyLadies. http://learnpythonthehardway.org/
  • 30. #3 Introspect a.k.a Introducing the String type >>> foo = 'bar' >>> spam = 'eggs' >>> fun = 'spam and EGGS ' dir() is a Python built-in function >>> dir(fun) ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', http://en.wikipedia.org/wiki/File:Flyingcircus_2.jpg '__rmul__', '__setattr__', '__sizeof__', '__str__','__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper','zfill']
  • 31. #3 Introspect a.k.a Introducing the String type >>> fun 'spam and EGGS ' >>> fun.strip() 'spam and EGGS' type() returns the type of object >>> spam.title() 'Spam And Eggs ' >>> fun.capitalize() 'Spam and eggs ' >>> fun.index('a') Line comments start with ‘# ‘ 2 >>> type(fun) <type 'str'> >>> len(fun) # built-in that gives length of object 16 >>> fun[0:5] # String slicing help() is a 'spam ' >>> help(fun) Python built-in no Python documentation found for 'spam and EGGS ' >>> help(str) str is the Python string type object
  • 32. #3 Introspect a.k.a Introducing the String type >>> help(str) Help on class str in module __builtin__: class str(basestring) | str(object) -> string | | Return a nice string representation of the object. | If the argument is a string, the return value is the same object. | | Method resolution order: | str | basestring | object | | Methods defined here: | | __add__(...) | x.__add__(y) <==> x+y | | __contains__(...) | x.__contains__(y) <==> y in x
  • 33. #3 Introspect a.k.a Introducing the String type >>> help(str) | capitalize(...) | S.capitalize() -> string | | Return a copy of the string S with only its first character | capitalized. | | center(...) | S.center(width[, fillchar]) -> string | | Return S centered in a string of length width. Padding is | done using the specified fill character (default is a space) | | count(...) | S.count(sub[, start[, end]]) -> int | | Return the number of non-overlapping occurrences of substring sub in | string S[start:end]. Optional arguments start and end are interpreted | as in slice notation.
  • 34. #4 Things with Strings >>> scale = 'Southern California Linux Expo' >>> scale[0] 'S' >>> scale[0:8] 'Southern' >>> scale[:-5] 'Southern California Linux' Strings are immutable >>> scale[0:8] = 'Northern' Traceback (most recent call last): File "<input>", line 1, in <module> TypeError: 'str' object does not support item assignment >>> scale.replace('Southern California','SoCal') 'SoCal Linux Expo' >>> scale 'Southern California Linux Expo' >>> scale = scale.replace('Southern California','SoCal') >>> scale 'SoCal Linux Expo' >>> scale.startswith('Windows') False >>> scale.endswith('Windows') False >>> scale.startswith('SoCal') True >>> 'Windows' in scale False >>> 'Linux' in scale True
  • 35. #5 String formatting >>> a = "Daniel" >>> b = "Adam" >>> c = "Greenfeld" >>> a + b + c 'DanielAdamGreenfeld' >>> "{0} {1} {2}".format(a, b, c) 'Daniel Adam Greenfeld' >>> "{first} {middle} {last}".format(first=a, middle=b, last=c) 'Daniel Adam Greenfeld' >>> lst = [a,b,c] >>> lst ['Daniel', 'Adam', 'Greenfeld'] >>> name =" ".join(lst) >>> name 'Daniel Adam Greenfeld'
  • 36. #6 Basic Operations >>> x, y, z = 5, 10, 15 >>> 5 < 10 True >>> 5 > 10 False Python has advanced math >>> True == False features that comes with False >>> (5 == x) or (10 == x) the standard library. True >>> (5 == x) and (10 == x) False >>> x + y - z 0 >>> 10 * 5 For scientific needs, 50 >>> 10 / 5 numpy is available. 2 >>> 10 + 5 15 >>> 10 ** 2 100
  • 37. #7 Lists >>> my_list = [1, 2, 3] >>> my_list.append(4) >>> my_list Lists are mutable [1, 2, 3, 4] >>> my_list.insert(2, 'dog') >>> my_list Tuples are not mutable [1, 2, 'dog', 3, 4] >>> my_list.extend([5, 6]) >>> my_list [1, 2, 'dog', 3, 4, 5, 6] >>> my_list.append([7, 8]) >>> my_list [1, 2, 'dog', 3, 4, 5, 6, [7, 8]] >>> my_list.pop(2) 'dog' >>> my_list [1, 2, 3, 4, 5, 6, [7, 8]] >>> my_list.reverse() >>> my_list [[7, 8], 6, 5, 4, 3, 2, 1]
  • 38. #8 Lists + Functional Programming >>> def divisible_by_2(x): ... return x % 2 == 0 ... >>> Filter constructs a list from >>> def cube(x): ... return x ** 3 those elements of an iterable ... for which the specified function >>> >>> numbers = [1, 2, 3, 4, 6, 31] returns True. >>> >>> filter(divisible_by_2, numbers) [2, 4, 6] >>> >>> map(cube, numbers) [1, 8, 27, 64, 216, 29791] Map applies the specified function to every item of the iterable and returns the results.
  • 39. #9 List Comprehensions Remember """ whitespace.py """ from random import randrange this def numberizer(): from the # Generate a random number from 1 to 10. return randrange(1, 11) beginning? number = numberizer() if number > 5: List Comprehension! print("This number is big!") class RandomNumberHolder(object): # Create and hold 20 random numbers using numberizer def __init__(self): self.numbers = [numberizer(x) for x in range(20)] random_numbers = RandomNumberHolder()
  • 40. #9 List Comprehensions >>> items = [x for x in range(20)] >>> items [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] >>> [x for x in range(20) if x % 2] [1, 3, 5, 7, 9, 11, 13, 15, 17, 19] List Comprehensions are wonderful syntactical sugar. >>> # Fizzbuzz solved using Python's List Comprehension >>> lst = [(x, 'Fizz', 'Buzz', 'FizzBuzz') ... [(not x % 3) | (not x % 5) << 1] for x in range(20)] Backslash can be used to break up long statements. Please use sparingly!
  • 41. #10 Generators >>> def countdown(n): ... print("Counting down from {0}".format(n)) ... while n > 0: ... yield n A generator evaluates only when the ... n -= 1 iterable is at that iteration. This is really powerful, especially when working with >>> x = countdown(10) large iterables. >>> x <generator object at 0x58490> >>> x.next() Counting down from 10 10 A billion iterations for >>> x.next() 9 a generator is NOTHING. >>> x.next() 8 >>> x.next() 7 http://dabeaz.com/generators/Generators.pdf
  • 42. #11 Generator Expressions >>> items = (str(x) for x in xrange(10000)) Generator expressions are >>> items <generator object <genexpr> at 0x100721460> shorthand for generators. Just like list comprehensions, but with () instead of []. http://dabeaz.com/generators/Generators.pdf
  • 43. #11 Generator Expressions Problem: count the bytes saved to huge apache access log. wwwlog = open("access-log") total = 0 Open the whole file, then for line in wwwlog: bytestr = line.rsplit(None,1)[1] iterate through the results. if bytestr != '-': total += int(bytestr) Lots of memory usage! print "Total", total # generator expressions way Generator wwwlog = open("access-log") bytecolumn = (line.rsplit(None,1)[1] for line in wwwlog) way bytes = (int(x) for x in bytecolumn if x != '-') print "Total", sum(bytes) http://dabeaz.com/generators/Generators.pdf
  • 44. #12 Sets >>> lst = [1,1,1,1,1,2,2,2,3,3,3,3,3,3] >>> s = set(lst) >>> s set([1,2,3]) Counting unique words in the Gettysburg Address >>> address = """Four score and seven years ago our fathers brought...""" >>> for r in [',','.','-']: ... address = address.replace(r,'') >>> >>> words = address.split(' ') len(words) All items in a set need to 278 >>> unique_words = set(words) be of the same type. >>> len(unique_words) 143
  • 45. >>> data = { #13 Dictionaries 'name':'Daniel Greenfeld', 'nickname':'pydanny', 'states_lived':['CA','KS','MD','NJ','VA','AD'], 'fiancee':'Audrey Roy' } >>> data['name'] 'Daniel Greenfeld' >>> data['nickname'] = 'audreyr' Mutable Key/Value objects >>> data['nickname'] 'audreyr' >>> data['nickname'] = 'pydanny' >>> data.keys() ['fiancee', 'nickname', 'name', 'states_lived'] >>> data.get('fiancee') 'Audrey Roy' >>> data.get('fiance') None >>> data.pop('fiancee') 'Audrey Roy' >>> data {'nickname': 'pydanny', 'name': 'Daniel Greenfeld', 'states_lived': ['CA', 'KS', 'MD', 'NJ', 'VA']} >>> data['fiancee'] = 'Audrey Roy' >>> data {'fiancee': 'Audrey Roy', 'nickname': 'pydanny', 'name': 'Daniel Greenfeld', 'states_lived': ['CA', 'KS', 'MD', 'NJ', 'VA', 'AD']}
  • 46. #14 Object-Oriented Programming class Animal(object): def __init__(self, name): self.name = name def talk(self): raise NotImplementedError("Subclass must implement abstract method") class Cat(Animal): def talk(self): return 'Meow!' class Dog(Animal): Missy: Meow! def talk(self): return 'Woof! Woof!' Mr. Mistoffelees: Meow! animals = [Cat('Missy'), Lassie: Woof! Woof! Cat('Mr. Mistoffelees'), Dog('Lassie')] for animal in animals: print animal.name + ': ' + animal.talk() Barely scratching the surface! http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming#Examples
  • 47. #15 Isolate Environments $ curl http://bit.ly/get-pip | python $ pip install virtualenv $ virtualenv my_env $ source my_env/bin/activate (my_env) $ Pro Tip: easy_install is legacy. Use pip. (my_env) $ pip install django==1.3.1 (my_env) $ pip install requests==0.9.1 (my_env) $ pip install mongoengine==0.5.2 Warning! (my_env) $ pip install celery==2.4.6 Only installs (my_env) $ pip freeze celery==2.4.6 Python drivers! django==1.3.1 mongoengine==0.5.2 Not MongoDB requests==0.9.1 (my_env) $ pip freeze > requirements.txt or RabbitMQ ... (another_env) $ pip install -r requirements.txt
  • 48. #16 Colorize Code How Github and Bitbucket do it $ pip install pygments from pygments import highlight from pygments.lexers import get_lexer_by_name from pygments.formatters import HtmlFormatter if __name__ == '__main__': # get this file pygments_demo.py code = open("pygments_demo.py", "rw").read() # figure out the lexer lexer = get_lexer_by_name("python", stripall=True) # construct the formatter formatter = HtmlFormatter(linenos=False, cssclass="source") # style and formatting css = HtmlFormatter().get_style_defs('.source') highlighted_code = highlight(code, lexer, formatter) page = """ $ python pygments_demo.py > text.html <html> <head><style>{css}</style></head> <body>{highlighted_code}</body> </html> """.format(css=css, highlighted_code=highlighted_code) print(page)
  • 49. Output of the program from pygments import highlight from pygments.lexers import get_lexer_by_name from pygments.formatters import HtmlFormatter text.html if __name__ == '__main__': # get this file code = open("pygments_demo.py", "rw").read() # figure out the lexer lexer = get_lexer_by_name("python", stripall=True) # construct the formatter formatter = HtmlFormatter(linenos=False, cssclass="source") # style and formatting css = HtmlFormatter().get_style_defs('.source') highlighted_code = highlight(code, lexer, formatter) page = """ <html> <head><style>{css}</style></head> <body>{highlighted_code}</body> </html> """.format(css=css, highlighted_code=highlighted_code) print(page)
  • 50. #17 Work with Relational Databases (my_env)$ pip install django from datetime import datetime Internationalization! from django.contrib.auth.models import User from django.db import models from django.utils.translation import ugettext_lazy as _ class Post(models.Model): author = models.ForeignKey(User) title = models.CharField(_('Title'), max_length=100) content = models.TextField(_("Content")) pub_date = models.DateTimeField(_("Publication date")) class Comment(models.Model): post = models.ForeignKey(Post) name = models.CharField(_('Title'), max_length=100) content = models.TextField(_("Content"))
  • 51. #18 Work with NoSQL (my_env)$ pip install pymongo >>> import pymongo >>> connection = pymongo.Connection("localhost", 27017) >>> db = connection.test >>> db.name u'test' >>> db.my_collection Collection(Database(Connection('localhost', 27017), u'test'), u'my_collection') >>> db.my_collection.save({"x": 10}) ObjectId('4aba15ebe23f6b53b0000000') >>> db.my_collection.save({"x": 8}) ObjectId('4aba160ee23f6b543e000000') >>> db.my_collection.save({"x": 11}) ObjectId('4aba160ee23f6b543e000002') >>> db.my_collection.find_one() {u'x': 10, u'_id': ObjectId('4aba15ebe23f6b53b0000000')} >>> db.my_collection.create_index("x") u'x_1' >>> [item["x"] for item in db.my_collection.find().limit(2).skip(1)] [8, 11]
  • 52. #19 Message Queues (my_env)$ pip install celery==2.4.6 (my_env)$ pip install requests==0.9.2 import logging products/tasks.py import requests from celery import task from products.models import Product Decorators wrap a logger = logging.getLogger('products.tasks') function or method @task def check_all_images(): with a function. for product in Product.objects.all(): response = request.get(product.medium_image.url) if response.status_code != 200: msg = "Product {0} missing image".format(product.id) logging.warning(msg) >>> from products.tasks import confirm_all_images >>> result = confirm_all_images.delay() >>> result.ready() False >>> result.ready() True
  • 53. #20 Work with JSON >>> import json >>> data = { 'name':'Daniel Greenfeld', 'nickname':'pydanny', 'states_lived':['CA','KS','MD','NJ','VA','AD'], 'fiancee':'Audrey Roy' } >>> type(data) <type 'dict'> >>> payload = json.dumps(data) >>> payload '{"fiancee": "Audrey Roy", "nickname": "pydanny", "name": "Daniel Greenfeld", "states_lived": ["CA", "KS", "MD", "NJ", "VA", "AD"]}' >>> type(payload) <type 'str'> >>> restored = json.loads(payload) >>> type(restored) <type 'dict'> >>> restored {u'fiancee': u'Audrey Roy', u'nickname': u'pydanny', u'name': u'Daniel Greenfeld', u'states_lived': [u'CA', u'KS', u'MD', u'NJ', u'VA', u'AD' ]}
  • 54. #21 Serve the Web $ pip install flask==0.8 # webapp.py from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__": app.run() flask.pocoo.org
  • 55. #21 Serve the Web Lots more frameworks!
  • 56. #21 Serve the Web http://science.nasa.gov/
  • 57. #21 Serve the Web http://djangopackages.com http://opencomparison.org
  • 58. #21 Serve the Web http://consumernotebook.com
  • 59. #21 Serve the Web http://grove.io Hosted IRC
  • 60. Finis • Learn more at the following booths: • Python • Django • Pyladies