Use this independent Quick Reference for the Python Institute PCEP - Certified Entry-Level Python Programmer (PCEP-30-02) to refresh Python fundamentals and trace short code snippets quickly. Focus on exact output, exact exception behavior, type conversions, mutability, and control-flow paths.
Rapid Scope Map
| Area | Know how to do | Common exam trap |
|---|
| Python basics | Recognize source code, interpreter, syntax, indentation, comments, literals, variables | Assuming indentation is cosmetic; it defines blocks |
| I/O | Use print() and input() | input() always returns str |
| Data types | Work with int, float, bool, str, None, lists, tuples, dictionaries | Confusing mutation with reassignment |
| Operators | Arithmetic, comparison, logical, bitwise, membership, identity | ** associativity, // with negatives, and/or short-circuiting |
| Control flow | if, elif, else, while, for, range(), break, continue, loop else | Loop else runs only when no break occurs |
| Collections | Index, slice, iterate, mutate lists/dicts, use tuples/strings | Slices tolerate out-of-range indices; direct indexing does not |
| Functions | Define, call, pass arguments, return values, understand scope | Missing return means None |
| Exceptions | Trace try, except, else, finally | More specific exceptions must be handled before general ones |
| Modules | Import modules and names | import math requires math.sqrt(), but from math import sqrt does not |
Python Program Basics
| Concept | Quick reference |
|---|
| Source code | Human-readable .py instructions. |
| Interpreter | Executes Python code, usually after parsing and compiling it internally to bytecode. |
| Syntax error | Code cannot be parsed; execution does not start normally. |
| Runtime exception | Error occurs while executing syntactically valid code. |
| Statement | Instruction such as assignment, if, while, def, import. |
| Expression | Produces a value, such as 2 + 3, len(x), x > 0. |
| Variable | Name bound to an object; assignment changes a binding. |
| Object | Runtime value with type, identity, and value. |
| Comment | Starts with # and continues to end of line. |
| Block | Group of indented statements after a header ending with :. |
Syntax Essentials
| Rule | Example | Notes |
|---|
| Indentation defines blocks | if x: ... | Consistent indentation is required. |
| Colon starts compound block | if, elif, else, for, while, def, try, except | Header line ends with :. |
| Case-sensitive names | total and Total | Different identifiers. |
| Assignment binds names | x = 5 | Creates or rebinds x. |
| Multiple assignment | a, b = 1, 2 | Right side is evaluated before binding. |
| Swap | a, b = b, a | No temporary variable needed. |
| Chained assignment | a = b = 0 | Both names refer to same object. |
| Augmented assignment | x += 1 | Equivalent in effect to update/rebind, with mutability details for containers. |
| Line continuation | Parentheses or \ | Prefer parentheses for readable continuation. |
Identifiers and Keywords
Valid identifiers:
- May contain letters, digits, and underscores.
- Cannot start with a digit.
- Cannot be a reserved keyword.
- Are case-sensitive.
Core Python 3 reserved words include:
False None True and as assert async await break class continue def del elif else
except finally for from global if import in is lambda nonlocal not or pass raise
return try while with yield
print()
| Feature | Example | Result |
|---|
| Basic output | print("Hi") | Prints Hi and a newline. |
| Multiple arguments | print("A", "B") | Default separator is one space. |
| Custom separator | print("A", "B", sep="-") | A-B |
| Custom ending | print("A", end="!") | Ends with ! instead of newline. |
print("A", "B", sep="-", end="!")
print("C")
## A-B!C
| Pattern | Meaning |
|---|
name = input() | Reads a line as str. |
age = int(input()) | Reads text, converts to int. |
x = float(input("x: ")) | Prompt is printed; result is still text until converted. |
Trap:
x = input()
print(x + 1) # TypeError if x is str
print(int(x) + 1) # Correct if x contains an integer literal
High-Use Built-ins
| Built-in | Use | Trap |
|---|
len(x) | Length of string/list/tuple/dict | Not for numbers. |
type(x) | Inspect type | Exam snippets may rely on exact type. |
int(x) | Convert to integer | int(3.9) truncates toward zero; int("3.9") raises ValueError. |
float(x) | Convert to floating-point | Floating precision is approximate. |
str(x) | Convert to string | Useful before concatenation with strings. |
bool(x) | Truth-value conversion | Empty/zero/None are false-like. |
range() | Generate integer sequence | Stop is excluded. |
list(x) | Convert iterable to list | Creates a new list from iterable elements. |
sorted(x) | Returns sorted list | Does not mutate original iterable. |
sum(x) | Sum numeric iterable | Fails on non-numeric elements. |
min(x), max(x) | Minimum/maximum | Empty sequence raises ValueError. |
Data Types, Literals, and Conversions
| Type | Literal examples | Key behavior |
|---|
int | 0, 42, -7, 0b1010, 0o12, 0xA | Arbitrary-size integer. |
float | 3.14, 2.0, 1e3, -0.5 | Approximate real number. |
bool | True, False | Boolean; participates like 1 and 0 in arithmetic. |
str | "abc", 'abc', """multi""" | Immutable sequence of characters. |
NoneType | None | Represents absence of value. |
list | [1, 2, 3] | Mutable ordered sequence. |
tuple | (1, 2), (1,) | Immutable ordered sequence. |
dict | {"a": 1} | Mutable key-value mapping. |
Truthiness
| Value | Truth value |
|---|
False, None | False |
0, 0.0 | False |
"", [], (), {} | False |
| Most other values | True |
print(bool("")) # False
print(bool("0")) # True
print(bool([])) # False
print(bool([0])) # True
String Escapes
| Escape | Meaning |
|---|
\n | Newline |
\t | Tab |
\\ | Backslash |
\' | Single quote |
\" | Double quote |
Operators and Precedence
Operator Groups
| Category | Operators | Notes |
|---|
| Arithmetic | +, -, *, /, //, %, ** | / always produces float. |
| Unary | +x, -x, ~x | ~x is bitwise inversion. |
| Comparison | <, <=, >, >=, ==, != | Result is bool. |
| Logical | not, and, or | Short-circuit evaluation. |
| Bitwise integer | &, ^, |, ~, <<, >> | Operate on integers. |
| Membership | in, not in | Works with strings, lists, tuples, dict keys. |
| Identity | is, is not | Object identity, not value equality. |
| Assignment | =, +=, -=, *=, etc. | Assignment is a statement in basic Python usage. |
Precedence: High to Low
| Level | Operators / constructs | Exam notes |
|---|
| 1 | Parentheses, indexing, slicing, calls | Use parentheses to remove ambiguity. |
| 2 | ** | Right-associative. |
| 3 | Unary +, -, ~ | Watch -2 ** 2. |
| 4 | *, /, //, % | Same level, left-to-right. |
| 5 | +, - | Addition/subtraction or sequence concat. |
| 6 | <<, >> | Bit shifts. |
| 7 | & | Bitwise AND. |
| 8 | ^ | Bitwise XOR. |
| 9 | | | Bitwise OR. |
| 10 | Comparisons, in, is | Chaining allowed: a < b < c. |
| 11 | not | Lower than comparisons. |
| 12 | and | Short-circuits. |
| 13 | or | Short-circuits. |
Arithmetic Traps
print(2 ** 3 ** 2) # 512, because 2 ** (3 ** 2)
print(-2 ** 2) # -4, because -(2 ** 2)
print((-2) ** 2) # 4
print(7 / 2) # 3.5
print(7 // 2) # 3
print(7 % 2) # 1
print(-7 // 3) # -3, floor division
print(-7 % 3) # 2
Remember:
// is floor division, not simple truncation for negative values.% is the remainder consistent with floor division.+ concatenates sequences only when types are compatible, such as str + str or list + list."3" + "4" is "34", not 7."ha" * 3 is "hahaha".
Logical Operators
| Expression | Behavior |
|---|
not x | Boolean negation. |
x and y | If x is false-like, returns x; otherwise returns y. |
x or y | If x is true-like, returns x; otherwise returns y. |
print(0 and 5) # 0
print(3 and 5) # 5
print("" or "x") # x
print("a" or "x") # a
Equality vs Identity
| Operator | Question answered | Example |
|---|
== | Do values compare equal? | [1, 2] == [1, 2] is True. |
is | Are both names bound to the same object? | Use for None: x is None. |
a = [1, 2]
b = [1, 2]
c = a
print(a == b) # True
print(a is b) # False
print(a is c) # True
Control Flow
Conditional Statements
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
else:
grade = "C"
| Rule | Notes |
|---|
if starts condition chain | Evaluated first. |
elif means “else if” | Checked only if previous conditions were false. |
else is optional | Runs when no prior condition matched. |
| Conditions use truthiness | Any expression can be tested. |
Trap:
x = 5
if x > 0:
print("positive")
if x > 3:
print("large")
else:
print("small")
## positive
## large
The else belongs only to the second if.
while Loops
n = 3
while n > 0:
print(n)
n -= 1
Use while when the number of iterations depends on a condition, sentinel value, or state change.
for Loops and range()
| Form | Values produced |
|---|
range(5) | 0, 1, 2, 3, 4 |
range(2, 6) | 2, 3, 4, 5 |
range(2, 10, 3) | 2, 5, 8 |
range(5, 0, -2) | 5, 3, 1 |
Rules:
- Start is included.
- Stop is excluded.
- Step cannot be zero.
- Negative step counts down.
for i in range(3):
print(i)
## 0
## 1
## 2
break, continue, and Loop else
| Construct | Meaning |
|---|
break | Exit nearest loop immediately. |
continue | Skip rest of current iteration; continue with next iteration. |
loop else | Runs when loop finishes normally, not when exited by break. |
for x in [1, 2, 3]:
if x == 4:
print("found")
break
else:
print("not found")
## not found
i = 0
while i < 5:
i += 1
if i == 3:
continue
print(i)
## 1
## 2
## 4
## 5
Choosing a Control Structure
| Need | Choose | Reason |
|---|
| One of several branches | if / elif / else | Conditional selection. |
| Count-controlled iteration | for i in range(...) | Known integer sequence. |
| Iterate over items | for item in collection | Direct traversal. |
| Repeat until condition changes | while | Unknown iteration count. |
| Stop search early | break | Avoid unnecessary iterations. |
| Skip selected item | continue | Continue loop without running remaining body. |
| Detect unsuccessful search | loop else | Executes only when no break. |
| Empty placeholder block | pass | Syntactically valid no-op. |
Collections Quick Reference
Sequence Indexing and Slicing
Applies to strings, lists, and tuples.
| Operation | Meaning |
|---|
seq[i] | Element at index i; raises IndexError if out of range. |
seq[-1] | Last element. |
seq[a:b] | Slice from a inclusive to b exclusive. |
seq[a:b:c] | Slice with step c. |
seq[:] | Shallow copy of full sequence. |
seq[::-1] | Reversed sequence. |
s = "Python"
print(s[0]) # P
print(s[-1]) # n
print(s[1:5:2]) # yh
print(s[::-1]) # nohtyP
Traps:
s[99] raises IndexError.s[2:99] is allowed and stops at the end.- Slice stop is excluded.
- A slice step of
0 raises ValueError.
Strings
| Operation / method | Example | Notes |
|---|
| Concatenate | "Py" + "thon" | Both operands must be strings. |
| Repeat | "ha" * 3 | Produces "hahaha". |
| Membership | "y" in "Python" | Returns True. |
| Length | len("abc") | Returns 3. |
| Case conversion | "Ab".lower() | Returns new string. |
| Strip whitespace | " x ".strip() | Returns "x". |
| Replace | "abab".replace("a", "x") | Returns "xbxb". |
| Find | "abc".find("b") | Returns index or -1. |
| Split | "a,b".split(",") | Returns ["a", "b"]. |
| Join | ",".join(["a", "b"]) | Returns "a,b". |
String immutability trap:
s = "cat"
## s[0] = "b" # TypeError
s = "b" + s[1:] # Rebinds s to "bat"
Lists
| Operation / method | Effect | Return value |
|---|
lst[i] | Access element | Element |
lst[i] = x | Replace element | None; statement |
lst.append(x) | Add one item at end | None |
lst.extend(xs) | Add all items from iterable | None |
lst.insert(i, x) | Insert before index i | None |
lst.remove(x) | Remove first matching value | None; ValueError if absent |
lst.pop() | Remove and return last item | Removed item |
lst.pop(i) | Remove and return item at index i | Removed item |
lst.clear() | Remove all items | None |
lst.sort() | Sort list in place | None |
lst.reverse() | Reverse in place | None |
del lst[i] | Delete item at index | Statement |
x in lst | Membership test | bool |
Mutation trap:
nums = [3, 1, 2]
result = nums.sort()
print(nums) # [1, 2, 3]
print(result) # None
Aliasing trap:
a = [1, 2]
b = a
c = a[:]
b.append(3)
print(a) # [1, 2, 3]
print(c) # [1, 2]
Tuples
| Pattern | Meaning |
|---|
t = (1, 2, 3) | Tuple with three elements. |
t = 1, 2, 3 | Tuple packing also works. |
one = (1,) | One-element tuple. |
not_tuple = (1) | Just integer 1. |
a, b = (10, 20) | Tuple unpacking. |
Tuple rules:
- Tuples are immutable.
- You can index, slice, iterate, use
len(), in, .count(), and .index(). - A tuple can contain mutable objects, but the tuple’s element bindings cannot be reassigned.
t = ([1, 2], 3)
t[0].append(4)
print(t) # ([1, 2, 4], 3)
Dictionaries
| Operation | Example | Notes |
|---|
| Create | d = {"a": 1, "b": 2} | Key-value pairs. |
| Access | d["a"] | Raises KeyError if key absent. |
| Safe access | d.get("x") | Returns None by default if absent. |
| Default access | d.get("x", 0) | Returns 0 if absent. |
| Add/replace | d["c"] = 3 | Existing key is overwritten. |
| Delete | del d["a"] | Raises KeyError if key absent. |
| Membership | "a" in d | Tests keys, not values. |
| Keys | d.keys() | View of keys. |
| Values | d.values() | View of values. |
| Items | d.items() | Key-value pairs. |
Dictionary traps:
d = {"a": 1, "b": 2}
print("a" in d) # True
print(1 in d) # False, values are not tested
print(d.get("x")) # None
## print(d["x"]) # KeyError
Keys must be hashable, so common safe key types include strings, numbers, and tuples of hashable elements. Lists cannot be dictionary keys.
Functions and Scope
Defining and Calling Functions
def area(width, height):
return width * height
print(area(3, 4)) # 12
| Concept | Quick reference |
|---|
| Definition | def name(parameters): creates a function object. |
| Call | name(arguments) executes the function. |
return value | Exits function and sends value to caller. |
No return | Function returns None. |
return alone | Returns None. |
| Function body | Does not run until function is called. |
Parameters and Arguments
| Pattern | Example | Notes |
|---|
| Positional | f(1, 2) | Matched by position. |
| Keyword | f(x=1, y=2) | Matched by name. |
| Mixed | f(1, y=2) | Positional arguments come first. |
| Default value | def f(x=0): | Used when argument omitted. |
| Invalid duplicate | f(1, x=2) | TypeError if x got two values. |
def power(base, exponent=2):
return base ** exponent
print(power(3)) # 9
print(power(3, 3)) # 27
print(power(exponent=3, base=2)) # 8
Scope Rules
| Scope behavior | Example / note |
|---|
| Local variable | Assigned inside a function by default. |
| Global variable | Defined at module level. |
| Read global | A function can read a global if not shadowed locally. |
| Rebind global | Requires global name inside function. |
| Shadowing | Local name can hide global name. |
x = 10
def show():
print(x)
show() # 10
Scope trap:
x = 10
def bad():
# print(x) # UnboundLocalError if executed before local assignment
x = 5
print(x)
bad() # 5
print(x) # 10
Global rebinding:
count = 0
def inc():
global count
count += 1
inc()
print(count) # 1
Mutable Argument Side Effects
def add_item(items):
items.append("x")
data = []
add_item(data)
print(data) # ['x']
A function can mutate a mutable object passed to it even without returning that object.
Exceptions
Basic Structure
try:
number = int(input())
result = 10 / number
except ValueError:
print("not an integer")
except ZeroDivisionError:
print("division by zero")
else:
print(result)
finally:
print("done")
| Clause | Runs when |
|---|
try | Code being protected is attempted. |
except SomeError | Matching exception occurs in try. |
else | No exception occurs in try. |
finally | Always runs after try/except/else path. |
Common Exceptions
| Exception | Typical cause |
|---|
SyntaxError | Invalid Python syntax; parse-time problem. |
IndentationError | Invalid indentation. |
NameError | Name is not defined. |
TypeError | Operation used with incompatible type. |
ValueError | Correct type, invalid value, such as int("abc"). |
ZeroDivisionError | Division or modulo by zero. |
IndexError | Sequence index out of range. |
KeyError | Missing dictionary key. |
AttributeError | Object has no requested attribute/method. |
ImportError / ModuleNotFoundError | Import cannot be completed. |
Exception Matching Traps
| Trap | Correct habit |
|---|
| General handler first | Put specific exceptions before broader ones. |
Assuming else always runs | else runs only if try has no exception. |
Assuming finally means success | finally runs even after an exception. |
| Catching wrong exception | Know difference between TypeError and ValueError. |
try:
x = int("abc")
except ZeroDivisionError:
print("zero")
except ValueError:
print("value")
## value
Modules and Namespaces
| Form | Example | How to use imported name |
|---|
| Import module | import math | math.sqrt(9) |
| Import with alias | import math as m | m.sqrt(9) |
| Import selected name | from math import sqrt | sqrt(9) |
| Import selected name with alias | from math import sqrt as s | s(9) |
| Import all names | from math import * | Names copied into current namespace; avoid in real code. |
import math
print(math.pi)
print(math.sqrt(16))
from math import sqrt
print(sqrt(16))
Trap:
import math
## print(sqrt(16)) # NameError
print(math.sqrt(16)) # Correct
Module Execution Guard
def main():
print("running directly")
if __name__ == "__main__":
main()
| Name | Meaning |
|---|
__name__ | Built-in module variable. |
"__main__" | Value when file is run directly. |
| Imported module | __name__ is the module name, not "__main__". |
High-Yield Code-Tracing Patterns
Evaluate in This Order
- Identify types of each variable.
- Apply parentheses, indexing, slicing, and function calls first.
- Apply operator precedence.
- Track assignments and mutations separately.
- For loops, write each iteration value.
- For
break/continue, mark skipped statements. - For functions, create a local scope and track return value.
- For exceptions, stop normal flow at the failing statement and jump to matching handler.
Frequent Output Traps
| Snippet | Result / issue |
|---|
print("2" + "3") | 23 |
print(2 + 3) | 5 |
print("2" + 3) | TypeError |
print(10 / 2) | 5.0 |
print(10 // 2) | 5 |
print(3 * "ab") | ababab |
print("abc"[1]) | b |
print("abc"[-1]) | c |
print([1, 2].append(3)) | None |
print(bool("False")) | True |
print(1 == True) | True |
print(1 is True) | Usually False; identity is not equality. |
Mutate or Return?
| Operation | Mutates original? | Returns useful value? |
|---|
lst.append(x) | Yes | No, returns None |
lst.sort() | Yes | No, returns None |
lst.reverse() | Yes | No, returns None |
sorted(lst) | No | Yes, new list |
s.upper() | No, strings immutable | Yes, new string |
s.replace(a, b) | No, strings immutable | Yes, new string |
lst[:] | No | Yes, shallow copy |
Mini Drill Snippets
Trace these until the result is automatic.
x = [1, 2, 3]
y = x
z = x[:]
x.append(4)
y[0] = 9
print(x)
print(z)
## [9, 2, 3, 4]
## [1, 2, 3]
total = 0
for i in range(1, 5):
if i % 2 == 0:
continue
total += i
print(total)
## 4
def f(x):
if x > 0:
return x
return -x
print(f(-3))
print(f(0))
print(f(3))
## 3
## 0
## 3
try:
print("A")
print(1 / 0)
print("B")
except ZeroDivisionError:
print("C")
finally:
print("D")
## A
## C
## D
Final Review Checklist
Before test day, make sure you can:
- Predict output for short Python snippets without running them.
- Explain why
/, //, and % produce different results. - Convert safely between
str, int, float, and bool. - Trace
if/elif/else chains exactly. - Use
range(start, stop, step) without including the stop value. - Distinguish
break, continue, and loop else. - Slice strings/lists/tuples using positive and negative indices.
- Identify which list methods mutate and return
None. - Distinguish list aliasing from list copying.
- Recognize tuple singleton syntax:
(x,). - Remember that dictionary membership tests keys.
- Trace function calls, local variables, defaults, and return values.
- Match common exceptions to likely causes.
- Use
import module versus from module import name correctly.
Next step: complete a timed mixed set of original PCEP-30-02 practice questions, then review every missed item by rewriting the code path, variable values, and final output or exception.