Modularity¶
Functions¶
Defining Functions¶
>>> def square(x):
... return x * x
...
>>> square(5)
25
>>> def launch_missiles():
... print("Missiles launched!")
...
>>> launch_missiles()
Missiles launched!
>>> def even_or_odd(n):
... if n % 2 == 0:
... print("even")
... return
... print("odd")
...
>>> w = even_or_odd(31)
odd
>>> w is None
True
>>> def nth_root(radicand, n):
... return radicand ** (1/n)
...
>>> nth_root(16,2)
4.0
>>> nth_root(27,3)
3.0
dunder
Our way of pronouncing special names
A portmanteau of “double underscore”
Instead of “underscore underscore name underscore underscore” we’ll say “dunder name”
name¶
__name__
Specially named variable allowing us to detect whether a module is run as a script or imported into another module.
if __name__ == '__main__':
if name = main, execute function, if name != main, it knows it’s being imported into another module, not executed. By using this statement, the python script can be executed as a script or module.__name__
will be set as__main__
depending on how it’s used - if runningpython words.py
,__main__
will return as__name__
instead.
print(__name__)
The Python Execution Model¶
def
is a statementTop-level functions are defined when a module is imported or run
Module Script or Program¶
Python module - Convenient import with API
Python script - Convenient execution from the command line (scripts should be importable)
Python program - Perhaps composed of many modules
Command Line Arguments¶
import sys
from urllib.request import urlopen
def fetch_words(url):
story = urlopen(url)
story_words = []
for line in story:
line_words = line.decode('utf-8').split()
for word in line_words:
story_words.append(word)
story.close()
return story_words
def print_items(items):
for item in items:
print (item)
def main():
words = fetch_words()
print_words(words)
if __name__ == '__main__':
main(sys.argv[1])
Docstrings¶
Literal strings which document functions, modules, and classes.
They must be the first statement in the blocks for these constructs.
PEP 257
Official Python convention for docstrings.
But… not widely adopted.
Sphinx
Tool to create HTML documentation from Python docstrings.
""" Retrieve and print words from a URL.
Usage:
python3 words.py <URL>
"""
import sys
from urllib.request import urlopen
def fetch_words(url):
"""Fetch a list of words from a URL.
Args:
url: The URL of a UTF-8 text-document.
Returns:
A list of strings containing words from the document
"""
story = urlopen(url)
story_words = []
for line in story:
line_words = line.decode('utf-8').split()
for word in line_words:
story_words.append(word)
story.close()
return story_words
def print_items(items):
"""Print items one per line.
Args:
An iterable series of printable items.
"""
for item in items:
print (item)
def main():
"""Print each word from a text document from at a URL.
Args:
url: The URL of a UTF-8 text document.
"""
words = fetch_words()
print_words(words)
if __name__ == '__main__':
main(sys.argv[1])
>>> import words
>>> help(words)
Help on module words:
NAME
words - Retrieve and print words from a URL.
DESCRIPTION
Usage:
python3 words.py <URL>
FUNCTIONS
fetch_words(url)
Fetch a list of words from a URL.
Args:
url: The URL of a UTF-8 text document.
Returns:
A list of strings containing the words from the document
main(url)
Print each word from a text document from at a URL.
Comments¶
Code is ideally clear enough without ancillary explanation
Sometimes you need to explain why your code is written as it is
Comments in Python start with
#
and extend to the end of the line
if _name_ =='__main__':
main(sys.argv[1]) # The Oth arg is the module filename.]