Well, the second one will fail if the variable a is not a number.
>>> a='hi'
>>> b='hi'
>>> print "The number is %d and the text is %s" %(a, b)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-aa94a92667a1> in <module>()
----> 1 print "The number is %d and the text is %s" %(a, b)
TypeError: %d format: a number is required, not str
If a is always a number, they would behave very much alike, except the %d in the format forces it to be an integer, so if you have:
>>> a=1.2
>>> b='hi'
>>> print "The number is %d and the text is %s" %(a, b)
The number is 1 and the text is hi
You can see that it converts the number 1.2 to an integer 1.
As per the comments, another option is to use the format function, that behaves similar to your first option but using a format string:
>>> a=1.2
>>> b='hi'
>>> print "The number is {} and the text is {}".format(a, b)
The number is 1.2 and the text is hi
It also allows to use named arguments:
>>> print "The number is {number} and the text is {text}".format(number=a, text=b)
The number is 1.2 and the text is hi
print("The number is {} and the text is {}".format(a, b))