Vložení jedné funkce do kódu – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vložení jedné funkce do kódu – Python – Fórum – Programujte.comVložení jedné funkce do kódu – Python – Fórum – Programujte.com

 

Lomby
~ Anonymní uživatel
4 příspěvky
23. 5. 2022   #1
-
0
-

Hezký den,

mám tento kód:


# A Python program to print all
# combinations of given length
from itertools import combinations
 
# Get all combinations of [1, 2, 3, 4, 5, 6, 7, 8]
# and length 4
comb = combinations([1, 2, 3, 4, 5, 6, 7, 8], 4)
 
# Print the obtained combinations
for i in list(comb):
    print (i)
 

Potřeboval bych tam vložit funkci, respektive podmínku, která zredukuje počet kombinací. A to tak, aby mi to vypsalo pouze kombinace, kde je součet čtyřčíslí roven 15. 

Děkuji za pomoc.

Nahlásit jako SPAM
IP: 91.231.30.–
gna
~ Anonymní uživatel
1698 příspěvků
23. 5. 2022   #2
-
0
-

   

if sum(kombinace) == 15:
    neco
Nahlásit jako SPAM
IP: 213.211.51.–
Lomby
~ Anonymní uživatel
4 příspěvky
23. 5. 2022   #3
-
0
-

#2 gna
Nějak se mi na to nedaří přijít.

Mohu poprosit o celou podobu kódu i s vloženou podmínkou?

Nahlásit jako SPAM
IP: 91.231.30.–
peter
~ Anonymní uživatel
3833 příspěvků
24. 5. 2022   #4
-
0
-

Ti vubec takove domaci ukoly nezavidim. Zakladni podminkou dobreho programatora je umet pouzivat nastroj jako google. Cely ten priklad je jiste zpracovan od stovek lidi jen s malymi obmenami.A druhou podminkou je, vlastni iniciativa. Pokus pochopit, co je tam napsane, co kod dela a vyzkouset kazdou myslitelnou i nemyslitelnou moznost a treba se trefis.
 

# v pythonu se kod pise do bloku podle mezer z leva

xxx
xxx
xxx

---

# pokud tam das podminku nebo funkci, zleva 
# se to posune a vetsinou je tam dvojtecna na prvnim radku

def xxx(yyy):
    zzz # vse, co je posunute, se vykonava jen v te funkci
    zzz

def bbb(ccc):
    ddd
    ddd

xxx(123) # volani funkce xxx
bbb(456) # volani funkce bbb

---

if xxx:
    yyy

---

# Ve tvem kodu vidim 

for i in list(comb):
    print (i)

# cili, comb = [ [1,2,3,4], [1,2,3,5] ...]
# to ti vyrobi ta funkce combinations(), ale ona to vyrobi jako object
# proto se to musi konvertovat na list pomoci funkce list() a pak
# i in list prochazi to pole, vraci comb[i]
# cili, postupne [1,2,3,4], v dalsim cyklu [1,2,3,5], ...
# a funkce print() pak pole v i vypise
# zacne to vypisovat tedy
[1,2,3,4]
[1,2,3,5]

# A, kdyz chces omezit vypisovani podminkou,
# tak musis dat omezeni pred ten print, ale dovnitr cyklu

for i in list(comb): # zacatek cyklu
    if (podminka):   # podminka
    print (i)        # vypis na obrazovku

# jenze, nesmis to zapomenout posunout spravne zleva
# (protoze je to python, preci, tak dokonaly jazyk, ze sice nema stredniky, ale vyzaduje spesl formatovani :) )
# pokud to neudelas, bud ti bude psat error
# nebo to bude chapat, ze v podmince nic nechces

for i in list(comb): # zacatek cyklu
    if (podminka):   # podminka
        print (i)        # vypis na obrazovku

Nahlásit jako SPAM
IP: 2001:718:2601:258:e872:cd5f:b563:3f7c...–
Lomby
~ Anonymní uživatel
4 příspěvky
24. 5. 2022   #5
-
0
-

#4 peter

# A Python program to print all
# combinations of given length
from itertools import combinations

# Get all combinations of [1, 2, 3, 4, 5, 6, 7, 8]

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

# Print the obtained combinations
for i in list(comb):
    if sum(combinations) == 15:
        print (i)

        
Traceback (most recent call last):
  File "<pyshell#7>", line 3, in <module>
    if sum(combinations) == 15:
TypeError: 'type' object is not iterable

Je to chyba v mezeře? Zkoušel jsem všemožné a nic.

Nahlásit jako SPAM
IP: 91.231.30.–
peter
~ Anonymní uživatel
3833 příspěvků
24. 5. 2022   #6
-
0
-

   

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 :)
Nahlásit jako SPAM
IP: 2001:718:2601:258:f9ae:1e43:3e88:a540...–
peter
~ Anonymní uživatel
3833 příspěvků
24. 5. 2022   #7
-
0
-

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.
 

Nahlásit jako SPAM
IP: 2001:718:2601:258:f9ae:1e43:3e88:a540...–
Lomby
~ Anonymní uživatel
4 příspěvky
24. 5. 2022   #8
-
0
-

#7 peter
Děkuji moc :)

Nahlásit jako SPAM
IP: 91.231.30.–
Zjistit počet nových příspěvků

Přidej příspěvek

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 9 hostů

 

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