• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funkcja problem z output

42 Warsaw Coding Academy
+1 głos
352 wizyt
pytanie zadane 14 listopada 2021 w Python przez magda_19 Gaduła (3,080 p.)

Piszę funkcję, która powinna przyjmować string jako argument. Funkcja ma liczyć sumę wszystkich liczb w stringu. Tak więc dla sum_of_digits("123") powinnam dostać: 6
Dla sum_of_digits("1aw3") powinnam mieć
The sum of digits operation performs 1+3
The extracted non-digits are: [’a’, ’w’]
4
Dla sum_of_digits("") powinno być:
Empty string entered
0
A dla sum_of_digits("united"):
The sum of digits operation could not detect a digit!
The returned input letters are: ['u', 'n', 'i', 't', 'e', 'd']
0

Mój program wyswietla odpowiedzi, ale nie takie jak powinny być. Oto kod:

def sum_of_digits(s):
    letters = []
    numbers = []
    sum = 0
    for i in s:
      if i.isdigit():
            sum += int(i)
            print(sum)
    for i in s:
        if i.isalpha() and i.isdigit():
            letters.append(i)
            numbers.append(i)
            print("The sum of digits operation performs ", "+".join(numbers))
            print("The extracted non-digits are: {} ".format(letters), end="\n")
        elif len(s) == 0:
            print('Empty string entered!')
            return 0   
        elif s == 'united':
            print('The sum of digits operation could not detect a digit!')
            print('The returned input letters are: ', end = '')
            print([char for char in s])
            return 0    

sum_of_digits("123")
sum_of_digits("1aw3")
sum_of_digits("")
sum_of_digits("united")

A to output:

1
3
6
1
4
The sum of digits operation could not detect a digit!
The returned input letters are: ['u', 'n', 'i', 't', 'e', 'd']
0

 

2 odpowiedzi

0 głosów
odpowiedź 14 listopada 2021 przez edutomek Dyskutant (8,380 p.)

1) Nie rozumiem, dlaczego robisz dwie pętle po znakach w s.
Można to zrobić jedną pętlą, sprawdzając po kolei wszystkie warunki.

2) Sprawdzanie len(s) w pętli też nie ma sensu - s się przecież nie zmienia.
To należy zrobić przed pętlą.

3) Skoro w pewnych sytuacjach zwracasz z funkcji 0, to wypadałoby zwracać jakąś wartość (choćby i to zero) we wszystkich możliwych odgałęzieniach.

Choć nie mam pojęcia, po co zwracać to zero.

4) Lepiej nie używać zmiennej o nazwie sum. W Pythonie jest funkcja o takiej nazwie.

5) Poza cyframi i literami są jeszcze inne znaki.
Ot, taka uwaga dodatkowa.

Czyli generalnie mamy następujący schemat funkcji:
 

def sum_of_digits(s):
    if len(s) == 0:
        print('Empty string entered!')
        return 0
    else:
        letters = []
        numbers = []
        suma = 0
        for i in s:
          if i.isdigit():
              suma += int(i)
              numbers.append(i)
          elif i.isalpha():
              letters.append(i)
        if len(numbers) == 0:
          print('Brak cyfr')
        else:
          print('Suma', suma)
          print('Cyfry', numbers)
        print('Litery', letters)

        return 0

sum_of_digits("123")
sum_of_digits("1aw3")
sum_of_digits("")
sum_of_digits("united")

Wyjście zapewne nie takie, ale format print-ów można dopracować.

komentarz 14 listopada 2021 przez magda_19 Gaduła (3,080 p.)

Dzięki za podpowiedź. Teraz tak to wygląda: Jest tylko problem z drugą funkcją, bo w ogóle jej nie odczytuje

def digit_sum(value: str) -> int:
  if value == "":
    print("Empty string entered!")
    return 0
  elif value == "united":
     print('The sum of digits operation could not detect a digit!')
     print('The returned input letters are: ', end = '')
     print([char for char in value])
     return 0  
  elif value.isdigit():
     print(sum([int(x) for x in value if x.isdigit()]))
  elif value.isalpha() and value.isdigit():
    numbers = []
    letters = []
    for y in value:
      numbers.append(y)
      letters.append(y)
      print("The sum of digits operation performs ", "+".join(numbers))
      print("The extracted non-digits are: {} ".format(letters), end="\n")

digit_sum("123")    
digit_sum("e12aw4")
digit_sum("")
digit_sum("united")

 

0 głosów
odpowiedź 15 listopada 2021 przez VBService Ekspert (256,600 p.)
edycja 15 listopada 2021 przez VBService

Teraz tak to wygląda: Jest tylko problem z drugą funkcją, bo w ogóle jej nie odczytuje

Może potraktuj przypadek gdzie zawartość jest mieszana

digit_sum("e12aw4")

jak else - gdzie wszystkie inne elif-y "nie zadziałały"  wink

 

 

propozycja zmian  [ on-line ]

def digit_sum(value: str) -> int:
   if not value:
      print("Empty string entered!")
      return 0
   elif value.isalpha():
      print('The sum of digits operation could not detect a digit!')
      print('The returned input letters are: ', end='')
      print(list(map(str, value)))
      return 0 
   elif value.isdigit():
      print(sum([int(x) for x in value if x.isdigit()]))
      return 1
   else: #value.isalpha() and value.isdigit():
      numbers = []
      letters = []
      for y in value:
         if y.isdigit(): numbers.append(y)
         if y.isalpha(): letters.append(y)
      print("The sum of digits operation performs", "+".join(numbers), "=", sum(map(int, numbers)))
      print("The extracted non-digits are: {} ".format(letters), end="\n")
      return 1
 
digit_sum("123")    
digit_sum("e12aw4")
digit_sum("")
digit_sum("united")

 

dodałbym jeszcze 

value.strip()

dla

digit_sum(" ")
digit_sum("  ")

 

 i

(not y.isdigit() and y.isascii)

dla

digit_sum(" 1 2")
digit_sum("34 - ")
digit_sum("1010 !? g")

 

przykład  [ on-line ]

def digit_sum(value: str) -> int:
   if not value.strip():
      print("Empty string entered!")
      return 0
   elif value.isalpha():
      print('The sum of digits operation could not detect a digit!')
      print('The returned input letters are: ', end='')
      print(list(map(str, value)))
      return 0 
   elif value.isdigit():
      print(sum([int(x) for x in value if x.isdigit()]))
      return 1
   else: #value.isalpha() and value.isdigit():
      numbers = []
      letters = []
      for y in value:
         if y.isdigit(): numbers.append(y)
         if y.isalpha() or (not y.isdigit() and y.isascii): letters.append(y)
      print("The sum of digits operation performs", "+".join(numbers), "=", sum(map(int, numbers)))
      print("The extracted non-digits are: {} ".format(letters), end="\n")
      return 1
 
digit_sum("123")    
digit_sum("e12aw4")
digit_sum("")
digit_sum("united")

print()

digit_sum(" ")
digit_sum("  ")
digit_sum(" 1 2")
digit_sum("34 - ")
digit_sum("1010 !? g")

 

Podobne pytania

+1 głos
1 odpowiedź 484 wizyt
pytanie zadane 13 września 2020 w Python przez TeaCup Obywatel (1,370 p.)
+2 głosów
1 odpowiedź 5,878 wizyt
pytanie zadane 12 listopada 2019 w Python przez Karpik Użytkownik (680 p.)
+1 głos
1 odpowiedź 503 wizyt
pytanie zadane 15 lutego 2017 w Python przez michalrudy Użytkownik (520 p.)

93,382 zapytań

142,382 odpowiedzi

322,539 komentarzy

62,740 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...