{ "cells": [ { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Playing around with various ways of doing a function\n", "for someone's add-on for [anki](https://en.wikipedia.org/wiki/Anki_(software%29)\n", "flash card stuff." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = 'examples/animals/mammals'\n", "s.count('/')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def foo(s, delimiter='/'):\n", " terms = s.split(delimiter)\n", " output_terms = []\n", " for term in terms:\n", " output_terms.append(term)\n", " yield delimiter.join(output_terms)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "deletable": true, "editable": true, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "examples\n", "examples/animals\n", "examples/animals/mammals\n" ] } ], "source": [ "for t in foo(s):\n", " print(t)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "known_good_output = list(foo(s))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "# I like this version best.\n", "\n", "def foo(s, delimiter='/'):\n", " terms = s.split(delimiter)\n", " for i in range(len(terms)):\n", " yield delimiter.join(terms[:i+1])\n", "\n", "assert list(foo(s)) == known_good_output" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "# This reduces the body to one statement,\n", "# but the duplication of s.split(delimiter) is ugly,\n", "# so I do not like this version.\n", "\n", "def foo(s, delimiter='/'):\n", " yield from (\n", " delimiter.join(s.split(delimiter)[:i+1])\n", " for i in range(len(s.split(delimiter)))\n", " )\n", "\n", "assert list(foo(s)) == known_good_output" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "# Using terms is less ugly.\n", "\n", "def foo(s, delimiter='/'):\n", " terms = s.split(delimiter)\n", " yield from (\n", " delimiter.join(terms[:i+1])\n", " for i in range(len(terms))\n", " )\n", "\n", "assert list(foo(s)) == known_good_output" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "# Strictly speaking, this is a regular function\n", "# that returns a generator expression.\n", "# The duplication of s.split(delimiter) is ugly.\n", "\n", "def foo(s, delimiter='/'):\n", " return (\n", " delimiter.join(s.split(delimiter)[:i+1])\n", " for i in range(len(s.split(delimiter)))\n", " )\n", "\n", "\n", "assert list(foo(s)) == known_good_output" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "deletable": true, "editable": true, "scrolled": true }, "outputs": [], "source": [ "def foo(s, delimiter='/'):\n", " terms = s.split(delimiter)\n", " return (delimiter.join(terms[:i+1])\n", " for i in range(len(terms)))\n", "\n", "assert list(foo(s)) == known_good_output" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from itertools import accumulate" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false, "deletable": true, "editable": true, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "['examples', 'examplesanimals', 'examplesanimalsmammals']" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Now for a functional approach.\n", "\n", "def foo(s, delimiter='/'):\n", " terms = s.split(delimiter)\n", " for x in accumulate(terms, str.__add__):\n", " yield x\n", "\n", "list(foo(s))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false, "deletable": true, "editable": true, "scrolled": true }, "outputs": [], "source": [ "def foo(s, delimiter='/'):\n", " terms = s.split(delimiter)\n", " for x in accumulate(terms, lambda x, y: delimiter.join((x, y))):\n", " yield x\n", " \n", "assert list(foo(s)) == known_good_output" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false, "deletable": true, "editable": true, "scrolled": true }, "outputs": [], "source": [ "def foo(s, delimiter='/'):\n", " terms = s.split(delimiter)\n", " yield from (\n", " x\n", " for x in accumulate(terms, lambda x, y: delimiter.join((x, y)))\n", " )\n", " \n", "assert list(foo(s)) == known_good_output" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false, "deletable": true, "editable": true, "scrolled": true }, "outputs": [], "source": [ "def foo(s, delimiter='/'):\n", " terms = s.split(delimiter)\n", " yield from accumulate(terms, lambda x, y: delimiter.join((x, y)))\n", " \n", "assert list(foo(s)) == known_good_output" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false, "deletable": true, "editable": true, "scrolled": true }, "outputs": [], "source": [ "def foo(s, delimiter='/'):\n", " yield from accumulate(\n", " s.split(delimiter),\n", " lambda x, y: delimiter.join((x, y))\n", " )\n", " \n", "assert list(foo(s)) == known_good_output" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false, "deletable": true, "editable": true, "scrolled": true }, "outputs": [], "source": [ "def foo(s, delimiter='/'):\n", " return accumulate(\n", " s.split(delimiter),\n", " lambda x, y: delimiter.join((x, y))\n", " )\n", " \n", "assert list(foo(s)) == known_good_output" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false, "deletable": true, "editable": true, "scrolled": true }, "outputs": [], "source": [ "def foo(s, delimiter='/'):\n", " return accumulate(\n", " s.split(delimiter),\n", " lambda x, y: x + delimiter + y\n", " )\n", " \n", "assert list(foo(s)) == known_good_output" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.0" } }, "nbformat": 4, "nbformat_minor": 2 }