Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Kód for v Pythoně v jedné větě

V předchozím kvízu, Online test znalostí Python 2.7, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Alexandr Saveljev:25.8.2023 13:31

Zda správně rozumím kódu?

cisla = input("Zadej čísla pro seřazení (oddělená čárkou): ")
vstupniPole = [int(n) for n in cisla.split(",")]
print(vstupniPole)
# cisla např. = -2, 15  , 0,5,8,-3,   22
[int(n) for n in cisla.split(",")] # napsaný kód
# Nyní se stane, že funkce input() Pythonu vrátí zadáné čísla jako řetězec "-2, 15  , 0,5,8,-3,   22"
[int(n) for n in "-2, 15  , 0,5,8,-3,   22". split(",")]
# poté funguje split()
[int(n) for n in ["-2", "15", "0", "5", "8", "-3", "22"]]
# tj.: cisla již je = ["-2", "15", "0", "5", "8", "-3", "22"]
vstupniPole = []
for n in cisla:
    vstupniPole.append(int(n)) # Metoda int(n) převede argument `n` z řetězce na int() a vrátí int().
# teď je možné printovat
print(vstupniPole)

Je to tak?

Zkusil jsem: Přečetl jsem lekce, ale neuspěl.

 
Odpovědět
25.8.2023 13:31
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Alexandr Saveljev
DarkCoder:25.8.2023 14:46
  1. Pomocí input() je načten vstupní řetězec.

2. Vytvoří se seznam řetězců, který je rozdelen podle čárek. To vše pomocí split().
3. Každý prvek seznamu se převede na číslo. Výsledkem je seznam čísel.
4. Vypíše se na obrazovku seznam čísel pomocí print().

Nahoru Odpovědět
25.8.2023 14:46
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Alexandr Saveljev:25.8.2023 15:06

Mohu Ti požádat napsat ten kód

vstupniPole = [int(n) for n in cisla.split(",")]

obvyklým způsobem, tj.

for n in cisla:
atd.

Zkoušl jsem to několikrát, ale neúspěšně.

 
Nahoru Odpovědět
25.8.2023 15:06
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:25.8.2023 15:34
cisla = input("Zadej čísla pro seřazení (oddělená čárkou): ")

cisla = "-2, 15  , 0,5,8,-3,   22"

vstupniPole = [int(n) for n in cisla.split(",")]

cisla.split(",") = ["-2"," 15  "," 0","5","8","-3","   22"] # ted si nejsem uplne jisty, zda tam ponecha pred nebo za mezery, PY se chova dost jinak nez bezny prog. jazyk, ktery tam ty mezery necha

for item in array # nebo jeste se pouziva: "for value in array", "for item in list", "for row in list"
array = ["-2"," 15  "," 0","5","8","-3","   22"]
array = [item,item,item,...] # cili, cyklus do item prirazuje postupne kazdy string z pole

int(item)
# prevadi string na cislo - viz treba " 15  " na +15

# vysledkem [int(n) for n in cisla.split(",")]
# bude tedy pole cisel [-2,15,0, 5,8,-3,22]

Je doporucene davat promennym alespon 3 pismenka pro nazev (ale za urcitych okolnosti to ani sam nedodrzuji).
Se doporucuje pro cykly pouziva i,j,k.
for item in array - pro tento druh cyklu bych doporucoval pouzivat item `nebo `value, slovo, ktere asi nejlepe odpovida hodnote, kterou ocekavas ve vysledku

[-2,15,0, 5,8,-3,22] --- for value in array
["-2", "15", "0", "5", "8", "-3", "22"] --- for item in list
[["-2", "15"], ["0", "5"], ["8", "-3"], "22"] --- for item in list
kdyz se jedna o koordinaty [x,y] nebo gps severni sirka, zapadni delka, tak treba  --- for coords in list

table = [
["-2", "15", "0", "5", "8", "-3", "22"],
["-2", "15", "0", "5", "8", "-3", "22"],
["-2", "15", "0", "5", "8", "-3", "22"],
]
"for row in table"

list = [
["Tomas"],
[" Pepik"],
["Honza"],
]
"for item in list"
item jako polozka v seznamu list

Proste, nazev, ktery nejlepe vystihuje situaci, jak s tim pracujes.
Pokud to tak v prikladech neni a vetsinou v PY prikladech to nikdo nedodrzuji, osobne to povazuji za vazny prohresek proti dobrym mravum pri programovani :)

Editováno 25.8.2023 15:36
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
25.8.2023 15:34
Avatar
Alexandr Saveljev:25.8.2023 15:58

Děkuji!
Všechno to je důležité, chápu to a snažím se toho držet. Pro mě je problém v něčem jiném.

1. myslil jsem, že ten kód

vstupniPole = [int(n) for n in cisla.split(",")]

je možné popsat jinak:

for n in cisla:
    cisla = str()
    cisla = cisla.split(",")
        if cisla.isdigit():
            vstupniPole += int(n)        # nebo: vstupniPole.append(int(n))
        print(vstupniPole)
        else:
            print("Chybné zadání!")

2. druhou otázkou je to - jak, v jaké fázi jsou nadbytečné mezery nastavené uživatelem odstraněny?

 
Nahoru Odpovědět
25.8.2023 15:58
Avatar
Alexandr Saveljev:25.8.2023 16:02

Ohledně
`cisla.split(",") = ["-2"," 15 "," 0","5","8","-3"," 22"]
# ted si nejsem uplne jisty, zda tam ponecha pred nebo za mezery,
PY se chova dost jinak nez bezny prog. jazyk, ktery tam ty mezery necha`
ANO, po split() jsou tam mezery, a proto i nevím v jaké fázi se odstraňuje.

 
Nahoru Odpovědět
25.8.2023 16:02
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Alexandr Saveljev
DarkCoder:25.8.2023 17:51

Vřele doporučuji naučit se psát vlastní funkce a knihovny. Vše budeš mít tak jak potřebuješ a ještě se naučíš programátorské myslet. Řešit problémy pak pro tebe bude hračka.

Nahoru Odpovědět
25.8.2023 17:51
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Alexandr Saveljev
DarkCoder:25.8.2023 18:21

Samozřejmě že tam split() mezery ponechá, prvky jsou stále řetězce. Až při pretypovaní na int dojde k odstranění mezer.

Nahoru Odpovědět
25.8.2023 18:21
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Alexandr Saveljev:25.8.2023 19:04

Je to tak. Děkuji!

 
Nahoru Odpovědět
25.8.2023 19:04
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:28.8.2023 8:26

Mezery odstranuje funkce int, ktera prevadi string na cislo.
Cislo je zapisovane jako 8, 16, 32... bytu, podle procesoru. 2,147,483,647 jako cislo je 32 bity = 4 byty
String je retezec znaku po 8 bitech, "2,147,483,647" = 14 bytu
A je dobre si precist, co presne int dela, v dokumnetaci. Opet se to castecne lisi pro ruzne jazyky. Obvykle se snazi najit v retezci prvni integer cislo, ostatni smaze. kdyz das int("2,147,483­,647"), tak by to teoreticky mohlo dat jen cislo=2 V nekterych jazycich je treba number() nebo float(), ktere by z toho mohli dostat vsechna cisla. Je lepsi si to vzdy overit, najit v dokumentaci, pokud s tim bezne nepracujes.

 
Nahoru Odpovědět
28.8.2023 8:26
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:28.8.2023 8:38

Mno, ten kod mas blbe, asi.

vstupniPole = [int(n) for n in cisla.split(",")]

je možné popsat jinak:

cisla = cisla.split(",")
for n in cisla:
    #cisla = str() # ???
    #cisla = cisla.split(",")
        if cisla.isdigit(): # tohle je asi nesmysl, digit zjistuje,  zda jsou v cisle cifry,
# jenze to plati i pro specialni znaky, jako umocnovani na druhou, treti - numbers in base 10
# a Kharosthi numbers
# https://www.tutorialspoint.com/python/string_isdigit.htm
            vstupniPole += int(n)        # nebo: vstupniPole.append(int(n))
        print(vstupniPole)
        else:
            print("Chybné zadání!")

---

import re
def has_numbers(inputString):
    return bool(re.search(r'\d', inputString))
# https://stackoverflow.com/questions/19859282/check-if-a-string-contains-a-number

str.isalpha()

a jina reseni na tom forku

 
Nahoru Odpovědět
28.8.2023 8:38
Avatar
DarkCoder
Člen
Avatar
DarkCoder:28.8.2023 12:15
# Vstupní řetězec obsahující čísla oddělená čárkami
cisla = "1,2,3,4,5"

# Rozdělení vstupního řetězce na části podle čárek
cisla = cisla.split(",")

# Vytvoření prázdného seznamu pro uložení celých čísel
vstupniPole = []

# Pro každou část v cisla
for n in cisla:
    # Převod části na celé číslo a přidání do seznamu vstupniPole
    vstupniPole.append(int(n))

# Výsledek je seznam celých čísel v proměnné vstupniPole, který vypíšeme
print(vstupniPole)

V Pythonu je int(n) funkce, která konvertuje hodnotu n na celé číslo (integer), pokud je to možné. Pokud je n řetězec obsahující číselnou hodnotu, bude převeden na odpovídající celé číslo. Pokud je n desetinné číslo, funkce int() odstraní desetinnou část a ponechá pouze celou část. Pokud by byl řetězec n ve formátu, který nelze převést na celé číslo, funkce int() může vyvolat chybu, například ValueError.

Nahoru Odpovědět
28.8.2023 12:15
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Alexandr Saveljev:30.8.2023 12:23

Děkuji!

 
Nahoru Odpovědět
30.8.2023 12:23
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.