# My very first python program, need help

Sun Aug 10 16:21:27 CEST 2008

```Dnia Sun, 10 Aug 2008 15:52:37 +0200, WP napisa³(a):

Hi,

> import re
>
> def calculate_sum_1(str):
^^^
this word is reserved, better use some other name

>      for c in str:
>          if c.isdigit() == False and c != ' ':
>              # That we assign to the variable we're looping over worries
> me...
>              str = str.replace(c, ' ')

It's good that it worries you. AFAIR python behavior when assigning to
a variable that is used in for loop is undefined, so you can't count
on it. Better introduce second variable.

>
>      mylist = str.split()
>
>      print "(for loop version) mylist after replace() and split() = ",
> mylist
>
>      sum = 0
>
>      for item in mylist:
>         sum += long(item)

You could use list comprehensions and sum function in here.

> def calculate_sum_2(str):
>      #print "In replace_nondigits_2(), str = ", str
>      p = re.compile('[^0-9]')

or: p = re.compile('\d+')
'\d+' is for one or more digits

>      mylist = p.split(str)

You don't have to split this string. Just search through it.
Findall method seems appropriate.

A bit more pythonic approaches to both of your functions:

=======================
import re

a="123xx,22! p1"

# Note that 'string' isn't the best name too. It may be shadowed by
# or shadow 'string' module if it's imported.
def calculate_sum_1(string):
result = ''

for i in string:
if i.isdigit():
result += i
else:
result += ' '

return sum([int(i) for i in result.split()])

def calculate_sum_2(string):
pat = re.compile('\d+')
digits = [int(i) for i in re.findall(pat, string)]
return sum(digits)

print calculate_sum_1(a)
print calculate_sum_2(a)
===========================

--
Regards,
Wojtek Walczak,
http://www.stud.umk.pl/~wojtekwa/

```