input: Write a python function to tokenize a sentence and tag its parts of speech.
  assert pos_tag_sentence("The quick brown fox jumps over the lazy dog") == [('The', 'DT'), ('quick', 'JJ'), ('brown', 'NN'), ('fox', 'NN'), ('jumps', 'VBZ'), ('over', 'IN'), ('the', 'DT'), ('lazy', 'JJ'), ('dog', 'NN')]
  assert pos_tag_sentence("I love programming in Python") == [('I', 'PRP'), ('love', 'VBP'), ('programming', 'VBG'), ('in', 'IN'), ('Python', 'NNP')]
  assert pos_tag_sentence("He is reading a book") == [('He', 'PRP'), ('is', 'VBZ'), ('reading', 'VBG'), ('a', 'DT'), ('book', 'NN')]
output: import nltk
  from nltk import pos_tag
  from nltk.tokenize import word_tokenize
  
  # Download necessary NLTK data files
  nltk.download('punkt')
  nltk.download('averaged_perceptron_tagger')
  
  def pos_tag_sentence(sentence):
      tokens = word_tokenize(sentence)
      tagged = pos_tag(tokens)
      return tagged