» »

[Python] učenje

Robocop1 ::

Pozdravljeni!

Sem nov v Pythonu in bom potreboval malo pomoči. Pregledal sem že tutoriale na tem forumu, a nisem našel to kar me zanima.
Za začetek bi rad izvedel kako združim več stavkov v nek blok. Rad bi z zanko napisal program, ki bi izpisal nekaj podobnega:
*****
*****
*****

Bi mi lahko kdo napisal kodo, ki to izpiše?

b0j3 ::

Pa napiši predlog kako naj bi zgledal potek programa, da pokažeš vsaj malo dobre volje.
Sedaj izgleda kot da hočeš, da naredimo tvojo domačo nalogo.

bluefish ::

Glede na prejšnje teme se gre očitno res za reševanje nalog: http://slo-tech.com/script/forum/izpisi...

Robocop1 ::

Sicer ne gre za domačo nalogo (učim se ga, ker ga bom najverjetneje potreboval v bližnji prihodnosti). Moj do sedaj napisan program je takšen:

for i in range (0, 3):
for j in range (0, 5):
print("*")
print("\n")

Problem je v tem, da se oba print ukaza izvedeta zaporedno, zato imam pri izpisu vsako zvezdico v svoji vrstici. Pa tudi če napišem samo:

print("*")
print("*")

bo vsaka zvezdica v novi vrstici, čeprav nisem zahteval skoka v novo vrstico. Je sploh možno napisati program, kot sem si ga zgoraj zamislil?

imagodei ::

Indentaj program:
for i in range(0,3):
     for j in range(0,5):
          print("*", end=" ")
     print("\n")
- Hoc est qui sumus -

Gandalfar ::

da:

print "*",

vejca na koncu v python 2.x pove printu, naj ne naredi newline na koncu

noname3 ::

za python imaš veliko dobrih tutorialov na spletu - v angleščini.
preberi jih in sigurno boš našel odgovore na veliko vprašanj...

BigWhale ::

Mar ne naredi vejica presledka?

jype ::

Ga ja.

A ni lažje:

for i in range(3): print 5*'*'

imagodei ::

You're just bragging... ;)
- Hoc est qui sumus -

Gandalfar ::

My bad, sem dal napacen nasvet :)

Isotropic ::

dajte se meni nekaj povedat
for i in range(0, len(element)):
  for j in range(0, len(field.values), 3):
    if element[i][0] == field.values[j].elementLabel:
      element[i].append(array('d', [field.values[j].data, field.values[j+1].data, field.values[j+2].data]))
      break
    else: continue


je ta break pravilno uporabljen? rad bi, da v primeru, da najde match, gre ven iz j loopa in se pomakne na nov element (i).
pa bi se dalo loopa se kako izboljsati performancno (problem je, da sta ZELO velika), ker tece ze kar nekaj casa.
bi slo z sorted in sklicevanje na prvi field, potem pa samo primerjam vrednosti in ce nista enaki, grem skozi celo dvojno zanko.

jype ::

Break bo skočil samo iz najožjega loopa.

Isotropic ::

saj to bi rad ja. loop i se more se nadaljevati.
sicer pa ni bil dober nacin, ker je trajalo vec kot pol ure, da je slo skozi ~15% i.
(i=~1e5, j=6e5/3)

Zgodovina sprememb…

noname3 ::

dajte se meni nekaj povedat
for i in range(0, len(element)):
  for j in range(0, len(field.values), 3):
    if element[i][0] == field.values[j].elementLabel:
      element[i].append(array('d', [field.values[j].data, field.values[j+1].data, field.values[j+2].data]))
      break
    else: continue


je ta break pravilno uporabljen? rad bi, da v primeru, da najde match, gre ven iz j loopa in se pomakne na nov element (i).
pa bi se dalo loopa se kako izboljsati performancno (problem je, da sta ZELO velika), ker tece ze kar nekaj casa.
bi slo z sorted in sklicevanje na prvi field, potem pa samo primerjam vrednosti in ce nista enaki, grem skozi celo dvojno zanko.


break je pravilno uporabljen, samo ne razumem zakaj rabis "else: continue"? razen če imaš nekaj za tem if-om v notranjem loop-u?

optimizacijo lahkio naredis da najprej sortiras values listo po elementLabel in gres preverat polovico po polovico - podobno kako dela qsort.

jype ::

Predvsem to ni naloga za Python. Take reči je smiselno delat v C modulu za Python, če že moraš v Pythonu.

imagodei ::

@jype

Zakaj - ker je Python prešvoh/prepočasen, ali ker enostavno ni opremljen za tovrstne naloge?
- Hoc est qui sumus -

jype ::

Ker gre za ogromen loop. Hočeš, da je čimbolj tight, da se na procesorju izvaja čim manj ukazov na vsako iteracijo.

Če se to dogaja v Python kodi, je (interpreterjevih) režijskih stroškov toliko, da nima nobenega smisla.

Napišeš funkcijo v C ki ji v Pythonu podaš objekte in potem loopaš v C, približno 400-3000x hitreje.

imagodei ::

Hm,

a nima drugač piton kakšnega kompajlerja? Sicer vem, da je v osnovi interpretiran jezik, ampak mislim, da swm vseeno nekaj zasledil...
- Hoc est qui sumus -

Isotropic ::

ne znam c :(
zdaj sice nekaj gledam, da bi sortiral oba lista, pa field sem dal v svoj list samo te value (ker je moral zdaj dostopati do baze podatkov za vsak j, kar je costly), potem pa najprej primerjal, ce mi bo ratalo (ker so/bodo itak po vrsti), ce pa ne, pa pac search po celem listu.

pa tudi receno mi je bilo, da se za takle ne splaca pisat v c, ker je samo kratka skripta

Zgodovina sprememb…

noname3 ::

meni se zdi da element listo ne rabis sortirati

hruske ::

Najbolj enostavno to pohitriš tako, da ne uporabljaš indeksov, ampak kar elemente. Odstranil sem še tisti continue, ker ne spremeni algoritma.

for i in element:
  for j in range(0, len(field.values), 3):
    if i[0] == field.values[j].elementLabel:
      i.append(array('d', [field.values[j].data, field.values[j+1].data, field.values[j+2].data]))
      break


S tem si se znebil dveh iskanj po seznaku, ki so v Pythonu še kar draga operacija.
Errarum humane est.

Zgodovina sprememb…

  • spremenilo: hruske ()

Isotropic ::

hm, sam res. to pa niti pomislil nisem.
btw, receno mi je bilo, da append porabi tudi veliko casa, ker se mora narediti nov list, vse prepisat not pa starega unict (vsakic).
a to popravim tkao, da ga na zacetku inicializiram (dolzina je znana) ali da mu priredim vrednost takole list[i][0] = ... (sklepam, da je append in tole isto sicer)

edit ni, tisto je insert, ce se ne motim.

hruske ::

Ne, to, da se ustvarja nov list vsakič ko dodaš kak element v Pythonu ni čisto res. Gre sicer po nekem eksponentnem povečevanju prostora.

Je pa res, da se v primeru vnaprej znane velikosti lahko temu izogneš in narediš nov list tako (N je velikost)

list = [None]*N


dodeljevanje je list[i] = nov_element
insert je list.insert(i, nov_element)
append je list.append(nov_element)
Errarum humane est.

hruske ::

Ok, zdaj pa še en uber trik.

from itertools import izip

def grouper(n, iterable):
    "ta funkcija vraca po n elementov seznama hkrati"
    # naslednja vrstica naredi list z "n" elementi, od katerih vsi 
    # kažejo na isti generator zato se ob vsakem dostopu do drugega
    # generatorja, ki ga vrne izip, vracajo po 1 element od vsakega
    # elementa v args, to pa je ravno n elementov seznama "iterable",
    # ki si sledijo po vrsti.
    args = [iter(iterable)] * n   
    return izip(*args)

for i in element:
  for j in grouper(3, field.values):
    if i[0] == j[0].elementLabel:
      i.append(array('d', [x.data for x in j]))
      break



No, in s tem se znebiš še iskanj po seznamu po indeksih j, zdaj pa bi se moralo to že konkretno poznat na hitrosti.
Errarum humane est.

Zgodovina sprememb…

  • spremenilo: hruske ()

noname3 ::

Ok, zdaj pa še en uber trik.

from itertools import izip

def grouper(n, iterable):
    "ta funkcija vraca po n elementov seznama hkrati"
    # naslednja vrstica naredi list z "n" elementi, od katerih vsi 
    # kažejo na isti generator zato se ob vsakem dostopu do drugega
    # generatorja, ki ga vrne izip, vracajo po 1 element od vsakega
    # elementa v args, to pa je ravno n elementov seznama "iterable",
    # ki si sledijo po vrsti.
    args = [iter(iterable)] * n   
    return izip(*args)

for i in element:
  for j in grouper(3, field.values):
    if i[0] == j[0].elementLabel:
      i.append(array('d', [x.data for x in j]))
      break



No, in s tem se znebiš še iskanj po seznamu po indeksih j, zdaj pa bi se moralo to že konkretno poznat na hitrosti.


cool, za ta iterootl nisem vedel.
sam, ali si siguren da tole nekaj pohitri...

Zgodovina sprememb…

  • spremenil: noname3 ()

Isotropic ::

crap, prezgodaj sem se veselil

Zgodovina sprememb…

hruske ::

Super. :)
Errarum humane est.

Isotropic ::

evo
element.sort(lambda z,x: cmp(z[0],x[0]))
list.sort(lambda z,x: cmp(z[0],x[0]))

for i in range(len(element)):
  if element[i][0] == list[i][0]:
    element[i].append(array('d', [list[i][1], list[i][2], list[i][3]]))
  else: print i


tisti list je v bistvu field.values.data temp variabla, me pa zanima, ce lahko kdo to prepise, da bo bolj po pythonovsko, sploh glede tistega i. sem videl, da ga kar omittate (i), meni na zacetku ni delalo tako (sem narobe zastavil), pa sem se navadil na dolgo. lavfalo je pa < 2min.

pa ce lahko pojasni kdo tisto lambdo, sem jo dobil od enega sodelavca, ki je rekel, da jo je vcasih se razumel.

cmp( x, y)

Compare the two objects x and y and return an integer according to the outcome. The return value is negative if x < y, zero if x == y and strictly positive if x > y.

zdaj ce prav razumem, primerja vsak element z 0,0 in ce je manjsi, ga premakne gor.

Zgodovina sprememb…

Isotropic ::

kako naj naredim vec if stavkov oz. po vecih kriterijih?
rad bi izpisal vse elemente, ki imajo x v rangu (0.20 - 0.21) in y v rangu (0.2-0.22)?

ok, vem da se to da narediti z list comp., samo ne vem, kako naj refenciram ustrezno kolumno lista. mam nekako tko, ampak ne dela (obviously):

[elem for elem in result where result[2] in range(0.2,0.21)]

Zgodovina sprememb…

Kami ::

Uporabiš and oziroma oz, odvisno od potrebe.

Na primer:

[elem for elem in result if elem[x] in range(2, 5) and elem[y] in range(5,9)]

...
http://www.ubuntu.si || http://www.freebsd.si

hruske ::

Pomojem hočeš:

[elem for elem in result if (0.2 <= result.x <= 0.21) and (0.2 <= result.y <= 0.22)]


ker je range diskretna stvar in ne gleda zveznih vrednosti.
Errarum humane est.

Isotropic ::

ce se ne motim, ima py neko omejitev, da lahko lavfa threade samo na enem procesorju/ coreu, kajne (samo lahko pa na tem procu izvaja n threadov)?
ve kdo kaj o tem?
se mi bolj splaca lavfat en thread ali vec (performacno)? vse kar delam, je primerjava nekih vnosov v listu.

dam se kodo:
for i in listBg:
  for j in tmp[i].elements:
    elBg.append([j.label])
    elBg[-1].extend(j.connectivity)
    
for i in listCoh:
  for j in tmp[i].elements:
    elCoh.append([j.label])
    elCoh[-1].extend(j.connectivity)
    
    
elBg.sort(lambda z,x: cmp(z[0],x[0]))
elCoh.sort(lambda z,x: cmp(z[0],x[0]))

stevec = [[0]*2 for num in range(len(elCoh))]
for i in range(len(elCoh)):
  for j in range(len(elBg)):
    bgg = elBg[1:]
    if elCoh[i][1] in bgg and elCoh[i][2] in bgg and elCoh[i][2] in bgg or \
       elCoh[i][4] in bgg and elCoh[i][5] in bgg and elCoh[i][6] in bgg:
        s = stevec[i][1] + 1
        stevec.append([elCoh[i][0], s])


vem, da py ni najboljsa izbira, ampak problem je ze v tem, da ne znam nic drugega, razen malo fortrana. preden bi pa skapiral, kako in kaj, bi pa tudi py ze naredil.

Zgodovina sprememb…

hruske ::

Performančno na CPythonu (uradna python.org implementacija) definitivno single thread. Če imaš večjedrni CPU to velja še toliko bolj.

Threadi v Pythonu niso primerni za procesno intenzivne stvari.
Errarum humane est.

Isotropic ::

lahko poves, ce se da dobiti kako direktorij, v katerem se nahaja skripta, ki je bila pognana? (zazene se z python c:\...). zdaj resujem to z rocnim vpisom, me pa zanima, ce se da kako boljse?

kaj pa je bolj primerno za intenzivne zadeve, v pure pythonu? cpp ne znam, scipy ipd. pa ni moznosti za instalacijo (nimamo linux admina, pa ce gre kaj narobe...)

Gandalfar ::

easy_install scipy

pa si ga instaliras v osebni home instaliraj. Python prakticno nikoli ne rabi admin privilegijev.

Zgodovina sprememb…

jype ::

loki3000> lahko poves, ce se da dobiti kako direktorij, v katerem se nahaja skripta, ki je bila pognana?

__file__

Zgodovina sprememb…

  • spremenilo: jype ()

Isotropic ::

kako je pa mozno, da mi samo tale koda (vse, ampak cisto vse ostalo je zakomentirano). vrne pa typeError: an integer is required. sem skopiral tudi iz neke druge kode, file je na direktoriju, kjer bi mogel lavfat, take datoteke se ni (sem tudi mal probal spremenit), placa je se dost.

#from os import *
from odbAccess import *

#pathh = '' #pot do direktorija

#files = listdir(pathh)
#files = [i for i in files if 'odb' in i]
files = ['new6.odb', 'new6reversed.odb']

f = open('result_iso.txt', 'w')
#for item in files:


sem probal dat stop med f in for (da javi napako), a je ni. ce sem dal stop pred f, je javil napako. definiran je tudi samo files, f pa ni vec, kaj sele item (kot type(item))







import __builtin__ je pomagal.

Zgodovina sprememb…



Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Python iskanje podvojenih vrednosti

Oddelek: Programiranje
18640 (353) BlueRunner
»

python problem

Oddelek: Programiranje
13690 (430) Isotropic
»

Python - naloga

Oddelek: Programiranje
121722 (1406) jype
»

[Python] Polja, matrike

Oddelek: Programiranje
5892 (784) OwcA
»

[C] Narascajoce sortiranje linearnega seznama

Oddelek: Programiranje
71015 (904) Jebiveter

Več podobnih tem