Vertical partitioning you do just through good table design any version
Horizontal partitioning not introduced until 5.1
Options in 5.0 :
DIY wraper that sorts out which table to access. So you could use table names like customer_A_E, customer_F_H referring to their postcode, or store table names in a table with ranges in them.
I used to use a perl DBI wrapper to apply partitioning and anything else I needed but then mysql-proxy came along ... then life changed for the better in many ways.. brilliant piece of software.
So you could write a mysql-proxy lua script that re-writes queries to point at physically separate tables...
Hmm warming to the idea myself...
A simple table that acts as a look up on range to control the horizontal partitioning and simple query to control the ranging of partitions. For the vertical partitioning you always have the information_schema to query to find the tables with the right columns
Or install 5.1