Python
Getting Started
Introduction
- Python (python.org)
- Python Document (docs.python.org)
- Learn X in Y minutes (learnxinyminutes.com)
- Regex in python (cheatsheets.zip)
Hello World
>>> print("Hello, World!")Hello, World!The famous “Hello World” program in Python
Variables
age = 18 # age is of type intname = "John" # name is now of type strprint(name)Python can’t declare a variable without assignment.
Data Types {.row-span-2}
str | Text |
int, float, complex | Numeric |
list, tuple, range | Sequence |
dict | Mapping |
set, frozenset | Set |
bool | Boolean |
bytes, bytearray, memoryview | Binary |
See: Data Types
Slicing String
>>> msg = "Hello, World!">>> print(msg[2:5])lloSee: Strings
Lists
mylist = []mylist.append(1)mylist.append(2)for item in mylist: print(item) # prints out 1,2See: Lists
If Else
num = 200if num > 0: print("num is greater than 0")else: print("num is not greater than 0")See: Flow control
Loops
for item in range(6): if item == 3: break print(item)else: print("Finally finished!")See: Loops
Functions
>>> def my_function():... print("Hello from a function")...>>> my_function()Hello from a functionSee: Functions
File Handling {.col-span-2}
with open("myfile.txt", "r", encoding='utf8') as file: for line in file: print(line)See: File Handling
Arithmetic
result = 10 + 30 # => 40result = 40 - 10 # => 30result = 50 * 5 # => 250result = 16 / 4 # => 4.0 (Float Division)result = 16 // 4 # => 4 (Integer Division)result = 25 % 2 # => 1result = 5 ** 3 # => 125The / means quotient of x and y, and the // means floored quotient of x and y, also see
StackOverflow
Plus-Equals
counter = 0counter += 10 # => 10counter = 0counter = counter + 10 # => 10
message = "Part 1."
# => Part 1.Part 2.message += "Part 2."f-Strings (Python 3.6+)
>>> website = 'cheatsheets.zip'>>> f"Hello, {website}""Hello, cheatsheets.zip"
>>> num = 10>>> f'{num} + 10 = {num + 10}''10 + 10 = 20'See: Python F-Strings
Python Built-in Data Types
Strings
hello = "Hello World"hello = 'Hello World'
multi_string = """Multiline StringsLorem ipsum dolor sit amet,consectetur adipiscing elit """See: Strings
Numbers
x = 1 # inty = 2.8 # floatz = 1j # complex
>>> print(type(x))<class 'int'>Booleans
my_bool = Truemy_bool = False
bool(0) # => Falsebool(1) # => TrueLists
list1 = ["apple", "banana", "cherry"]list2 = [True, False, False]list3 = [1, 5, 7, 9, 3]list4 = list((1, 5, 7, 9, 3))See: Lists
Tuple
my_tuple = (1, 2, 3)my_tuple = tuple((1, 2, 3))Similar to List but immutable
Set
set1 = {"a", "b", "c"}set2 = set(("a", "b", "c"))Set of unique items/objects
Dictionary
>>> empty_dict = {}>>> a = {"one": 1, "two": 2, "three": 3}>>> a["one"]1>>> a.keys()dict_keys(['one', 'two', 'three'])>>> a.values()dict_values([1, 2, 3])>>> a.update({"four": 4})>>> a.keys()dict_keys(['one', 'two', 'three', 'four'])>>> a['four']4Key: Value pair, JSON like object
Casting
Integers
x = int(1) # x will be 1y = int(2.8) # y will be 2z = int("3") # z will be 3Floats
x = float(1) # x will be 1.0y = float(2.8) # y will be 2.8z = float("3") # z will be 3.0w = float("4.2") # w will be 4.2Strings
x = str("s1") # x will be 's1'y = str(2) # y will be '2'z = str(3.0) # z will be '3.0'Python Advanced Data Types
Heaps {.col-span-2 .row-span-3}
import heapq
myList = [9, 5, 4, 1, 3, 2]heapq.heapify(myList) # turn myList into a Min Heapprint(myList) # => [1, 3, 2, 5, 9, 4]print(myList[0]) # first value is always the smallest in the heap
heapq.heappush(myList, 10) # insert 10x = heapq.heappop(myList) # pop and return smallest itemprint(x) # => 1Negate all values to use Min Heap as Max Heap
myList = [9, 5, 4, 1, 3, 2]myList = [-val for val in myList] # multiply by -1 to negateheapq.heapify(myList)
x = heapq.heappop(myList)print(-x) # => 9 (making sure to multiply by -1 again)Heaps are binary trees for which every parent node has a value less than or equal to any of its children. Useful for accessing min/max value quickly. Time complexity: O(n) for heapify, O(log n) push and pop. See: Heapq
Stacks and Queues {.row-span-3}
from collections import deque
q = deque() # emptyq = deque([1, 2, 3]) # with values
q.append(4) # append to right sideq.appendleft(0) # append to left sideprint(q) # => deque([0, 1, 2, 3, 4])
x = q.pop() # remove & return from righty = q.popleft() # remove & return from leftprint(x) # => 4print(y) # => 0print(q) # => deque([1, 2, 3])
q.rotate(1) # rotate 1 step to the rightprint(q) # => deque([3, 1, 2])Deque is a double-ended queue with O(1) time for append/pop operations from both sides. Used as stacks and queues. See: Deque
Python Strings
Array-like
>>> hello = "Hello, World">>> print(hello[1])e>>> print(hello[-1])dGet the character at position 1 or last
Looping
>>> for char in "foo":... print(char)fooLoop through the letters in the word “foo”
Slicing string {.row-span-4}
┌───┬───┬───┬───┬───┬───┬───┐ | m | y | b | a | c | o | n | └───┴───┴───┴───┴───┴───┴───┘ 0 1 2 3 4 5 6 7-7 -6 -5 -4 -3 -2 -1>>> s = 'mybacon'>>> s[2:5]'bac'>>> s[0:2]'my'>>> s = 'mybacon'>>> s[:2]'my'>>> s[2:]'bacon'>>> s[:2] + s[2:]'mybacon'>>> s[:]'mybacon'>>> s = 'mybacon'>>> s[-5:-1]'baco'>>> s[2:6]'baco'With a stride
>>> s = '12345' * 5>>> s'1234512345123451234512345'>>> s[::5]'11111'>>> s[4::5]'55555'>>> s[::-5]'55555'>>> s[::-1]'5432154321543215432154321'String Length
>>> hello = "Hello, World!">>> print(len(hello))13The len() function returns the length of a string
Multiple copies
>>> s = '===+'>>> n = 8>>> s * n'===+===+===+===+===+===+===+===+'Check String
>>> s = 'spam'>>> s in 'I saw spamalot!'True>>> s not in 'I saw The Holy Grail!'TrueConcatenates
>>> s = 'spam'>>> t = 'egg'>>> s + t'spamegg'>>> 'spam' 'egg''spamegg'Formatting {.col-span-2}
name = "John"print("Hello, %s!" % name)name = "John"age = 23print("%s is %d years old." % (name, age))format() Method
txt1 = "My name is {fname}, I'm {age}".format(fname="John", age=36)txt2 = "My name is {0}, I'm {1}".format("John", 36)txt3 = "My name is {}, I'm {}".format("John", 36)Input
>>> name = input("Enter your name: ")Enter your name: Tom>>> name'Tom'Get input data from console
Join
>>> "#".join(["John", "Peter", "Vicky"])'John#Peter#Vicky'Endswith
>>> "Hello, world!".endswith("!")TruePython F-Strings (Since Python 3.6+)
f-Strings usage
>>> website = 'cheatsheets.zip'>>> f"Hello, {website}""Hello, cheatsheets.zip"
>>> num = 10>>> f'{num} + 10 = {num + 10}''10 + 10 = 20'
>>> f"""He said {"I'm John"}""""He said I'm John"
>>> f'5 {"{stars}"}''5 {stars}'>>> f'{{5}} {"stars"}''{5} stars'
>>> name = 'Eric'>>> age = 27>>> f"""Hello!... I'm {name}.... I'm {age}.""""Hello!\n I'm Eric.\n I'm 27."it is available since Python 3.6, also see: Formatted string literals
f-Strings Fill Align
>>> f'{"text":10}' # [width]'text '>>> f'{"test":*>10}' # fill left'******test'>>> f'{"test":*<10}' # fill right'test******'>>> f'{"test":*^10}' # fill center'***test***'>>> f'{12345:0>10}' # fill with numbers'0000012345'f-Strings Type
>>> f'{10:b}' # binary type'1010'>>> f'{10:o}' # octal type'12'>>> f'{200:x}' # hexadecimal type'c8'>>> f'{200:X}''C8'>>> f'{345600000000:e}' # scientific notation'3.456000e+11'>>> f'{65:c}' # character type'A'>>> f'{10:#b}' # [type] with notation (base)'0b1010'>>> f'{10:#o}''0o12'>>> f'{10:#x}''0xa'F-Strings Others
>>> f'{-12345:0=10}' # negative numbers'-000012345'>>> f'{12345:010}' # [0] shortcut (no align)'0000012345'>>> f'{-12345:010}''-000012345'>>> import math # [.precision]>>> math.pi3.141592653589793>>> f'{math.pi:.2f}''3.14'>>> f'{1000000:,.2f}' # [grouping_option]'1,000,000.00'>>> f'{1000000:_.2f}''1_000_000.00'>>> f'{0.25:0%}' # percentage'25.000000%'>>> f'{0.25:.0%}''25%'F-Strings Sign
>>> f'{12345:+}' # [sign] (+/-)'+12345'>>> f'{-12345:+}''-12345'>>> f'{-12345:+10}'' -12345'>>> f'{-12345:+010}''-000012345'Python Lists
Defining
>>> li1 = []>>> li1[]>>> li2 = [4, 5, 6]>>> li2[4, 5, 6]>>> li3 = list((1, 2, 3))>>> li3[1, 2, 3]>>> li4 = list(range(1, 11))>>> li4[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]Generate {.col-span-2}
>>> list(filter(lambda x : x % 2 == 1, range(1, 20)))[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
>>> [x ** 2 for x in range (1, 11) if x % 2 == 1][1, 9, 25, 49, 81]
>>> [x for x in [3, 4, 5, 6, 7] if x > 5][6, 7]
>>> list(filter(lambda x: x > 5, [3, 4, 5, 6, 7]))[6, 7]Append
>>> li = []>>> li.append(1)>>> li[1]>>> li.append(2)>>> li[1, 2]>>> li.append(4)>>> li[1, 2, 4]>>> li.append(3)>>> li[1, 2, 4, 3]List Slicing {.col-span-2 .row-span-3}
Syntax of list slicing:
a_list[start:end]a_list[start:end:step]Slicing
>>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']>>> a[2:5]['bacon', 'tomato', 'ham']>>> a[-5:-2]['egg', 'bacon', 'tomato']>>> a[1:4]['egg', 'bacon', 'tomato']Omitting index
>>> a[:4]['spam', 'egg', 'bacon', 'tomato']>>> a[0:4]['spam', 'egg', 'bacon', 'tomato']>>> a[2:]['bacon', 'tomato', 'ham', 'lobster']>>> a[2:len(a)]['bacon', 'tomato', 'ham', 'lobster']>>> a['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']>>> a[:]['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']With a stride
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']>>> a[0:6:2]['spam', 'bacon', 'ham']>>> a[1:6:2]['egg', 'tomato', 'lobster']>>> a[6:0:-2]['lobster', 'tomato', 'egg']>>> a['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']>>> a[::-1]['lobster', 'ham', 'tomato', 'bacon', 'egg', 'spam']Remove
>>> li = ['bread', 'butter', 'milk']>>> li.pop()'milk'>>> li['bread', 'butter']>>> del li[0]>>> li['butter']Access
>>> li = ['a', 'b', 'c', 'd']>>> li[0]'a'>>> li[-1]'d'>>> li[4]Traceback (most recent call last): File "<stdin>", line 1, in <module>IndexError: list index out of rangeConcatenating {.row-span-2}
>>> odd = [1, 3, 5]>>> odd.extend([9, 11, 13])>>> odd[1, 3, 5, 9, 11, 13]>>> odd = [1, 3, 5]>>> odd + [9, 11, 13][1, 3, 5, 9, 11, 13]Sort & Reverse {.row-span-2}
>>> li = [3, 1, 3, 2, 5]>>> li.sort()>>> li[1, 2, 3, 3, 5]>>> li.reverse()>>> li[5, 3, 3, 2, 1]Count
>>> li = [3, 1, 3, 2, 5]>>> li.count(3)2Repeating
>>> li = ["re"] * 3>>> li['re', 're', 're']Python Flow control
Basic
num = 5if num > 10: print("num is totally bigger than 10.")elif num < 10: print("num is smaller than 10.")else: print("num is indeed 10.")One line
>>> a = 330>>> b = 200>>> r = "a" if a > b else "b">>> print(r)aelse if
value = Trueif not value: print("Value is False")elif value is None: print("Value is None")else: print("Value is True")match case
x = 1match x: case 0: print("zero") case 1: print("one") case _: print("multiple")Python Loops
Basic
primes = [2, 3, 5, 7]for prime in primes: print(prime)Prints: 2 3 5 7
With index
animals = ["dog", "cat", "mouse"]# enumerate() adds counter to an iterablefor i, value in enumerate(animals): print(i, value)Prints: 0 dog 1 cat 2 mouse
While
x = 0while x < 4: print(x) x += 1 # Shorthand for x = x + 1Prints: 0 1 2 3
Break
x = 0for index in range(10): x = index * 10 if index == 5: break print(x)Prints: 0 10 20 30 40
Continue
for index in range(3, 8): x = index * 10 if index == 5: continue print(x)Prints: 30 40 60 70
Range
for i in range(4): print(i) # Prints: 0 1 2 3
for i in range(4, 8): print(i) # Prints: 4 5 6 7
for i in range(4, 10, 2): print(i) # Prints: 4 6 8With zip()
words = ['Mon', 'Tue', 'Wed']nums = [1, 2, 3]# Use zip to pack into a tuple listfor w, n in zip(words, nums): print('%d:%s, ' %(n, w))Prints: 1:Mon, 2:Tue, 3:Wed,
for/else
nums = [60, 70, 30, 110, 90]for n in nums: if n > 100: print("%d is bigger than 100" %n) breakelse: print("Not found!")Also see: Python Tips
Python Functions
Basic
def hello_world(): print('Hello, World!')Return
def add(x, y): print("x is %s, y is %s" %(x, y)) return x + y
add(5, 6) # => 11Positional arguments
def varargs(*args): return args
varargs(1, 2, 3) # => (1, 2, 3)Type of “args” is tuple.
Keyword arguments
def keyword_args(**kwargs): return kwargs
# => {"big": "foot", "loch": "ness"}keyword_args(big="foot", loch="ness")Type of “kwargs” is dict.
Returning multiple
def swap(x, y): return y, x
x = 1y = 2x, y = swap(x, y) # => x = 2, y = 1Default Value
def add(x, y=10): return x + y
add(5) # => 15add(5, 20) # => 25Anonymous functions
# => True(lambda x: x > 2)(3)
# => 5(lambda x, y: x ** 2 + y ** 2)(2, 1)Python Modules
Import modules
import mathprint(math.sqrt(16)) # => 4.0From a module
from math import ceil, floorprint(ceil(3.7)) # => 4.0print(floor(3.7)) # => 3.0Import all
from math import *Shorten module
import math as m
# => Truemath.sqrt(16) == m.sqrt(16)Functions and attributes
import mathdir(math)Python File Handling
Read file
Line by line
with open("myfile.txt") as file: for line in file: print(line)With line number
file = open('myfile.txt', 'r')for i, line in enumerate(file, start=1): print("Number %s: %s" % (i, line))String
Write a string
contents = {"aa": 12, "bb": 21}with open("myfile1.txt", "w+") as file: file.write(str(contents))Read a string
with open('myfile1.txt', "r+") as file: contents = file.read()print(contents)Object
Write an object
contents = {"aa": 12, "bb": 21}with open("myfile2.txt", "w+") as file: file.write(json.dumps(contents))Read an object
with open('myfile2.txt', "r+") as file: contents = json.load(file)print(contents)Delete a File
import osos.remove("myfile.txt")Check and Delete
import osif os.path.exists("myfile.txt"): os.remove("myfile.txt")else: print("The file does not exist")Delete Folder
import osos.rmdir("myfolder")Python Classes & Inheritance
Defining
class MyNewClass: pass
# Class Instantiationmy = MyNewClass()Constructors
class Animal: def __init__(self, voice): self.voice = voice
cat = Animal('Meow')print(cat.voice) # => Meow
dog = Animal('Woof')print(dog.voice) # => WoofMethod
class Dog:
# Method of the class def bark(self): print("Ham-Ham")
charlie = Dog()charlie.bark() # => "Ham-Ham"Class Variables {.row-span-2}
class MyClass: class_variable = "A class variable!"
# => A class variable!print(MyClass.class_variable)
x = MyClass()
# => A class variable!print(x.class_variable)Super() Function {.row-span-2}
class ParentClass: def print_test(self): print("Parent Method")
class ChildClass(ParentClass): def print_test(self): print("Child Method") # Calls the parent's print_test() super().print_test()>>> child_instance = ChildClass()>>> child_instance.print_test()Child MethodParent Methodrepr() method
class Employee: def __init__(self, name): self.name = name
def __repr__(self): return self.name
john = Employee('John')print(john) # => JohnUser-defined exceptions
class CustomError(Exception): passPolymorphism
class ParentClass: def print_self(self): print('A')
class ChildClass(ParentClass): def print_self(self): print('B')
obj_A = ParentClass()obj_B = ChildClass()
obj_A.print_self() # => Aobj_B.print_self() # => BOverriding
class ParentClass: def print_self(self): print("Parent")
class ChildClass(ParentClass): def print_self(self): print("Child")
child_instance = ChildClass()child_instance.print_self() # => ChildInheritance
class Animal: def __init__(self, name, legs): self.name = name self.legs = legs
class Dog(Animal): def sound(self): print("Woof!")
Yoki = Dog("Yoki", 4)print(Yoki.name) # => YOKIprint(Yoki.legs) # => 4Yoki.sound() # => Woof!Python Type Hints (Since Python 3.5)
Variable & Parameter
string: str = "ha"times: int = 3
# wrong hit, but run correctlyresult: str = 1 + 2print(result) # => 3
def say(name: str, start: str = "Hi"): return start + ", " + name
print(say("Python")) # => Hi, PythonBuilt-in date type
from typing import Dict, Tuple, List
bill: Dict[str, float] = { "apple": 3.14, "watermelon": 15.92, "pineapple": 6.53,}completed: Tuple[str] = ("DONE",)succeeded: Tuple[int, str] = (1, "SUCCESS")statuses: Tuple[str, ...] = ( "DONE", "SUCCESS", "FAILED", "ERROR",)codes: List[int] = (0, 1, -1, -2)Built-in date type (3.10+)
bill: dict[str, float] = { "apple": 3.14, "watermelon": 15.92, "pineapple": 6.53,}completed: tuple[str] = ("DONE",)succeeded: tuple[int, str] = (1, "SUCCESS")statuses: tuple[str, ...] = ( "DONE", "SUCCESS", "FAILED", "ERROR",)codes: list[int] = (0, 1, -1, -2)Positional argument
def calc_summary(*args: int): return sum(args)
print(calc_summary(3, 1, 4)) # => 8Indicate all arguments’ type is int.
Returned
def say_hello(name) -> str: return "Hello, " + name
var = "Python"print(say_hello(var)) # => Hello, PythonUnion returned
from typing import Union
def resp200(meaningful) -> Union[int, str]: return "OK" if meaningful else 200Means returned value type may be int or str.
Keyword argument
def calc_summary(**kwargs: int): return sum(kwargs.values())
print(calc_summary(a=1, b=2)) # => 3Indicate all parameters’ value type is int.
Multiple returns
def resp200() -> (int, str): return 200, "OK"
returns = resp200()print(returns) # => (200, 'OK')print(type(returns)) # tupleUnion returned (3.10+)
def resp200(meaningful) -> int | str: return "OK" if meaningful else 200Since Python 3.10
Property
class Employee: name: str age: int
def __init__(self, name, age): self.name = name self.age = age self.graduated: bool = FalseSelf instance
class Employee: name: str
def set_name(self, name) -> "Employee": self.name = name return self
def copy(self) -> 'Employee': return type(self)(self.name)Self instance (3.11+)
from typing import Self
class Employee: name: str age: int
def set_name(self: Self, name) -> Self: self.name = name return selfType & Generic {.col-span-2}
from typing import TypeVar, Type
T = TypeVar("T")
# "mapper" is a type, like int, str, MyClass and so on.# "default" is an instance of type T, such as 314, "string", MyClass() and so on.# returned is an instance of type T too.def converter(raw, mapper: Type[T], default: T) -> T: try: return mapper(raw) except: return default
raw: str = input("Enter an integer: ")result: int = converter(raw, mapper=int, default=0)Function {.col-span-2}
from typing import TypeVar, Callable, Any
T = TypeVar("T")
def converter(raw, mapper: Callable[[Any], T], default: T) -> T: try: return mapper(raw) except: return default
# Callable[[Any], ReturnType] means a function declare like:# def func(arg: Any) -> ReturnType:# pass
# Callable[[str, int], ReturnType] means a function declare like:# def func(string: str, times: int) -> ReturnType:# pass
# Callable[..., ReturnType] means a function declare like:# def func(*args, **kwargs) -> ReturnType:# pass
def is_success(value) -> bool: return value in (0, "OK", True, "success")
resp = dict(code=0, message="OK", data=[])successed: bool = converter(resp["message"], mapper=is_success, default=False)Python Operators
Walrus {.col-span-2}
values = [1, "text", True, "", 2]i = 0
# It assigns a value to a variable and compares it in a boolean expressionwhile (data := values[i]):
print(data, end=",") i = i + 1
# Expected result: 1, "text", TrueMiscellaneous
Comments
# This is a single line comments.""" Multiline strings can be written using three "s, and are often used as documentation."""''' Multiline strings can be written using three 's, and are often used as documentation.'''Generators
def double_numbers(iterable): for i in iterable: yield i + iGenerators help you make lazy code.
Generator to list
values = (-x for x in [1,2,3,4,5])gen_to_list = list(values)
# => [-1, -2, -3, -4, -5]print(gen_to_list)Handle exceptions {.col-span-3}
try: # Use "raise" to raise an error raise IndexError("This is an index error")except IndexError as e: pass # Pass is just a no-op. Usually you would do recovery here.except (TypeError, NameError): pass # Multiple exceptions can be handled together, if required.else: # Optional clause to the try/except block. Must follow all except blocks print("All good!") # Runs only if the code in try raises no exceptionsfinally: # Execute under all circumstances print("We can clean up resources here")