Files
learn-python3/notebooks/intermediate/exercises/01_std_lib2_exercise.ipynb
Jerry Pussinen 52ca70b866 Pyupgrade 3.10+
2023-04-21 13:45:36 +03:00

224 lines
6.4 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 1. Let's mock things!\n",
"Below you can see `get_wiki_article` function which is a very simple implementation for fetching an article from wikipedia. Your task is to mock it's implementation such that it's going to always return `'Python is cool!'`. However, note that you should be able to check which argument is given to `urlopen` when `get_wiki_article` is called.\n",
"\n",
"**Note**: `get_content_of_url` uses [`urrlib`](https://docs.python.org/3/library/urllib.html#module-urllib), which is part of the Standard Library, for creating a HTTP request. Usually it's preferable to use [`requests`](http://docs.python-requests.org/en/master/) library (not part of the Standard Library) for such operations. Actually, `requests` uses `urllib` under the hood so it's good to know what's happening when you start using `requests` - or maybe you have already used it."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"editable": false
},
"outputs": [],
"source": [
"from urllib.request import urlopen\n",
"\n",
"\n",
"def get_wiki_article(name):\n",
" url = f\"https://en.wikipedia.org/wiki/{name}\"\n",
" response = urlopen(url)\n",
" content = str(response.read())\n",
" return content"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Your implementation here"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's verify it works as expected."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"editable": false
},
"outputs": [],
"source": [
"article = \"Python_(programming_language)\"\n",
"res = get_wiki_article(article)\n",
"assert \"Guido van Rossum\" not in res, \"Guido is still there!\"\n",
"assert res == \"Python is cool!\"\n",
"urlopen.assert_called_with(\n",
" \"https://en.wikipedia.org/wiki/Python_(programming_language)\"\n",
")\n",
"\n",
"print(\"All good!\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 2. The power of `collections` module"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2.1 Creating a namedtuple\n",
"Create a namedtuple `Car` which has fields `price`, `mileage`, and `brand`. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Your implemenation here"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's test it."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"editable": false
},
"outputs": [],
"source": [
"car1 = Car(25000, 2000, \"BMW\")\n",
"assert car1.price == 25000\n",
"assert car1.mileage == 2000\n",
"assert car1.brand == \"BMW\"\n",
"assert isinstance(car1, tuple)\n",
"\n",
"# Note that indexing works also!\n",
"# This means that if you change a tuple into a namedtuple,\n",
"# the change will be backwards compatible.\n",
"assert car1[2] == \"BMW\"\n",
"\n",
"print(\"All good!\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The power of namedtuples is their simplicity. If `Car` would have been implemented as a class, the implementation would have been notably longer. However, if you would need to be able to e.g. change the `mileage` or `price` during the lifetime of a `Car` instance, consider using `class` because `tuples` are immutable."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2.2 dict of dicts\n",
"Implement a `name_mapping` function which takes a collection of names as argument. \n",
"\n",
"#### The specification for `name_mapping`\n",
"* you can assume that all the elements in the names collection are strings\n",
"* if the provided names collection is empty, returns an empty dict\n",
"* returns a dictionary of dictionaries\n",
" * outer dictionary should contain keys `vowel` and `consonant`\n",
" * `vowel` and `consonant` keys should have dictionaries of names (keys) and their occurences (values) as values\n",
" * names belong to either `vowel` or `consonant` based on their first letter\n",
" * vowels are defined by the `VOWELS` constant\n",
" * if there are only names starting with a vowel, `consonant` key should not be present in the return value (same applies vice versa)\n",
"* see the tests below for complete examples \n",
"\n",
"Tip: `defaultdict` and `Counter` may be helpful here :)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"editable": false
},
"outputs": [],
"source": [
"VOWELS = (\"a\", \"e\", \"i\", \"o\", \"u\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def name_mapping(names):\n",
" # Your implementation here"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's verify that it works correctly!"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"editable": false
},
"outputs": [],
"source": [
"names = (\"Alice\", \"John\", \"Lisa\", \"John\", \"Eric\", \"Waldo\", \"annie\", \"Alice\", \"John\")\n",
"expected = {\n",
" \"consonant\": {\"John\": 3, \"Waldo\": 1, \"Lisa\": 1},\n",
" \"vowel\": {\"Alice\": 2, \"annie\": 1, \"Eric\": 1},\n",
"}\n",
"assert name_mapping(names) == expected\n",
"print(\"First ok!\")\n",
"\n",
"only_consonants = (\"John\", \"Doe\", \"Doe\")\n",
"expected2 = {\"consonant\": {\"John\": 1, \"Doe\": 2}}\n",
"assert name_mapping(only_consonants) == expected2\n",
"print(\"Second ok!\")\n",
"\n",
"assert name_mapping([]) == {}\n",
"\n",
"print(\"All ok!\")"
]
}
],
"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.5.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}