The differences are quite subtle, but to bring in some order, I'd suggest the following (I hope other native Poles agree):
taking something away from me to give to someone else' who is in a different room, or part of a house for example.
- in this case mostly "zanieś/daj tę książkę nauczycielowi" (if it's not just a normal house, but a big palace with wings and the teacher is really far, several hundreds meters for example, then rather only "zanieś", not "daj" *).
- if you were saying it to someone who visits you and then goes to another place (building or even town) by train, car, bus, tram etc., where you know he/she will meet the teacher, then rather "weź tę książkę dla nauczyciela" or "(od)daj tę książkę nauczycielowi"
- if you're asking someone to go to some distant place only to deliver the book to someone, and these persons wouldn't normally meet if not to fulfill your request, then "zanieś/zawieź tę książkę nauczycielowi" (I hope you know the difference between "nieść" - when you go on foot - and "wieźć" - when you go by car, bus etc.).
- * "daj tę książkę nauczycielowi" is more generic, but for me it implies the two persons will meet anyway for other reasons or that the recipient of the the action (i.e. the teacher) isn't far away from a place where the person fulfilling you're request is (or will be).