Visualizza post

Questa sezione ti permette di visualizzare tutti i post inviati da questo utente. N.B: puoi vedere solo i post relativi alle aree dove hai l'accesso.


Post - nuzzopippo

Pagine: [1] 2 3 ... 26
1
Così, p.e.
>>> def max_tre_decine(value):
if value > 30: return 3
if value % 10:
return value // 10 + 1
else:
return value // 10


>>> z = max_tre_decine(25)
>>> z
3
>>>


Giacché stai inziando per hobby, leggi questo, servirà

2
Ciao @matteo

premetto che non ho nessuna  esperienza di programmazione e sto preparando un esame all'università.
Ahi!

mi stavo esercitando su classi, listelinkate e alberi... riporto uno script che sto facendo per esercitarmi ma non capisco perche mi da errore :AttributeError: 'str' object has no attribute 'val'

Il discorso è semplice, quando Tu istanzi il Tuo oggetto Lista assegni "e" alla proprietà lista.next ed è e una stringa, tipo di oggetto che NON possiede la proprietà "val"

Python 3.8.5 (default, Jul 28 2020, 12:59:40)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
>>> class Lista():
def __init__(self, val=None, next_e=None):
self.val = val
self.next = next_e
def __repr__(self):
return f'valore: {self.val}, prossimo: {self.next}'


>>> l = Lista('w', 'e')
>>> l
valore: w, prossimo: e
>>> type(l)
<class '__main__.Lista'>
>>> type(l.next)
<class 'str'>

P.S. : "next" è una funzione builtin di python, eviterei di usarlo quale nome di variabile

Confesso di NON essere un informatico, sono solo uno scarso autodidatta che sta cercando di apprendere python, ma stando a wikipedia una lista linkata sarebbe :
Citazione
In informatica, una lista concatenata (o linked list) è una struttura dati dinamica, tra quelle fondamentali usate nella programmazione. Consiste di una sequenza di nodi, ognuno contenente campi di dati arbitrari ed uno o due riferimenti ("link") che puntano al nodo successivo e/o precedente
... ora, cosa è l'oggetto "Lista()" da Te definito? ... sbaglierò ma così, ad orecchio, sembrerebbe che con esso Tu voglia definire un "nodo" costituente un elemento di una collezione di nodi; se così fosse la proprietà next dovrebbe puntare ad un oggetto "Lista" non ad una stringa ... abbisognerebbe, quindi, un insieme di oggetti "Lista" da referenziare, proviamo a definirne uno con il Tuo oggetto, magari che punti al Tuo nik-name
>>> nik = 'matteo.bas'
>>> linked_nik = [Lista(c) for c in nik]
>>> for i in range(len(linked_nik) -1):
linked_nik[i].next = linked_nik[i+1]


>>> linked_nik[0]
valore: m, prossimo: valore: a, prossimo: valore: t, prossimo: valore: t, prossimo: valore: e, prossimo: valore: o, prossimo: valore: ., prossimo: valore: b, prossimo: valore: a, prossimo: valore: s, prossimo: None
>>> linked_nik[6]
valore: ., prossimo: valore: b, prossimo: valore: a, prossimo: valore: s, prossimo: None
>>> type(linked_nik[0])
<class '__main__.Lista'>
>>> type(linked_nik[0].next)
<class '__main__.Lista'>
>>>

... sorprendente, vero? Ma un oggetto "Lista" è una linked list? ... qui entra in ballo la mia ignoranza, agli utenti più esperti la parola, come potremmo, comunque utilizzarlo, ad esempio per stampare il nick?, così?
>>> l = linked_nik[0]
>>> while not l.next == None:
print(l.val, end='')
l = l.next
else:
print(l.val)


matteo.bas
>>>


... discorso senz'altro da approfondire, e parecchio pure

3
PyQT / Re:passare un oggetto ad una funzione
« il: Gennaio 12, 2021, 17:09 »
...
No.
Un oggetto DEVE essere l'argomento di una funzione. Non è possibile passare a una funzione qualcosa che NON sia un oggetto. Sarebbe errore di sintassi. ...
In Python tutto è un oggetto.

Verissimo @Ric :)
Ho volutamente evitato di precisarlo allo OP, avrei dovuto digli che anche la stringa è un "oggetto", rischiando così di confondergli le idee (ricordo bene come fischiarono a me le orecchie anche di recente ;) ), a volte son meglio "piccoli passi" penso.
Per tale pensiero, ho solo cercato di far comprendere allo OP che non deve utilizzare una stringa indicante il nome di un oggetto ma l'oggetto stesso, pian piano verrà il resto (se approfondirà, certo).

4
Base / Re:problema con l'uso di una classe
« il: Gennaio 09, 2021, 16:54 »
L'output che ricevi è perfettamente regolare, descrive l'oggetto e da l'indirizzo in memoria dello stesso.

Qualora Tu voglia una rappresentazione di tipo stringa di un oggetto della classe da Te creata devi implementare nella Tua classe i metodi "__repr__" o "__str__", magari non ci sei ancora incappato ma le classi sono argomenti complessi, da affrontarsi con un buon libro.

Per altro, ho qualche perplessità circa l'algoritmo da Te implementato, giusto per farti un esempio di uso delle funzioni ho cercato di re-implementarlo dopo essermi rispolverato il vecchio libro di aritmetica (chi se lo ricorda più come si fa ;) ):
Python 3.8.5 (default, Jul 28 2020, 12:59:40) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
>>> class Fraction:
def __init__(self, numeratore=0, denominatore=1):
if not denominatore:
raise ZeroDivisionError('Il denominatore non può essere nullo')
n = abs(numeratore)
d = abs(denominatore)
if n % d == 0:
self.numeratore = n / d
self.denominatore = 1
elif d % n == 0:
self.numeratore = 1
self.denominatore = d / n
else:
if n < d:
a = n // 2
else:
a = d // 2
while a > 1:
if n % a == 0 and d % a == 0:
n = n / a
d = d / a
a -= 1
self.numeratore = n
self.denominatore = d
if numeratore < 0:
self.numeratore = -self.numeratore
if denominatore < 0:
self.denominatore = -self.denominatore
def __str__(self):
return "numeratore %d denominatore % d" % (self.numeratore, self.denominatore)


>>> x = Fraction(3, 6)
>>> print(x)
numeratore 1 denominatore  2
>>> x = Fraction(53, 7)
>>> print(x)
numeratore 53 denominatore  7
>>> x = Fraction(21, 7)
>>> print(x)
numeratore 3 denominatore  1
>>> x = Fraction(-21, 7)
>>> print(x)
numeratore -3 denominatore  1
>>> x
<__main__.Fraction object at 0x7fc8693cb6d0>
>>> print(x.numeratore)
-3.0
>>> print(x.denominatore)
1
>>>

5
Guarda, non conosco la libreria XML, sin ora non l'ho mai usata, prendimi con le molle, ma ho dato una guardata alla docs, e visto l'esempio per lo XPath, la funzione "sarebbe" corretta SE il nodo cercato esiste ... il problema viene se il nodo cercato NON esiste, esempio, posto un file "nomi.xml" con questo contenuto :
<?xml version="1.0" encoding="UTF-8"?>
<utenti>
    <utente anni="20">
        <nome>Ema</nome>
        <cognome>Princi</cognome>
        <indirizzo>Torino</indirizzo>
    </utente>
    <utente anni="54">
        <nome>Max</nome>
        <cognome>Rossi</cognome>
        <indirizzo>Roma</indirizzo>
    </utente>
</utenti>


Il Tuo codice risponderà bene cercando un nodo esistente, p.e. "cognome", ma darà errore cercando un tag inesistente, p.e. "lavoro", vedi giù
>>> def foo(value_name):
tree = ET.parse('nomi.xml')
root = tree.getroot()
nomv = './/' + value_name
return root.find(nomv).text

>>> print(foo('cognome'))
Princi
>>> foo('lavoro')
Traceback (most recent call last):
  File "<pyshell#64>", line 1, in <module>
    foo('lavoro')
  File "<pyshell#63>", line 5, in foo
    return root.find(nomv).text
AttributeError: 'NoneType' object has no attribute 'text'
>>>

al problema si può ovviare eseguendo una verifica preliminare assegnando il risultato ad una variabile e se questa risulta vera restituire il testo, qualcos'altro altrimenti, ovviamente bisogna prevenire un eventuale errore, p.e. così
>>> def foo(value_name):
tree = ET.parse('nomi.xml')
root = tree.getroot()
nomv = './/' + value_name
try:
cognome = root.find(nomv).text
return cognome
except AttributeError:
pass


>>> print(foo('cognome'))
Princi
>>> print(foo('lavoro'))
None
>>>


... per altro, la Tua routine si ferma sempre e comunque alla prima evenienza trovata, per averle tutte bisognerebbe utilizzare "findall()"
>>> def foo(value_name):
tree = ET.parse('nomi.xml')
root = tree.getroot()
nomv = './/' + value_name
result = []
for e in root.findall(nomv):
result.append(e.text)
return result

>>> foo('cognome')
['Princi', 'Rossi']


per ulteriori domande, la documentazione Ti riponderà meglio di me ;)

6
Base / Re:Problema ciclo while
« il: Dicembre 30, 2020, 08:38 »
Ciao @Andrea

In primo luogo, per i futuri post, evita il cross-posting, genera confusione : saluti nei saluti, problema una sola volta nella sezione giusta.
Per altro, inserisci il codice utilizzando il pulsante "pythoncode" nell'editor del post, sarà più chiaro e leggibile.

Stavo per risponderti direttamente, ma poi ho deciso di farTi un esempio basato sul Tuo codice per fornirTi materiale da vedere/pensare, intanto le domande :

domanda 1 : guardati i "tipi di variabile", anche se python non è un linguaggio fortemente tipizzato una stringa non è mai uguale ad un numero. Oltre questo, quando nel secondo ciclo hai definito "a" come stringa (s/n) essa rimarrà tale con il valore assunto dall'input, il secondo ciclo diventa sempre falso e non sarà più eseguito. Devi modificare le regole di avvio del secondo ciclo while

domanda 2 : il continue non serve a niente, nel caso in specie, per le esigenze in gioco la definizione di avvio del secondo ciclo è meglio avvenga all'esterno del ciclo, ti faccio esempio :
>>> def area_cerchio(r):
area = r**2 * 3.14
return "l'area del cerchio è di: {}".format(area)

>>> def main():
continua_calcolo = True
while continua_calcolo:
try:
r = float(input('Inserisci lunghezza raggio: '))
print(area_cerchio(r))
except ValueError:
print('Immissione errata')
a = ''
while a.lower() not in ['s', 'n']:
a = input('Fare un nuovo calcolo (s/n)? : ')
if a.lower() == 'n':
continua_calcolo = False
elif a.lower() != 's':
print('risposta non corretta!')


>>> main()
Inserisci lunghezza raggio: 1
l'area del cerchio è di: 3.14
Fare un nuovo calcolo (s/n)? : s
Inserisci lunghezza raggio: 2
l'area del cerchio è di: 12.56
Fare un nuovo calcolo (s/n)? : b
risposta non corretta!
Fare un nuovo calcolo (s/n)? : s
Inserisci lunghezza raggio: 3
l'area del cerchio è di: 28.26
Fare un nuovo calcolo (s/n)? : n
>>>

come vedi, per il secondo ciclo, definisco la variabile di controllo, immediatamente prima del suo avvio, in modo tale che NON ricada nella lista dei valori ammessi, condizione per cui il secondo ciclo si avvia o si interrompe.

Comprendi il perché delle piccole differenze, leggi la documentazione e cerca di capire perché ho utilizzato lower(), sarà utile esercizio.

Ciao :)

7
...ho un server pieno di documenti pdf, word ed excel molto importanti. Ho un secondo hard-disk che in automatica fa la copia di backup settimanale. Il server gira su linux che ha un filesystem abbastanza stabile, ma questo non è stato sufficiente ...
 Qualche suggerimento?

Ciao @Pasquale,

Incuriosito ed anche un po' preoccupato dalla Tua problematica, ho cercato di ragionarci un po' su, anche io uso linux ed ho macchine "vecchie" con notevole quantità di documenti e, pur non avendo incontrato files corrotti, ho pensato che se un file è effettivamente corrotto non si riuscirebbe ad "aprirlo", ho quindi creato un venv ed importato le librerie "PyPDF2" per i pdf, "odfpy" per files libre-office calc e writer (il grosso dei miei documenti), "python-docx" per documenti microsoft word "*.docx" (i file prima della versione 2007 sono problematici, li ho ignorati, se hai necessità guarda qua) e, infine, la libreria "openpyxl" per i file excel "*.xlsx" (stesso discorso che per word) ed ho scritto uno script che Ti propongo di seguito :

import os
import sys

# generatori per estrazioni dei files con estensioni "interessanti"
def get_files(path):
    '''Restituisce i files presenti in una directory.'''
    for f in os.listdir(path):
        f_name = os.path.join(path, f)
        if os.path.exists(f_name) and os.path.isfile(f_name):
            yield f_name

def get_dirs(path):
    '''Restituisce le directory presenti in una directory.'''
    for d in os.listdir(path):
        d_name = os.path.join(path, d)
        if os.path.exists(d_name) and os.path.isdir(d_name):
            yield d_name
   
def recursive_get_files(p_dir):
    '''Restituisce i files presenti in una directory e richiama se
       stessa sulle sub-directory contenute.'''
    yield from get_files(p_dir)
    for sub_dir in get_dirs(p_dir):
        yield from recursive_get_files(sub_dir)

def get_files_for_ext(p_dir):
    '''Esamina i file ricevuti e restituisce solo quelli che possiedono
       una delle volute estensioni.'''
    sel_extension = ['pdf', 'docx', 'docm', 'xlsx', 'odt', 'ods']
    for f in recursive_get_files(p_dir):
        ext = f.split('.')[-1]
        if ext.lower() in sel_extension:
            yield f
'''
Funzioni che verificano la funzionalità dei vari tipi di files utilizzando
librerie specifiche per la loro manipolazione : cercano di aprirli ed in
caso, restituiscono True se riescono, False altrimenti.
Queste funzioni importano localmente le librerie necessarie, per evitare di
doverle installare in caso di tipologie non interessanti, basterà modificare
aeguatamente "sel_extension" in get_files_for_ext()
'''

def open_pdf(filename):
    from PyPDF2 import PdfFileReader  # libreria : PyPDF2
    # qualunque errore da risposta negativa
    doc = None
    try:
        doc = PdfFileReader(filename, 'rb')
    except:
        return False
    finally:
        if doc: doc = None
    return True

def open_odt_ods(filename):
    from odf.opendocument import load  # libreria: odfpy
    doc = None
    try:
        doc = load(filename)
    except:
        return False
    finally:
        if doc: doc = None
    return True

def open_docx_docm(filename):
    from docx import Document
    doc = None
    try:
        doc = Document(filename)
    except:
        return False
    finally:
        if doc: doc = None
    return True

def open_xlsx(filename):
    import openpyxl
    doc = None
    try:
        doc = openpyxl.load_workbook(filename)
    except:
        return False
    finally:
        if doc: doc = None
    return True
       
       
# Valutatore di integrità; è un generatore
def valutator(p_dir):
    type_operator = {'pdf' : open_pdf,
                     'docx': open_docx_docm,
                     'docm': open_docx_docm,
                     'xlsx': open_xlsx,
                     'odt' : open_odt_ods,
                     'ods' : open_odt_ods
                     }
    # word<2003 : difficile vedi
    # http://blog.digitally-disturbed.co.uk/2012/04/reading-microsoft-word-doc-files-in.html
    for f in get_files_for_ext(p_dir):
        ext = f.split('.')[-1].lower()
        # do per scontatto che ext sia una chiave di type_operator
        if not type_operator[ext](f):
            yield f

if __name__ == '__main__':
    if len(sys.argv) != 2:
        print('Utilizzo : python[3] search_type_file.py directory')
        exit()
    p_dir = sys.argv[1]
    if not os.path.exists(p_dir) or not os.path.isdir(p_dir):
        print(p_dir, 'inesistente o non è una directory')
        exit()
    print(p_dir)
    counter = 0
    for f in get_files_for_ext(p_dir):
        counter += 1
    print('Trovati %d files, inizio esame ...' % counter)
    damaged_files = []
    for f in valutator(p_dir):
        damaged_files.append(f)
    if damaged_files:
        print('\nTrovati %d files danneggiati - Elenco :' % len(damaged_files))
        for f in damaged_files:
            print(f)

Cui ho fatto valutare la mia direttrice dei documenti di lavoro, nella quale ho documenti presenti anche da una quindicina di anni ... su 13403 file esaminati ha dato 25 segnalazioni delle quali una parte sono effettivamente files danneggiati, altri avranno, forse dei problemi ma sembrano falsi positivi, in particolare ho notato che la grossa parte delle segnalazioni sono pdf da scansione (quindi con sola immagine) molto probabilmente formattati male, ho ricevuto diversi warning sui pdf

p38b_v) NzP:~$ python search_type_files.py ~/Documenti
/home/nuzzopippo/Documenti
Trovati 13403 files, inizio esame ...
PdfReadWarning: Xref table not zero-indexed. ID numbers for objects will be corrected. [pdf.py:1736]
UserWarning: wmf image format is not supported so the image is being dropped [drawings.py:59]
PdfReadWarning: Xref table not zero-indexed. ID numbers for objects will be corrected. [pdf.py:1736]

Trovati 25 files danneggiati - Elenco :
/home/nuzzopippo/Documenti/Ufficio/Amministrativo/Avvocati/2017/Verbali/finali/in_pdf/verbale_04.pdf
/home/nuzzopippo/Documenti/Ufficio/Amministrativo/Forniture/Senza RUP/Acquisto_autovettura_2010/esempi/2005_01_10.pdf
...


Ho aspettato di provarlo in ufficio, dove avevo materiale più adeguato alla problematica, prima di proporti lo script ... anche se non è certo da utilizzare in modalità "automatica", consuma una notevole quantità di memoria e, comunque, alcune delle segnalazioni sono su files ancora legibili.
Spero possa esserTi utile.

Ciao

8
PyQT / Re:passare un oggetto ad una funzione
« il: Dicembre 14, 2020, 20:00 »
Un "oggetto" può essere tranquillamente parametro di una funzione.
Puoi, quindi, passare ad una funzione il Tuo "oggetto" ed all'interno di essa utilizzarne i metodi, od anche, volendo, definire anche caratteristiche "nuove" dell'oggetto stesso, ti faccio un esempio :
>>> class Subject:
def __init__(self): pass
def set_first_name(self, value):
self.first_name = value
def __str__(self):
return self.last_name + self.first_name


>>> def set_first_name(obj, name):
obj.set_first_name(name)


>>> def set_last_name(obj):
obj.last_name = 'nuzzo'


>>> oggetto = Subject()
>>> set_first_name(oggetto, 'pippo')
>>> set_last_name(oggetto)
>>> print(oggetto)
nuzzopippo
>>>


Come vedi nello stralcio di codice sopra, ho definito al volo un oggetto "Subject", una funzione cui passo una istanza dell'oggetto che provvede a richiamarne un metodo per la definizione del first_name ed un'altra funzione cui passo per parametro lo stesso oggetto che definisce una proprietà "nuova" dell'oggetto ed alla fine lo stampo, ed esce il mio nick.
NON copiare 'sti metodi così come sono, Ti darebbero errori probabilmente, sono solo un esempio di mezzi che stanno li a Tua disposizione, approfondisci le nozioni sui parametri delle funzioni e sulle classi e li vedrai.

Ciao :)

9
... cioè il server intermedio mi serve solo per comunicare ai rispettivi clienti quali sono gli IP pubblici reciproci e le sottoreti, ma poi vorrei creare una comunicazione diretta tra i due client, perchè comunque saranno solo due e non di più. E' fattibile? se si, come si fa? all'interno di una rete LAN privata lo so' fare, sul web però non ho idea

Come Ti ho detto in precedenza, non ci ho mai provato, prendimi con molle da 1 Km (e prega con me che qualche utente pratico in materia voglia intervenire sugli svarioni anche concettuali).

Dovessi farlo io, in primo luogo mi doterei di un VPS sul quale poter installare i miei programmi ... so che esistono fornitori di servizi di tal genere ma non ne ho mai cercati e non conosco eventuali prezzi.

Una volta che disponga di detto VPS mi scriverei un programmino con un socket da mettere in ascolto su di una porta, ed accetti richieste di connessione da parte di un gruppo utenti predefinito, comunichi loro indirizzo IP interessante e termini la connessione, ovviamente le comunicazioni sarebbero criptate e su IPV6, i socket python possono da lungo tempo soddisfare tali esigenze (il link è relativo a comunicazione IPV4-IPV6), ovviamente detto programmino dovrebbe poi essere messo in funzione sul VPS al suo avvio (su macchina virtuale linux sarebbe da lanciare con systemd, procedura un attimino complessa, da studiarsela nel caso)

Dici che la Tua applicazione funziona già in lan locale, dovrebbe funzionare senza grosse differenze anche con indirizzo IPV6 che, necessariamente, dovrebbe adottare, sempre di protocollo TCP-IP si tratta ... poi, ovvio, dipende anche un po' dalla Tua applicazione, da come è fatta e da cosa utilizza (librerie, intendo).
Una volta conosciuti gli indirizzi IP pubblici dei due hosts che vuoi connettere, con il client invece di connetterti con indirizzo "192.168.etc" ti connetti all'indirzzo IPV6 del server ricevuto, ovviamente re-indirizzato dal router.

Senza partire "direttamente" per il "server VPS", intanto potresti controllare la possibilità di accesso tramite internet semplicemente leggendo l'indirizzo IP pubblico del server tramite uno dei tanti servizi che To lo dicono, tipo Mio-IP.it o altri (cerca con google) e provare a connetterti da internet, dalla Tuo lan o, meglio ancora, da altra, per vedere se la Tua applicazione funziona già così com'è, ovviamente con adeguatamente impostato il re-indirizzamento sul Tuo router.

10
Ti ringrazio per la risposta. Il problema degli IP dinamici si risolve facilmente: basta acquistare un semplice servizio di hosting e metterci su un programmino java che faccia da server a cui i client si collegano e dichiarano i propri IP. Il problema invece è il trasferimento dei dati. Nel mio caso specifico vorrei fare uno streaming video ed inviare alcune semplici stringhe per controllare dei componenti elettronici. Lo streaming video credo sia la cosa più pesante da inviare, ma come la invio?? tramite http potrei inviare le stringhe di comandi ma per il video non credo sia il massimo perchè non ci sarebbe nessun tipo di compressione e soprattutto ci sarebbe una latenza enorme. Qualche idea?

Le comunicazioni, anche quelle http, sono comunque in forma binaria, se devi crearti un programma intermedio in java per smistare le comunicazioni dipende un po' da cosa Ti mette a disposizione il "servizio di hosting", se Ti è possibile avere un servizio con aperte porte a Tua discrezione per Tuoi programmi, allora credo Tu possa crearti un socket in ascolto su una porta scelta e smistarlo tra i client come un qualsiasi file, te lo "comprimi" alla fonte e lo decomprimi a destinazione raggiunta

 ... mai provata la cosa ma ipotizzando un nodo di comunicazione intermedio, quest'ultimo non potrebbe, magari.  comunicare agli host interessati i vicendevoli indirizzi IP pubblici del momento, e con questa conoscenza non potrebbero essi stabilire una connessione diretta tra loro (sempre con i router di mezzo, ovvio)?

Magari questa è una domanda per più esperti di me.

11
Multimedia / Re:Foto carte da gioco
« il: Dicembre 06, 2020, 11:09 »
Ciao :)

Il bello della programmazione è che le cose si possono affrontare in mille modi diversi, ovviamente su di un codice in corso di definizione non è bene dare "pareri", anche se, a dire il vero, non mi garbano molto due "while True" annidati.

... Per altro, guardando il Tuo codice mi è venuta in mente una possibile variante che magari potrebbe essere usata, rivoluzionerebbe, però, il codice steso, mi riferisco alla definizione del mazzo, ove magari userei una lista di dizionari, una cosa così :

>>> mazzo = []
>>> semi = ['Coppe', 'Denari', 'Mazze', 'Spade']
>>> nomi = ['Asso', 'due', 'tre', 'quattro', 'cinque',
'sei', 'sette', 'Fante', 'Cavallo', 'Re']
>>> for seme in semi:
    for voce in enumerate(nomi, start=1):
        carta = {}
        carta['seme'] = seme
        carta['nome'] = voce[1]
        if voce[0] in [8, 9, 10]:
            carta['val'] = 0.5
        else:
            carta['val'] = float(voce[0])
        mazzo.append(carta)

>>> print(len(mazzo))
40
>>> print(mazzo)
[{'seme': 'Coppe', 'nome': 'Asso', 'val': 1.0}, {'seme': 'Coppe', 'nome': 'due', 'val': 2.0}, {'seme': 'Coppe', ...

l'utilizzo di un dizionario, magari, permetterebbe di risparmiare un po' di cicli, contenendo la carta stessa il suo valore, limitandosi a riassegnare il valore della "matta" a quello scelto dal giocatore, potrebbe, forse, anche facilitare i processi di rappresentazione, una cosa così :
>>> import random
>>> random.shuffle(mazzo)
>>> print(mazzo[0])
{'seme': 'Mazze', 'nome': 'due', 'val': 2.0}
>>> def dai_carta():
global mazzo
return mazzo.pop(0) if len(mazzo) else None

>>> carta = dai_carta()
>>> carta
{'seme': 'Mazze', 'nome': 'due', 'val': 2.0}
>>> carta = dai_carta()
>>> carta
{'seme': 'Coppe', 'nome': 'Re', 'val': 0.5}
>>> len(mazzo)
38
>>> print('%s di %s, valore = %.1f' % (carta['nome'], carta['seme'], carta['val']))
Re di Coppe, valore = 0.5
>>>

Sarebbe, anche, più semplice, con un dizionario, associare alla "carta" i valori per l'eventuale "immagine", siano essi i caratteri indicati da @RicPol od anche dei riferimenti a file.
... è solo un suggerimento di approccio diversificato che mi è venuto li, tieni presente (e scusa se uso il tipo "Napoletane", con cui ho familiarità) consideralo solo come una possibile via da esplorare ;)

12
Multimedia / Re:Leggere Notifiche
« il: Dicembre 01, 2020, 17:34 »
:sarcastic: Sto creando un programma in python, ho bisogno che sia in grado di capire quando arriva una notifica e da dove, qualcuno mi può aiutare? grazie

"una notifica" ... di cosa?

Così, a pelle, sembrerebbe Tu stia parlando di un  observer, ma il contesto di applicazione possibile è enorme, oltre tutto potresti non intendere proprio contesti del genere. Precisa bene il problema.

13
Multimedia / Re:Foto carte da gioco
« il: Dicembre 01, 2020, 17:18 »
Ovviamente ci sono già un sacco di implementazioni pronte, da cui si può prendere spunto guardando il codice sorgente: basta googlare per "python card deck library" e si trova di tutto.

Devo dire che son rimasto sorpreso dalla ricerca, ho trovato diverse librerie python per le generiche carte "da ramino" (non so neanche come si chiamano) ed una per carte "francesi" ... non me lo sarei mai immaginato per una cosa che ritengo essenzialmente banale, alla fine il "necessaire" sono un paio di liste ed un paio di chiamate a random, una cosa così :
class Mazzo:
    semi = ['Denari', 'Coppe', 'Spade', 'Mazze']
    def __init__(self):
        self.mazzo = []
        for s in range(len(self.semi)):
            carte = [x for x in range(1, 11)]
            self.mazzo.append(carte)
   
    def estrai(self):
        ha_carte = False
        while not ha_carte:
            seme = randint(0, 3)
            ha_carte = self.mazzo[seme]
        estrai = randint(0, len(self.mazzo[seme])-1)
        carta = self.mazzo[seme].pop(estrai)
        return seme, self.semi[seme], carta


Ben diversa cosa sarebbe la definizione di una "partita" ... va da se che un po' del codice di quanto trovato debbo andarmelo a vedere, chissà quante altre cose "non immagino".

Grazie per la dritta :)

[Edit] P.S. - si, lo so che in caso di esaurimento del mazzo va in loop infinito, è solo un prototipo base di test, il controllo preventivo di tutti i semi l'ho rimandato ;)

14
Multimedia / Re:Foto carte da gioco
« il: Dicembre 01, 2020, 13:06 »
cioè... sprite raster di carte da gioco... ma sono tornati gli anni '80?
Beh? Magari tornassi indietro di 40 anni!!! ... e poi, vuoi mettere con le "Napoletane"?

Scherzo naturalmente, ;) personalmente, 'na guardata la darò dato che, comunque, mi faccio prima dei prototipi "testuali" dei processi e, perché no, potrei anche includere quelle carte "da ramino" (anche se non mi piacciono), magari potrei approfittarne per vedermi le curses ... Comunque, non è la realizzazione del "gioco" in se che interessa me, più mettermi sulla sua "rappresentazione".

15
Multimedia / Re:Foto carte da gioco
« il: Dicembre 01, 2020, 07:59 »
 :D Riferisci al 7-1/2? ... ma dai! Una googlata e ne trovi milioni, comunque, guarda qui, c'è l'insieme delle carte napoletane, attento ad eventuali diritti di copyright.

Ti dirò, intrigato da Tuo post sul setteemezzo, ho preso un mazzo me le sono scansionate e serializzate tutte quante, quando ho tempo (quindi raramente) mi guardo la "cosa", finalizzo a fare un esercizio d'apprendimento sulle wx realizzando un "tavolo" da gioco grafico.
Al momento, ho abbozzato un prototipo di "mano" per una giocata, trovato un set di regole del gioco su wikipedia e sto esplorando alcuni metodi grafici di wx ... se non hai "fretta" (io sono mooolto flemmatico), se ne può anche parlare e vedere assieme (N.B. : io uso molto le classi)

Ciao

Pagine: [1] 2 3 ... 26