Hirdetés
- Apple iPhone 17 Pro Max – fennsík
- Samsung Galaxy S23 és S23+ - ami belül van, az számít igazán
- Samsung Galaxy S25 - végre van kicsi!
- Youtube Android alkalmazás alternatívák reklámszűréssel / videók letöltése
- Xiaomi 15T Pro - a téma nincs lezárva
- iPhone topik
- Samsung Galaxy S25 Ultra - titán keret, acélos teljesítmény
- Eddigi legjobb DxOMark helyezésével zárta 2025-öt a Vivo
- Milyen okostelefont vegyek?
- Íme az új Android Auto!
Új hozzászólás Aktív témák
-
cousin333
addikt
válasz
Siriusb
#3846
üzenetére
Konkrét megoldásom nincsen, de én a diff előtt kicsit átdolgoznám az adatsort:
- legyen az index a dátum oszlop
- elrendezem az adatokat a groupby és/vagy asfreq metódusokkal (havi bontásban)Ezután mehet a diff, amikor már minden hónapra van pontosan egy értékem (ami lehet 0 is). Nem mondom, hogy ez a tuti megoldás, de én itt keresgélnék.
-
cousin333
addikt
Mégegyszer: a kódom működik és szerintem jól átlátható. Az eredetileg felvetett megoldás javított kiadása, demonstráció céljára éppen megfelel. Éppen azért nem használom a gyári függvényt, mert az lehet, hogy gyors, de nem látszik a mögöttes logika. Az algoritmus lehetne szofisztikáltabban és optimalizáltabb, de pár száz elemre nem igazán lesz látványos a különbség. Az meg, hogy millió elemre nem a leggyorsabb...
Egyébként list comprehension-nel is megoldható lenne, ha generátor függvényt használok, ami belül számon tartja az addigi prímszámokat. Az sem lenne optimális, mert kétszer tárolnám el a prímlistát.
ui: Így jobban megnézve az én kódomban (#3748) egy fia list comprehension sincs...

-
cousin333
addikt
Ez a gyakran előforduló alap szituáció, ami egy lista (tágabban: egy iterálható objektum) elemein hajtja végre ugyanazt a függvényt:
lista = []for elem in elemek:lista.append(func(elem))A func() függvényhívásnak ott kell lennie különben egyszerűen csak átmásolnád a listát. Ugyanez rövidebben ún. list comprehension-nel:
lista = [func(elem) for elem in elemek]Gyakorlatilag a for ciklus belsejét kihoztuk az elejére, elhagytuk az append-et, és az egészből egy egysoros értékadást csináltunk. Az extra [] tulajdonképpen egy "konstruktor", egy "syntactic sugar" (van erre magyar kifejezés?), ami azt mondja, hogy az eredményt listába szeretném rendezni. Írhattam volna ezt is:
lista = list(func(elem) for elem in elemek)A [] helyett írhatnék mást is, a szándéktól függően: a {} például - kicsit más szintaxis mellett - egy szótárat (dictionary) hozna létre, míg a () egy generátor kifejezést. Ami egyébként megegyezik a fenti példával, csak a list függvény nélkül. Mint látható, Pythonban az egyes szintaktikai elemek ebben az esetben (is) nagyon szépen egymásra épülnek.
Namost az if kifejezés a fentieknek egy speciális esete: nem akarunk minden elemet felhasználni, csak azokat, amik egy bizonyos feltételnek megfelelnek. Mivel ez egy extra, opcionális eset, logikus, hogy a kifejezés végére kerül, ha egyáltalán szerepel:
lista = [func(elem) for elem in elemek if not elem % 3]Ugyanígy működik a feltételes értékadás is, amit axioma is írt, ami mondjuk C-ben az x = (a) ? m : n.
Pythonban pedig:
x = m if a else nHa nem lenne feltétel, akkor csak simán ezt írnánk:
x = mLátható, hogy a feltételes és feltétel nélküli értékadás ugyanúgy kezdődik, csak előbbi a feltétellel folytatódik.
-
cousin333
addikt
A kód nem attól lesz jó vagy rossz, hogy mennyire hosszú, hanem hogy mennyire érthető és áttekinthető. A Python segítségével szerencsére tömör és áttekinthető kód írható. Érdemes az alap paradigmákat és a szintaktikát hamar elsajátítani, mert gyorsabbak, átláthatóbbak és hatékonyabbak. Ráadásul így nem készülnek később
for i in range(len(szamok)):
típusú kódok sem.A te példád szerintem nem lett olvashatóbb mint az enyém, de valamivel kétségkívül hosszabb.
Ráadásul a "code golf"-ot átírtad "algoritmus golfra" a rekurzivitással. Lehet, hogy hatékonyabb csillió számnál, de sanszos, hogy azt úgysem fogod kilistázni, és különben is a beépített függvényt fogod alkalmazni. -
cousin333
addikt
válasz
stellaz
#3746
üzenetére
Alapvetően egy függvényre van szükséged, ami megmondja egy számról, hogy prím-e (True) vagy sem (False):
import mathdef is_prime(num: int) -> bool:upper = int(math.sqrt(num) + 1)for i in range(2, upper):if not num % i:return Falsereturn TrueEzt a függvényt kell használni a szóba jöhető számokra. A filter függvénnyel kiszűrhetők azok az értékek, amikre a válasz igaz (prímek). A list pedig listát készít a generált értékekből:
szam = 200primek = list(filter(is_prime, range(2, szam))) -
cousin333
addikt
válasz
Hege1234
#3719
üzenetére
Pontosan mit szeretnél elérni? Alapvetően az a problémád, hogy kevered a datetime objektumot és annak a sztring megfelelőjét. Illetve nem importálod a datetime modult, csak egy elemét. Azt sem értem, hogy a fenti példában minek a startTime, ha egyszer a pillanatnyi időt használod. Pár példa:
import datetimeTIME_FORMAT = '%Y-%m-%dT%H:%M:%SZ'startTime = '2022-10-26T20:00:00Z'# Ido objektum a sztringbol (datetime.datetime objektumkent)start = datetime.datetime.strptime(startTime, TIME_FORMAT)# pillanatnyi ido (datetime.datetime objektumkent)now = datetime.datetime.now()# ebbol a pillanatnyi ido (sztringkent)now_str = now.strftime(TIME_FORMAT)print(now_str)# idokulonbseget hozzaadva (datetime.datetime objektumkent)time_test_minus = now + datetime.timedelta(minutes=-45)# idokulonbseget hozzaadva (sztringkent)time_test_minus_str = time_test_minus.strftime(TIME_FORMAT)print(time_test_minus_str) -
cousin333
addikt
válasz
Blasius
#3678
üzenetére
Szerintem a legnagyobb nyűg minden függőséget feltenni, maga a kódolás egyszerű: [link]
Összesen 96 sor: 9 grafikon, szerintem ez elég menő. Ráadásul az elkészült grafikon dinamikusan nagyítható, görgethető... stb. Bár tény, hogy a célja nem 10 érték egyidejű megjelenítése. A téged érdeklő rész a 6-os grafikon az 54. sortól kezdve.Ami a frissítést illeti, látszik, hogy csinálja: Egy QtTimer időről-időre frissíti a grafikon tartalmát. Ennyi adatnál ez egyik grafikus csomagnak sem probléma.
update: Kipróbáltam a demót. Egy alap Anaconda telepítésem van, a pip-ből a pzqtgraph csomagot kellett feltenni, és már fut is!

-
cousin333
addikt
válasz
Hege1234
#3653
üzenetére
Szerintem a megoldást a reguláris kifejezések és egy generátor kombinációja jelenti. Előbbi megkeresi a beadott sztringben az értékeket, utóbbi meg egyesével visszaadja a feldolgozott elemeket, amiket aztán felhasználhatsz a feldolgozás során. Egy gyors példa:
import redef process(text):for match in re.finditer(r'(\d+-\d+)|\d+', text):x = match.group()if '-' in x:a, b = x.split('-')for i in range(int(a), int(b)+1):yield ielse:yield int(x)Ezt így tudod használni az alábbi példaszövegen:
text = "1,2 3 4 25,16-20,22 7"x = list(process(text))#x: [1, 2, 3, 4, 25, 16, 17, 18, 19, 20, 22, 7]A kódodba meg az inputnál tudod beilleszteni:
text = input('\nírd ide a számot vagy számokat: ')for number in process(text):id_ = title['list'+str(number)]['j_id']print('\n'+str(id_))A lista felhasználása előtt esetleg sorrendbe rakhatod az értékeket, és egy set()-tel kiszűrheted a duplikátumokat.
-
cousin333
addikt
válasz
Hege1234
#3498
üzenetére
Uhhh... Bevallom nem tudom, mit csinál a kódod, de sok sebből vérzik.

Erre a problémára a legegyszerűbb megoldás a szótár (dictionary) használata. Ez gyakorlatilag kulcs-érték párokat jelent, random sorrendben. A kulcs és az érték is bármilyen típus lehet (sztring is).
qualities = {'0': 1080, '1': 720, '2': 540, '3': 480}Ha úgyis csak szám-opciókat akarsz, akkor egyszerűbben is legenerálhatod:
my_list = [1080, 720, 540, 480, 360]qualities = {i: j for i, j in enumerate(my_list)}Ha mondjuk azt akarod, hogy a kulcs inkább sztring legyen, ne szám:
qualities = {str(i): j for i, j in enumerate(my_list)}print('Minőség kiválasztása\r\n')print('\r\n'.join(f'{i} = {j}' for i, j in qualities.items()))minoseg = input('\nÍrd ide a számot: ')quality = qualities[minoseg]ekkor a quality változóban benne lesz a szám, 1080, 540 vagy amit kiválasztasz.
-
cousin333
addikt
válasz
Hege1234
#3495
üzenetére
Az univerzális megoldás valóban a try-except (lásd 8.3 fejezet). Lényegében a kritikus részt a try blokkba írod, és ha lefut, örülsz. Ha hiba van, akkor az except ág(ak) fut(nak) le. Ily módon szelektíven lehet kezelni a problémát: ha pl. a fájl nem található (lásd FileNotFoundError) akkor vállat vonsz és továbblépsz a következő fájlra, ha viszont más a hiba, akkor lehet, hogy ez nem elegendő megoldás, de jó, ha tudsz a problémáról.
A fenti példában (is) lehet célirányosabb megoldást is találni, például megvizsgálni a vtt értékét, mielőtt dolgozni kezdesz vele, hiszen a findall egyik lehetséges hibája, hogy éppenséggel nem talál semmit:
vtt = re.findall("[a-zA]...')if vtt is not None:vtt = vtt[0].strip()...A fenti esetben feltételezhető, hogy None értéket kap. De az is vizsgálható, hogy lista-e, és/vagy van-e annyi eleme, amennyi neked kell. Szívás, de a kód egy jelentős része mindig arra megy el, hogy ezeket a hibákat felderítsd és megnyugtatóan lekezeld.
-
cousin333
addikt
válasz
Hege1234
#3491
üzenetére
Azért ez egy kicsit más feladat...

Az a probléma, hogy a keys argumentumoknál egymást kéne követnie a paramétereknek (lásd a működő sorokat), vesszővel elválasztva. Nálad viszont egyetlen sztring argumentumként megy be az egész. És azért van ", mert a ' már szerepel a sztringben...
Igazából neked ez az egész konkrét művelet, amit kérdeztél, - az aposztrófokkal, meg a vesszőkkel - szükségtelen. Először is, az eredeti key.txt fájlt használd, ne az én kódommal módosítottat. Ezt a két sort
keys = fs.readlines()keys = keys[0].strip()Ezt cseréld le erre:
lines = fs.readlines()keys = lines[0].strip().split()A futtatás parancsot
debug = subprocess.run([mp4decr, keys, video, videoout])meg erredebug = subprocess.run([mp4decr, *keys, video, videoout]) -
cousin333
addikt
válasz
cousin333
#3489
üzenetére
Hááát, még nem tökéletes...
Ez viszont már jobbnak tűnik:
def convert(txt):return ', '.join(f"'{chunk}'" for chunk in txt.split())with open('d:/input.txt', 'r') as reader, open('d:/output.txt', 'w') as writer:for line in map(convert, reader.readlines()):writer.write(line + "\n")Tesztbemenet (input.txt):
--this is something
new line here 1234Kimenet (output.txt):
'--this', 'is', 'something'
'new', 'line', 'here', '1234' -
-
cousin333
addikt
válasz
Archttila
#3483
üzenetére
Talán nem a legelegánsabb megoldás, de próbáld ezt:
#!/usr/bin/env pythonfrom lxml import htmlimport requestsimport jsonimport rere_fmt = r"-?[0-9]+"lat = "47.95"lng = "21.71"resp = requests.get("https://darksky.net/forecast/{},{}/ca12/en".format(lat, lng))tree = html.fromstring(resp.content)summary = tree.cssselect("span.summary.swap")temp = re.match(re_fmt, summary[0].text_content()).group()if temp is None:print("NA °C")else:print("{}°C".format(temp)) -
cousin333
addikt
válasz
Archttila
#3481
üzenetére
A jobb oldali kódban töröld ki a 14, 15, 20, 21 sorokat
A 19-es sorba az idézőjelek közé írj "C"-t és a végére egy ")" jeletEz viszont még ki fogja írni az összegzést is (pl. "partly cloudy"). Hogy ne tegye, elvileg ezzel kéne kiegészítened(!) a 18-as sort (nyilván a vessző továbbra is a sor végén maradjon):
.split()[0] -
cousin333
addikt
válasz
Luxoros
#3470
üzenetére
Célszerű kiíratni a az elemeket a két függvényhívás között. Akkor látni fogod, hogy az exchange1 függvény meghívása után a lista2 csupa '0'-ból áll. A második függvény is rendben lefut, de emiatt nyilván már semmit sem fog csinálni.
Igazából a tipp2[i] = "0" sorra semmi szükséged.
A staticmethod-os megoldásban felesleges az __init__ függvény.
-
cousin333
addikt
válasz
Hege1234
#3452
üzenetére
Én most ennyire jutottam. Elismerem, hogy nem a legszebb kód evör

import reregex = r'S[1-9]*[0-9]\sE[1-9]*[0-9]:?'r = re.compile(regex)def replacer(x):a, b = x.group().split()return f'S{int(a[1:]):02}E{int(b[1:]):02}'s = 'Rick and Morty - S5 E2 Mortyplicity're.sub(r, replacer, s)Ebben az esetben az s az a cím sztring. A kimenet:
'Rick and Morty - S05E12 Mortyplicity'
-
cousin333
addikt
Az, hogy az egér világít, még nem sokat jelent. A Windows eszközkezelőben látod is az egeret?
Gondolom ezt a kódot futtattad:
import spacenavigatorimport timesuccess = spacenavigator.open()if success:while 1:state = spacenavigator.read()print(state.x, state.y, state.z)time.sleep(0.5)Mi erre a kimenet pontosan?
Én lépésenként megnézném, mit csinál a kód. Akár debuggerrel, akár kézzel beírva. Például innen:
import pywinusb.hid as hidall_hids = hid.find_all_hid_devices()if all_hids:for index, dev in enumerate(all_hids):print(f'{index=}, {dev=}') -
cousin333
addikt
"Ötletként felmerült, hogy csak akkor jelenjen meg tartalom ha azt valaki valóban látja is"
Ha a megjelenített tartalom nem függ a közelben lévő személytől, akkor ennek mi értelme van? Az e-paper nem fogyaszt semmit, csak ha éppen képet változtatsz rajta. A törléssel, visszakapcsolással csak energiát égetsz el.
Egy esetet tudok, amikor jó lehet a közelség érzékelés: nem frissíteni a képet, ha nincs, aki lássa...
Sajnos a konkrét rPi + Bluetooth kérdésben nincs tapasztalatom.
-
cousin333
addikt
válasz
Gyuri27
#3341
üzenetére
Az eddig felfogott feladatra itt a megoldásom. Házi feladat: megérteni, hogy működik...

import randomimport itertoolsimport stringhfeherje = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'H7', 'H8', 'H9', 'H10', 'H11', 'H12', 'H13', 'H14', 'H15', 'H16']nfeherje = ['N1', 'N2', 'N3', 'N4', 'N5', 'N6', 'N7', 'N8', 'N9']nevek = 'COVIDSAR'elnevezettek = {'H1N1': 'Madárinfluenza'}for var in itertools.product(hfeherje, nfeherje):varians = ''.join(var)betukod = ''.join(random.choices(nevek, k=3))szamkod = ''.join(filter(lambda x: x in string.digits, varians))elnevezes = elnevezettek.get(varians, f'{betukod}-{szamkod}')print(f'fehérjevariáns: {varians}, elnevezés: {elnevezes}') -
cousin333
addikt
válasz
Gyuri27
#3332
üzenetére
Én valahogy így oldanám meg a feladatot:
import randomimport itertoolshfeherje = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'H7', 'H8', 'H9', 'H10', 'H11', 'H12', 'H13', 'H14', 'H15', 'H16']nfeherje = ['N1', 'N2', 'N3', 'N4', 'N5', 'N6', 'N7', 'N8', 'N9']variansok = itertools.product(hfeherje, nfeherje)nevek = 'COVIDSARS'elnevezesek = [''.join(random.choices(nevek, k=3) + list(varians)) for varians in variansok]for elnevezes in elnevesek:print(elnevezes)Ez a kód létrehozza az összes lehetséges H és N fehérje kombinációt, és mindegyik elé beszúr random 3 betűt a nevek sztringből, majd egymás után kiírja őket.
-
cousin333
addikt
válasz
Gyuri27
#3332
üzenetére
Először megcsináltad ezt:
nevek = ['C', 'O', 'V', 'I', 'D', 'S', 'A', 'R', 'S']nev = ''for i in range(3):nev += random.choice(nevek)Ezután viszont nem használtad a nev változót, hanem újra random.choice-oztál

Mivel a sztring is iterálható, ezért a fenti részt így írnám inkább:
nevek = 'COVIDSARS'nev = ''.join(random.choices(nevek, k=3)Azért kapsz aposztrófot, meg zárójelet, mert az egy 1 elemű lista, teljesen feleslegesen. Szóval de, egy kicsit túlbonyolítottad.
-
cousin333
addikt
válasz
böng ész ő
#3330
üzenetére
A choices esetén ismétlődhetnek az elemek, a sample esetén nem:
x = [1, 2, 3, 4, 5]
sample: az 1 kihúzásának esélye 20, 25, 33, 50, 100 százalék minden egyes húzás után
choices: az 1 kihúzásának esélye 20, 20, 20, 20, 20 százalék minden egyes húzás után -
cousin333
addikt
válasz
sztanozs
#3270
üzenetére
Azt értem, hogy technikailag mit csinál, csak azt nem, hogy minek? Gyakorlatilag az output.txt-be kiírkálod a leendő fájlneveket, minden tartalom nélkül. OK, így lesz egy előzetes listád, és nem menet közben kell kitalálni, de szerintem akkor is felesleges kétszer beolvasni a bemeneti fájlt. Arról nem is beszélve, ha valamiért szétcsúszik a szinkron a fájlnevek és a tartalom között…
-
cousin333
addikt
-
cousin333
addikt
Ebben az esetben egyszerűen így módosítanám a korábbi kódomat:
import osstart_string = 'START'stop_string = 'STOP'name_string = 'Adat:'filename = Noneoutput_file = Nonewith open('szoveg.txt', 'r') as input_file:for line in input_file:if line.startswith(start_string):output_file = open('output.txt', 'w')elif line.startswith(stop_string):output_file.close()if filename is not None:os.rename('output.txt', filename + '.txt')else:output_file.write(line)if name_string in line:loc = line.find(name_string )loc += len(name_string ) + 2filename = line[loc:loc+8]Elképzelhető, hogy kicsit módosítani kell a számokon, de azt már meg tudod nézni.
-
cousin333
addikt
Továbbra is úgy gondolom, hogy neked felesleges a sorszámokkal foglalkozni, elvégre a START sztring és a STOP sztring nincs átfedésben. Egyszerűen végig kell menni a fájlon, és kiírogatni a megfelelő sorokat, majd nyitni egy új fájlt, oda is kiírni... stb.
Tegyük fel, hogy van a szoveg.txt fájlod, amit fel akarsz dolgozni:
blahbla
blahbla2
START
Első sor
Adat: valami
még egy sor
STOP
blah
START
Új fájlba
újabb sor
Adat: minden
STOP
semmiEkkor csak egyszer végig kell menni a fájlon és keresni a megfelelő sorokat. A nehézséget csak az jelenti, ha a START és a STOP között van a sor, ami a fájlnevet adja, így azt nem tudhatjuk előre. Ilyenkor azt csinálnám, hogy univerzális fájlnevet adok, és a végén átnevezem:
import osstart_string = 'START'stop_string = 'STOP'file_string = 'Adat:'filename = ''output_file = Nonewith open('szoveg.txt', 'r') as input_file:for line in input_file:if line.startswith(start_string):output_file = open('output.txt', 'w')elif line.startswith(stop_string):output_file.close()os.rename('output.txt', filename + '.txt')elif line.startswith(file_string):filename = line[6:] # Vagy ahogy ki kell találni a fájlnevetelse:output_file.write(line) -
cousin333
addikt
Mi van meg eddig? Őszintén szólva csak részben értem a problémát. A szövegrész, amit keresel az egy sorban van, vagy több sor között szétosztva? Valami konkrét sztringet keresel? A sor elején van, a közepén, vagy különálló sor?…
Pythonban van arra lehetőség, hogy egy for ciklussal menj végig a fájlon. Pl.:
with open(‘d:/szoveg.txt’, ‘r’) as ifile:for i, line in enumerate(ifile):print(‘sorszam:’, i, ‘tartalom:’, line)Bár nem tudom, mivel próbálkoztál, de szerintem nincs szükséged a sorszámra a feladat megoldásához. Ezt inkább valami generátor függvénnyel gondolnám megoldani. Megnyitja a fájlt, soronként kiolvassa, mindig amíg a kérdéses sor nem következik.
-
cousin333
addikt
válasz
sztanozs
#3166
üzenetére
Minden viszonylagos, azért Pythonhoz is akadnak modulok szép számmal, attól is függ, mire kell. Az tény, hogy nincs annyira előtérben, mint mondjuk a C# esetén.
Ott a tkinter, ami ráadásul integrálva van az alap telepítésben. A világot nem váltja meg, de azért lehet vele GUI-t gyártani. Aztán ott a Qt, amihez használható a Qt Designer. Telepíteni lehet, hogy macera (Anaconda FTW), de ha ez megvan, onnantól viszonylag egyszerű integrálni. A hordozhatóság egy másik kérdés...
Még a kivy-t szokták emlegetni, mint modern alternatívát. Életképesnek tűnik, de sosem használtam.
Egyébként meg sok felhasználáshoz GUI sem kell, vagy ha igen, akkor meg csak kódfuttatáshoz, egyszerű (esetleg dinamikus) grafikonok, táblázatok megjelenítéséhez, elsősorban az adatgyűjtés, adatfeldolgozás, illetve hasonló (pl. akadémia) munkák esetén. Ehhez elérhető egy remek környezet: a Jupyter Notebook/Lab, ami viszont a maga nemében egyedülálló.
Grafikára van PyGame, ezt sem használtam sosem. Ha viszont 2D/3D grafikonokra gondolsz, akkor abból annyi féle van, hogy Dunát lehet rekeszteni velük, még árvíz idején is.
-
cousin333
addikt
válasz
Mr Dini
#3173
üzenetére
Én nem értek a lovakhoz, de gondolom a Flask korábbi, elterjedtebb csomag. Sokszor idő kell, mire egy adott modult felfedeznek és használni kezdenek (és a dokumentációja is feljavul).
Az async eleve nem tekint vissza nagy múltra, más csomagok is csak óvatosan migrálnak rá. Egyébként pedig a Quart honlapjáról: "remember that Quart is an implementation of the Flask API". Szóval a nagy előd azért nem teljesen haszontalan...

-
cousin333
addikt
válasz
Hege1234
#3127
üzenetére
Lényegét tekintve ennyi:
import datetimet = datetime.time(hour=result[0]['result']['time']['hours'], minute=result[0]['result']['time']['minutes'], second=result[0]['result']['time']['seconds'])print(t.strftime("%H %M %S"))Ha az elemek nevei nem lennének többesszámban (hours) még egyszerűbb lenne a dolog:
t = datetime.time(**result[0]['result']['time']) -
cousin333
addikt
válasz
Hege1234
#3125
üzenetére
No offense, de ez így kissé gányolásnak tűnik az elemek egyesével történő kiírásával.
A helyedben megnézném beépített a datetime modult: [link]
A kiolvasott időadatokból készítenék egy datetime objektumot, majd, közvetlenül kiírás előtt megformáznám a time.strftime() függvénnyel.A lényeg, hogy a beolvasott adatokat valami kulturált belső objektumban tárolnám, és azt dolgoznám fel, írnám ki. Javaslom például a pandas modult. Van read_json() metódusa is, bár én még azt nem használtam.
-
cousin333
addikt
válasz
sztanozs
#3024
üzenetére
Jó gondolat!
Bár ebben az esetben lehet, hogy egyszerűbb lenne generátor függvénnyel. Ez remélhetőleg működne:
def osszes_diak(self):for diak in self.diakok:yield diakMeghívni elvileg hasonlóan lehet, for ciklussal.
for diak in osztaly.osszes_diak():print('Diák:', diak) -
cousin333
addikt
válasz
Longeye
#3008
üzenetére
Amúgy ha tudsz angolul, akkor ezt a videót mindenképpen érdemes megnézni Python osztály témakörben: Python's Class Development Toolkit
-
cousin333
addikt
válasz
Longeye
#3008
üzenetére
Ezt a problémát többféleképpen is meg lehetne oldani.
A célravezető megközelítésszerintem általában az, hogy az osztály egy létező "fizikai" entitásnak a leképezése. Tehát szerintem a diák (Diak néven: Pythonban illik CamelCase-el írni az osztályneveket) pont, hogy alkalmas osztálynak. Ha nem akarsz metódust, csak adattárolást, akkor mondjuk lehetne NamedTuple is osztály helyett, de aztán később még rájöhetsz, hogy mégis kéne metódus, szóval én maradnék az osztálynál. Ha már mindenáron (főleg) adatokat akarsz, akkor olvass utána a Dataclass-oknak. Így egyszerűben adhatsz hozzá további attribútumokat, például, hogy mikor kezdte a sulit, éppen beteg-e stb.
Én viszont olyan osztályt nem csinálnék, hogy "diákok", meg úgy általában többes számban írt entitások. Ezeket inkább Diák-ok listájaként tárolnám. Ha mindenképpen csoportot szeretnél, metódusokkal, akkor inkább legyen a neve Csoport, Osztály, esetleg Iskola, vagy valami általános gyűjtőfogalom. Itt viszont nem úgy "tárolnám be" a diákokat, ahogy te tetted, hanem magát a példányosított Diák objektumot "adnám oda". Ha type hintet is használsz, akkor a fejlesztőeszköz fel fogja ajánlani a megfelelő attribútumokat és metódusokat. A példáddal:
from dataclasses import dataclass@dataclassclass Diak:om: intnev: strclass Osztaly(object):def __init__(self):self.diakok= []def uj_diak(self, diak: Diak):self.diakok.append(diak)A diákok hozzáadó függvényét amúgy így is csinálhatod (a te példád alapján):
def ujdiak(self, datum, *args):self.lista.append(diak(*args))Ezzel a módszerrel mindegy, hogy a "diak" osztálynak éppen mennyi paramétere van, mindet átadja a konstruktornak.
-
cousin333
addikt
válasz
mylastage
#2912
üzenetére
"Előfordul, hogy az 5-öt lefelé kerekíti - és két tizedesnél ez 1%."
Példa? Remélem nem a 7.850000000005-től vártad, hogy 7.86 legyen...
"az apróban való tárolás tényleg egy jó ötlet, de még mindig zavar, hogy szorzás esetén - ahol nincs szó végtelen tizedes törtről - hibás eredményt ad."
Nem, nem ad. A "klasszikus példádban" meg pont nincs szorzás. Az említett számábrázolási hiba legtöbbször minimális pontatlansággal jár (nem 1%), ha meg mindenképpen el akarod kerülni ezeket, akkor Decimal osztály, vagy sympy modul valódi törtekkel
![;]](//cdn.rios.hu/dl/s/v1.gif)
-
cousin333
addikt
A matplotlib (amit alapból a pandas is használ) megpróbálja automatikusan generálni az osztásokat és címkéket. Ez általában esztétikusan néz ki, de nem minden esetben éri el a kívánt hatást. Szerencsére szinte minden konfigurálható benne.
Próbáld meg ezt - az utolsó előtti sorban - hozzáadni:
plt.xticks(range(1900, 2000, 1)) -
cousin333
addikt
válasz
xAttilax
#2874
üzenetére
Szóval, ha jól értem, PC-re telepítetted a pyserial-t. Milyen Python (verzió, honnan telepítetted)? Milyen pyserial verzió és hogyan telepítetted?
Elvileg a hivatalos Python disztribúciónak (mondjuk Python 3.7, 3.8 vagy 3.9) simán működnie kellene ha pip-el felteszed a pyserial-t:
pip install pyserialBocs, ha valami triviálisat írtam, de valahol el kell kezdeni...
-
cousin333
addikt
A namedtuple egy "gyártó függvény" (factory function), aminek az eredménye ebben az esetben egy osztály lesz (mintha mondjuk nem kellene megírnod a Kör osztályt előre, hanem futás közben dinamikusan hoznád létre). Az i2c_io_pinout tehát lényegében egy osztály (amit talán elegánsabb lenne ennek megfelelően camel-case-el jelölni: pl. I2cIoPinout), az i2c_io_state meg valóban egy példány.
Az adott számú "kulcsnevet" vagy az eredeti elnevezés tömbbel éred el, vagy a _fields paraméterrel. Pl.:
i2c_io_state._fields[1]Őszintén szólva nem tudom, mire kell, de nekem az a véleményem, hogy ha ezt akarod elérni, akkor nem jól használod a típust, hiszen ez pont arra lenne jó, hogy ne kelljen ismerni a sorrendet a létrehozást követően.
Alapvetően én az egész külső IC-nek egy osztályt hoznék létre, hasonlóan a már létező I2C, SPI... stb. osztályokhoz, ami aztán minden létező funkciót egy névtérbe "csomagol". Valami ilyesmi struktúrával:
class IoModule(object):MASK_SWITCH1 = 0x30def __init__(self, interface):self.port = interfaceself.portA_status = Noneself.portB_status = Nonedef connect(self):.... # connect heredef close(self):self.port.close()def update_ports(self):self.portA_status = self.port.read(<reg_portA>)self.portB_status = self.port.read(<reg_portB>)def compare_portA(self):port_old = self.portA_statusself.update_ports()port = self.portA_statusreturn port & port_old@propertydef id(self):return self.port.read(<id_reg>)@propertydef Switch1(self):return True if self.port_status & self.MASK_SWITCH else FalseEbben az esetben az osztályunk példányosításkor megkapja az interfészt (ami ebben az esetben egy I2C objektum), és azt használja a továbbiakban. A fenti kód elég kezdetleges, csak a struktúrát akartam megmutatni.
ui: ha listaelemeken akarsz végigmenni, akkor ne használd a range(len(x)) formulát. Ha az elem kell, akkor
for elem in lista:print(elem)Ha kell a sorszám is, akkor enumerate:
for i, elem in enumerate(lista):print('Az', i, 'elem a(z)', elem)Ha pedig több egyforma listád van, akkor zip:
for elemA, elemB in zip(listaA, listaB):print('Az A eleme:', elemA, 'a B eleme pedig:', elemB) -
cousin333
addikt
A mondás szerint akinek kalapácsa van, mindent szögnek néz...

Ebben az esetben én nem használnám a dictionary-t, mert nem erre való. Az a baj vele ugyanis, hogy nem fix az elemek sorrendje - a pin kiosztásod viszont igen (bár létezik OrderedDict).
Én a helyedben megismerkednék a NamedTuple típussal, illetve nem tudom, hogy hányas Python verziót használsz, de a 3.7-es verzió óta támogatott a DataClass is, ami hasonló céllal (is) készült. Ez utóbbi talán valamivel elegánsabb. Mindkettő a standard könyvtár része.
from collections import namedtuple...Ports = namedtuple('Ports', ['Switch1', 'Switch2', 'Switch3', 'Switch4','Button1', 'Button2', 'NC7', 'NC8'])...# i2c_io_readed_array: [True, True, True, True, False, True, False, False]port_state = Ports(*i2c_io_readed_array) # figyelj a csillagra!Ilyenkor sorrendben rendeli hozzá az értékeket a címkékhez. Ezek után már egyszerűen tudsz hivatkozni a tömbre, vagy egyes elemeire, valahogy így:
>>> port_state
Ports(Switch1=True, Switch2=True, Switch3=True, Switch4=True, Button1=False, Button2=True, NC7=False, NC8=False)>>> port_state.Switch2
TrueUgyanez dataclass-al:
from dataclasses import dataclass@dataclassclass InputPorts:Switch1: boolSwitch2: boolSwitch3: boolSwitch4: boolButton1: boolButton2: boolNC7: boolNC8: bool...port_state = InputPorts(*i2c_io_readed_array)A használata kb. ugyanaz, mint a namedtuple-nek.
-
cousin333
addikt
A beírt formula helyes, egyszerűen kihagyta az értékadás részt (channel dictionary =), gondolván, hogy nem kell máshol ez az info.
Gondolom már rájöttél, hogy kell az idézőjel. Én még talán kiegészíteném egy vizsgálattal és az egész olvasós részt betenném alá, valahogy így:
def adc_measure(channel_name):channel_dictionary = {'A0': 0x40,'A1': 0x41,'A2': 0x42,'A3': 0x43,}if channel_name in channel_dictionary:...bus.write_byte(I2C_address, channel_dictionary.get(channel_name)) -
cousin333
addikt
válasz
asuspc96
#2798
üzenetére
A leírását elnézve olyan sok probléma nem lehet vele. A potméterek jól vannak beállítva? Az egyik az érzékenységet állítja (ez lehet túl érzékeny is, mindenre bekapcsol), a másik a bekapcsolás időtartamát, ami a leírás szerint akár 200 mp is lehet, ami nem kevés. A legrosszabb eset persze a kettő (rossz) kombinációja.
Rá tudsz mérni valamivel (oszcilloszkóp, multiméter, digitális analizátor)?
-
cousin333
addikt
delimiter == sep
Ezek szerint viszont megvan a probléma oka. Arra figyelni kell, hogy általában az interaktív prompt sem ír ki mindent, csak az utolsó elemet (hacsak nem használsz print-et).
Pandas-ról lehet nézni pár újabb YT videót, de szerintem a hivatalos dokumentációt érdemes böngészni. Ahogy látom, külsőre megváltozott, de tartalmilag eddig is rendben volt. A "mit, hogyan" típusú kérdésekhez a User Guide az érdekes, a piszkos részletekhez meg a referencia.
Ha gyárilag, Pythonnal készítesz csv-t, akkor az UTF-8-at használ, és nem kell semmi konverzió. Ha Excel kompatibilis, akkor cp-1250, elsősorban az ékezetek miatt. Itt tipikus beolvasási paraméter-igény szokott még lenni a sep=";" és a decimal=",", hogy a tizedes értékek is kiértékelhetők legyenek. Esetleg érdemes lehet megadni az egyes oszlopok adattípusait, valamint az index oszlop sorszámát (ha van). A dátum típusokra vannak külön függvények is, akár két oszlopból (dátum + idő) is lehet egyetlen datetime oszlopot összeállítani.
-
cousin333
addikt
válasz
cousin333
#2723
üzenetére
Lejárt a szerkesztési időm...
Érdekesség: 2019-es Python fejlesztői felmérés a JetBrains-től (többek között A PyCharm fejlesztői). Pár érdekesség:
- 84% elsődleges nyelvként használja!
- nem meglepő módon leginkább web fejlesztésre és adatelemzésre használják
- bár az arányuk rohamosan csökken, 10% még mindig a Python 2-t nyúzza
- a Python 3 felhasználók fele a 3.7-es változatnál jár, a 3.8 kb. 11%-on áll
- webfejlesztés: dominánsan Flask és Django
- adatelemzés: NumPy és Pandas (nem meglepő módon), bár ez szorosabb
- unit testing: pytest és unittest
- adatbázis: PostgreSQL, MySQL, SQLite szinte fej-fej mellett
- operációs rendszer: Linux > Windows > MacOS
- IDE: PyCharm, VSCode, Vim/Jupyter Notebook -
cousin333
addikt
Érdekesség: 2019-es Python fejlesztői felmérés a JetBrains-től (többek között A PyCharm fejlesztői). Mire használják leginkább a Pythont? Nem meglepő módon web fejlesztésre és adatelemzésre.
-
cousin333
addikt
válasz
DrojDtroll
#2696
üzenetére
Miért, amit írtál, nem így működik? [link]
-
cousin333
addikt
Nem fogalmaztam elég pontosan. Erre a méretre kb. mindegy, hogy mit használ. Ha (jóval) több adat van, akkor jöhet jól a deque, ami elvileg pont ilyen cirkuláris buffer szerű használathoz van.
Ami a sebességet illeti: van a programozás sebessége, meg a futtatásé. A kettő együtt már nem feltétlenül rosszabb a Python esetében, más nyelvekkel összevetve, hacsak nem 7/24-ben nyomják. De egy optimálisan megírt kód, ami a háttérben C függvényeket használ (tehát pl. nem "natív" Python for ciklus), szerintem nyers sebességben sem vall szégyent. Alkalmazásfüggő.
-
cousin333
addikt
Online Python futtatókörnyezet: [link]
Most találtam, az alapokhoz jónak tűnik -
cousin333
addikt
válasz
cousin333
#2681
üzenetére
Meg is feledkeztem arról, hogy a sztring is iterálható, szóval a kód egyszerűsödhet kissé:
import itertoolshossz = 5nums = itertools.product('0123456789abcdef', repeat=hossz)prods = itertools.product(('02', '03'), (''.join(i) for i in nums))with open('d:/test_output.txt', 'w') as ofilefor pre, num in prods:ofile.write(pre + num + '\n') -
cousin333
addikt
válasz
davidvarga
#2680
üzenetére
Szerintem valahogy így, bár vannak benne "nem szép" elemek...

import itertoolshossz = 5x = [hex(i)[-1] for i in range(16)]with open('d:/test_output.txt', 'w') as ofile:nums = itertools.product(x, repeat=hossz)prods = itertools.product(('02', '03'), (''.join(i) for i in nums))for pre, num in prods:ofile.write(pre + num + '\n')A hossz értelemszerűen a számok hossza a 02/03 nélkül.
ui: A hosszal vigyázz, mert hamar elszáll a fájlméret!
-
cousin333
addikt
válasz
alec.cs
#2675
üzenetére
Én kezdetnek összefűzném őket egy tuple-t tartalmazó listává:
lista = [(i, j) for i, j in zip(list1, list2)]Ennyi elemnél mondjuk még nem lesz teljesítménybeli gondod. De ha a sebesség is számít, akkor lista helyett deque.
Esetleg készíthetsz egy generátor függvényt, ami az adott pozícióból indexelve adja vissza az értékeket. Tehát nem a listát módosítod, hanem a kiolvasást végzed máshogy.
-
cousin333
addikt
válasz
cousin333
#2660
üzenetére
Még egy példa a hivatalos dokumentációból. Tuple-lista sorba rendezése a második elemek alapján:
pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]pairs.sort(key=lambda pair: pair[1])Eredmény:
[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')] -
cousin333
addikt
válasz
oszi666
#2659
üzenetére
A lambda alapvetően egyszerű függvények helyett van, ami így nem foglal nevet, és kompaktabbul használható, mert nem kell előtte definiálni és elég egy sort írni. Nyilván nem kell mindig ezt használni, de néha jól jöhet.
Egy példa a pandas modul használatával:
import pandas as pddata = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})Az eredmény egy indexelt "táblázat", oszlop fejlécekkel:
A B
0 1 4
1 2 5
2 3 6Tegyük fel, hogy egy számításhoz minden sorban össze akarom adni az A oszlop köbét és a B oszlop felét. Hogyan lehet ezt megcsinálni? Létezik az apply() metódus, ami soronként, vagy oszloponként végigmegy a táblázaton, és az első argumentumban megadott függvényt futtatja. Az első megoldás, hogy készítünk egy függvényt, majd ezt használjuk:
def process(sor):return sor.A**3 + sor.B / 2data.apply(process, axis=1)Az eredmény:
0 3.0
1 10.5
2 30.0
dtype: float64A megoldás tehát működik, viszont a process mostantól egy foglalt név (vagy felülír egy korábbit) olyasvalamire, amit talán soha többé nem használunk. Ráadásul írtunk 2 extra sort. Ugyanez lambda függvénnyel jóval egyszerűbb:
data.apply(lambda x: x.A**3 + x.B/2, axis=1)A helyzet hasonló a list comprehension-hoz. Azt is meg tudod oldani for ciklussal, de miért írnád azt, hogy
a = [1, 2, 3, 4, 5, 6, 7, 8]b = []for elem in a:if elem % 2 == 0:b.append(elem**2)ha írhatod jóval egyszerűbben (és gyorsabban) is:
a = [1, 2, 3, 4, 5, 6, 7, 8]b = [elem**2 for elem in a if a % 2 == 0]Sőt, utóbbi esetben, ha mondjuk alapvetően csak ezen négyzetszámoknak az összegére vagyunk kíváncsiak, akkor azt is írhatjuk, hogy:
szumma = sum(elem**2 for elem in a if a % 2 == 0)és akkor nem számoltunk ki és tároltunk el feleslegesen egy egész listát.
-
cousin333
addikt
Ez melyik 2-es verzió pontosan? Én kipróbáltam 2.7.17-el, ami elvileg a legfrissebb. Ha azt írod be, hogy vacak, akkor kivételt dob (NameError), tehát nem is fut le. Ha azt írom, hogy 'vacak', tehát idézőjelek között, akkor viszont jó. Egyébként meg, ahogy kovisoft írja, használd a raw_input függvényt. De inkább a Python 3-at tedd fel.
-
cousin333
addikt
válasz
0xmilan
#2617
üzenetére
Ebben az esetben nem biztos, hogy jobb, mivel sosem keveredik ki a
while Trueciklusból
Random hint: az
ifígy egy fokkal szebben nézne ki (ha már egyszer lehet ilyet):if humidity is not None and 0 <= humidity <= 100 and temperature is not None and -100 < temperature < 150: -
cousin333
addikt
Két behúzás is kell bele:
while True:if humidity is not None and humidity >= 0.0 and humidity <= 100.0 and temperature is not None and temperature > -100.0 and temperature < 150.0:cur = db.cursor()cur.execute("INSERT INTO TH(THdate, THtemperature, THhumidity) VALUES ('" + dt + "'," + str(temperature) + "," + str(humidity) + ")")db.commit()cur.close()del curdb.close()time.sleep(300) -
cousin333
addikt
válasz
cousin333
#2582
üzenetére
A Python osztályokhoz (mint az OOP-k zászlóshajójához) kapcsolódó kötelező videó:
Python's Class Development Toolkit -
cousin333
addikt
válasz
Tigerclaw
#2579
üzenetére
A Python hivatalosan "multi paradigm", de az OOP erősen jelen van már az alapoknál. Tekintve hogy pl. az "egész szám" is egy osztály, saját metódusokkal... stb., inkább tekinteném olyan OO nyelvnek, ami nem tolja ezt az arcodba.
A Python alapvetően más, mint sok ismert nyelv, és ez az OO terén is megjelenik. Szerintem nagyon is használható OO nyelvként, nem hiányzik belőle semmi, csak bizonyos dolgokat máshogy kezel. Absztrakt osztályok vannak benne, öröklés szintén. Adatrejtés elve is benne van, de Raymond Hettinger szerint a Python egy "consenting adult" nyelv. Szóval nincs olyan, hogy privát változó (csak privát-szerű, lásd _a vagy __a), de a paramétereket, metódusokat szépen modulokba, fájlokba, osztályokba szervezheted, definiálhatsz osztályokat osztályokon belül... stb. Nekem eddig semmi nem hiányzott belőle a legfontosabb, hogy mindent úgy használj, ahogy megtervezték, és ne próbált a C++, Java stb. gondolatiságot beleerőltetni.
"mint egy klasszikus OOP nyelv"
És milyen lenne az a klasszikus OO nyelv?
Mint mondjuk a Java, ahol osztályok nélkül kb. mozdulni se tudsz? Vagy a C++ ami egy tuningolt C?"Dobálom ki a metódusokból a visszatérési értéket, az argumentum tipusokat"
Ami nem kell az minek is
Kb. mint a váltó, a kettős tömegű lendkerék meg a kipufogórendszer egy villanyautónál.nincs abstract osztály
De van, a célnak szerintem megfelel.
"nincs többszörös konstruktor"
De van. Lehet, hogy egy kicsit más jellegű, de lényegét tekintve ugyanaz.
"Muszáj vagyok commentbe tenni a listák, dictionaryk esetén, hogy milyen tipusra terveztem azokat."
Ez meg inkább csak egy rossz beidegződés, mint a C-s for ciklus:
for i in range(len(elemek)):print(elemek[i])vs.
for elem in elemek:print(elem)Pont az a lényeg, hogy nem előre kell típusra tervezni. Duck typing for president

"hogy tudok expliciten tipust kapcsolni a változókhoz"
Nem tudok ilyesmiről. Gondolom a type hint-re gondolsz, de az nem sokkal több, mint amit a neve sugall. Alapvetően azért van, hogy a statikus kódelemzők, meg az IDE-k működését segítse. Odaírhatod, hogy -> int, aztán visszatérhetsz egy szöveglistával

"Python namespace, scope, hogy aztán visszarakjam a láthatóságot a minimumra."
Engem meg pontosan ez a fene nagy titkolódzás zavar a többi nyelvbe. Csak arra jók, hogy mindent megbonyolítsanak, és elfedjék a komplexitásból következő problémákat. Egy rendes, jól strukturált Python programmal ezek jórészt kivédhetők, vagy eleve nem jelentenek gondot.
Tehát a lényeg, hogy a Python nagyon is OOP, a különbség nem a Python OOP és a többi OOP, hanem inkább a Python és a többiek között van. Nem akarom azt sugallni, hogy a Python minden megoldása van olyan jó, mint a többieké, vagy hogy mindent ugyanúgy megtehetsz, mint más nyelvekbe, de a saját logikája alapján jól működik, és szerintem elég jól meg van tervezve, a részek szépen összeillenek. Kivéve talán az enum, meg a switch-case...
Ezért is tűnik kicsit "veszélyesnek", ha 1:1-ben próbálod átfordítani a meglévő programodat. A Pythonnak nem csak a szintaxisa más, hanem a logikája is. Amúgy a Python is erősen típusos, próbálj csak meg összeadni egy sztringet meg egy számot.
-
cousin333
addikt
válasz
kovisoft
#2441
üzenetére
Igen, ebben igazad van. Az a probléma, hogy inkonzisztensen használja a változókat. Az adatbevitelnél ez szerepel:
m1=float(input("Gömbréteg feletti magasság (m1) : "))
m2=float(input("Gömbréteg alatti magasság (m2) : "))Ennek fényében az M számítási képlete megfelelő lenne:
m1=r-sqrt(r**2-q1**2) # Felső szelet magassága
m2=r-sqrt(r**2-q2**2) # Alsó szelet magassága
M=r-(m2+m1)Viszont az előtte lévő sorokban nem ezt az m1 és m2-t számolja ki, hanem a síkok origótól mért távolságát, amiből M valóban az általad javasolt módon jönne ki:
M = m2 - m1 -
cousin333
addikt
válasz
kovisoft
#2438
üzenetére
A képlet, amit használ, szerintem jó, hiszen korrekt módon írja le az adatbevitelnél.
Én is tettem egy próbát a feladattal, bár más megközelítéssel: egyszerű osztályokba szerveztem az egyes alakzatokat. Ezt aztán lehet bővíteni rogyásig különböző trükkökkel, ellenőrzésekkel, összevonásokkal.
Nem szűnök csodálni továbbá, hogy milyen sok összetett és praktikus program és eszköz érhető el a neten. Például a fent említett próbálkozást Jupyter notebookban implementáltam, súgóként a képleteket is odaírva - természetesen LaTex formázással
... és mindezt simán feltettem a Google Colab platformra, így ti is láthatjátok, sőt, szerkeszthetitek is: [link] How cool is that?

-
cousin333
addikt
Amint már írták a Visual Studio Code elég jó kis ide.
Amúgy nem tudom, hogy melyik Python és PyCharm verziót használod, illetve azok hogyan vannak beállítva, de természetesen tudja mindkét kívánt funkciót:
csvfile
Személy szerint én a PyCharm-ot használom, és nagyon jónak találom.
Most már kellően gyors is a működése, nem gondolkodik a gépelés (és az IntelliSense használata) alatt. Emellett rengeteg ügyes funkciója van (praktikus apróságok), csak győzze az ember megjegyezni a billentyű-kombinációkat.
Tudsz vele saját modult gyártani, vagy Unittest/Pytest elemeket futtatni van verziókövető integráció is (SVN, Mercurial, Git).De támogatja a fenti példákban látható scratch fájlok használatát is az aktuális projekttől függetlenül.
Egyetlen bánatom, hogy Jupyter Notebook támogatás csak a fizetős változatban van.
-
cousin333
addikt
válasz
Janos46
#2416
üzenetére
Másik lehetőség:
with open("valami.txt", "a") as ofile:ofile.write(f"Eredmény: {x} darab\n")ofile.write(f"Ez is az: {y} liter\n")Ennek az az előnye, hogy a fájl a with "tömbön" belül van nyitva, és a végén automatikusan bezárásra kerül, akkor is, ha közben a kód valami kivételt dob.
-
cousin333
addikt
válasz
Csaby25
#2408
üzenetére
Optimista felütés...

A természeténél fogva a Python elsősorban ott népszerű, ahol a kísérletezés kap nagy szerepet, illetve ahol pl. folyamatokat kell automatizálni.
Pár példa: mérésautomatizálás, tesztautomatizálás, adatgyűjtés és -elemzés (műszaki területen, vagy pl. interneten), gépi tanulás (ez kifejezetten menő és Python erősség), big-data, adatvizualizáció, akadémiai felhasználás (ez nyilván speciális tudást is igényel), web-keretrendszer lásd pl. Django).
-
cousin333
addikt
válasz
Janos46
#2405
üzenetére
Nem biztos, hogy jól értem a kérdést, de elvileg a kód "közepét" kell átírnod:
if h > 0 and m > 0:print ("\nHiba! Csak magasság vagy palást kell!")Utána meg if-ek helyett elif-eket használj.
Amúgy meg ilyen esetekben nem dobnék hibát, hanem egyszerűen csak a magassággal számolnék, és kiírnám, hogy a palást érték redundáns volt és nem lett figyelembe véve a számolás során.
Még távolabbról nézve meg egy csinos kis osztályt készítenék a csonka gúlából...

-
cousin333
addikt
válasz
cousin333
#2387
üzenetére
És a rá adott válaszom:
Szia!
Kivételesen még itt is válaszolok, de a továbbiakban nem kívánok közvetíteni. Oldd meg, hogy írni tudj a fórumba, és akkor majd jönnek a válaszok is, akár több irányból.
"En pedig azt nem ertem, miert nem erted, hogy A betu es B betu van a fontos cellakban."
Nyilván azért, mert ezt sehol sem írtad le. Mindig A és B-ként hivatkoztál rájuk és nem 'A betű'-ként.
"Oh, persze, alig par ezer oldalas doksi, ezzel az erovel mondhatod, hogy "ott a megoldas a vilagegyetemben".
Abban talán egyetérthetünk, hogy a világegyetem sokkal komplexebb, mint pár ezer oldal..

Ha fel szeretnél hívni valakit, és linkelnek neked egy telefonkönyvet, akkor meg visszaírod, hogy ennyi ezer oldalt nem olvasol el? Vagy csak simán megkeresed a téged érintő részeket?
Javaslom továbbá a netes súgót a PDF helyett: jobban strukturált és könnyebben kereshető. Ami téged érint az az alapok (pl,. DataFrame), a csv beolvasás, a statisztika és az ábrázolás. Az első kettő szerintem nem igényel segítséget, már rég végezhettél volna az elolvasásával.
"Tudtommal a meteorologia hasznalja."
Igen, ők is.
Az angol neve heatmap. Arról szól, hogy egy színtérképpé alakítja a táblázatos adatokat, így vizuálisan könnyebb befogadni. A te esetedben akár minden cella lehet egy pixel (vagy több), esetleg összevonhatsz sorokat és oszlopokat ami a képen annál pirosabb (pl.), minél több benne az A. tulajdonképpen egy 2 dimenziós hisztogram."Ezek kozotti esetleges osszefuggeseket kell vizsgalni. ennyi a feladat."
Pontosan ez a kérdés: milyen összefüggésekre vagy kíváncsi? Hogy az A betű mellett hol van B? Vagy alatta? Vagy, hogy melyikből van több? Vagy azonos-e az eloszlásuk a sorok és oszlopok között? Vagy az egyes sorokban éppen melyikből van több? Vagy... ?
Tudtommal az egy dimenzio, az PONT-ot jelent, mivel a tuple az egy lista-hoz hasonlo, maris ket dimenzios, es ettol kezdve a tablazat sorait tartalmazhatja.
Tehát mégsem jó a te felhasználásodra, legalábbis önmagában. Amúgy igazad van, egy dimenziós tömbre gondoltam.
"Biztosan nem, tobb konyvben tobb peldaban szerepelt, hogy a listak elemeit a python 'egyedi, hatekony modon' tarolja el, igy a listak kiiratasakor a sorrend mindig veletlenszeru, ha nincsen arra kenyszeritve, hogy sorba rendezve jelenitse meg az adatokat."
Ha készítesz egy listát, akkor az 10-ből 10-szer ugyanúgy jelenik meg. Ha új elemeket adsz hozzá, akkor is. Az iterálás is mindig ugyanazt adja.Talán a szótárakra (dictionary) gondolhattál, ott tényleg nem lehet megbízni a sorrendben (noha egy fix méretű objektumnál akkor is mindig ugyanaz lesz a sorrend, igaz, nem feltétlenül egyezik meg a hozzáadás sorrendjével).
-
cousin333
addikt
válasz
cousin333
#2385
üzenetére
Újra kezdosql privátja:
Szia,
nagyon koszonom, nekem ugy tunik, hogy tartosan elbeszelunk egymas mellett.:-(
Megprobalom reszletesen leirni, mik az elteresek, hatha elkezdjuk erteni egymast.
mikor már teljes értékűen tudod használni a netet.
Tudom hasznalni, csak a python forum van valamiert blokkolva a mcaffee altal.
Mas forumokba tudok irni.az általam linkelt Pandas dokumentációt sem tudtad betölteni.
Irtam, hogy atiranyitasi gond volt, valamiert nem volt elerheto akkor a server. azota letoltottam a doksit, par ezer oldalas pdf file.
Az "A és B közötti összefüggések keresése" elég sovány definíció. Továbbra sem ismert hogy pl. milyen (típusú) adatokról van szó.
En pedig azt nem ertem, miert nem erted, hogy A betu es B betu van a fontos cellakban.
ennel egyszerubb megoldas nem hiszim, hogy letezik.Mondtam neked, hogy a Pandas modul használata a megoldás.
Oh, persze, alig par ezer oldalas doksi, ezzel az erovel mondhatod, hogy "ott a megoldas a vilagegyetemben".

A grafikus megoldás nem azt jelenti, hogy kinyomtatod az adatokat egy táblázatban, hanem pl. hőtérképen ábrázolod.
Ez megint olyasmi, amit te szeretsz, de fogalmam sincs, hogy mi ez es mire jo.
Az biztos, hogy statisztika teren nem tanutam.
Tudtommal a meteorologia hasznalja.
Adott A es B kulonbozo cellakban - nincsenek linearis adatok, vagy skala, csak ket diszkret adat van.
Ezek kozotti esetleges osszefuggeseket kell vizsgalni.
ennyi a feladat.a tuple NEM ERRE VALÓ, mert az egy egy dimenziós, fix tartalmú objektum-gyűjtemény
Tudtommal az egy dimenzio, az PONT-ot jelent, mivel a tuple az egy lista-hoz hasonlo, maris ket dimenzios, es ettol kezdve a tablazat sorait tartalmazhatja.
Szerintem félreolvastál valamit.
Biztosan nem, tobb konyvben tobb peldaban szerepelt, hogy a listak elemeit a python 'egyedi, hatekony modon' tarolja el, igy a listak kiiratasakor a sorrend mindig veletlenszeru, ha nincsen arra kenyszeritve, hogy sorba rendezve jelenitse meg az adatokat.
-
cousin333
addikt
A szokásos privát üzenet kezdosql-től. Ezúttal igyekszem mindjárt válaszolni is rá.
Szia!
Tovabbra se tudok irni a python forumba, es most olvasni se tudom.:-(
Látható, hogy nem csak itt van problémád, hanem pl. az általam linkelt Pandas dokumentációt sem tudtad betölteni. Google keresés sem találja meg? Ezzel már kezdhetnél valami, szerintem utána térjünk vissza a problémára.
A regi kerdesedre a valaszom az, hogy pontosan megodasi modszert keresek, hogyan lehet az A es/vagy B adatok kozti osszefuggeseket kimutatni.
Nem tudom, hogy milyen statisztikai modszert lehet erre hasznalni, es eddig senki se tudott segiteni, mintha erre nem lenne megoldas, amit furcsallok.
Persze, hogy nincs megoldás, ha nem tudod, mi a probléma. Az "A és B közötti összefüggések keresése" elég sovány definíció. Továbbra sem ismert hogy pl. milyen (típusú) adatokról van szó.
Addig jutottam, hogy csv-be lementettem a tablazatot, most keresek megoldast, hogyan tudom csv-vel pythonba beolvastatni es csinalni olyan tuple-ket, amiben csak A illetve csak B szerepel, igy kiderulhet, hany sorra es oszlopra lehet csokkenteni a tablazatot.
Mondtam neked, hogy a Pandas modul használata a megoldás. Ezt úgy értettem, hogy már az adatok beolvasására is. Ha megvan, akkor az A-t és B-t tartalmazó oszlopkra, sorokra szűrés egy sor kód, esetleg 2. Aztán majd kitalálod, mit akarsz csinálni velük.
(Mert ugye a grafikus megoldas csak akkor mukodik, ha egy kepernyore kifer az abra, ami ugy kb. 40 sor es 40 oszlop lehet lekicsinyitve az oszlopszelesseget.)
A grafikus megoldás nem azt jelenti, hogy kinyomtatod az adatokat egy táblázatban, hanem pl. hőtérképen ábrázolod. Ehhez vagy sorokat vonsz össze, vagy min 1x1 pixelen megjeleníted, hogy az adott sorban/oszlopban szerepel-e a kérdéses elem.
Emellett a python logikajat se nagyon ertem, mert a tuple-k is lenyegeben sorokat jelentenek, nekem viszont tablazatra van szuksegem, kellenek az oszlop adatok is valahogy.
Az a Python logikája, hogy a tuple NEM ERRE VALÓ, mert az egy egy dimenziós, fix tartalmú objektum-gyűjtemény: [link] Felőlem szívathatod magad számok helyett sztringekkel végzett matematikai műveletekkel is, de nincs értelme. PAN-DAS MO-DULT KELL HASZ-NÁL-NI.
Raadasul szinte minden konyv azt hangsulyozza, hogy Pythonban az adatmegjelenites sorrendje bizonytalan, kulonbozo lekerdezeseknel kulonbozo sorrendben adja vissza az adatokat, ami szamomra erthetetlen.
Számomra is érthetetlen, hogy ezt honnan szedted. Szerintem félreolvastál valamit.
-
cousin333
addikt
válasz
kezdosql
#2383
üzenetére
A videós link valamiért tényleg nem megy, hiányzik mögüle a videó...

Az összes többi viszont elérhető.Az aktuális verziószám ne tévesszen meg, ez amolyan open-source-os kapuzárás előtti pánik. A modult évek óta fejlesztik, kelően funkció-gazdag és stabil. Ha Chrome volna, már régen 25-ös lenne...
Ami a problémát illeti, a Pandas-t nem azért írtam, mert konkrét megoldási javaslatom van, hanem azért, mert indexelt sorok és fejléces oszlopokból álló táblázatok kezelésére találták ki. Nem derült ki számomra, hogy pontosan mit szeretnél elérni, sem az, hogy pl. milyen adatokról van szó, enélkül meg nehéz konkrét algoritmust ajánlani, de úgy gondolom, a Pandas sokkal testhez állóbb, mint pl. tuple-el bohóckodni.
Ki lehet számoltatni az előfordulást a sorokban, oszlopokban. Esetleg valamiféle hőtérképet gyártani belőlük. Előbbi megoldás számszerű végeredményt adhat, utóbbi nem pontos, de jobban áttekinthető. Ezért is kérdés, hogy milyen megoldásra gondoltál.
-
cousin333
addikt
válasz
Whysperer
#2380
üzenetére
Azért kell elsősorban így beilleszteni, mert:
1. szebben néz ki
2. így lesz használható. A Pythonban ugyanis számít a behúzás mértéke, amit viszont a komment motor tönkretesz. Hacsak nem formázod kódként.Ami a problémádat illeti, első körben a Python (2) alapjaival kell megismerkedned, bármiféle Maya nélkül. Erre angol nyelven szerencsére számos lehetőség van. Pl: [link]
Ha ezt követően nézel Maya specifikus videókat vagy tutorial-okat akkor már könnyen felismered bennük az univerzális Python-elemeket.
-
cousin333
addikt
Újabb kezdosql kérés:
Szia,
sajnos valamiert tovabbra se tudok irni a python forumba, beirnad a forumba a valaszomat, hatha masnak is hasznos lehet kesobb?
--
Koszonom a javaslatot, sajnos a vimeo-s video nem elerheto es a program weboldalanal is valami baj van,
ugy latom, meg csak a 0.25-os verzional vannak, de tucatnyi korabbi valtozatra is van link doc-ot es letoltest igerve, de mindig az a valasz, hogy nem mukodik az atiranyitasi cim.Megirnad, hogy milyen statisztikai megoldast javasolsz?
En korrelacioszamitasra gondoltam, de az csak termeszetes szamokkal mukodik, itt pedig harom fele allapotot kell osszevetni. -
cousin333
addikt
válasz
sztanozs
#2369
üzenetére
Úgy gondolom, lehet tuple-el meg numpy-vel szenvedni, de ez low level stuff. Szerencsére a Python bővelkedik specializált, magas szintű 3rd party modulokban, amik jelentősen egyszerűsítik az adott feladatot.
Én ennek a problémának tuti, hogy a Pandas modullal vágnék neki. Népszerű, nagy tudású, jól dokumentált, és ehhez az adatmennyiséghez bőven gyors.
Telepíteni is egyszerű:
pip install pandasGyorstalpaló videó és kód.
Cheat sheet -
cousin333
addikt
-
cousin333
addikt
Ha már ostoba módról írtam az előbb, szerintetek mit csinál és ad vissza az alábbi kód:
i, j, retList = 0, 0, [error]
for paramNb in range(4):
while ((i+j) < len(returnedString) and returnedString[i+j] != ','):
j += 1
retList.append(eval(returnedString[i:i+j]))
i, j = i+j+1, 0
return retList -
cousin333
addikt
válasz
alec.cs
#2140
üzenetére
Őszintén szólva 1000 sornyi 700 karakteres szöveg kezelése nem hiszem, hogy túl időigényes lenne, hacsak nem valami kifejezetten ostoba módon van megoldva. Egy Jupyter Notebook-al és a %%timeit "varázslattal" nagyon gyorsan és egyszerűen ellenőrizhető a szükséges idő és összevethető más megoldásokkal.
Az a megoldás nekem szimpatikusabb, különösen, ha az URL fájl nem (gyakran) változik. Ha osztályokkal csinálod, akkor írnék egy letöltő/beolvasó metódust, amit mindjárt a példányosítás során meghívnék. Esetleg osztály metódusként (classmethod) megírva alternatív konstruktorként használnám, attól függően, hogy a fájl mennyire játszik központi szerepet az osztályban.
Ettől függetlenül a b módszer is működhet, amennyiben a hálózati kielégítő sebességű, és a használt műveletek nem okoznak extrém mértékű terhelést (mondjuk nem használnád a fájlt másodpercenként 100-szor...)
-
cousin333
addikt
válasz
Siriusb
#2037
üzenetére
De azzal kezdted a mondandódat, hogy "Adott 3 osztály:", majd felsoroltad őket örökléssel együtt. Vagy örököl, vagy nem, de ezzel ne "érzékeltess" semmit, mert az félrevezető...

Ebben az esetben valóban a classmethod tűnik jó megoldásnak (esetleg a staticmethod), mindazonáltal az örökléssel is megoldható, hogy akár a saját
f1()függvényt, akár a szülő osztályokf1()függvényét használd tetszés szerint.A fenti példa így az alábbiak szerint módosulhat:
class A:
def f1(self):
print('f1 in Class A')
class B(A):
@classmethod
def f1(cls):
print('f1 in Class B')
class C(A):
def f1(self):
print('f1 in Class C')
def f2(self):
B.f1()
c = C()
c.f2()f1 in Class B
Új hozzászólás Aktív témák
- Samsung Galaxy S20 128GB, Kártyafüggetlen, 1 Év Garanciával
- BESZÁMÍTÁS! Apple Watch Ultra 2 49mm Cellular okosóra garanciával hibátlan működéssel
- ÁRGARANCIA!Épített KomPhone Ryzen 5 7600X 32/64GB RAM RX 7800 XT 16GB GAMER PC termékbeszámítással
- GYÖNYÖRŰ iPhone 13 mini 128GB Green -1 ÉV GARANCIA - Kártyafüggetlen, MS4050
- REFURBISHED és ÚJ - DELL Thunderbolt Dock WD22TB4 (210-BDTD)
Állásajánlatok
Cég: Laptopszaki Kft.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest

Ráadásul a "code golf"-ot átírtad "algoritmus golfra" a rekurzivitással. Lehet, hogy hatékonyabb csillió számnál, de sanszos, hogy azt úgysem fogod kilistázni, és különben is a beépített függvényt fogod alkalmazni.



![;]](http://cdn.rios.hu/dl/s/v1.gif)
... és mindezt simán feltettem a Google Colab platformra, így ti is láthatjátok, sőt, szerkeszthetitek is: 



