Anonymní profil peter – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil peter – Programujte.comAnonymní profil peter – Programujte.com

 

Příspěvky odeslané z IP adresy 2001:718:2601:258:f9ae:1e43:3e88:a540...–

peter
Python › Vložení jedné funkce do kódu
24. 5. 2022   #390182

if sum(combinations) == 15

TypeError: 'type' object is not iterable ### https://translate.google.com/ anglictina na cestinu
TypeError: Objekt 'type' nelze iterovat

To znamena, ze funkce sum() dostane data v typu, ktery nelze prochazet cyklem, iterovat.
Combinations je nazev funkce. Fyzicky je to cislo integer v pameti, kde je zapsany kod funkce. Neni to proste pole array nebo seznam list a to se mu nelibi. S mezerami to nema nic spolecneho.
Zvlast zduraznuje v te chybe to 'TYPE', ze se na to mas zamerit. A ne na mezery :)


"Fyzicky je to cislo integer v pameti" - vim, to je krkolomna veta. Zkusim to vysvetlit.
Program v pythonu je nejaky text. Treba print('1234').
Ten program prelozi prekladac na binarni kod (programovy kod assembleru), znaky 0-255, funkce print ma nekolik znaku, pak retezec '1234' jsou zapsany jako ascii znaky, ... Procesor pak takove znaky umi zpracovat jako nuly a jednicky a vyrobit jine nuly a jednicky a odeslat vysledek na obrazovku, treba.
Cili, prekladac ti z toho vyrobi nejaky retezec znaku. Kazdy znak pak predstavuje bud prikaz typu skoc na adresu, porovnej, vyhodnot porovnani, odesli data, prijmi data na adresu a jine. Procesor pak bere znak po znaku.
Je tam prikaz skoc na pozici 10. Na pozici 10 je odesli n-znaku na adresu 3045. na pozici 11 je cislo 4, na pozici 12,13,14,15 jsou znaky 1234, na pozici 16 je skoc na jinou adresu. Na adresach mas namapovane treba usb, porty, obrazovku, mys, klavesnici.
Cili, ta funkce combination pro procesor znamena jen adresa pameti cislo 7524, tam najdes dalsi assemberove prikazy nebo text. Jestli je to text nebo prikaz, o tom rozhoduji prikazy.

Pokud tedy tyhle zaklady mas, pak logicky podobnou chybu zamerne udelat nemuzes. Nebo te to teda hnedka trkne. Zvlast, kdyz nadava prekladac na typ promene.
 

peter
Python › Vložení jedné funkce do kódu
24. 5. 2022   #390181

   

from itertools import combinations

comb = combinations([1, 2, 3, 4, 5, 6, 7, 8], 4)

for i in list(comb):
    if sum(combinations) == 15: # eee? "combinations()" je funkce modulu "itertools"
    if sum(i) == 15: # co takhle?
        print (i)

# jak te vubec napadlo delat sumu nad nazvem funkce?

Jakoze itertools.combinations() je nazev. Jako bys napsal sum('karel novotny'). Co sis od toho sliboval?
Neco jineho je, kdyz tu funkci provedes. Pak by to sum mohlo davat nejaka cisla, ikdyz uplne spatne :)
Tobe mozna unika, stale, co dela ten pudovni kod. Zkusim to napsat nejak vic pro cloveka, co nema tuseni, co je programovani.
 

from itertools import combinations

# pridani do programu funkce ze skupiny 'itertools'
# to je nejaky soubor, ktery obsahuje seznam nejakych funkci a ty sis vybral jednu z nich
# nebo si muzes pridat vsechny, ale tvuj program po prelozeni do EXE
# bude pak zabirat zbytecne misto navic 
# (protoze ty ostatni funkce nepouzijes ani 1x, proc je tam pridavat?)

comb = combinations([1, 2, 3, 4, 5, 6, 7, 8], 4)

# program v procesoru muzes prirovat ke cteni, psani knizky.
# pr: precte slovo, treba, skoc o 5 slov dal a to udela
# pr: zkopiruj text od pateho pismene, 40 pismen a uloz ho tam a tam nebo zpracuj nejak
# no, a programatori si napsali funkce, kterymi nahrazuji skupinu takovych prikazu
# a nazvali to datove typy. typ 
# - pro ukladani cisla 1-32000, integer 
# - pro ukladani 1 znaku a-z0-9 a jine ascii, char
# - pro ukladani skupiny znaku, string (pocet + seznam znaku)
# 'karel' = 5 znaku + seznam k a r e l
# - a treba jeste typ pole array nebo seznam list pro ukladani vice skupin cisel, znaku
# ['k', 'a', 'r', 'e', 'l']
# [0, 1, 2, 45, -11]
# ['karel', 'lojza']

#comb = combinations([1, 2, 3, 4, 5, 6, 7, 8], 4)

# z toho zapisu 'comb' je tebou zvoleny nazev promene pro tvuj program
# 'combinations' je ta funkce z importu
# v dokumentaci se doctes, ze vytvari kombinace ze seznamu cisel, znaku
# https://docs.python.org/…ertools.html
# Pozn: Lze ji nahradit cykly, kdyz bys ji nechtel.
# das seznam znaku, treba array = [1,2,3,4,5,6,7,8]
# napises, kolik znaku ma zkombinovat n=4
# a ona ti vyrobi asi pole (array) se ctvericemi znaku
# comb (array) = [ [1,2,3,4], [1,2,3,5], [1,2,3,6], ... [5,6,7,8] ]
# klidne si to predstav jako dvourozmernou tabulku, x,y
1|2|3|4
-+-+-+-
1|2|3|5
-+-+-+-
1|2|3|6
...
5|6|7|8

for i in list(comb):

# tohle je cyklus

# list(comb) konvertuje datovy typ 'array' na 'list' (nejspis je to tam proto,
# ze tento typ cyklu nepracuje s datovym typem 'array', ale jen s typem 'list')
# (jevi se mi to jako hloupost, rychlejsi zpracovani by melo byt primo s array)

# 'i' v kazdem kroku bude kopirovat celou ctverici znaku z pretypovaneho list comb,
# napr [1,2,3,4]
# krok 1, i (array) = [1,2,3,4]
# krok 2, i (array) = [1,2,3,5]
# ...
# krok n, i (array) = [5,6,7,8]
# po posledni hodnote v dalsim kroku cyklus ukonci
# ... ja vim, je to slozite na pochopeni

    if sum(i) == 15: # co takhle?
#   if sum([1,2,3,4]) == 15: # pro prvni krok
# tim padem, sumu chces delat s 'i' a nikoliv se nazvem funkce 'combinations'
# mozna si to myslel jinak, udelat pole comb, sum(comb)
# ale, to je preci taky blbost, proc delat sumu se vsemi cisly v comb?
# a navic, proc to davat dovnitr cyklu?

        print (i)
# no, a to je jen vypis na obrazovku

------

# takze, jeste jednou, strucne, pouziji cyklus primo pro pole 'array'

comb = combinations([1, 2, 3, 4, 5, 6, 7, 8], 4)
# combinations vyrobi pole s kombinacemi cisel
# comb (array) = [ [1,2,3,4], [1,2,3,5], [1,2,3,6], ... [5,6,7,8] ]

#for i in list(comb): # to je trochu nestastne zvolene pojmenivani, to 'i'
#    if sum(i) == 15:
#for item in list(comb): # to je lepsi nazev
#    if sum(item) == 15:
# nicmene, mi jde o to nahradit to jinym kodem cyklu, takze...

i_end = Len(comb) # spocitej delku pole
for (i=0; i<i_end; i++) # cyklus, opakuj, dokud plati, ze i<i_end;
    if sum(comb[i]) == 15:

# treba je to ted vic srozumitelnejsi
# s tim list(comb) usetris pismenka programu, ale, musis vedet, co to dela :)

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý