Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
¿ Es Posible Pasar Una Función Como Parámetro ?
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje ¿ Es Posible Pasar Una Función Como Parámetro ? 
 
Buenas!.

Se que os sonara raro. Pero es que en Python es posible y no tengo ni idea si con algo sofisticado, un puntero por ejemplo
se pueda hacer en gambas. No me gustan los punteros, mata mis serpientes.  

Os voy a mostrar un código de Python para que veáis la idea. Fijaros.

def tiempo_funciones_desordenar(func_desord, lst):
    t1 = time.perf_counter()
    func_desord(lst)
    t2 = time.perf_counter()
    return (t2 - t1 ) * 1000000  
 


Se trata de calcular el tiempo que usa varias funciones. En este caso el tiempo devuelto es en micro segundos.
Como veis, se le pasa la función como argumento y dentro de la función  tiempo_funciones_desordena, se la llama,
pasándole lst como argumento.

Inocentemente use objeto y variant, pero gambas me dice que no. Que eso no es un tipo de datos.  Jeje.  

¿ Es posible eso en otro lenguajes ?. Por ejemplo en ¿ C ?.

La idea principal de pasarle la función como es habitual en usar una función es evitar la repetición del código.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: ¿ Es Posible Pasar Una Función Como Parámetro ? 
 
Shell escribió: [Ver mensaje]
No me gustan los punteros, mata mis serpientes.  

      


Punctatrum contra serpentes !
 



 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: ¿ Es Posible Pasar Una Función Como Parámetro ? 
 
Shell escribió: [Ver mensaje]
func_desord(lst)


No comprendo (hace falta ver el tu código) porque no puedes hacer:    
Private Function tiempo_funciones_desordenar(lst as .....) As Integer
    ......
    func_desord(lst)
    .........
    return (t2 - t1 ) * 1000000  

End


Private Procedure func_desord(lst as .....)
  .......
  .......
End

 



 
última edición por vuott el Domingo, 27 Marzo 2016, 02:29; editado 3 veces 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: ¿ Es Posible Pasar Una Función Como Parámetro ? 
 
Vuott:

Citar:

Punctatrum contra serpentes !


En realidad Python usa punteros a su manera. Pero son punteros de serpientes...

Citar:

No comprendo (hace falta ver el tu código) porque no puedes hacer:


Tengo tres formas de hacer lo mismo. Bueno, dos. En una uso un bucle While y en la otra un bucle For.
Quiero comparar el tiempo que emplea cada bucle y ver cual es el más adecuado....(For naturalmente).  

Public Sub Main()

  Dim lista As String[]  
  Dim i As Integer
  Dim cuentanombres As Integer
  
  lista = ["Juan", "Mateo", "Santiago", "Marcos"]
  
  Randomize
  
  ' Mostrar(lista)
  ' Print  
  ' Mostrar(Shuffle1(ByRef lista))
  ' Print
  ' Mostrar(Shuffle2(ByRef lista))      

  tiempo(Shuffle1, lista)
    
End

Public Sub Mostrar(l As Variant[])
  
  Dim elemento As Variant
  
  For Each elemento In l
    Print elemento
  Next
  
End

Public Function Shuffle1(ByRef l As Variant[]) As Variant[]
  Dim cuenta, j As Integer
  Dim listanueva As New Variant[]
  
  While cuenta < l.Count
    j = Rnd(0, l.Count)
    If listanueva.Find(l[j]) = -1 Then
      listanueva.Add(l[j])
      cuenta += 1
    Endif
  Wend
  Return listanueva
  
End

Public Function Shuffle2(ByRef l As Variant[]) As Variant[]
    
  Dim i As Integer
  Dim t As Variant
  Dim j As Integer
  
  For i = l.Max To 0 Step -1
    j = Int(Rnd(l.Count))
    t = l[i]
    l[i] = l[j]
    l[j] = t
  Next
  Return l
      
End

' Public Sub tiempo(funcion As Pointer, lista As Variant[])
'  
'   Mostrar(funcion(lista))
'  
' End
 


Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: ¿ Es Posible Pasar Una Función Como Parámetro ? 
 
En el Main, sobran variables.
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: ¿ Es Posible Pasar Una Función Como Parámetro ? 
 
Y aquí el código en Python...

#!/usr/bin/python3
import random
import time

def shuffle1(l):
    cuenta = 0
    listanueva = []
    while cuenta < len(l):
        j = random.randint(0,len(l) - 1)
        if l[j] not in listanueva:
            listanueva.append(l[j])
            cuenta += 1
    return listanueva      

def shuffle2(l):
    listanueva = l.copy()  
    for i in range(len(l)):
        j = random.randint(0,len(l) - 1)        
        listanueva[i], listanueva[j] = listanueva[j], listanueva[i]
##        # Codigo tradicional sustituido
##        t = listanueva[i]
##        listanueva[i] = listanueva[j]
##        listanueva[j] = t      
    return listanueva

def shuffleoriginal(l):
    return random.shuffle(l)
    
def tiempo_funciones_desordenar(func_desord, lst):
    t1 = time.perf_counter()
    func_desord(lst)
    t2 = time.perf_counter()
    return (t2 - t1 ) * 1000000  
  

def main():    
    
    lista = ['Juan','Mateo','Santiago','Marcos']

    # print (lista)
    # print (shuffle2(lista))
    
    tiempo_bucle_while = tiempo_funciones_desordenar(shuffle1, lista)
    tiempo_bucle_for = tiempo_funciones_desordenar(shuffle2, lista)
    tiempo_original = tiempo_funciones_desordenar(shuffleoriginal, lista)
        
    print ('El código con bucle while ha tomado {:.2f}uS'.format(tiempo_bucle_while))
    print ('El código con bucle for ha tomado {:.2f}uS'.format(tiempo_bucle_for))
    print ('El código con shuffle ha tomado {:.2f}uS'.format(tiempo_original))
    
if __name__=='__main__': main()
 


Jijiji...

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: ¿ Es Posible Pasar Una Función Como Parámetro ? 
 
En gambas  es posible pasar un Puntero a Función solo con las funciones externas.
 



 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: ¿ Es Posible Pasar Una Función Como Parámetro ? 
 
Vuott:

Bueno, lo de usar puntero como puse en el código fue en plan de "película de ciencia ficción".  

Ah, encontré este post, en el que por lo visto un programador de C/C++ pregunta sobre la ausencia de punteros en Python.
Es interesante la respuesta que dan.

http://es.stackoverflow.com/questio...teros-en-python

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Domingo, 27 Marzo 2016, 10:04; editado 2 veces 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: ¿ Es Posible Pasar Una Función Como Parámetro ? 
 
Fijaros en este código, sobre el tema de referencias.

Clase Persona:

Private hnombre As String
Property nombre As String

Private hdinero As Float
Property dinero As Float

Private Function nombre_Read() As String

Return hnombre  

End

Private Sub nombre_Write(Value As String)

  hnombre = Value

End

Private Function dinero_Read() As Float

  Return hdinero

End

Private Sub dinero_Write(Value As Float)

  hdinero = Value

End
 


Código principal:

Public Sub Main()

  Dim bob As New Persona
  Dim nancy As Persona  
  
  bob.nombre = "Bob"
  bob.dinero = 100
  
  nancy = bob
  nancy.nombre = "Nancy"
  
  Print bob.nombre, "tiene", bob.dinero, "euros."
  Print nancy.nombre, "tiene", nancy.dinero, "euros."
  
End
 


Salida:

Citar:

Nancy    tiene    100    euros.
Nancy    tiene    100    euros.


La explicación es fácil.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: ¿ Es Posible Pasar Una Función Como Parámetro ? 
 
Shell escribió: [Ver mensaje]
Ah, encontré este post, en el que por lo visto un programador de C/C++....

Solo por curiosidad, te traduzco el primero ejemplo en C que está en la pagina.
#include <stdio>

int main(void) {
    // your code goes here
    int a = 5;
    int *b = &a;
    printf("a = %d; b = %d\n", a, *b); // (1)

    a = 6;
    printf("a = %d; b = %d\n", a, *b); // (2)
    return 0;
}


Traducción a Gambas:
Public Sub Main()

  Dim a As Integer = 5
  Dim b As Pointer = VarPtr(a)    ' Creamos un Puntero a la variable "a"

' Dereferenciamos el Puntero, para ver el valor contenido de la variable apuntada del Puntero:
   Print "a = "; a, "b = "; Int@(b)


   a = 6
   Print "a = "; a, "b = "; Int@(b)

End

 



 
última edición por vuott el Domingo, 27 Marzo 2016, 20:16; editado 1 vez 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes ¿ Podemos En Basic Pasar Una Función Com... Shell General 10 Martes, 14 Julio 2015, 13:45 Ver último mensaje
Shell
No hay nuevos mensajes Como Pasar De Una Fila A Otra En Un Gridview? jousseph Controles/Librerías/Componentes 4 Domingo, 28 Agosto 2016, 07:00 Ver último mensaje
jousseph
No hay nuevos mensajes ¿ Es Posible Un DrawingArea Como Mascara ? Shell General 8 Sabado, 19 Noviembre 2016, 16:56 Ver último mensaje
vuott
No hay nuevos mensajes Pasar Un Parámetro Concreto De Varios A U... Shell General 6 Martes, 03 Enero 2017, 22:34 Ver último mensaje
Shell
 

Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron