## Python-related videos indexed so you can find it

**Example:** PyCon US 2012

## Product of the elements in a list

Design goal: should be just one line, without using explicit iteration over the list.

**Sum** of the elements:

>>> li = [2,3,5] >>> sum(li) 10

**Product** of the elements:

>>> li = [2,3,5] >>> from operator import mul >>> reduce(mul, li) 30

## Digits of PI (Part 2)

On the Python mailing list I got some great answers on how to generate the digits of PI. Here I sum them up.

**Solution 1**

Tichodroma forwarded me to http://mail.python.org/pipermail/edu-sig/2006-July/006810.html.

Quote:

Here's a generator I coded up based on a paper by Gibbons: It's simple to code, but I think you have to read the paper to figure out what it's doing. (I just translated some code, so I really can't tell you :-) In the paper, this was done in a lazy functional language. I was mostly interested to see how it would translate to a Python generator. # pi.py -- imlementation of Gibbons' spigot algorithm for pi # John Zelle 4-5-06 def pi_digits(): """generator for digits of pi""" q,r,t,k,n,l = 1,0,1,1,3,3 while True: if 4*q+r-t < n*t: yield n q,r,t,k,n,l = (10*q,10*(r-n*t),t,k,(10*(3*q+r))/t-10*n,l) else: q,r,t,k,n,l = (q*k,(2*q+r)*l,t*l,k+1,(q*(7*k+2)+r*l)/(t*l),l+2) Here it is in action: >>> import pi >>> digits = pi.pidigits() >>> for i in range(30): print digits.next(), ... 3 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 2 3 8 4 6 2 6 4 3 3 8 3 2 7 >>> Since this uses long ints, it slows down considerably after a few thousand digits. You might want to use psyco when generating really "deep" digits. --John

It generates the digits of PI one after the other. It works well bit if you want lots of digits, it gets really slow.

**Solution 2**

E. Woiski suggested using the library SymPy.

sudo apt-get install python-sympy

>>> from sympy.mpmath import mp >>> mp.dps = 1000 # number of digits >>> +mp.pi # str(mp.pi)

Very fast and simple. The only problem might be that you need to install sympy.

**Solution 3 (update, 20121128)**

One of my students called G. Szegedi came up with this solution:

from bigfloat import precision import bigfloat str_pi = str(bigfloat.atan2(+0.0,-0.0,precision(1000)))

With the bigfloat package you can do high precision floating-point arithmetic.

## Digits of PI (Part 1)

**Problem**

You want to work with the digits of PI. Why? For instance you want a new job (screenshot here if it got removed since then).

**Solution**

I like simple solutions. So instead of generating the digits, I simply fetched the data from the web. This is a fast, efficient, and painless approach of the problem :) Visit http://newton.ex.ac.uk/research/qsystems/collabs/pi/, where you can download several data files.

**For the lazy pigs**

I made a script that downloads the data, parses them, and returns the digits as a string. Here it is.

Usage (get the first 30 digits of PI after the dot):

#!/usr/bin/env python from jabbapylib.math import pi def main(): digits = pi.get_digits_of(pi.PI3) # get 10^3 = 1000 digits print digits[:30] if __name__ == "__main__": main()

Output:

141592653589793238462643383279

jabbapylib is here

## Quick Python Script Explanation for Programmers

At http://coffeeghost.net/pybat/python_cheatsheet.png, I found the following cheat sheet:

## Python Regular Expression Testing Tool

See http://www.pythonregex.com/. Cool stuff, it also generates source code. Happiness!

For a screenshot, click on the image on the right side.

## Python’s strftime directives

Python’s strftime directives is a thing that I don’t always need, but when I do, I get frustrated finding it on the net. So here is a shortcut: http://strftime.org/.

I also copy/paste it here for future references:

%a Locale’s abbreviated weekday name. %A Locale’s full weekday name. %b Locale’s abbreviated month name. %B Locale’s full month name. %c Locale’s appropriate date and time representation. %d Day of the month as a decimal number [01,31]. %f Microsecond as a decimal number [0,999999], zero-padded on the left %H Hour (24-hour clock) as a decimal number [00,23]. %I Hour (12-hour clock) as a decimal number [01,12]. %j Day of the year as a decimal number [001,366]. %m Month as a decimal number [01,12]. %M Minute as a decimal number [00,59]. %p Locale’s equivalent of either AM or PM. %S Second as a decimal number [00,61]. %U Week number of the year (Sunday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Sunday are considered to be in week 0. %w Weekday as a decimal number [0(Sunday),6]. %W Week number of the year (Monday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Monday are considered to be in week 0. %x Locale’s appropriate date representation. %X Locale’s appropriate time representation. %y Year without century as a decimal number [00,99]. %Y Year with century as a decimal number. %Z Time zone name (no characters if no time zone exists). %% A literal '%' character. </pre>%a Locale’s abbreviated weekday name. %A Locale’s full weekday name. %b Locale’s abbreviated month name. %B Locale’s full month name. %c Locale’s appropriate date and time representation. %d Day of the month as a decimal number [01,31]. %f Microsecond as a decimal number [0,999999], zero-padded on the left %H Hour (24-hour clock) as a decimal number [00,23]. %I Hour (12-hour clock) as a decimal number [01,12]. %j Day of the year as a decimal number [001,366]. %m Month as a decimal number [01,12]. %M Minute as a decimal number [00,59]. %p Locale’s equivalent of either AM or PM. %S Second as a decimal number [00,61]. %U Week number of the year (Sunday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Sunday are considered to be in week 0. %w Weekday as a decimal number [0(Sunday),6]. %W Week number of the year (Monday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Monday are considered to be in week 0. %x Locale’s appropriate date representation. %X Locale’s appropriate time representation. %y Year without century as a decimal number [00,99]. %Y Year with century as a decimal number. %Z Time zone name (no characters if no time zone exists). %% A literal '%' character.

## urllib.quote, urllib.unquote

>>> import urllib >>> urllib.quote('hello world') 'hello%20world' >>> urllib.unquote('hello%20world') 'hello world'

## produce the output of Unix’s date command

**Problem**

You want to get the same output as Unix’s date command but you don’t want to make an external call. How to produce this output in pure Python?

**Solution**

I posed this question today on the python-list and I got the following answer from Chris R.:

From POSIX (http://pubs.opengroup.org/onlinepubs/009695399/utilities/date.html): When no formatting operand is specified, the output in the POSIX locale shall be equivalent to specifying: date "+%a %b %e %H:%M:%S %Z %Y" Therefore: from time import strftime print strftime("%a %b %e %H:%M:%S %Z %Y") But note that `date` is locale-sensitive; imitating that would be a bit more complicated.

Thus, the code snippet:

from time import strftime print strftime("%a %b %e %H:%M:%S %Z %Y") # sample output: # Thu Apr 5 23:55:56 CEST 2012