Could you please tell me what you liked or may have disliked about this code? What can be made better?
#!/usr/bin/python3
def change_char_at(ch, s, indx):
"""
Strings in Python are immutable objects. So, it is not possible to change a
certain character in a string in place. For example, an attempt to run the
following code will fail with a TypeError:
s = "spam"
s[1] = "z" # TypeError: 'str' object does not support item assignment
What this function does is it provides you with a nice interface when you
want to change a character in a string at a certain index position. So, use
this function instead of doing everything manually which can sometimes be
tricky. Notice that the character parameter does not necessarily have to be
one character long. It can be an empty string which means that a character
at a certain position will effectively be deleted from the string. If it's
more than one character long, then they all will be inserted into the string
starting at the specified index position.
Parameters:
ch: character to insert
s: string to insert into
indx: index position where to insert the character
"""
# Error handling
if type(ch) is not str:
raise TypeError("first argument must be a string")
if type(s) is not str or not len(s) > 0:
raise TypeError("second argument must be a non-empty string")
length = len(s) - 1
if not(indx >= 0 and indx <= length):
msg = "string index out of range; "
msg += "attempt to access index at {0}; ".format(indx)
msg += "allowable index range 0 to {0}".format(length)
raise IndexError(msg)
# Actual function logic
return s[:indx] + ch + s[indx + 1:]
"""
Another possible implementation:
ls = list(s)
ls[indx] = ch
return ''.join(ls)
This works well too and is equally good, but might be conspired unpythonic
by some compared to the one right above it.
"""
def main():
my_string = "spam"
my_string = change_char_at("z", my_string, 1)
print(my_string) # prints "szam"
if __name__ == "__main__": main()
index
. Doesn't make much sense to shorten word by one character. Also I know several ways of doing this, but yours seems best to me. – Alissa Feb 18 at 16:04