Can you assign multiple drivers to one bone?
A driver is used to calculate a single value. Only one driver can be assigned to calculate a specific value.

So yes a bone can have several drivers, one for it's x-location, one for it's y-location, one for it's x-rotation and so on.

If you need to use more complex logic to calculate the value, you can define a python function within the driver namespace.

import bpy

def driver_func(val):
    return val * val    # return val squared

# add function to driver_namespace
bpy.app.driver_namespace['driver_func'] = driver_func