Articles

Hva Er Python-Navnerom (Og Hvorfor Trengs De?)

Navnekonflikter skjer hele tiden i virkeligheten. For eksempel, hver skole som jeg noen gang gikk til hadde minst to elever i klassen min som delte samme fornavn. Hvis noen kom inn i klassen og ba om student X, ville vi entusiastisk spørre, » Hvilken snakker du om ? Det er To studenter som heter X. » Etter det ville den spørrende personen gi oss et etternavn, og vi ville introdusere ham Til høyre X.

all denne forvirringen og prosessen med å bestemme den nøyaktige personen vi snakker om ved å lete etter annen informasjon i tillegg til et fornavn, kunne unngås hvis alle hadde et unikt navn. Dette er ikke et problem i en klasse på 30 studenter. Det blir imidlertid stadig vanskeligere å komme opp med et unikt, meningsfylt og lett å huske navn for hvert barn i en skole, by, by, land eller hele verden. Et annet problem i å gi hvert barn et unikt navn er at prosessen med å avgjøre om noen andre har også kalt sine barn Macey, Maci Eller Macie kan være veldig slitsomt.

en veldig lignende konflikt kan også oppstå i programmeringen. Når du skriver et program med bare 30 linjer uten eksterne avhengigheter, er det veldig enkelt å gi unike og meningsfulle navn til alle variablene dine. Problemet oppstår når det er tusenvis av linjer i et program, og du har lastet inn noen eksterne moduler også. I denne opplæringen vil du lære om navnerom, deres betydning og omfangsoppløsning I Python.

Hva Er Navnerom?

et navneområde er i utgangspunktet et system for å sikre at alle navnene i et program er unike og kan brukes uten konflikt. Du vet kanskje allerede at alt i Python-lignende strenger, lister, funksjoner, etc.- det er et objekt. Et annet interessant faktum er At Python implementerer navnerom som ordbøker. Det er en navn-til-objekt-tilordning, med navnene som nøkler og objektene som verdier. Flere navnerom kan bruke samme navn og tilordne det til et annet objekt. Her er noen eksempler på navnerom:

  • Lokalt Navnerom: Dette navneområdet inneholder lokale navn i en funksjon. Dette navneområdet opprettes når en funksjon kalles, og det varer bare til funksjonen returnerer.
  • Globalt Navneområde: dette navneområdet inneholder navn fra ulike importerte moduler som du bruker i et prosjekt. Den opprettes når modulen er inkludert i prosjektet, og den varer til skriptet slutter.
  • Innebygd Navneområde: dette navneområdet inneholder innebygde funksjoner og innebygde unntaksnavn.

I Matematiske Moduler I Python-serien på Envato Tuts+ skrev jeg om nyttige matematiske funksjoner tilgjengelig i forskjellige moduler. For eksempel har matte-og cmath-modulene mange funksjoner som er felles for dem begge, som log10()acos()cos()exp() etc. Hvis du bruker begge disse modulene i samme program, er den eneste måten å bruke disse funksjonene utvetydig å prefiks dem med modulnavnet ,som math.log10() og cmath.log10().

Hva Er Omfang?

Navnerom hjelper oss med å identifisere alle navnene i et program. Dette betyr imidlertid ikke at vi kan bruke et variabelnavn hvor som helst vi vil. Et navn har også et omfang som definerer delene av programmet der du kan bruke det navnet uten å bruke prefiks. Akkurat som navnerom, er det også flere områder i et program. Her er en liste over noen omfang som kan eksistere under utførelsen av et program.

  • et lokalt område, som er det innerste området som inneholder en liste over lokale navn som er tilgjengelige i gjeldende funksjon.
  • et omfang av alle omsluttende funksjoner. Søket etter et navn starter fra nærmeste omsluttende omfang og beveger seg utover.
  • et modulnivå omfang som inneholder alle de globale navnene fra gjeldende modul.
  • det ytterste omfanget som inneholder en liste over alle de innebygde navnene. Dette området søkes sist for å finne navnet du refererte til.

i de kommende delene av denne opplæringen vil vi i stor grad bruke Den innebygde Python dir ()-funksjonen til å returnere en liste over navn i gjeldende lokale omfang. Dette vil hjelpe deg å forstå begrepet navnerom og omfang mer tydelig.

Scope Resolution

som jeg nevnte i forrige avsnitt, starter søket etter et gitt navn fra den innerste funksjonen og beveger seg deretter høyere og høyere til programmet kan kartlegge det navnet til et objekt. Når det ikke finnes noe slikt navn i noen av navneområdene, øker programmet Et NameError-unntak.

før vi begynner, prøv å skrive dir() I TOMGANG eller annen Python IDE.

dir()# 

La oss se utgangen avdir() funksjonen etter å ha definert en variabel og en funksjon.

a_num = 10dir()# def some_func(): b_num = 11 print(dir()) some_func()# dir()# 

dir() – funksjonen sender bare ut listen over navn innenfor gjeldende omfang. Det er derfor innenfor rammen av some_func(), det er bare ett navn kalt b_num. Kallerdir() etter å ha definertsome_func() legger den til i listen over navn som er tilgjengelige i det globale navneområdet.

Nå, la oss se listen over navn i noen nestede funksjoner. Koden i denne blokken fortsetter fra forrige blokk.

koden ovenfor definerer to variabler og en funksjon innenfor rammen av outer_func(). Inneinner_func() skriverdir() – funksjonen bare navnet d_num. Dette virker rettferdig som d_num er den eneste variabelen definert der.

med mindre det er uttrykkelig angitt ved hjelp avglobal, opprettes en ny lokal variabel med samme navn på nytt i et lokalt navneområde. Dette fremgår av følgende kode.

Inne i både outer_func() og inner_func()a_num har blitt erklært å være en global variabel. Vi setter bare en annen verdi for den samme globale variabelen. Dette er grunnen til at verdien av a_num på alle steder er 20. På den annen side oppretter hver funksjon sin egenb_num variabel med lokalt omfang, ogprint() – funksjonen skriver ut verdien av denne lokalt omfangsrike variabelen.

Riktig Import Av Moduler

det er veldig vanlig å importere eksterne moduler i prosjektene dine for å øke utviklingen. Det er tre forskjellige måter å importere moduler på. I denne delen vil du lære om alle disse metodene, diskutere fordeler og ulemper i detalj.

  • from module import *: Denne metoden for å importere en modul importerer alle navnene fra den gitte modulen direkte i ditt nåværende navneområde. Du kan bli fristet til å bruke denne metoden fordi den lar deg bruke en funksjon direkte uten å legge til navnet på modulen som prefiks. Det er imidlertid svært feilutsatt, og du mister også muligheten til å fortelle hvilken modul som faktisk importerte den funksjonen. Her er et eksempel på bruk av denne metoden:

hvis du er kjent med matte-og cmath-modulene, vet du allerede at det er noen vanlige navn som er definert i begge disse modulene, men gjelder henholdsvis ekte og komplekse tall. Siden vi har importert cmath-modulen etter mattemodulen, overskriver den funksjonsdefinisjonene av disse vanlige funksjonene fra mattemodulen. Dette er grunnen til at den førstelog10(125) returnerer et reelt tall og den andrelog10(125) returnerer et komplekst tall. Det er ingen måte for deg å brukelog10() – funksjonen fra mattemodulen nå. Selv om du prøvde å skrive math.log10(125), vil du få Et NameError unntak fordi math faktisk ikke finnes i navneområdet.

bunnlinjen er at du ikke bør bruke denne måten å importere funksjoner fra forskjellige moduler bare for å lagre noen tastetrykk.

  • from module import nameA, nameB: hvis du vet at du bare skal bruke ett eller to navn fra en modul, kan du importere dem ved a bruke denne metoden. På denne måten kan du skrive koden mer konsistent mens du fortsatt holder navneområdeforurensningen til et minimum. Vær imidlertid oppmerksom på at du fortsatt ikke kan bruke noe annet navn fra modulen ved å bruke module.nameZ. Enhver funksjon som har samme navn i programmet vil også overskrive definisjonen av den funksjonen importert fra modulen. Dette vil gjøre den importerte funksjonen ubrukelig. Her er et eksempel på å bruke denne metoden:
dir()# from math import log2, log10dir()# log10(125)# 2.0969100130080562
  • import module: Dette er den sikreste og anbefalte måten å importere en modul på. Den eneste ulempen er at du må prefiks navnet på modulen til alle navnene du skal bruke i programmet. Du vil imidlertid kunne unngå forurensning av navneområdet og også definere funksjoner hvis navn samsvarer med navnet på funksjoner fra modulen.
dir()# import mathdir()# math.log10(125)# 2.0969100130080562

Final Thoughts

jeg håper denne opplæringen hjalp deg med å forstå navnerom og deres betydning. Du skal nå kunne bestemme omfanget av forskjellige navn i et program og unngå potensielle fallgruver. I Tillegg, ikke nøl med å se hva vi har tilgjengelig for salg og for studier i markedet,og ikke nøl med å stille spørsmål og gi verdifull tilbakemelding ved hjelp av feed nedenfor.

den siste delen av artikkelen diskuterte ulike måter å importere moduler I Python og fordeler og ulemper ved hver av dem. Hvis du har spørsmål knyttet til dette emnet, vennligst gi meg beskjed i kommentarene.

Lær Python

Lær Python med vår komplette python tutorial guide, enten du nettopp har begynt eller du er en erfaren koder som ønsker å lære nye ferdigheter.