Show how Python's split turns a string into a list and join turns it back into a string.
split breaks a string into a list of pieces using a separator, and join glues an iterable of strings back together using a separator you choose.
csv_line = "ada,99,grace,87"
fields = csv_line.split(",")
print(fields) # ['ada', '99', 'grace', '87']
print(",".join(fields)) # ada,99,grace,87
print("-".join(fields)) # ada-99-grace-87
# maxsplit limits how many splits happen
print("a,b,c".split(",", 1)) # ['a', 'b,c']
# join works on any iterable of strings
print("".join(str(n) for n in range(5))) # 01234Splitting on a comma gives four fields, and joining them with a comma reproduces the original string exactly. The maxsplit argument is the detail people miss: split(",", 1) splits only at the first comma, so the rest of the string stays in one piece. That is exactly what you want for a format where only the first separator is a delimiter.
Two variants of split are worth distinguishing. split() with no argument splits on any run of whitespace and throws away empty pieces, so it is the right call for counting words. split(",") splits on that literal separator and keeps empty pieces, so "a,,b".split(",") produces three elements with an empty string in the middle.
For join, the important points are that the separator belongs to the string you call it on, and that every element must already be a string. Passing an integer raises a TypeError, which is why the generator expression above converts with str first. And join accepts any iterable, so it works on a list, a tuple or a generator — which is why it is the natural counterpart to split.