[Risolto][Python3] importazione moduli dubbio

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

[Risolto][Python3] importazione moduli dubbio

Messaggio da gila75 »

Buon giorno a tutti...ciclicamente "attacco" Python che per me nella sua semplicità è una tragedia...comunque.
Stavo studiando più o meno i moduli e gli import vari.
Penso sia una buona tecnica di programmazione "spacchettare" le varie funzioni in più moduli piuttosto che un mega listato unico.
Questi 2 moduli calcolano l'm.c.m di una lista partendo dal M.C.D fornito da math.gcd e usando reduce.
Innanzi tutto vorrei capire se è corretto fare come ho fatto. Poi una cosa che non ho capito:

programma che chiama:

Codice: Seleziona tutto

import mcm 
#import math 
#import functools as ft
	
l=[40,15,27]
y=mcm.f(l)
print (y)
print (sqrt(10)) #errore
funzione:

Codice: Seleziona tutto

import math 
import functools as ft
def f(l):
	def my_f(a,b):
		res=math.gcd(a,b)
		return (a//res)*b
	x=ft.reduce(my_f,l)
	return x
Come vedete nel primo programma se io tento di stampare:
print (sqrt(10)) #errore
Mi da errore. Non capisco, con import mcm non importo tutto ? Anche le librerie che usa il modulo?
Non capisco perchè l'importazione è un'operazione gravosa, infatti per re-importare ti forza a usare reload.
Quindi se non viene importata math, io nel programma principale la devo reimportare.
Ora supponiamo queste operazioni con molti moduli, non è uno sforzo gravoso?
Grazie in anticipo a tutti :)
Ultima modifica di gila75 il martedì 5 aprile 2022, 10:50, modificato 1 volta in totale.
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2854
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 22.04 LTS Jammy Jellyfish
Sesso: Maschile
Località: Roma, Italia

Re: [Python3] importazione moduli dubbio

Messaggio da DoctorStrange »

sqrt è una funzione di math, non di mcm. Tu, la funzione math la importi limitatamente all tua funzione e quindi ha visibilità limitata alla sola funzione. Se vuoi servirti di una funzione che è parte di math, nel dominio superiore alla tua funzione, allora, anche math dovrà essere importata e visibile dal ciclo superiore.

Nel tuo caso, visto che fai uso di funzioni di math sia nel dominio di visibilità superiore, che all'interno della tua funzione, se la tua funzione è dichiarata all'interno del "main", ti conviene semplicemente importarla un'unica volta nel main. In questo modo rimarrà visibile anche nella tua funzione.
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Python3] importazione moduli dubbio

Messaggio da gila75 »

Grazie, provo a vedere. é un argomento prematuro per me, ma ero curioso.
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1624
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Python3] importazione moduli dubbio

Messaggio da nuzzopippo »

Ciao @Gila, ben tornato nelle "Tragedie" di python, :D
gila75 ha scritto:
venerdì 1 aprile 2022, 9:44
Mi da errore. Non capisco, con import mcm non importo tutto ? Anche le librerie che usa il modulo?
No.

Come ben dice @DoctorStrange è una questione di visibilità dei nomi (Namespace), ogni modulo ha il suo namespace, cosi come ogni funzione ha il suo namespece, esempio:

Codice: Seleziona tutto

>>> def foo():
	x = 5
	while x:
		print(x)
		x -=1
	print(x)

	
>>> x = 10
>>> foo()
5
4
3
2
1
0
>>> print(x)
10
>>> 
Come vedi dal codice sopra, ho definito una funzione che istanzia una variabile "x" e la azzera in un ciclo, poi nel namespace che "contiene" la funzione ho dichiarato una variabile di nome "x" e quindi ho eseguito la funzione, la variabile "x" dichiarata nel namespace globale è rimasta invariata mentre la "x" della funzione è stata evidentemente azzerata, ciò avviene perché le due "x" sono oggetti diversi, appartenendo a namespace diversi, oltre tutto, il namespace interno alla funzione, viene "perso" all'uscita della funzione e non può essere consutato all'esterno della funzione stessa.
È una condizione piuttosto "articolata", non complessa ma da tener presente, dato che può dare "sorprese", p.e. una variabile definita all'interno del namespace di una funzione non è visibile dall'esterno, una variabile definita nel namespace che "continene" la funzione è visibile dalla funzione, che può utilizzarne il valore

Codice: Seleziona tutto

>>> def spam():
	print(x * 5)

	
>>> x = 3
>>> spam()
15
>>> 
ma se appena va ad assegnarle un valore entra immediatamente in gioco il namespace locale, che ovviamente restituisce errore

Codice: Seleziona tutto

>>> x = 3
>>> spam()
15
>>> def baz():
	x += 1

	
>>> baz()
Traceback (most recent call last):
  File "/usr/lib/python3.8/idlelib/run.py", line 559, in runcode
    exec(code, self.locals)
  File "<pyshell#46>", line 1, in <module>
  File "<pyshell#45>", line 2, in baz
UnboundLocalError: local variable 'x' referenced before assignment
>>> 
per altro, esistono diversi tipi di namespaces ed è anche possibile interagire tra funzioni e variabili dello spazio globale (dichiarazione con "global") ed anche se ogni modulo ha un suo spazio globale, è possibile leggersi le variabili globali dichiarate ... se Ti è utile, qui una buona spiegazione

[Edit] mi si è persa una parte del post in cui rispondevo circa l'importazione dei moduli, che avviene comunque una volta sola, la prima volta che un modulo viene importato e poi precisavo che, comunque, è possibile importare una sola funzione o classe, invece di un intero modulo, ed ho esemplificato per il codice di calcolo del minimo comune multiplo per una lista di interi, come sotto.

Codice: Seleziona tutto

>>> from math import gcd
>>> from functools import reduce
>>> def f(l):
	def mcm(a, b):
		return a * b // gcd(a, b)
	x = reduce(mcm, l)
	return x

>>> l = [40, 15, 27]
>>> f(l)
1080
>>>
in analogia, potresti importare il solo "sqrt" da math nel secondo modulo per le altre operazioni.

Spero Ti sia utile :ciao:
Ultima modifica di nuzzopippo il venerdì 1 aprile 2022, 13:43, modificato 1 volta in totale.
Fatti non foste a viver come bruti ...
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Python3] importazione moduli dubbio

Messaggio da gila75 »

Ciao Nuzzo :) . Rileggo bene con cura dopo. Ero curioso anche di sapere se è giusto come ho fatto al di la delle import.

Ma non voglio fare l'errore di tutte le altre volte che mi sono messo a studiare Python, cioè di saltare di palo in frasca.
Sta volta ero curioso, ma ora chiederò solo su cose che sto incontrando sul manuale. :D
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [Python3] importazione moduli dubbio

Messaggio da vaeVictis »

Credo che il dubbio derivi dal fatto che in C/C++ l'inclusione di un modulo/libreria in un modulo A si propaga anche ai moduli B che importano A.
In Python non funziona così.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Python3] importazione moduli dubbio

Messaggio da gila75 »

Ciao vae :) . Non ricordo bene, ma probabilmente in C e' cosí.
Me lo devo scordare il C se no fallisco ancora lo studio di Python, grazie.
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [Python3] importazione moduli dubbio

Messaggio da vaeVictis »

Credo tu possa levare il "probabilmente" :)
È uno dei motivi per cui si usano le headers guards in C/C++.

Ultimo riferimento al C, promesso
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Python3] importazione moduli dubbio

Messaggio da gila75 »

Si vae, era un po' ambiguo il probabilmente. Mi sono espresso male, sembrava una mancanza di fiducia in cio' che hai detto, ma non era quello il senso ;)
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 9 ospiti