input: Write a function to generate a random password of length 8 characters, which contains at least one of each character type (lowercase, uppercase, digits, special characters). The function should return the generated password.
  import string
  import random
  
  def generate_password():
      # length of password
      length = 8
  
      # special characters
      special_characters = "!#$%&'()*+,-./:;<=>?@[\]^_`{|}~"
  
      # generating password
      password = random.choice(string.ascii_lowercase)
      password += random.choice(string.ascii_uppercase)
      password += random.choice(string.digits)
      password += random.choice(special_characters)
  
      for i in range(length):
          password += random.choice(string.ascii_lowercase + string.ascii_uppercase + string.digits + special_characters)
  
      password  = ''.join(random.sample(password,len(password)))
  
      return password
      
  assert len(generate_password()) == 8
  assert any(c.islower() for c in generate_password()) == True
  assert any(c.isupper() for c in generate_password()) == True
  assert any(c.isdigit() for c in generate_password()) == True
  assert any(c in "!#$%&'()*+,-./:;<=>?@[\]^_`{|}~" for c in generate_password()) == True
output: def generate_password():
      length = 8
      special_characters = "!#$%&'()*+,-./:;<=>?@[\]^_`{|}~"
      password = random.choice(string.ascii_lowercase) + random.choice(string.ascii_uppercase) + random.choice(string.digits) + random.choice(special_characters)
      password += ''.join(random.choice(string.ascii_lowercase + string.ascii_uppercase + string.digits + special_characters) for _ in range(length - 4))
      return ''.join(random.sample(password, length))