Back to basics - Python
This is part 1 of back to basics series. Today’s topic is python. Let’s dive into code!
Numbers - int, float, complex
year = 2021
type(year) # int
pi = 3.14
type(pi) # 3.14
# conversion
int(3.5) # 3
float(3) # 3.0
# some math op
float_num = 5 / 2 # returns a float
floored_div = 5 // 2 # returns a int
squared = 2 ** 2
mod = 5 % 2
# get divisor and modulas
div, mod = divmod(5, 2)
complex_num = 3 + 2j # (3 + 2j)
type(complex_num) # complex
# some functions
abs(-25)
round(2.5)
Strings and Bytes
# string can use single/double or docblock quote
name = "Python" + 'Python' + """Python"""
type(name) # str
binary = b"Python"
type(binary) # bytes
name == binary # false
# codepoint to str
chr(65) # A
type(chr(65)) # str
chr(240) # ð
# str functions
"python".upper() # PYTHON
"python".capitalize() # Python
" python ".strip() # python
("hello" "world") # helloworld
"hello"[0] # h
"hello world".split() # list [hello, world]
# python string are immutable!
# string/array slicing
"hello"[0] # h
"hello"[-1] # o
"hello"[:] # hello
"hello"[1:] # ello
"hello"[:-1] # hell
# str formatting
"{lang} is awesome".format(lang="Python") # Python is awesome
lang = "Python"
f"{lang} is awesome" # Python is awesome
# strings are enumerable
upper = ""
for c in "hello":
upper += c.upper()
# list comprehension on string
"".join([c.upper() for c in "hello"])
# byte conversion
"hello".encode() # b"hello"
"ð".encode() # conver into bytes b'\xc3\xb0'
len("ð") # 1
len("ð".encode()) # 2
Collection - list, tuple, set, dict
# list aka dynamic array
evens = [2, 4, 6]
evens.append(8) # [2, 4, 6, 8]
evens.remove(2) # [4, 6, 8]
evens.index(6) # 1
evens.extend([8, 10]) # [4, 6, 8, 8, 10]
evens.sort() # sort asc order
sorted(evens, reverse=True) # sort desc order
# looping a list
for val in range(5):
print(val)
# looping list with index
for i, val in enumerate(range(5)):
print(i, val)
# 2d array, 2x3 dimension
grid = [[1,2,3], [4,5,6]]
[0] * 3 # [0, 0, 0]
[[0, 1]] * 3 # [[0, 1], [0, 1], [0, 1]]
# jagged array
jagged = [[1], [1,2], [1,2,3]]
# tuple - immutable
immutable_list = tuple(2, 4, 6)
# set
distinct = set("AABBCCDD") # {'A', 'B', 'C', 'D'}
# conversion
a_list = list(range(5))
a_tup = tuple(a_list)
a_set = set(a_list)
# dict - map
hash_map = {"state": "GA", "post_code": 30342}
hash_map.keys() # dict_keys(['state', 'post_code'])
hash_map.values() # dict_values(['GA', 30342])
hash_map.get('state') # GA
hash_map.get('unknown_key', 'default_val') # default_val
hash_map.setdefault('foo', 'bar')
hash_map['foo'] = 'baz'
# looping a dict
for k, v in hash_map.items():
print(k, v)
List comprehension
[x**2 for x in range(5)] # [0, 1, 4, 9, 16]
# set
{x**2 for x in range(5)} # {0, 1, 4, 9, 16}
[key for key in hash_map.keys()] # ['state', 'post_code']
[val for val in hash_map.values()] # ['GA', 30342]
[item for item in hash_map.items()] # [('state', 'GA'), ('post_code', 30342)]
# dict
{key: key ** 2 for key in range(5)} # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
Dates - datetime, time, timedelta
from datetime import date, datetime, timedelta
import time
# just the day
today = date.today()
# specific day
dob = date(2000,1,1)
dob.isoformat() # '2000-01-01'
delta_days = today - dob # days
dt = datetime.fromisoformat('2011-11-04') # only python >= 3.7
# date diff using timedelta
yesterday = today - timedelta(days=1)
tomorrow = today + timedelta(days=1)
# datetime, it uses timezon
today = datetime.today()
# timestamp
timestamp = time.time()
today = date.fromtimestamp(timestamp)
# date formatting
today.strftime("%Y-%m-%d %H:%M:%S") # 2021-01-30 16:01:20
Functional programming - itertools, functools
# generator expressions - surrounded by parenthesis ()
iter = (line.strip() for line in ["hello world", "foo bar"])
# map, filter
list(map(lambda x: x.upper(), ["hello", "world"])) # ['HELLO', 'WORLD']
list(filter(lambda x: x % 2 == 0, range(10))) # [0, 2, 4, 6, 8]
# any, all
any([0,0,1]) # True
all([1,1,1]) # True
# itertools module
from itertools import count, cycle, repeat, takewhile, accumulate, groupby
import operator
# infinite iterator
# start counting from 100, 200, 300 ...
for i in count(100, 100):
if i >= 1000:
break
print(i)
# takewhile
list(takewhile(lambda x: x < 1000, count(100, 100)))
# cycle
for val in cycle("ABC"):
print(val)
# repeat some numbers
repeat("ABC") # repeat infinitely
repeat("ABC", 3) # repeat 3 times
# running sum
list(accumulate(range(10)))
# group by - iterms need to be sorted!
{k: len(list(g)) for k, g in groupby('AABBBCCDEEE')} # {'A': 2, 'B': 3, 'C': 2, 'D': 1, 'E': 3}
# functools module - reduce
from functools import reduce
import operator
# sum up, init 0
reduce(operator.add, range(10), 0)