¿ Es Posible Pasar Una Función Como Parámetro ?


Ir a la página 1, 2  Siguiente

Objetivo: ¿ 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

Objetivo: 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 !

Perfil MP  
Objetivo: 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
Perfil MP  
Objetivo: 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

Objetivo: Re: ¿ Es Posible Pasar Una Función Como Parámetro ?
En el Main, sobran variables.

Objetivo: 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

Objetivo: 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.

Perfil MP  
Objetivo: 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

última edición por Shell el Domingo, 27 Marzo 2016, 10:04; editado 2 veces
Objetivo: 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

Objetivo: 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
Perfil MP  
Ir a la página 1, 2  Siguiente

Página 1 de 2


  
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

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.4605s (PHP: -65% SQL: 165%)
Consultas SQL: 48 - Debug off - GZIP Activado