Autosave: 2023-02-15 15:31:31
This commit is contained in:
parent
4b34232081
commit
53c5012ce9
6 changed files with 366 additions and 6 deletions
|
@ -14,3 +14,113 @@ Dictionaries:
|
||||||
- Are mutable
|
- Are mutable
|
||||||
- Are indexed by a key which references a value
|
- Are indexed by a key which references a value
|
||||||
- Can be increased/decreased in length by adding/removing new members.
|
- Can be increased/decreased in length by adding/removing new members.
|
||||||
|
|
||||||
|
## Basic usage
|
||||||
|
|
||||||
|
Dictionaries are declared with `{...}`:
|
||||||
|
|
||||||
|
```python
|
||||||
|
cities = {
|
||||||
|
'Wales': 'Cardiff',
|
||||||
|
'England': 'London',
|
||||||
|
'Scotland': 'Edinburgh',
|
||||||
|
'Northern Ireland': 'Belfast',
|
||||||
|
'Ireland': 'Dublin'
|
||||||
|
}
|
||||||
|
|
||||||
|
print(type(citites))
|
||||||
|
# <class 'dict'>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Accessing entries
|
||||||
|
|
||||||
|
```python
|
||||||
|
print(cities['Wales'])
|
||||||
|
# Cardiff
|
||||||
|
|
||||||
|
print(cities.get('Ireland'))
|
||||||
|
# Dublin
|
||||||
|
|
||||||
|
print(cities.values())
|
||||||
|
# ['Cardiff', 'London', 'Edinburgh', 'Belfast', 'Dublin']
|
||||||
|
|
||||||
|
print(cities.keys())
|
||||||
|
# ['Wales', 'England', 'Scotland', 'Northern Ireland', 'Ireland']
|
||||||
|
|
||||||
|
print(cities.items())
|
||||||
|
# [('Wales', 'Cardiff'), ('England', 'London'), ('Scotland', 'Edinburgh'), ('Northern Ireland', 'Belfast'), ('Ireland', 'Dublin')]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Predicates
|
||||||
|
|
||||||
|
```py
|
||||||
|
print('Wales' in cities)
|
||||||
|
# True
|
||||||
|
|
||||||
|
print('France' not in cities)
|
||||||
|
# True
|
||||||
|
```
|
||||||
|
|
||||||
|
## Looping
|
||||||
|
|
||||||
|
```py
|
||||||
|
for country in cities:
|
||||||
|
print(country, end=', ')
|
||||||
|
print(cities[country])
|
||||||
|
|
||||||
|
"""
|
||||||
|
Wales, Cardiff
|
||||||
|
England, London
|
||||||
|
Scotland, Edinburgh
|
||||||
|
Northern Ireland, Belfast
|
||||||
|
Ireland, Dublin
|
||||||
|
"""
|
||||||
|
|
||||||
|
for e in country.values():
|
||||||
|
print(e)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Updating values
|
||||||
|
|
||||||
|
```py
|
||||||
|
cities['Wales'] = 'Swansea'
|
||||||
|
print(cities)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Removing values
|
||||||
|
|
||||||
|
```py
|
||||||
|
# Remove last item
|
||||||
|
cities.popitem()
|
||||||
|
print(cities)
|
||||||
|
# {'Wales': 'Cardiff', 'England': 'London', 'Scotland': 'Edinburgh', 'Northern Ireland': 'Belfast'}
|
||||||
|
|
||||||
|
# Remove specific entry by key
|
||||||
|
|
||||||
|
cities.pop('Northern Ireland')
|
||||||
|
print(cities)
|
||||||
|
# {'Wales': 'Cardiff', 'England': 'London', 'Scotland': 'Edinburgh'}
|
||||||
|
|
||||||
|
del cities['Scotland']
|
||||||
|
print(cities)
|
||||||
|
{'Wales': 'Cardiff', 'England': 'London'}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Containers as values
|
||||||
|
|
||||||
|
```py
|
||||||
|
seasons = {
|
||||||
|
'Spring': ('Mar', 'Apr', 'May'),
|
||||||
|
'Summer': ('June', 'July', 'August'),
|
||||||
|
'Autumn': ('September', 'October', 'November'),
|
||||||
|
'Winter': ('December', 'January', 'February')}
|
||||||
|
|
||||||
|
print(seasons['Spring'])
|
||||||
|
print(seasons['Spring'][1])
|
||||||
|
|
||||||
|
"""
|
||||||
|
('Mar', 'Apr', 'May')
|
||||||
|
Apr
|
||||||
|
"""
|
||||||
|
|
||||||
|
```
|
||||||
|
|
124
Programming_Languages/Python/Syntax/Functions_in_Python.md
Normal file
124
Programming_Languages/Python/Syntax/Functions_in_Python.md
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
---
|
||||||
|
categories:
|
||||||
|
- Programming Languages
|
||||||
|
tags: [python]
|
||||||
|
---
|
||||||
|
|
||||||
|
# Functions
|
||||||
|
|
||||||
|
- Convention is to leave a double line-break after a function definition (but not with nested functions - here, a single linebreak is sufficient)
|
||||||
|
- Scope within functions is demarcated by indents, as everything in Python
|
||||||
|
- We use a docstring _within_ the function body, to document our function. This text will then show up in Intellisense etc.
|
||||||
|
|
||||||
|
## Basic examples
|
||||||
|
|
||||||
|
```py
|
||||||
|
|
||||||
|
# No params, no return
|
||||||
|
def print_msg():
|
||||||
|
""" A function that prints hello world """
|
||||||
|
print('Hello World!')
|
||||||
|
|
||||||
|
print_msg()
|
||||||
|
# Hello World!
|
||||||
|
|
||||||
|
print(type(print_msg))
|
||||||
|
# <class 'function'>
|
||||||
|
|
||||||
|
# Params, no return
|
||||||
|
def print_my_msg(msg):
|
||||||
|
""" A simple function to print a message """
|
||||||
|
print(msg)
|
||||||
|
|
||||||
|
print_my_msg('Good day')
|
||||||
|
# Good day
|
||||||
|
|
||||||
|
# Params and return
|
||||||
|
def square(n):
|
||||||
|
return n * n
|
||||||
|
|
||||||
|
print(square(2))
|
||||||
|
# 4
|
||||||
|
|
||||||
|
result = square(4)
|
||||||
|
print(result)
|
||||||
|
|
||||||
|
# 16
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## Default parameters
|
||||||
|
|
||||||
|
```py
|
||||||
|
def greeter(name, message='Live Long and Prosper'):
|
||||||
|
print('Welcome', name, '-', message)
|
||||||
|
|
||||||
|
greeter('Eloise')
|
||||||
|
|
||||||
|
# Welcome Eloise - Live Long and Prosper
|
||||||
|
```
|
||||||
|
|
||||||
|
## Function with arbitrary parameter list
|
||||||
|
|
||||||
|
```python
|
||||||
|
def greeter(*args):
|
||||||
|
for name in args:
|
||||||
|
print('Welcome', name)
|
||||||
|
|
||||||
|
greeter('John', 'Denise', 'Phoebe', 'Adam', 'Gryff', 'Natalia')
|
||||||
|
|
||||||
|
"""
|
||||||
|
Welcome John
|
||||||
|
Welcome Denise
|
||||||
|
Welcome Phoebe
|
||||||
|
Welcome Adam
|
||||||
|
Welcome Gryff
|
||||||
|
Welcome Natalia
|
||||||
|
"""
|
||||||
|
```
|
||||||
|
|
||||||
|
## Scoping
|
||||||
|
|
||||||
|
Function variables are locally scoped by default.
|
||||||
|
|
||||||
|
They can access variables that are outer to them and can redefine them within their own scope _and_ within the global scope using the keywords `global` and `nonlocal`.
|
||||||
|
|
||||||
|
Below a global variable is accessed and changed but only internally within a function scope
|
||||||
|
|
||||||
|
```py
|
||||||
|
max = 100
|
||||||
|
print('initial value of max:', max)
|
||||||
|
|
||||||
|
def print_max():
|
||||||
|
global max
|
||||||
|
max = max + 1
|
||||||
|
print('inside function:', max)
|
||||||
|
|
||||||
|
|
||||||
|
print_max()
|
||||||
|
print('outside function:', max)
|
||||||
|
|
||||||
|
"""
|
||||||
|
initial value of max: 100
|
||||||
|
inside function: 101
|
||||||
|
outside function: 101
|
||||||
|
"""
|
||||||
|
```
|
||||||
|
|
||||||
|
Below a higher-scoped variable is redefined from within the lower scope:
|
||||||
|
|
||||||
|
```py
|
||||||
|
def myfunc1():
|
||||||
|
x = "John"
|
||||||
|
def myfunc2():
|
||||||
|
nonlocal x
|
||||||
|
x = "hello"
|
||||||
|
myfunc2()
|
||||||
|
return x
|
||||||
|
|
||||||
|
print(myfunc1())
|
||||||
|
|
||||||
|
# hello
|
||||||
|
```
|
||||||
|
|
||||||
|
We cannot however redefine a global variable from a function scope permanently. It will remain whatever it is in global scope, after the function has run.
|
33
Programming_Languages/Python/Syntax/Lambdas_in_Python.md
Normal file
33
Programming_Languages/Python/Syntax/Lambdas_in_Python.md
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
---
|
||||||
|
categories:
|
||||||
|
- Programming Languages
|
||||||
|
tags: [python]
|
||||||
|
---
|
||||||
|
|
||||||
|
# Lambdas in Python
|
||||||
|
|
||||||
|
In Python, anonymous functions like arrow-functions in JavaScript (`() => {}`) are immediately invoked and unnamed. They are called lambdas.
|
||||||
|
|
||||||
|
Whilst they are unnamed, just like JS, the value they return can be stored in a variable. They do not require the `return` keyword.
|
||||||
|
|
||||||
|
They are most often used unnamed with the functional methods [map, filter and reduce](/Programming_Languages/Python/Syntax/Map_filter_reduce_in_Python.md)
|
||||||
|
|
||||||
|
Here is the two syntaxes side by side:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const double = (x) => x * x;
|
||||||
|
```
|
||||||
|
|
||||||
|
```py
|
||||||
|
double = lambda x: x * x
|
||||||
|
```
|
||||||
|
|
||||||
|
Here is a lambda with multiple parameters:
|
||||||
|
|
||||||
|
```py
|
||||||
|
func = lambda x, y, z: x + y + z
|
||||||
|
print(func(2, 3, 4))
|
||||||
|
# 9
|
||||||
|
```
|
||||||
|
|
||||||
|
> Lambdas obviously enshrine functional programming paradigms. Therefore they should be pure functions, not mutating values or issueing side effects. For example, it would be improper (though syntactically well-formed) to use a lambda to `print` something
|
|
@ -0,0 +1,55 @@
|
||||||
|
---
|
||||||
|
categories:
|
||||||
|
- Programming Languages
|
||||||
|
tags: [python]
|
||||||
|
---
|
||||||
|
|
||||||
|
# Map and filter in Python
|
||||||
|
|
||||||
|
## Map
|
||||||
|
|
||||||
|
```py
|
||||||
|
data = [1, 3, 5, 2, 7, 4, 10]
|
||||||
|
|
||||||
|
new_data = map(lambda i: i + 10, data)
|
||||||
|
print(new_data)
|
||||||
|
```
|
||||||
|
|
||||||
|
We can also pass-in a function rather than use a lambda:
|
||||||
|
|
||||||
|
```py
|
||||||
|
def add_one(i):
|
||||||
|
return i + 1
|
||||||
|
|
||||||
|
x = list(map(addOne, data))
|
||||||
|
# [2, 4, 6, 3, 8, 5, 11]
|
||||||
|
# necessary to add `list` to get some output
|
||||||
|
```
|
||||||
|
|
||||||
|
## Filter
|
||||||
|
|
||||||
|
```py
|
||||||
|
data = [1, 3, 5, 2, 7, 4, 10]
|
||||||
|
|
||||||
|
d1 = list(filter(lambda i: i % 2 == 0, data))
|
||||||
|
print(d1)
|
||||||
|
# [2, 4, 10]
|
||||||
|
|
||||||
|
def is_even(i):
|
||||||
|
return i % 2 == 0
|
||||||
|
|
||||||
|
|
||||||
|
# Filter for even numbers using a named function
|
||||||
|
d2 = list(filter(is_even, data))
|
||||||
|
|
||||||
|
# [2, 4, 10]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Chaining
|
||||||
|
|
||||||
|
```py
|
||||||
|
data = [1, 3, 5, 2, 7, 4, 10]
|
||||||
|
new_data = list(map(lambda i: i + 10, filter(is_even, data)))
|
||||||
|
print(new_data)
|
||||||
|
# new_data: [12, 14, 20]
|
||||||
|
```
|
|
@ -54,6 +54,37 @@ basket.remove('apple')
|
||||||
basket.discard('apricot')
|
basket.discard('apricot')
|
||||||
print(basket)
|
print(basket)
|
||||||
# {'pear', 'banana', 'orange'}
|
# {'pear', 'banana', 'orange'}
|
||||||
|
|
||||||
|
basket.clear()
|
||||||
|
print(basket)
|
||||||
|
#set
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Add items to a set
|
## Add items to a set
|
||||||
|
|
||||||
|
```python
|
||||||
|
basket.add('apricot')
|
||||||
|
print(basket)
|
||||||
|
# {'apricot', 'pear', 'banana', 'orange'}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Apply unions and intersections
|
||||||
|
|
||||||
|
```python
|
||||||
|
s1 = {'apple', 'orange', 'banana'}
|
||||||
|
s2 = {'grapefruit', 'lime', 'banana'}
|
||||||
|
print('Union:', s1 | s2)
|
||||||
|
# Union: {'apple', 'orange', 'grapefruit', 'lime', 'banana'}
|
||||||
|
|
||||||
|
print('Intersection:', s1 & s2)
|
||||||
|
# Intersection: {'banana'}
|
||||||
|
|
||||||
|
|
||||||
|
print('Difference:', s1 - s2)
|
||||||
|
# Difference: {'orange', 'apple'}
|
||||||
|
|
||||||
|
print('Symmetric Difference:', s1 ^ s2)
|
||||||
|
#Symmetric Difference: {'apple', 'orange', 'grapefruit', 'lime'}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
|
@ -2,17 +2,24 @@
|
||||||
|
|
||||||
## Python
|
## Python
|
||||||
|
|
||||||
- Get PEP8 working in VSCode as linter and add to execute on save. (These are conventions not syntactic enforcements, style)
|
|
||||||
|
|
||||||
- Is there a thing like prettier to enforce double quotes over single for instance?
|
|
||||||
|
|
||||||
- Research: How do I make sure I am using `conda` and not the default install in VSCode ? PyCharm makes it easy to select environment.
|
|
||||||
|
|
||||||
- Research: best practice for separating projects into `conda` environments like npm
|
- Research: best practice for separating projects into `conda` environments like npm
|
||||||
|
|
||||||
- Read-up more on types: what does it mean for Python to be dynamically typed. What is type-hinting really?
|
- Read-up more on types: what does it mean for Python to be dynamically typed. What is type-hinting really?
|
||||||
|
|
||||||
- Use provided pdfs and John's books
|
- Use provided pdfs and John's books
|
||||||
|
|
||||||
|
- Is `dictionary.values()`/ `dictionary.keys()` of type list?
|
||||||
|
- Is `dictionary.items()` a list of tuples for key, value?
|
||||||
|
|
||||||
|
- How to run test suites via VSCode?
|
||||||
|
|
||||||
|
BBC Course, remaining topics:
|
||||||
|
|
||||||
|
- Classes and object-oriented paradigms in Python
|
||||||
|
- Modules
|
||||||
|
- Error handling
|
||||||
|
- Testing
|
||||||
|
|
||||||
## Bash
|
## Bash
|
||||||
|
|
||||||
- Best way to run a command in a script - is it to `echo` it?
|
- Best way to run a command in a script - is it to `echo` it?
|
||||||
|
|
Loading…
Add table
Reference in a new issue