PCAP-31-03 — Python Institute PCAP - Certified Associate Python Programmer Quick Review

Quick Review for Python Institute PCAP-31-03 candidates: high-yield Python concepts, common traps, decision rules, and practice focus areas.

Quick Review purpose

This Quick Review is for candidates preparing for the Python Institute PCAP - Certified Associate Python Programmer (PCAP-31-03) exam from Python Institute. Use it as a final-pass review before moving into topic drills, mock exams, and detailed explanations.

This page is IT Mastery exam-prep support. It is not affiliated with Python Institute and does not replace the official exam syllabus or policies. Always verify registration rules, exam format, and current requirements with the official provider.

How to use this review efficiently

  1. Scan the tables first. They summarize the rules most likely to cause mistakes.
  2. Mark weak areas. Do not reread everything equally; target the rules you cannot explain quickly.
  3. Practice output prediction. Many Python exam questions reward exact reasoning about values, types, scope, mutation, and control flow.
  4. Use original practice questions immediately after review. The fastest improvement usually comes from topic drills with detailed explanations, not passive reading.
  5. Revisit mistakes by category. Track whether you missed syntax, object behavior, mutability, inheritance, exceptions, or standard-library behavior.

High-yield PCAP-31-03 review map

AreaWhat to know coldCommon candidate mistake
Types and operatorsNumeric operators, precedence, truthiness, comparison behaviorConfusing is with ==, or / with //
Control flowif, loops, break, continue, loop else, nestingThinking loop else means “if condition was false”
CollectionsLists, tuples, dictionaries, sets, slicing, mutabilityForgetting list methods often mutate and return None
StringsIndexing, slicing, immutability, methods, formatting basicsExpecting string methods to modify the original string
FunctionsParameters, return values, defaults, scope, *args, **kwargsUsing mutable default arguments unintentionally
Modules and packagesImport forms, namespaces, __name__, module search conceptsNot knowing what name is introduced by each import style
Exceptionstry, except, else, finally, raising exceptions, hierarchyCatching broad exceptions before specific ones
FilesOpen modes, text processing, context managersForgetting to close files or mishandling newline behavior
OOPClasses, instances, attributes, methods, inheritance, overridingConfusing class attributes with instance attributes
Iteration toolsIterables, iterators, comprehensions, generatorsExpecting a generator to restart automatically

Python execution model and object basics

Python questions often test object behavior more than definitions.

ConceptReview rule
Everything is an objectValues have identity, type, and value.
Assignment binds namesx = y makes x refer to the same object as y; it does not copy the object.
Mutability mattersLists, dictionaries, and sets are mutable. Strings, tuples, numbers, and booleans are immutable.
Identity vs equalityis checks object identity; == checks value equality.
NamespacesA name is resolved in a namespace; the same spelling can refer to different objects in different scopes.

Identity, equality, and mutation traps

Expression or patternCorrect interpretation
a == bDo a and b have equal values?
a is bAre a and b the exact same object?
b = ab now refers to the same object as a.
b = a[:]For many sequences, creates a shallow copy.
list1.append(x)Mutates list1 and returns None.
s.upper()Returns a new string; s is unchanged.

Quick check: if an operation mutates an object in place, be suspicious of assigning its return value. For example, x = my_list.sort() makes x become None.

Operators, precedence, and expressions

Arithmetic and comparison rules

OperatorMeaningTrap
+Addition or concatenationWorks differently by type; 1 + "1" is invalid.
-Subtraction or unary negativeUnary operators interact with exponentiation.
*Multiplication or sequence repetition"ha" * 3 gives repeated string content.
/True divisionResult is a float.
//Floor divisionFloors toward negative infinity, not toward zero.
%ModuloSign behavior follows Python’s floor-division relationship.
**ExponentiationRight-associative: 2 ** 3 ** 2 means 2 ** (3 ** 2).
==, !=Equality comparisonDo not confuse with identity checks.
<, <=, >, >=Ordering comparisonsChained comparisons are evaluated mathematically.

Boolean logic and truthiness

ValueTruth value
False, NoneFalse
0, 0.0False
"", [], (), {}, set()False
Most other objectsTrue

Important rules:

  • and and or short-circuit.
  • and returns the first falsy operand or the last operand.
  • or returns the first truthy operand or the last operand.
  • not returns a Boolean value.
  • Chained comparisons such as a < b < c are valid and do not mean (a < b) < c.

Operator precedence review

High-level order to remember:

  1. Parentheses and indexing/calls
  2. Exponentiation
  3. Unary +, -, not where applicable
  4. Multiplication, division, floor division, modulo
  5. Addition and subtraction
  6. Comparisons and membership/identity tests
  7. Boolean and
  8. Boolean or

When in doubt, add parentheses mentally and test with small values in practice questions.

Control flow

if, elif, and else

PatternReview point
if condition:Executes only if condition is truthy.
elif condition:Tested only if previous branches failed.
else:Executes when no earlier branch executed.
Nested ifIndentation determines structure, not visual intention.

Common trap: if x == 1 or 2: is almost always wrong because 2 is truthy. Use if x == 1 or x == 2: or if x in (1, 2):.

Loops

Loop featureMeaning
while condition:Repeats while condition is truthy.
for item in iterable:Iterates over items produced by iterable.
breakExits the nearest loop immediately.
continueSkips to the next iteration of the nearest loop.
Loop elseRuns if the loop was not terminated by break.

Loop else decision rule

Use this rule:

  • If the loop finishes normally, the else block runs.
  • If the loop exits by break, the else block does not run.
  • continue does not prevent the loop else from running.

This is frequently misunderstood because loop else does not mean “the loop condition was false in the same way as an if statement.”

Collections: lists, tuples, dictionaries, and sets

Lists

Lists are ordered, mutable sequences.

OperationResult
lst[i]Element at index i
lst[-1]Last element
lst[a:b]Slice from a up to but not including b
lst[a:b:c]Slice with step c
lst.append(x)Adds one element at the end
lst.extend(iterable)Adds each item from iterable
lst.insert(i, x)Inserts before index i
lst.pop()Removes and returns last item
lst.pop(i)Removes and returns item at index i
lst.remove(x)Removes first matching value
lst.sort()Sorts in place and returns None
sorted(lst)Returns a new sorted list

List slicing traps

SliceMeaning
lst[:]Shallow copy
lst[::-1]Reversed copy
lst[:3]First three elements
lst[3:]Elements from index 3 onward
lst[-3:]Last three elements
lst[::2]Every second element
lst[5:1:-1]Descending slice from index 5 down to above index 1

Remember: slicing tolerates out-of-range bounds more gracefully than direct indexing.

Tuples

Tuples are ordered and immutable, but they can contain mutable objects.

PatternMeaning
(1, 2, 3)Tuple with three elements
(1,)One-element tuple
(1)Just the integer 1
tuple_obj[0]Indexing works like lists
tuple_obj[:]Slicing works like lists

Trap: tuple immutability means the tuple’s references cannot be changed, but a mutable object inside a tuple may still be mutated.

Dictionaries

Dictionaries store key-value pairs and preserve insertion order in modern Python versions.

OperationReview point
d[key]Returns value or raises KeyError if missing
d.get(key)Returns value or None if missing
d.get(key, default)Returns default if key missing
d[key] = valueAdds or updates an entry
del d[key]Deletes key or raises KeyError
key in dTests keys, not values
d.keys()View of keys
d.values()View of values
d.items()View of key-value pairs

Dictionary traps:

  • Keys must be hashable.
  • Lists cannot be dictionary keys.
  • Tuples can be keys only if all their elements are hashable.
  • in checks keys by default.
  • Updating an existing key does not create a duplicate key.

Sets

Sets are unordered collections of unique hashable elements.

OperationMeaning
set(iterable)Creates a set from unique items
`ab`
a & bIntersection
a - bDifference
a ^ bSymmetric difference
x in sMembership test
s.add(x)Adds one element
s.remove(x)Removes item or raises KeyError
s.discard(x)Removes item if present; no error if absent

Trap: {} creates an empty dictionary, not an empty set. Use set() for an empty set.

Strings

Strings are immutable sequences of characters.

FeatureReview point
Indexings[0], s[-1] work like sequence indexing.
SlicingReturns a new string.
ImmutabilityYou cannot assign to s[0].
MethodsMost return new strings or other values.
Membership"py" in "python" tests substring presence.

String method review

MethodUse
s.lower()New lowercase string
s.upper()New uppercase string
s.strip()Removes leading/trailing whitespace by default
s.lstrip(), s.rstrip()Remove from left or right
s.find(sub)Lowest index or -1
s.index(sub)Lowest index or raises ValueError
s.count(sub)Counts non-overlapping occurrences
s.replace(old, new)Returns new string with replacements
s.split(sep)Returns list of substrings
sep.join(iterable)Joins strings using separator
s.startswith(prefix)Boolean result
s.endswith(suffix)Boolean result
s.isalpha(), s.isdigit(), s.isspace()Character classification checks

String formatting basics

Know the difference between:

  • Concatenation with +
  • Conversion with str()
  • Format strings and placeholders
  • f-string expression evaluation

Common trap: join() is called on the separator, not on the list. The pattern is ", ".join(items).

Functions

Defining and calling functions

FeatureReview rule
def name(...):Creates a function object and binds it to a name.
return valueExits function and sends value back.
No explicit returnFunction returns None.
Positional argumentsMatched by position.
Keyword argumentsMatched by parameter name.
Default parametersUsed when caller omits that argument.
*argsCollects extra positional arguments as a tuple.
**kwargsCollects extra keyword arguments as a dictionary.

Argument-order rule

A safe ordering model:

  1. Positional parameters
  2. Defaulted parameters
  3. *args
  4. Keyword-only parameters, if used
  5. **kwargs

When calling a function:

  • Positional arguments generally come before keyword arguments.
  • Do not provide the same parameter twice.
  • A required parameter must receive a value.
  • Keyword names must match parameter names unless captured by **kwargs.

Default argument trap

Default argument expressions are evaluated once when the function is defined, not each time it is called.

PatternRisk
def f(x, items=[]):The same list may be reused across calls.
def f(x, items=None):Safer pattern; create a new list inside if needed.

This is a classic exam and interview trap because the code may appear to “remember” values between calls.

Scope and name resolution

Python uses the LEGB rule:

LevelMeaning
LocalNames assigned inside the current function
EnclosingNames in enclosing function scopes
GlobalNames at module level
Built-inPython built-in names

Important scope rules:

  • Reading a global name from inside a function is allowed.
  • Assigning to a name inside a function normally makes it local.
  • If a local assignment exists, reading that name before assignment can cause UnboundLocalError.
  • global tells Python that assignment should target the module-level name.
  • nonlocal targets a name in an enclosing function scope.

Lambda, higher-order functions, and comprehensions

FeatureReview point
lambdaCreates a small anonymous function with one expression.
map()Applies a function to items; returns an iterator.
filter()Keeps items for which function is truthy; returns an iterator.
List comprehensionBuilds a list from an expression and iterable.
Generator expressionLazy expression; produces items as needed.

Candidate trap: in Python 3, functions such as map() and filter() produce iterators, not lists. If a question expects a list, conversion may be needed with list(...).

Modules, packages, and imports

Import forms

Import statementName available afterward
import mathmath
import math as mm
from math import sqrtsqrt
from math import sqrt as ss
from math import *Many public names; avoid in production-style reasoning

Import traps

TrapCorrect understanding
import module vs from module import nameThe first imports the module name; the second imports a specific object name.
AliasingAfter import math as m, use m.sqrt(...), not math.sqrt(...) unless math was also imported.
Namespace pollutionfrom module import * can overwrite existing names and reduce clarity.
Module executionTop-level module code executes when imported.
Repeated importsModules are cached after import in normal execution.

__name__ and script behavior

The variable __name__ is:

  • "__main__" when the file is run directly.
  • The module’s name when imported.

Common pattern: if __name__ == "__main__": guards code that should run only when the module is executed as a script, not when imported.

Packages

A package organizes modules in directories. Review:

  • Absolute vs relative import concepts.
  • Why namespaces prevent name collisions.
  • How package structure affects import paths.
  • The role of module search paths at a conceptual level.

Do not spend all your review time memorizing obscure package mechanics. For PCAP-style readiness, prioritize understanding what names are available after imports and how module code executes.

Selected standard-library areas to recognize

ModuleCommon purpose
mathMathematical functions and constants
randomPseudorandom choices and numbers
datetimeDates and times
osOperating-system interactions
sysInterpreter-related values and functions
platformPlatform information
jsonJSON serialization and parsing

Practice questions often test whether you recognize the purpose and basic use pattern of standard modules rather than deep memorization of every function.

Exceptions

Exception flow

ConstructMeaning
tryCode that may raise an exception
except SomeErrorHandles a matching exception
exceptBroad catch; should usually come last
elseRuns if no exception occurred in try
finallyRuns regardless of whether an exception occurred
raiseRaises an exception
assert conditionRaises AssertionError if condition is false

Exception-order rule

Put specific exception handlers before general ones.

Better orderWhy
except ValueError: before except Exception:Specific handler gets a chance to run.
Broad handler firstMakes later specific handlers unreachable or ineffective.

try / except / else / finally decision table

Situationexcept runs?else runs?finally runs?
No exception in tryNoYesYes
Exception handled by matching exceptYesNoYes
Exception not handledNo matching handlerNoYes, then exception propagates
return inside tryMaybe notDepends on flowYes before function exits

Important: finally is for cleanup logic. It runs even when control flow is leaving the block.

Common built-in exceptions

ExceptionTypical cause
ValueErrorCorrect type, invalid value
TypeErrorOperation or function used with inappropriate type
IndexErrorSequence index out of range
KeyErrorMissing dictionary key
ZeroDivisionErrorDivision or modulo by zero
FileNotFoundErrorFile path cannot be found
AttributeErrorAttribute does not exist
NameErrorName is not defined
UnboundLocalErrorLocal variable referenced before assignment
ImportError / ModuleNotFoundErrorImport problem
AssertionErrorFailed assertion

Files and input/output

File-opening basics

ModeMeaning
"r"Read text file
"w"Write text file; truncates existing file
"a"Append text
"x"Create new file; fail if it exists
"b"Binary mode modifier
"t"Text mode modifier
"+"Updating: reading and writing

Use context managers when possible: with open(...) as f: ensures the file is closed after the block.

File method review

MethodUse
read()Reads entire file or specified size
readline()Reads one line
readlines()Reads all lines into a list
Iterating over file objectReads line by line
write(text)Writes string and returns number of characters written
writelines(iterable)Writes strings from iterable; does not automatically add newlines
close()Closes the file

Common traps:

  • Opening with "w" can erase existing content.
  • read() consumes from the current file position.
  • Newline characters may remain when reading lines.
  • Text mode expects strings; binary mode expects bytes-like objects.
  • writelines() does not insert separators or newline characters for you.

Object-oriented programming

Class and object fundamentals

TermMeaning
ClassBlueprint for objects
Object / instanceA concrete object created from a class
AttributeData associated with an object or class
MethodFunction associated with a class
selfConventional name for the current instance
Constructor initializer__init__ initializes a new instance after creation

Instance vs class attributes

Attribute typeWhere storedShared?
Instance attributeOn each objectNo
Class attributeOn the classYes, unless shadowed by instance attribute

Candidate trap: mutable class attributes can be shared by all instances. If each object needs its own list, create it as an instance attribute inside __init__.

Methods and binding

Method patternReview point
Instance methodFirst parameter receives the instance, conventionally self.
Calling obj.method()Python passes obj as the first argument automatically.
Calling Class.method(obj)Equivalent explicit style for many instance methods.
Missing selfCommon cause of argument-count errors.

Encapsulation conventions

Python uses conventions more than strict access controls.

Name styleConvention
namePublic
_nameInternal-use convention
__nameName-mangled to reduce accidental collision in subclasses
__name__Special “dunder” method or attribute

Do not describe Python’s underscores as absolute privacy. They are primarily conventions and name-mangling mechanisms.

Inheritance and overriding

ConceptReview point
InheritanceA subclass can reuse and extend superclass behavior.
OverrideSubclass defines a method with the same name as superclass method.
super()Accesses superclass behavior according to method resolution rules.
isinstance(obj, Class)Tests whether object is instance of class or subclass.
issubclass(Sub, Base)Tests class inheritance relationship.

Inheritance decision points

Ask these questions when reading OOP code:

  1. Which class is used to create the object?
  2. Does the instance have the attribute directly?
  3. If not, does the class have it?
  4. If not, is it inherited from a superclass?
  5. If a method is called, which override is found first?
  6. Does the method call super() and continue the chain?

Special methods

MethodPurpose
__init__Initialize instance state
__str__User-friendly string representation
__repr__Developer-oriented representation
__len__Supports len(obj)
__eq__Supports equality comparison
__lt__Supports less-than comparison
__iter__Supports iteration
__next__Produces next item for iterator protocol

Know the pattern: Python syntax and built-in functions often call special methods behind the scenes.

Iteration, iterators, and generators

ConceptReview point
IterableObject that can produce an iterator
IteratorObject with __next__() behavior
iter(obj)Gets an iterator
next(iterator)Gets next value or raises StopIteration
Generator functionFunction using yield
Generator objectLazy iterator produced by calling a generator function

Generator traps

  • A generator does not execute its body until iteration begins.
  • Values are produced one at a time.
  • Once exhausted, a generator does not restart automatically.
  • return inside a generator ends iteration.
  • yield pauses function state between values.

Comprehensions

FormProduces
[expr for x in iterable]List
{expr for x in iterable}Set
{k: v for x in iterable}Dictionary
(expr for x in iterable)Generator expression

Review filter placement:

  • [x for x in nums if x > 0] keeps only positive values.
  • [x * 2 for x in nums] transforms every value.
  • [x * 2 for x in nums if x > 0] filters first by the if, then transforms kept values.

Nested comprehensions are easy to misread. Translate them into ordinary loops if needed.

Common PCAP-31-03 mistake patterns

Syntax and indentation

MistakeCorrection
Missing colon after if, for, while, def, class, try, exceptCompound statements need :.
Incorrect indentationBlocks are defined by indentation.
Mixing tabs and spacesAvoid; can produce indentation errors.
Assuming braces define blocksPython uses indentation, not braces.

Type and conversion mistakes

MistakeCorrection
Adding string and integer directlyConvert explicitly with str() or int() as appropriate.
Expecting input() to return a numberinput() returns a string.
Confusing list("abc") with ["abc"]The first gives individual characters.
Expecting bool("False") to be falseNon-empty strings are truthy.

Mutability mistakes

MistakeCorrection
Thinking assignment copies a listAssignment binds another name to the same list.
Expecting slicing to deep-copy nested listsSlicing creates a shallow copy.
Using mutable default argumentsUse None and create inside function.
Sorting a list and assigning the resultlist.sort() returns None; use sorted() for a new list.

Scope mistakes

MistakeCorrection
Assigning to global name inside function without globalCreates a local name by default.
Reading local before assignmentCan raise UnboundLocalError.
Shadowing built-ins like list or strAvoid using built-in names as variables.

Exception mistakes

MistakeCorrection
Catching Exception before ValueErrorPut specific handlers first.
Assuming finally runs only on errorsIt runs regardless.
Assuming else runs after an exception is handledelse runs only if no exception occurred in try.

Quick decision rules for exam questions

Use these fast checks when answering code-based questions.

If the question involves…Ask yourself…
AssignmentAre two names pointing to the same object?
A list or dictionaryIs it being mutated in place?
A method callDoes this method return a value or mutate and return None?
A functionWhat is returned if no return executes?
DefaultsWas the default object created once at definition time?
ScopeIs the name local, enclosing, global, or built-in?
ImportsWhich exact name is available after the import statement?
ExceptionsWhich handler matches first? Does finally run?
InheritanceWhich method or attribute is found first?
IteratorsHas the iterator already been consumed?
StringsIs a new string returned rather than modifying the original?
DictionariesIs membership checking keys or values?

Mini review: output-prediction checklist

Before choosing an answer, walk through the code in this order:

  1. Parse the structure. Check indentation, blocks, and function/class definitions.
  2. Identify object creation. Lists, dictionaries, objects, iterators, and generators may carry state.
  3. Track name binding. Assignment changes what a name refers to.
  4. Track mutation. In-place operations affect all references to the same mutable object.
  5. Resolve scope. Apply LEGB for every non-obvious name.
  6. Follow control flow. Include break, continue, return, exceptions, and finally.
  7. Check return values. Many methods return None even though they changed an object.
  8. Confirm final type. A correct-looking value with the wrong type may still be wrong.

Practice priorities before the real exam

After this Quick Review, use a question bank with original practice questions, topic drills, and detailed explanations. Prioritize practice in this order if time is short:

PriorityPractice focusWhy it matters
1Output prediction with lists, dictionaries, functions, and scopeHigh error rate and easy to underestimate
2Exceptions and file handlingTests exact control flow and cleanup behavior
3OOP inheritance and attributesRequires methodical lookup reasoning
4Modules and importsSmall syntax differences change available names
5Strings and slicingMany questions hide off-by-one or immutability traps
6Iterators, generators, comprehensionsLazy evaluation and exhaustion can surprise candidates

Final readiness check

You are closer to ready for PCAP-31-03 when you can:

  • Explain the difference between equality and identity.
  • Predict the result of list mutation through multiple references.
  • Trace function calls with positional, keyword, default, *args, and **kwargs.
  • Apply LEGB without guessing.
  • Explain when loop else, try else, and finally execute.
  • Identify what each import form makes available.
  • Distinguish class attributes from instance attributes.
  • Follow inheritance and method overriding.
  • Read and reason about file modes and common file methods.
  • Solve timed original practice questions without relying on trial-and-error execution.

Practical next step

Move from review into IT Mastery practice: start with targeted topic drills for your weakest areas, then take mixed mock exams and study the detailed explanations for every missed or guessed question.

Continue in IT Mastery

Use this Quick Review as a final concept map, then move into IT Mastery for focused topic drills, mixed practice sets, timed mock exams, and detailed explanations. The practice questions are original IT Mastery practice items; they are not official Python Institute questions, copied live-exam content, or exam dumps.