fix grammatical errors and confusing wording

This commit is contained in:
BrandonThaiTran 2020-07-29 12:37:53 -04:00
parent d6ddacb2d4
commit ff679bcaf1

View File

@ -12,9 +12,12 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": null,
"metadata": { "metadata": {
"collapsed": false "collapsed": false,
"jupyter": {
"outputs_hidden": false
}
}, },
"outputs": [], "outputs": [],
"source": [ "source": [
@ -23,22 +26,14 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 2, "execution_count": null,
"metadata": { "metadata": {
"collapsed": false "collapsed": false,
}, "jupyter": {
"outputs": [ "outputs_hidden": false
{
"name": "stdout",
"output_type": "stream",
"text": [
"Sebastian Raschka 01/27/2016 \n",
"\n",
"CPython 3.5.1\n",
"IPython 4.0.3\n"
]
} }
], },
"outputs": [],
"source": [ "source": [
"%watermark -a 'Sebastian Raschka' -v -d" "%watermark -a 'Sebastian Raschka' -v -d"
] ]
@ -166,7 +161,7 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"Now, the tricky part is that we have multiple independent namespaces in Python, and names can be reused for different namespaces (only the objects are unique, for example:\n", "Now, the tricky part is that we have multiple independent namespaces in Python, and names can be reused for different namespaces. Only the objects in namespaces are unique, for example:\n",
"\n", "\n",
"<pre>a_namespace = {'name_a':object_1, 'name_b':object_2, ...}\n", "<pre>a_namespace = {'name_a':object_1, 'name_b':object_2, ...}\n",
"b_namespace = {'name_a':object_3, 'name_b':object_4, ...}</pre>\n", "b_namespace = {'name_a':object_3, 'name_b':object_4, ...}</pre>\n",
@ -191,20 +186,14 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": null,
"metadata": { "metadata": {
"collapsed": false "collapsed": false,
}, "jupyter": {
"outputs": [ "outputs_hidden": false
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 global\n",
"5 in foo()\n"
]
} }
], },
"outputs": [],
"source": [ "source": [
"i = 1\n", "i = 1\n",
"\n", "\n",
@ -250,21 +239,14 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 11, "execution_count": null,
"metadata": { "metadata": {
"collapsed": false "collapsed": false,
}, "jupyter": {
"outputs": [ "outputs_hidden": false
{
"name": "stdout",
"output_type": "stream",
"text": [
"loc in foo(): True\n",
"loc in global: False\n",
"glob in global: True\n"
]
} }
], },
"outputs": [],
"source": [ "source": [
"#print(globals()) # prints global namespace\n", "#print(globals()) # prints global namespace\n",
"#print(locals()) # prints local namespace\n", "#print(locals()) # prints local namespace\n",
@ -277,7 +259,8 @@
"\n", "\n",
"foo()\n", "foo()\n",
"print('loc in global:', 'loc' in globals()) \n", "print('loc in global:', 'loc' in globals()) \n",
"print('glob in global:', 'foo' in globals())" "print('glob in global:', 'glob' in globals())\n",
"print('foo in global:', 'foo' in globals())"
] ]
}, },
{ {
@ -299,7 +282,7 @@
"where the arrows should denote the direction of the namespace-hierarchy search order. \n", "where the arrows should denote the direction of the namespace-hierarchy search order. \n",
"\n", "\n",
"- *Local* can be inside a function or class method, for example. \n", "- *Local* can be inside a function or class method, for example. \n",
"- *Enclosed* can be its `enclosing` function, e.g., if a function is wrapped inside another function. \n", "- *Enclosed* can be variables of an`enclosing` function, e.g., if a function is wrapped inside another function. \n",
"- *Global* refers to the uppermost level of the executing script itself, and \n", "- *Global* refers to the uppermost level of the executing script itself, and \n",
"- *Built-in* are special names that Python reserves for itself. \n", "- *Built-in* are special names that Python reserves for itself. \n",
"\n", "\n",
@ -311,21 +294,14 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 8, "execution_count": null,
"metadata": { "metadata": {
"collapsed": false "collapsed": false,
}, "jupyter": {
"outputs": [ "outputs_hidden": false
{
"name": "stdout",
"output_type": "stream",
"text": [
"3.141592653589793 from the math module\n",
"3.141592653589793 from the numpy package\n",
"3.141592653589793 from the scipy package\n"
]
} }
], },
"outputs": [],
"source": [ "source": [
"import numpy\n", "import numpy\n",
"import math\n", "import math\n",
@ -347,11 +323,7 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"<br>\n", "![LEGB figure](https://raw.githubusercontent.com/rasbt/python_reference/master/Images/scope_resolution_1.png)"
"<br>\n",
"![LEGB figure](https://raw.githubusercontent.com/rasbt/python_reference/master/Images/scope_resolution_1.png)\n",
"<br>\n",
"<br>"
] ]
}, },
{ {
@ -381,9 +353,12 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": null,
"metadata": { "metadata": {
"collapsed": false "collapsed": false,
"jupyter": {
"outputs_hidden": false
}
}, },
"outputs": [], "outputs": [],
"source": [ "source": [
@ -427,7 +402,7 @@
"source": [ "source": [
"### Here is why:\n", "### Here is why:\n",
"\n", "\n",
"We call `a_func()` first, which is supposed to print the value of `a_var`. According to the LEGB rule, the function will first look in its own local scope (L) if `a_var` is defined there. Since `a_func()` does not define its own `a_var`, it will look one-level above in the global scope (G) in which `a_var` has been defined previously.\n", "We call `a_func()` first, which is supposed to print the value of `a_var`. According to the LEGB rule, the function will first look in its own local scope (L) if `a_var` is defined there. Since `a_func()` does not define its own `a_var`, it will look two levels above (Local-> Enclosed -> Global) in the global scope (G) in which `a_var` has been defined previously.\n",
"<br>\n", "<br>\n",
"<br>" "<br>"
] ]
@ -443,9 +418,12 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 2, "execution_count": null,
"metadata": { "metadata": {
"collapsed": false "collapsed": false,
"jupyter": {
"outputs_hidden": false
}
}, },
"outputs": [], "outputs": [],
"source": [ "source": [
@ -501,21 +479,14 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 3, "execution_count": null,
"metadata": { "metadata": {
"collapsed": false "collapsed": false,
}, "jupyter": {
"outputs": [ "outputs_hidden": false
{
"name": "stdout",
"output_type": "stream",
"text": [
"global value [ a_var outside a_func() ]\n",
"local value [ a_var inside a_func() ]\n",
"local value [ a_var outside a_func() ]\n"
]
} }
], },
"outputs": [],
"source": [ "source": [
"a_var = 'global value'\n", "a_var = 'global value'\n",
"\n", "\n",
@ -538,30 +509,14 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 4, "execution_count": null,
"metadata": { "metadata": {
"collapsed": false "collapsed": false,
}, "jupyter": {
"outputs": [ "outputs_hidden": false
{
"ename": "UnboundLocalError",
"evalue": "local variable 'a_var' referenced before assignment",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mUnboundLocalError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-4-a6cdd0ee9a55>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma_var\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'[ a_var outside a_func() ]'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0ma_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m<ipython-input-4-a6cdd0ee9a55>\u001b[0m in \u001b[0;36ma_func\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0ma_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0ma_var\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0ma_var\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma_var\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'[ a_var inside a_func() ]'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mUnboundLocalError\u001b[0m: local variable 'a_var' referenced before assignment"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 [ a_var outside a_func() ]\n"
]
} }
], },
"outputs": [],
"source": [ "source": [
"a_var = 1\n", "a_var = 1\n",
"\n", "\n",
@ -573,6 +528,30 @@
"a_func()" "a_func()"
] ]
}, },
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is how to make the above code work:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"a_var = 1\n",
"\n",
"def a_func():\n",
" global a_var\n",
" a_var = a_var + 1\n",
" print(a_var, '[ a_var inside a_func() ]')\n",
"\n",
"print(a_var, '[ a_var outside a_func() ]')\n",
"a_func()"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -610,9 +589,12 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 4, "execution_count": null,
"metadata": { "metadata": {
"collapsed": false "collapsed": false,
"jupyter": {
"outputs_hidden": false
}
}, },
"outputs": [], "outputs": [],
"source": [ "source": [
@ -657,7 +639,7 @@
"source": [ "source": [
"### Here is why:\n", "### Here is why:\n",
"\n", "\n",
"Let us quickly recapitulate what we just did: We called `outer()`, which defined the variable `a_var` locally (next to an existing `a_var` in the global scope). Next, the `outer()` function called `inner()`, which in turn defined a variable with of name `a_var` as well. The `print()` function inside `inner()` searched in the local scope first (L->E) before it went up in the scope hierarchy, and therefore it printed the value that was assigned in the local scope." "Let us quickly recapitulate what we just did: We called `outer()`, which defined the variable `a_var` locally (next to an existing `a_var` in the global scope). Next, the `outer()` function called `inner()`, which in turn defined a variable with of name `a_var` as well. The `print()` function inside `inner()` searched in the local scope first (L) before it went up in the scope hierarchy, and therefore it printed the value that was assigned in the local scope."
] ]
}, },
{ {
@ -670,21 +652,14 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 5, "execution_count": null,
"metadata": { "metadata": {
"collapsed": false "collapsed": false,
}, "jupyter": {
"outputs": [ "outputs_hidden": false
{
"name": "stdout",
"output_type": "stream",
"text": [
"outer before: local value\n",
"in inner(): inner value\n",
"outer after: inner value\n"
]
} }
], },
"outputs": [],
"source": [ "source": [
"a_var = 'global value'\n", "a_var = 'global value'\n",
"\n", "\n",
@ -715,7 +690,7 @@
"source": [ "source": [
"## 3. LEGB - Local, Enclosed, Global, Built-in\n", "## 3. LEGB - Local, Enclosed, Global, Built-in\n",
"\n", "\n",
"To wrap up the LEGB rule, let us come to the built-in scope. Here, we will define our \"own\" length-funcion, which happens to bear the same name as the in-built `len()` function. What outcome do you excpect if we'd execute the following code?" "To wrap up the LEGB rule, let us come to the built-in scope. Here, we will define our \"own\" length-funcion, which happens to bear the same name as the in-built `len()` function. What outcome do you expect if we'd execute the following code?"
] ]
}, },
{ {
@ -727,9 +702,12 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 6, "execution_count": null,
"metadata": { "metadata": {
"collapsed": false "collapsed": false,
"jupyter": {
"outputs_hidden": false
}
}, },
"outputs": [], "outputs": [],
"source": [ "source": [
@ -805,9 +783,12 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 59, "execution_count": null,
"metadata": { "metadata": {
"collapsed": false "collapsed": false,
"jupyter": {
"outputs_hidden": false
}
}, },
"outputs": [], "outputs": [],
"source": [ "source": [
@ -887,19 +868,14 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 42, "execution_count": null,
"metadata": { "metadata": {
"collapsed": false "collapsed": false,
}, "jupyter": {
"outputs": [ "outputs_hidden": false
{
"name": "stdout",
"output_type": "stream",
"text": [
"8\n"
]
} }
], },
"outputs": [],
"source": [ "source": [
"a_var = 2\n", "a_var = 2\n",
"\n", "\n",
@ -930,9 +906,12 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 6, "execution_count": null,
"metadata": { "metadata": {
"collapsed": false "collapsed": false,
"jupyter": {
"outputs_hidden": false
}
}, },
"outputs": [], "outputs": [],
"source": [ "source": [
@ -941,9 +920,12 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 7, "execution_count": null,
"metadata": { "metadata": {
"collapsed": false "collapsed": false,
"jupyter": {
"outputs_hidden": false
}
}, },
"outputs": [], "outputs": [],
"source": [ "source": [
@ -952,9 +934,12 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 8, "execution_count": null,
"metadata": { "metadata": {
"collapsed": false "collapsed": false,
"jupyter": {
"outputs_hidden": false
}
}, },
"outputs": [], "outputs": [],
"source": [ "source": [
@ -963,9 +948,12 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 9, "execution_count": null,
"metadata": { "metadata": {
"collapsed": false "collapsed": false,
"jupyter": {
"outputs_hidden": false
}
}, },
"outputs": [], "outputs": [],
"source": [ "source": [
@ -974,9 +962,12 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 58, "execution_count": null,
"metadata": { "metadata": {
"collapsed": false "collapsed": false,
"jupyter": {
"outputs_hidden": false
}
}, },
"outputs": [], "outputs": [],
"source": [ "source": [
@ -1024,20 +1015,14 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 5, "execution_count": null,
"metadata": { "metadata": {
"collapsed": false "collapsed": false,
}, "jupyter": {
"outputs": [ "outputs_hidden": false
{
"name": "stdout",
"output_type": "stream",
"text": [
"4 -> a in for-loop\n",
"4 -> a in global\n"
]
} }
], },
"outputs": [],
"source": [ "source": [
"for a in range(5):\n", "for a in range(5):\n",
" if a == 4:\n", " if a == 4:\n",
@ -1054,20 +1039,14 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 9, "execution_count": null,
"metadata": { "metadata": {
"collapsed": false "collapsed": false,
}, "jupyter": {
"outputs": [ "outputs_hidden": false
{
"name": "stdout",
"output_type": "stream",
"text": [
"4 -> b in for-loop\n",
"4 -> b in global\n"
]
} }
], },
"outputs": [],
"source": [ "source": [
"b = 1\n", "b = 1\n",
"for b in range(5):\n", "for b in range(5):\n",
@ -1085,20 +1064,14 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": null,
"metadata": { "metadata": {
"collapsed": false "collapsed": false,
}, "jupyter": {
"outputs": [ "outputs_hidden": false
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0, 1, 2, 3, 4]\n",
"1 -> i in global\n"
]
} }
], },
"outputs": [],
"source": [ "source": [
"i = 1\n", "i = 1\n",
"print([i for i in range(5)])\n", "print([i for i in range(5)])\n",
@ -1124,15 +1097,6 @@
"\n", "\n",
"\"List comprehensions no longer support the syntactic form `[... for var in item1, item2, ...]`. Use `[... for var in (item1, item2, ...)]` instead. Also note that list comprehensions have different semantics: they are closer to syntactic sugar for a generator expression inside a `list()` constructor, and in particular the loop control variables are no longer leaked into the surrounding scope.\"" "\"List comprehensions no longer support the syntactic form `[... for var in item1, item2, ...]`. Use `[... for var in (item1, item2, ...)]` instead. Also note that list comprehensions have different semantics: they are closer to syntactic sugar for a generator expression inside a `list()` constructor, and in particular the loop control variables are no longer leaked into the surrounding scope.\""
] ]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": []
} }
], ],
"metadata": { "metadata": {
@ -1151,9 +1115,9 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.5.0" "version": "3.8.2"
} }
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 0 "nbformat_minor": 4
} }