Kezd összeállni a dolog. Azzal, hogy az első sorban megadtam az end='\n' paramétert, nem befolyásoltam semmit, hisz az amúgy is az alapértelmezett volt. A második sorban az implicit '\n' elvégezte a soremelést, de mivel ott szerepel még egy '\n' ezért újabb soremelés történt, ami ugye így egy üres sorhoz vezetett.
Ami azt a részt illeti, hogy "több elem esetén csak az utolsó után rakja ki az end-ben definiált sorvéget" azt én úgy értelmezem, hogy ha egy print() függvényen belül több elem van (ebben az esetben az "alma" és "banan") akkor csak az utolsó elem, azaz a "banan" karakterlánc után rakja ki az end-ben definiált sorvéget.