diff --git a/notes-other/pythonetc/f-strings.md b/notes-other/pythonetc/f-strings.md
new file mode 100644
index 0000000..32ec2ca
--- /dev/null
+++ b/notes-other/pythonetc/f-strings.md
@@ -0,0 +1,16 @@
+You can implement [f-strings](https://www.python.org/dev/peps/pep-0498/) in older Python versions by accessing [globals and locals](https://t.me/pythonetc/121) from the caller function. It is possible through getting the parent frame from the call stack:
+
+```python
+import inspect
+from collections import ChainMap
+def f(s):
+ frame = inspect.stack()[1][0]
+ vrs = ChainMap(frame.f_locals, frame.f_globals)
+ return s.format(**vrs)
+
+name = '@pythonetc'
+f('Hello, {name}')
+# Hello, @pythonetc
+```
+
+[ChainMap](https://t.me/pythonetc/225) merges `locals` and `globals` into one mapping without need to create a new `dict`.
diff --git a/notes-other/pythonetc/numbers.md b/notes-other/pythonetc/numbers.md
new file mode 100644
index 0000000..692cecd
--- /dev/null
+++ b/notes-other/pythonetc/numbers.md
@@ -0,0 +1,34 @@
+Module [numbers](https://docs.python.org/3/library/numbers.html) was introduced by [PEP-3141](https://www.python.org/dev/peps/pep-3141/) in Python 2.6. It implements the numbers hierarchy, inspired by [Scheme](https://en.wikipedia.org/wiki/Scheme_programming_language):
+
+```python
+Number :> Complex :> Real :> Rational :> Integral
+```
+
+this is [ABC](https://t.me/pythonetc/550) classes, so they can be used in `isinstance` checks:
+
+```python
+import numbers
+isinstance(1, numbers.Integral)
+# True
+
+isinstance(1, numbers.Real)
+# True
+
+isinstance(1.1, numbers.Integral)
+# False
+```
+
++ `int` is `Integral`.
++ [fractions.Fraction](https://t.me/pythonetc/201) is `Rational`.
++ `float` is `Real`.
++ `complex` is `Complex` (wow!)
++ [decimal.Decimal](https://t.me/pythonetc/201) is `Number`.
+
+In theory, `Decimal` should be `Real` but it's not because `Decimal` doesn't interoperate with `float`:
+
+```python
+Decimal(1) + 1.1
+# TypeError: unsupported operand type(s) for +: 'decimal.Decimal' and 'float'
+```
+
+The most fun thing about `numbers` is that [it's not supported by mypy](https://github.com/python/mypy/issues/3186).
diff --git a/notes-other/pythonetc/recursion.md b/notes-other/pythonetc/recursion.md
new file mode 100644
index 0000000..a110a2b
--- /dev/null
+++ b/notes-other/pythonetc/recursion.md
@@ -0,0 +1,12 @@
+Python doesn't support [tail recursion](https://t.me/pythonetc/239). Hence, it's easy to face `RecursionError` when implementing recursive algorithms. You can get and change maximum recursion depth with [sys.getrecursionlimit](https://docs.python.org/3/library/sys.html#sys.getrecursionlimit) and [sys.setrecursionlimit](https://docs.python.org/3/library/sys.html#sys.setrecursionlimit) functions:
+
+```python
+sys.getrecursionlimit()
+# 3000
+
+sys.setrecursionlimit(4000)
+sys.getrecursionlimit()
+# 4000
+```
+
+However, it's dangerous practice, especially because every new frame on the call stack is quite expensive. Luckily, any recursive algorithm can be rewritten with iterations.