Več

Uporaba bloka definirane kode funkcije s Pythonom v ArcGIS

Uporaba bloka definirane kode funkcije s Pythonom v ArcGIS


Izvajam izračun polja v skriptu Python v ArcGIS. V tem izračunu polja kličem definirano funkcijo v kodnem bloku.

Tukaj je dialog, ki sem ga vodil in delal:

To je delovalo. Vendar tega ne morem prevesti v svojo kodo Python:

Tukaj je koda:

#Izračunajte izraz YSLB = "izhod (! MTH_BRNT!,! YR_BRNT!,! YSLB!)" Code_block = "def izhod (MTH_BRNT, YR_BRNT, YSLB):/n mesec = str (mesec_val)/n mesec_current = int (mesec) /n mesec_požar = int (MTH_BRNT)/n leto = str (visoko_leto)/n leto_current = int (leto)/n year_fire = int (YR_BRNT)/n Mc = (12*(year_current-1)) + mesec_current/n Mf = (12*(year_fire-1)) + month_fire/n return (Mc-Mf)/12 "arcpy.CalculateField_management (fuel_age_out," YSLB ", izraz," PYTHON_9.3 ", code_block)

S tem problemom sem se že srečal. Poskusite uporabiti "" "namesto" nad izrazom.

V nasprotnem primeru poskusite tole:

code_block = "" "def output (MTH_BRNT, YR_BRNT, YSLB): month = str (month_val) month_current = int (month)/n month_fire = int (MTH_BRNT) year = str (high_year)/n year_current = int (year) year_fire = int (YR_BRNT) Mc = (12*(year_current-1)) + month_current Mf = (12*(year_fire-1)) + povrat_mesečnega požara (Mc-Mf)/12 "" "

včasih python ne prepozna znova n


V Pythonu je blok skladenjska lastnost (vdolbina pod stavki za odpiranje bloka, na primer if ali def) in ne predmet. Pričakovana funkcija je lahko zaprtje (ki lahko dostopa do spremenljivk zunaj bloka), kar lahko dosežete z uporabo notranjih funkcij, lahko pa uporabite katero koli klicljivo. Zaradi delovanja lambde v Pythonu je vgrajena definicija funkcije, ki ste jo prikazali z do | arg | je omejen na en sam izraz.

Tukaj je grobo prepis vzorčne kode v Pythonu.

Ena varianta uporablja zanko for, da razjasni, da je zanka končna:

Pogosto boste imeli pri takšnem klicanju že na voljo želeno funkcijo in vam je ne bo treba ponovno opredeliti. Na primer, metode na objektih (vezane metode) so popolnoma veljavne.


Metode

Parameter označuje napako (rdeč X) s priloženim sporočilom. Orodja se ne izvajajo, če ima kateri od parametrov napako.

Označuje parameter kot opozorilo (rumeni trikotnik) s priloženim sporočilom. Za razliko od napak se orodja izvajajo z opozorilnimi sporočili.

setIDMessage (messageType: string, messageID: string, , )

Omogoča nastavitev sistemskega sporočila. Argumenti so enaki funkciji AddIDMessage.

Počisti vse besedilo sporočila in status nastavi na informativno (brez napak ali opozoril).

Vrne true, če parameter vsebuje napako.

Vrne true, če parameter vsebuje opozorilo.

Vrne true, če se orodje preverja znotraj modela in je vhodna vrednost rezultat drugega orodja v modelu.

Lastnosti

Smer vnosa/izhoda parametra.

Niz: "Obvezno", "Izbirno", "Izpeljano"

Seznam indeksov vsakega odvisnega parametra.

Vrednost parametra.

Nepravilno, če parameter ni na voljo.

Res je, če je uporabnik spremenil vrednost.

Res je, če je rutina notranje preverjanja preverila parameter.

Kategorija parametra.

Shema izhodnega nabora podatkov.

Filter, ki se uporabi za vrednosti v parametru.

Pot do datoteke plasti (.lyr), ki se uporablja za risanje izhoda.

Sporočilo, ki bo prikazano uporabniku. Glejte zgoraj SetErrorMessage in SetWarningMessage.

ParameterDependencies

Običajno nastavite odvisnosti parametrov za uporabo objekta Schema. Obstajata dva primera, ko so odvisnosti morda že nastavljene v metodi getParameterInfo orodja.

  • Za parameter izhodnega nabora podatkov, katerega vrsta je Izpeljana, je odvisnost indeks parametra, iz katerega izhaja izhod.
  • Za nekatere vrste vhodnih podatkov je odvisnost indeks parametra, ki vsebuje informacije, ki jih uporablja nadzor, kot je prikazano v spodnji tabeli.

Tabela, ki vsebuje polja.

Element INFO ali izraz INFO

Tabela INFO, ki vsebuje elemente.

Pokritost, ki vsebuje funkcije.

Območne ali linearne enote

Geografski nabor podatkov, ki se uporablja za določanje privzetih enot.

Delovni prostor, ki se uporablja za določanje privzetega koordinatnega sistema.

Nastavitve hierarhije omrežnih analitikov

Omrežni nabor podatkov, ki vsebuje informacije o hierarhiji.

Tabela geostatistične vrednosti

Analizni sloj, ki vsebuje tabele.

parameterDependencies je enakovreden nastavitvi čarovnika Orodje za skripte, pridobljeno iz.

Odvisnosti so običajno nastavljene v metodi getParameterInfo:

Vrednost

To je vrednost parametra, ki ga je uporabnik vnesel ali nastavil programsko. Vrednost lahko nastavite v metodi getParameterInfo, v tem primeru služi kot začetna privzeta vrednost parametra. Vrednost v updateParameters lahko nastavite tudi kot odgovor na vnos uporabnika, kot je prikazano spodaj.

Lastnost vrednosti parametra vrne objekt, razen če parameter ni zapolnjen, v tem primeru vrednost vrne None. Za zaščito pred parametrom, ki ni poseljen, uporabite if ček, preden uporabite njegovo vrednost.

Spodnji delček kode preveri, ali je vrednost enaka nizu "Get Spatial Weights From File". Ta test deluje, ker je podatkovni tip parametra niz.

Ker objekt Value ne podpira manipulacije niza, uporabite lastnost value predmeta Value, kadar koli želite manipulirati ali razčleniti niz. Vzorec kode uporablja metodo os.path.dirname za vrnitev imenika iz nabora podatkov.

Z izjemo Describe pri preverjanju ne uporabljajte metod, ki uberejo pot kataloga, na primer ListFields. Podatkovni niz morda ne obstaja, če je vaše orodje preverjeno v ModelBuilderju, metoda pa lahko ne uspe ali da nepričakovane rezultate.

V posebnem primeru ListFields bo lastnost polj objekta Describe zagotovila enakovredne informacije.

Ne nastavljajte vrednosti parametra v updateMessages (), ker vrednost ne bo preverjena z notranjo potrditveno rutino.

Spremenjen

spremenjeno je res, če je uporabnik spremenil vrednost parametra - na primer z vnosom izhodne poti. Ko je parameter spremenjen, ostane spremenjen, dokler uporabnik ne izprazni (izbriše) vrednosti, v tem primeru se vrne nespremenjen. Programsko spreminjanje vrednosti s kodo za preverjanje ne spremeni spremenjenega stanja. To pomeni, da če nastavite vrednost za parameter, se spremenjeno stanje parametra ne spremeni.

altered se uporablja za določitev, ali lahko spremenite vrednost parametra. Denimo, da ima orodje parameter razreda lastnosti in parameter ključne besede. Če razred značilnosti vsebuje točke ali poligone, so ključne besede RDEČA, ZELENA in MODRA, če pa črte, ORANŽNE, RUMENE, VIJOLIČNE in BELE.

Recimo, da uporabnik vstopi v razred točkovnih lastnosti. Če parameter ključne besede ni spremenjen, nastavite vrednost na RDEČO, saj je to privzeta vrednost.

Če vnesete razred lastnosti vrstice, nastavite privzeto vrednost na ORANGE, dokler parameter ključne besede ni spremenjen.

Če pa je uporabnik spremenil parameter ključne besede (to pomeni, da je ključna beseda nastavljena na ZELENO), ključne besede ne smete ponastaviti - uporabnik se je odločil (ZELENO) in ne veste za njen namen - lahko spremenijo razred lastnosti, tako da je ZELENA veljavna, ali pa spremenijo ključno besedo (na primer v PURPLE). Ker GREEN ni član niza ključnih besed, ki ste jih ustvarili za vrstice, notranja potrditev označi parameter kot napako. Uporabnik ima na tej točki dve možnosti - spremenite razred vnosnih lastnosti ali spremenite ključno besedo.

HasBeenValidated

hasBeenValidated je false, če je uporabnik spremenil vrednost parametra od zadnjega klica updateParameters in notranje validate. Ko je poklicana notranja potrditev, geoprocesna obdelava samodejno nastavi hasBeenValidated na true za vsak parameter.

hasBeenValidated se uporablja za ugotavljanje, ali je uporabnik spremenil vrednost od zadnjega klica do updateParameters. Te podatke lahko uporabite pri odločanju, ali boste sami preverili parameter.


Tok nadzora v Pythonu

Ena najbolj značilnih lastnosti Pythona je uporaba zamika za označevanje blokov kode. Razmislite o stavku if iz našega preprostega programa za preverjanje gesla:

Linije print ('Prijava'.) in print ('Napačno geslo.') sta dve ločeni kodnih blokov. Ti so dolgi le v eni vrstici, vendar vam Python omogoča pisanje kodnih blokov, sestavljenih iz poljubnega števila stavkov.

Če želite označiti blok kode v Pythonu, morate vsako vrstico bloka zamakniti za enak znesek. Dva bloka kode v našem primeru stavek if-sta oba zamaknjena v štiri presledke, kar je tipična količina zamika za Python.

V večini drugih programskih jezikov se zamik uporablja le zato, da koda izgleda lepo. Toda v Pythonu je to potrebno za označevanje kateremu kodu kode pripada izjava. Na primer, finale print ('Vse končano!') je ne z zamikom in tako je ne del drugega bloka.

Programerji, ki poznajo druge jezike, pogosto pomislijo, da je zamik pomemben: Mnogi programerji imajo radi svobodo, da kodo oblikujejo po svoji želji. Vendar so pravila zamika Python precej preprosta in večina programerjev že uporablja zamik, da bi bila njihova koda berljiva. Python preprosto naredi to idejo korak dlje in osmisli zamik.

  • IDLE je zasnovan tako, da za vas samodejno zamakne kodo. Na primer, ko pritisnete tipko Return po vnosu : v glavi if-head samodejno zamakne kazalec v naslednji vrstici.
  • Količina zamika je pomembna: Manjkajoči ali dodatni prostor v bloku Python lahko povzroči napako ali nepričakovano vedenje. Izjave v istem nizu kode morajo biti zamaknjene na isti ravni.

If/elif-stavki

Stavek if/elif je posplošen stavek if z več kot enim pogojem. Uporablja se za sprejemanje kompleksnih odločitev. Recimo, da ima letalski prevoznik naslednje cene vozovnic “ otrok ”: Otroci, stari 2 leti ali mlajši, letijo brezplačno, otroci, starejši od 2 let, vendar mlajši od 13 let, plačujejo vozovnico za otroke s popustom, vsak, ki je star 13 let ali več, pa plača redno cena za odrasle. Naslednji program določa, koliko mora potnik plačati:

Ko Python dobi starost od uporabnika vnese stavek if/elif in preveri vsak pogoj enega za drugim v vrstnem redu, v katerem so podani. Zato najprej preveri, če starost je manj kot 2, in če je tako, pomeni, da je letenje prosto in skoči iz stanja elif. Če starost ni manjši od 2, nato preveri naslednji elif-pogoj, če je starost je med 2 in 13. Če je tako, natisne ustrezno sporočilo in skoči iz stavka if/elif. Če niti pogoj if niti pogoj elif nista Prav, nato izvede kodo v bloku else.

  • elif je okrajšava za drugače če, in lahko uporabite toliko elif-blokov, kolikor je potrebno.
  • Kot običajno mora biti vsak od kodnih blokov v stavku if/elif dosledno zamaknjen z enakim zneskom. Ne samo, da Python potrebuje to vdolbino, da lahko prepozna kodne bloke, ampak dosledna vdolbina ljudem olajša prepoznavanje pogojev if/elif in njihovih ustreznih kodnih blokov.
  • Tako kot pri običajnem stavku if je blok else neobvezen. V izjavi if/elif z blok else, točno eno blokov if/elif bodo izvedeni. Če ni drugega bloka, potem je možno, da noben od pogojev ni Prav, v tem primeru se ne izvede noben od blokov if/elif.
  • Stavek if/elif mora imeti točno en if-blok, nič ali več elif-blokov ter nič ali enega drugega bloka.

Pogojni izrazi

Python ima še enega logičnega operaterja, ki je všeč nekaterim programerjem (nekateri pa ne ’t!). V bistvu je okrajšava zapisa if-stavkov, ki jih je mogoče uporabiti neposredno v izrazih. Razmislite o tej kodi:

Izraz na desni strani = v drugi vrstici se imenuje a pogojni izraz, in oceni eno ali drugo "fuj" ali 'yum'. To je enakovredno naslednjemu:

Pogojni izrazi so običajno krajši od ustreznih stavkov if/else, čeprav niso tako prilagodljivi ali enostavni za branje. Na splošno bi jih morali uporabiti, ko olajšajo vašo kodo.


7 odgovori 7

Iz objave je težko razbrati, v čem je težava, če pa je drugače oblikovano tako

To pomeni, da mora biti ostalo pri enako stopnjo kot ustrezno.

Včasih, ko se vaš urejevalnik samodejno vklopi namesto vas in ročno urejate, se lahko stvari zapletejo, zato boste morali ugotoviti, kako vaš urejevalnik obravnava vdolbine (npr. Ali vedno uporablja zavihke ali presledke?), Kaj se zgodi, če pritisnete tipko return itd).

Prav tako, bodite previdni pri mešanju zavihkov in presledkov, bo to povzročilo tudi težave (težko jih je opaziti, ker sta oba & quotinvisible & quot)

Druga mora biti na isti ravni zamika kot če, s katero je povezana:

Tudi če je vaš urejevalnik samodejno zamaknjen, morate še vedno odstraniti zamik, da bo koda sintaktično pravilna.

Določitev pravilne zamike v resnici ni težava Pythona, ampak težava z urejevalnikom, ki ga uporabljate za izvorno kodo.

Večina urednikov, ki razumejo Python, bo pravilno dodala eno raven zamika za dvopičjem (kot vidite). Ker imate lahko v tem bloku kode poljubno število stavkov, urejevalnik ne more vedeti, kdaj naj & quotoutdent & quot; označi naslednjo vrstico za drugo.

Uredniku morate povedati, da premaga to vrstico, tako da pritisnete backspace ali Shift + Tab na vrstici, preden začnete tipkati.

Če vstavljate drugi del po tem, ko je preostala koda napisana, se prepričajte, da so znaki, ki jih uporabljate za zamik, enaki kot pri stavku if. Če je stavek if zamaknjen s presledki, uporabite enako število presledkov za else. Če je stavek if zamaknjen z enim ali več zavihki, uporabite enako število zavihkov za drug stavek. Za zamike ne mešajte presledkov in zavihkov.

Ne domnevajte tega samo zato, ker so vrstice & quotlook & quot; kot da so vdolbljene enako kot oni so z vdolbino enako. Lahko uporabite presledke in druge zavihke (ali kombinacijo).


3 odgovori 3

Preprosti črni seznami so najslabši način za odpravljanje ranljivosti. Ustvarili bodo veliko lažnih pozitivnih rezultatov in vsak odločen napadalec bo običajno našel pot okoli njih.

Dober primer so požarni zidovi spletnih aplikacij. Pravila odkrivanja, ki jih uporabljajo, so veliko bolj zapletena od vašega poenostavljenega črnega seznama, vendar ne ujamejo vsega in vsake toliko se pojavijo obvoznice za stvari, ki jih so naj bi ujel.

Ne vidim možnosti, da bi pobegnil od tega.

Ali tako mislite. Samo niste gledali dovolj dolgo.

Ta pluje naravnost skozi vaš filter. Pokliče funkcijo exec (), ki se nato natisne 'pwned'.

Zdaj lahko spremenite svoj črni seznam, da se ujame tudi to, vendar bo nekdo drug prišel na drug način.

99% časa vidim, da nekdo uporablja nekaj takega, kot sta exec ali eval, to je popolnoma nepotrebno. Če se lahko izognete uporabi exec, si naredite uslugo in se znebite te ranljivosti, ki čaka na izkoriščanje. Če pa vsekakor potreba če želite uporabiti exec, potem naredite, kot je @amon predlagal v komentarjih: Ustvarite novo cev, razcepite in spustite čim več privilegijev v otroku, nato pa izvedite kodo. Uporabite cev za komunikacijo med otrokom in starševskimi procesi. Ali pa ga shranite v peskovnik, kot je predlagal Steffen Ullrich.


7 Primeri funkcij Python s parametri, povratnimi in podatkovnimi tipi

Funkcije so delčki kode v bloku, ki mu je dodeljeno ime. Vzame vnos, izvede izračun ali dejanje in vrne izhod.

Funkcije izboljšajo ponovno uporabo kode.

V tej vadnici bomo razpravljali o naslednjih primerih:

  1. Primer osnovne funkcije Python
  2. Vgrajene funkcije Python
  3. Python uporabniško določene funkcije
  4. Parametri funkcije Python
  5. Python funkcija neznano število parametrov
  6. Povratna vrednost funkcije Python
  7. Tip podatkov za parameter s in vrnjeno vrednost

1. Primer osnovne funkcije Python

Spodaj je primer funkcije python, ki vzame dva parametra in izračuna vsoto ter vrne izračunano vrednost.

V Pythonu obstajata dve široki kategoriji funkcij: vgrajene in uporabniško določene funkcije.

2. Vgrajene funkcije Python

Ko je Python nameščen, so številne funkcije. Uporabniku ni treba skrbeti glede definicij funkcij. print () je ena najpogosteje uporabljenih vgrajenih funkcij v Pythonu.

Še nekaj primerov takšnih funkcij je: len (), str (), int (), abs (), sum () itd.

Tu so vse vgrajene funkcije, ki jih podpira Python3.

3. Uporabniško definirane funkcije Python

Uporabniško definirane funkcije so deklarirane s ključno besedo def. Ključni besedi mora slediti ime funkcije.

Pri tej funkciji se končni znesek izračuna z uporabo preprostih obresti za glavnico. izračunaj_si_znesek je ime funkcije. glavnica, stopnja in čas so parametri, funkcija pa vrača izračunane podatke.

Ni nujno, da funkcija sprejme parametre in vrne vrednosti. Lahko naredi oboje ali enega od njih ali pa nič. Spodaj je primer funkcije, ki ne sprejme nobenega parametra, vendar vrne podatke.

4. Parametri funkcije Python

Funkcija ima lahko privzete parametre.

V tej funkciji, če uporabnik ne poda drugega parametra b, predpostavlja, da je 10, vendar je treba navesti prvega parametra.

5. Python funkcija neznano število parametrov

OPOMBA: Če v funkciji obstajajo, recimo 4 parametri, za drugega pa je določena privzeta vrednost, je treba 3. in 4. parametru dodeliti tudi privzeto vrednost.

Če število parametrov, ki bi jih morala pričakovati funkcija, ni znano, se *args doda definiciji funkcije kot eden od parametrov. Ta parameter pričakuje nabor. Zvezdica (*) je tukaj pomembna. Ime args je le konvencija. Lahko mu damo katero koli drugo ime.

Podobno ** kwargs pričakuje slovar kot parameter.

Zgornji del kode se sklicuje na zanko for. Za več podrobnosti glejte to: 12 bistvenih primerov ukazov Python za zanko

6. Vrnjena vrednost funkcije Python

Python omogoča funkciji, da vrne več vrednosti.

Tu se vračata dve vrednosti. Ko se ta funkcija pokliče, se povratne vrednosti shranijo v dveh spremenljivkah hkrati.

OPOMBA: Če funkcija ne vrne ničesar, implicitno vrne nič.

7. Podatkovni tip za parametre in vrnjeno vrednost

Določanje podatkovnih tipov za parametre funkcij in vrnjeno vrednost lahko uporabnik obvesti o pričakovanjih funkcij.

Opredelitev funkcije označuje, da potrebuje en parameter tipa int in bo vrnil dve vrednosti tipa int in seznam.


Uporaba virov¶

Te funkcije se uporabljajo za pridobivanje informacij o uporabi virov:

Ta funkcija vrne objekt, ki opisuje vire, ki jih porabi trenutni proces ali njegovi podrejeni elementi, kot jih določa WHO parameter. The WHO parameter je treba določiti z eno od spodaj opisanih konstant RUSAGE_*.

Vsako polje vrnjene vrednosti opisuje, kako je bil uporabljen določen sistemski vir, npr. čas, porabljen za izvajanje, je uporabniški način ali kolikokrat je bil postopek zamenjan iz glavnega pomnilnika. Nekatere vrednosti so odvisne od notranje oznake ure, npr. količino pomnilnika, ki ga proces uporablja.

Zaradi povratne združljivosti je povratna vrednost dostopna tudi kot nabor 16 elementov.

Polja ru_utime in ru_stime povratne vrednosti sta vrednosti s plavajočo vejico, ki predstavljata količino časa, porabljenega za izvajanje v uporabniškem načinu, in čas, porabljen za izvajanje v sistemskem načinu. Preostale vrednosti so cela števila. Posvetujte se s getrusage (2) man strani za podrobnejše informacije o teh vrednostih. Kratek povzetek je predstavljen tukaj:


Uporaba bloka definirane kode funkcije s Pythonom v ArcGIS - Geografski informacijski sistemi

Priprave na tehniko intervjuji?

Učite se od najboljših
inštruktorji na terenu.


Ta stran vas bo vodila, kako razbiti kateri koli intervju za programiranje pythona, vključno z:

1. Vprašanja za intervju v Pythonu v resničnem svetu, ki jih postavljajo podjetja, kot so Microsoft, Google, Amazon, in kako nanje odgovoriti (prihrani čas priprave na intervju).

2. Težave s prakso Pythona ki jih lahko takoj rešite.

1. Kaj je Python?

Python je programski jezik za splošno uporabo, ki se razlaga na visoki ravni. Ker je jezik za splošne namene, ga je mogoče uporabiti za izdelavo skoraj vseh vrst aplikacij s pravimi orodji/knjižnicami. Poleg tega python podpira predmete, module, niti, obdelavo izjem in samodejno upravljanje pomnilnika, ki pomagajo pri modeliranju resničnih težav in izdelavi aplikacij za reševanje teh težav.

2. Kakšne so prednosti uporabe Pythona?

Python je programski jezik za splošno uporabo, ki ima preprosto sintakso, ki jo je mogoče naučiti, ki poudarja berljivost in zato zmanjšuje stroške vzdrževanja programa. Poleg tega je jezik sposoben pisati skripte, popolnoma odprtokoden in podpira pakete drugih proizvajalcev, ki spodbujajo modularnost in ponovno uporabo kod.
Njegove podatkovne strukture na visoki ravni v kombinaciji z dinamičnim tipkanjem in dinamično vezavo privabljajo veliko skupnost razvijalcev za hiter razvoj in uvajanje aplikacij.

3. Kaj je dinamično tipkan jezik?

Preden razumemo, kaj je dinamično tipkan jezik, bi se morali naučiti, kaj je tipkanje. Tipkanje se nanaša na preverjanje tipa v programskih jezikih. V močno tipkano jezik, na primer Python, "1" + 2 bo povzročila napako pri vnosu, ker ti jeziki tega ne dopuščajo "tipna prisila" (implicitna pretvorba podatkovnih tipov). Po drugi strani pa a šibko tipkan jezik, na primer Javascript, se bo preprosto izpisal "12" kot rezultat.

  • Statično - Pred izvedbo se preverijo podatkovni tipi.
  • Dinamično - Med izvajanjem se preverjajo podatkovni tipi.

4. Kaj je tolmačeni jezik?

An Tolmačeno jezik svoje stavke izvaja po vrsticah. Jeziki, kot so Python, Javascript, R, PHP in Ruby, so odlični primeri tolmačenih jezikov. Programi, napisani v interpretiranem jeziku, se izvajajo neposredno iz izvorne kode, brez vmesnega koraka sestavljanja.

5. Kaj je PEP 8 in zakaj je pomemben?

PEP pomeni Predlog izboljšave Python. PEP je uradni projektni dokument, ki zagotavlja informacije skupnosti Python ali opisuje novo funkcijo Pythona ali njegovih procesov. PEP 8 je še posebej pomembno, ker dokumentira slogovne smernice za Python Code. Očitno pri prispevanju v odprtokodno skupnost Python morate iskreno in strogo upoštevati te slogovne smernice.

6. Kako se upravlja s pomnilnikom v Pythonu?

Upravljanje pomnilnika v Pythonu vodi Upravitelj pomnilnika Python. Pomnilnik, ki ga dodeli upravitelj, je v obliki zasebnega prostora za kup namenjen Pythonu. Vsi predmeti Python so shranjeni v tem kupu in so zasebni, zato programerju ni dostopen. Čeprav python ponuja nekatere osnovne funkcije API -ja za delo na zasebnem prostoru kopice.
Poleg tega ima Python vgrajeno zbirko smeti za recikliranje neuporabljenega pomnilnika za prostor zasebnega kupa.

7. Kaj so imenski prostori Python? Zakaj se uporabljajo?

  • Lokalni imenski prostor vključuje lokalna imena znotraj funkcije. imenski prostor je začasno ustvarjen za klic funkcije in se počisti, ko se funkcija vrne.
  • Globalni imenski prostor vključuje imena iz različnih uvoženih paketov/ modulov, ki se uporabljajo v trenutnem projektu. Ta imenski prostor se ustvari, ko je paket uvožen v skript, in traja do izvedbe skripta.
  • Vgrajen imenski prostor vključuje vgrajene funkcije jedra Python in vgrajena imena za različne vrste izjem.

8. Kaj je področje uporabe v Pythonu?

  • A lokalnem obsegu se nanaša na lokalne objekte, ki so na voljo v trenutni funkciji.
  • A globalnega obsega se nanaša na predmete, ki so na voljo med izvajanjem kode od njihovega začetka.
  • A obseg na ravni modula se nanaša na globalne objekte trenutnega modula, dostopne v programu.
  • An najbolj oddaljeni obseg se nanaša na vsa vgrajena imena, ki jih je mogoče poklicati v programu. Predmeti v tem obsegu se nazadnje iščejo, da bi našli omenjeno ime.

9. Kaj je Resolution Scope Resolution v Pythonu?

  • Moduli Python, in sicer 'math' in 'cmath', imata veliko skupnih funkcij za oba - log10 (), acos (), exp () itd. modul, na primer math.exp () in cmath.exp ().
  • Upoštevajte spodnjo kodo, temp objekta je bil inicializiran na 10 globalno in nato na 20 ob ​​klicu funkcije. Vendar pa klic funkcije globalno ni spremenil vrednosti temp. Tu lahko opazimo, da Python potegne jasno mejo med globalnimi in lokalnimi spremenljivkami, ki oba njuna prostora obravnavata kot ločeni identiteti.

To vedenje je mogoče preglasiti z uporabo globalne ključne besede znotraj funkcije, kot je prikazano v naslednjem primeru:

10. Kaj so dekoraterji v Pythonu?

Dekoraterji v Pythonu so v bistvu funkcije, ki dodajo funkcionalnost obstoječi funkciji v Pythonu, ne da bi spremenile strukturo same funkcije. Predstavljeni so z @decorator_name v Pythonu in se kličejo od spodaj navzgor. Na primer:

Lepota dekoraterjev je v tem, da lahko poleg dodajanja funkcionalnosti izidu metode celo sprejeti argumente za funkcije in lahko te argumente še spremeni, preden jih posreduje sami funkciji. The notranja ugnezdena funkcija, to je "ovojna" funkcija, igra tukaj pomembno vlogo. Izvaja se za uveljavljanje inkapsulacija in se tako skriva pred globalnim obsegom.

11. Kaj so seznami in kolački? Kakšna je ključna razlika med obema?

Seznami in Ploščice sta oba podatkovne vrste zaporedja ki lahko shrani zbirko predmetov v Python. Predmeti, shranjeni v obeh zaporedjih, imajo lahko različne vrste podatkov. Seznami so predstavljeni z oglati oklepaji ['sara', 6, 0,19], medtem ko so torte predstavljene z okraske („anš“, 5, 0,97).
Kakšna pa je resnična razlika med obema? Ključna razlika med obema je v tem, da medtem seznami so spremenljivi, torte po drugi strani so nespremenljivi predmetov. To pomeni, da je mogoče sezname spreminjati, dodajati ali razrezati na poti, vendar naborki ostanejo konstantni in jih ni mogoče na noben način spreminjati. Za potrditev razlike lahko zaženete naslednji primer v Python IDLE:

12. Kaj sta razumevanja Dict in List?

Python razumevanje, tako kot dekoraterji, je skladenjski sladkor konstrukcije, ki pomagajo graditi spremenjeno in filtrirano sezname, slovarje ali sklope z danega seznama, slovarja ali niza. Z razumevanjem prihranite veliko časa in kode, ki je lahko precej bolj podrobna (vsebuje več vrstic kode). Oglejmo si nekaj primerov, kjer je lahko razumevanje resnično koristno:

  • Izvajanje matematičnih operacij na celotnem seznamu
  • Izvajanje operacij pogojnega filtriranja na celotnem seznamu
  • Združevanje več seznamov v enega
    Razširitve omogočajo več ponoviteljev, zato jih je mogoče uporabiti za združevanje več seznamov v enega.
  • Poravnava večdimenzionalnega seznama
    Podoben pristop ugnezdenih iteratorjev (kot zgoraj) je mogoče uporabiti za poravnavo večdimenzionalnega seznama ali delo na njegovih notranjih elementih.

Opomba: Razumevanje seznamov ima enak učinek kot metoda zemljevida v drugih jezikih. Sledita zapis matematičnega graditelja nizov namesto funkcij preslikave in filtriranja v Pythonu.

13. Katere so običajne vgrajene vrste podatkov v Pythonu?

V Pythonu je več vgrajenih podatkovnih tipov. Čeprav Python ne zahteva, da se podatkovni tipi izrecno opredelijo med deklaracijami spremenljivk, se pa lahko zgodijo napake pri tipu, če zanemarimo poznavanje podatkovnih tipov in njihovo medsebojno združljivost. Python ponuja funkcije type () in isinstance () za preverjanje vrste teh spremenljivk. Te vrste podatkov lahko združimo v naslednje kategorije-

  • Brez Vrsta
    Nobena ključna beseda ne predstavlja ničelnih vrednosti v Pythonu. Logično operacijo enakosti je mogoče izvesti s temi objekti NoneType.
    Ime razredaOpis
    NoneTypePredstavlja NIČ vrednosti v Pythonu

  • Številčne vrste
    Obstajajo tri različne številčne vrste - cela števila, številke s plavajočo vejico, in kompleksne številke. Poleg tega, booleans so podvrsta celih števil.
    Ime razredaOpis
    intShranjuje celoštevilske literale, vključno s šestnajstiškimi, oktalnimi in binarnimi števili kot cela števila
    plavatiShrani literale, ki vsebujejo decimalne vrednosti in/ali znak eksponenta, kot številke s plavajočo vejico
    zapletenoShranjuje kompleksno številko v obliki (A + Bj) in ima atribute: real in imag
    boolShrani logično vrednost (True ali False)
    Opomba: Standardna knjižnica vključuje tudi ulomki za shranjevanje racionalnih števil in decimalno za shranjevanje številk s plavajočo vejico z natančnostjo, ki jo določi uporabnik.

14. Kaj je lambda v Pythonu? Zakaj se uporablja?

  • Dodelitev lambda funkcij spremenljivki
  • Zavijanje lambda funkcij v drugo funkcijo

15. Kaj je pass v Pythonu?

Ključna beseda pass predstavlja ničelno operacijo v Pythonu. Običajno se uporablja za polnjenje praznih blokov kode, ki se lahko izvajajo med izvajanjem, vendar jih še ni treba napisati. Brez prehod v naslednji kodi, lahko med izvajanjem kode naletimo na nekatere napake.

16. Kako kopiraš predmet v Pythonu?

V Pythonu je izjava o dodelitvi ( = operator) ne kopira predmetov. Namesto tega ustvari povezavo med obstoječim objektom in imenom ciljne spremenljivke. Za ustvarjanje kopij predmeta v Pythonu moramo uporabiti datoteko kopirati modul. Poleg tega obstajata dva načina za ustvarjanje kopij za dani predmet z uporabo kopirati modul -

  • Plitka kopija je bitna kopija predmeta. Ustvarjeni kopirani objekt ima natančno kopijo vrednosti v izvirnem objektu. Če je katera od vrednosti sklicevanje na druge objekte, se kopirajo le referenčni naslovi za iste.
  • Globoka kopija rekurzivno kopira vse vrednosti iz izvornega v ciljni objekt, kar pomeni, da celo podvoji predmete, na katere se sklicuje izvorni predmet.

17. Kakšna je razlika med xrange in range v Pythonu?

xrange () in obseg () sta si po funkcionalnosti precej podobna. Oba ustvarita zaporedje celih števil, z edino razliko, da range () vrne a Seznam Python, medtem ko xrange () vrne an xrange objekt.

Kako je torej to pomembno? Zagotovo, ker za razliko od range () xrange () ne ustvari statičnega seznama, vrednost ustvari na poti. Ta tehnika se običajno uporablja pri vrsti predmeta generatorji in je bil označen kot "Mehek".

Mehek je ključnega pomena v aplikacijah, kjer je spomin omejen. Ustvarjanje statičnega seznama v obsegu () lahko v takih pogojih povzroči napako v pomnilniku, medtem ko lahko xrange () z njim optimalno ravna tako, da za generator uporablja le dovolj pomnilnika (v primerjavi s tem bistveno manj).

Opomba: xrange je bilo zastarelo od Python 3.x. Zdaj obseg dela popolnoma enako, kot je nekoč počel xrange Python 2.x, ker je bilo v Pythonu 2.x bolje uporabiti xrange () kot prvotno funkcijo range ().

18. Kaj so moduli in paketi v Pythonu?

Paketi Python in moduli Python sta dva mehanizma, ki omogočata modularno programiranje v Pythonu. Modularizacija ima več prednosti -

  • Enostavnost: Delo na enem modulu vam pomaga, da se osredotočite na relativno majhen del težave. Tako je razvoj lažji in manj nagnjen k napakam.
  • Vzdrževanje: Moduli so zasnovani za uveljavljanje logičnih meja med različnimi področji problemov. Če so napisane na način, ki zmanjšuje medsebojno odvisnost, je manj verjetno, da bi spremembe v modulu vplivale na druge dele programa.
  • Ponovna uporaba: Funkcije, opredeljene v modulu, lahko preprosto uporabite v drugih delih aplikacije.
  • Obseg: Moduli običajno določajo ločeno imenski prostor, ki pomaga preprečiti zmedo med identifikatorji iz drugih delov programa.

Modulina splošno so preprosto datoteke Python s končnico .py in imajo lahko določen in izveden nabor funkcij, razredov ali spremenljivk. Lahko jih uvozite in inicializirate z uporabo stavka import. If partial functionality is needed, import the requisite classes or functions using from foo import bar .

Packages allow for hierarchial structuring of the module namespace using dot notation. As, modules help avoid clashes between global variable names, in a similary manner, paketov help avoid clashes between module names.
Creating a package is easy since it makes use of the system's inherent file structure. So just stuff the modules into a folder and there you have it, the folder name as the package name. Importing a module or its contents from this package requires the package name as prefix to the module name joined by a dot.

Opomba: You can technically import the package as well, but alas, it doesn't import the modules within the package to the local namespace, thus, it is practically useless.

19. What are global, protected and private attributes in Python?

  • Globalno variables are public variables that are defined in the global scope. To use the variable in the global scope inside a function, we use the global keyword.
  • Protected attributes are attributes defined with a underscore prefixed to their identifier eg. _sara. They can still be accessed and modified from outside the class they are defined in but a responsible developer should refrain from doing so.
  • Zasebno attributes are attributes with double underscore prefixed to their identifier eg. __ansh. They cannot be accessed or modified from the outside directly and will result in an AttributeError if such an attempt is made.

20. What is self in Python?

Self is a keyword in Python used to define an instance or an object of a class. In Python, it is explicity used as the first paramter, unlike in Java where it is optional. It helps in disinguishing between the methods and attributes of a class from its local variables.

21. What is __init__?

__init__ is a contructor method in Python and is automatically called to allocate memory when a new object/instance is created. All classes have a __v__ method associated with them. It helps in distinguishing methods and attributes of a class from local variables.

22. What is break, continue and pass in Python?

Odmor The break statement terminates the loop immediately
and the control flows to the statement after the body of the loop.
Nadaljuj The continue statement terminates the current iteration of the statement,
skips the rest of the code in the current iteration and the control flows to the next iteration of the loop.
Pass As explained above, pass keyword in Python is generally used to fill-up empty blocks
and is similar to an empty statement represented by a semi-colon in languages such as Java, C++, Javascript etc.

23. What is pickling and unpickling?

Python library offers a feature - serialization out of the box. Serializing a object refers to transforming it into a format that can be stored, so as to be able to deserialize it later on, to obtain the original object. Here, the kumarica module comes into play.

Dekapiranje
Pickling is the name of the serialization process in Python. Any object in Python can be serialized into a byte stream and dumped as a file in the memory. The process of pickling is compact but pickle objects can be compressed further. Moreover, pickle keeps track of the objects it has serialized and the serialization is portable across versions.
The function used for the above process is pickle.dump() .

Unpickling
Unpickling is the complete inverse of pickling. It deserializes the byte stream to recreate the objects stored in the file, and loads the object to memory.
The function used for the above process is pickle.load() .

Opomba: Python has another, more primitive, serialization module called marshall, which exists primarily to support .pyc files in Python and differs significantly from pickle.

24. What are generators in Python?

Generators are functions that return an iterable collection of items, one at a time, in a set manner. Generators, in general, are used to create iterators with a different approach. They employ the use of yield keyword rather than return to return a generator object.
Let's try and build a generator for fibonacci numbers -

25. What is PYTHONPATH in Python?

PYTHONPATH is an environment variable which you can set to add additional directories where Python will look for modules and packages. This is especially useful in maintaining Python libraries that you do not wish to install in the global default location.


You should consider adding a main function to your project. This is usually done through the introduction of:

This allows for me to import your project and not have it automatically execute the game function at the bottom. Increasing re-usability.

1 For instance, It may be the project defaults to "" , but you need to print out " Hi " with the quotes, so print('" Hi "') may be chosen.

In addition to another answer I will add these places to improve (I will not repeat all things from that answer, my answer is just an addition):

1. Code inconsistency

You have several places in your code where your code is inconsistent

Both functions are checking collisions but one returns integer (0/1) and another - boolean (True/False).

For head you convert X*block_size to int (it is unnecessary anyway). For body you don't do it.

I recommend you to always check your code for possible inconsistency.

2. Names inconsistency

I moved it to an another point because it is not about how your code works - it is about how another programmers will read your code.

You use three different namings for direction entity:

je daleč better to use consistent variable names. If you are using different direction variables, get them names with only one word for directions. Here is the example:

3. Small code improvements

Sometimes you look at your code and think: "Hmmm, it is working but looks not good". Often in these cases you can slightly reorganize your code to make it a bit better :)

This line of code is correct too but it is hard to read:

But it will be far better to read if you will change it to:

or even this (sometimes I use it for really long if's):

You never read size , and Python Lists already know their own length in case you did need it.

You're just duplicating functionality that List already gives you by manually keeping size in sync with the list length.

Separate game logic from screen rendering details

You keep snake coordinates scaled by pixels. This seems to complicate your code everywhere with block_size instead of 1 I suspect it would be easier to keep snake coordinates in units of blocks, and only scale to pixels for drawing purposes.

npr. then your outer-wall check could be something like s.head[0] >= bg_width instead of
s.head[0] > bg_width-block_size .

1 is special for integers because it's the difference between > and >=

I like your add_to_tail idea of putting multiple snake segments in the same place initially, so move on future turns actually makes the snake longer on screen. That high-level design might be worthy of a comment.

The other option would be a "future growth" counter that you check (and decrement) every move to decide whether to remove the last tail block. (That's what I was expecting because I hadn't thought of your idea). Your way is more efficient and will still work if you want food to cause multiple segments of growth. You can still do them all when the food is eaten.

Keeping a separate head : I'm not sure this is helping you. Functions that want to look at the first segment can do head = snake_.body[0] .

I don't understand why move needs to do this:

when it looks to me like inserting the modified head as a new first element will already create that condition. So either this is redundant (and confusing), or else it's extra work that you wouldn't need to do if you didn't redundantly keep the head coordinates in 2 places. (Front of the List, and in its own object.)

This should be an enum or integer, not a string. String compares are fairly cheap, but not as cheap as integers. There's no reason that a direction needs to be an arbitrary string when it can take only 1 of 4 possible values. A string isn't making your code any easier to read.

You probably still want the if/elif chain to turn a direction into an x or y offset, but another option for an integer would be a lookup table of [-1, 0] , [1, 0] etc. so you look up the x and y offsets for the given direction and just add them to the head's x and y coordinates without any conditionals.

Or direction could actually biti an XY vector, removing the lookup step.

But that might complicate change_dir . Or give you a different implementation: to check for reversing direction: if new_dir + old_dir == [0,0] then you tried to double back. Otherwise you lahko set dir = new_dir .

I like your design for having the keyboard-input just call change_dir to check the game-logic of that input. That works very cleanly, and would still work if left was defined as [-1, 0] instead of "LEFT" .


Poglej si posnetek: Integrating Deep Learning with ArcGIS using Python