programacion - que es python y para que sirve
Denomine este constructo de lenguaje python/ruby (usando valores de matriz para satisfacer los parámetros de la función) (7)
¿Cómo se llama este constructo de lenguaje?
En Python puedo decir:
def a(b,c): return b+c
a(*[4,5])
y obtener 9. Asimismo en Ruby:
def a(b,c) b+c end
a(*[4,5])
¿Cómo se llama esto, cuando se pasa una única matriz a una función que de otra manera requiere múltiples argumentos?
¿Cuál es el nombre del operador *
?
¿Qué otros idiomas admiten esta genial función?
Haskell también lo tiene (para parejas), con la función de uncurry
:
ghci> let f x y = 2*x + y
f :: (Num a) => a -> a -> a
ghci> f 1 2
4
ghci> f 10 3
23
ghci> uncurry f (1,2)
4
ghci> uncurry f (10,3)
23
También puede convertirlo en un operador, por lo que es más similar a un splat:
ghci> f `uncurry` (1,2)
4
ghci> let (***) = uncurry
(***) :: (a -> b -> c) -> (a, b) -> c
ghci> f *** (10,3)
23
Y aunque sería fácil definir funciones similares para los casos de 3-tupla, 4-tupla, etc., no hay ninguna función general para n
tuples (como splat funciona en otros idiomas) debido a la tipificación estricta de Haskell.
La mayoría de las preguntas ya han sido respondidas, pero en cuanto a la pregunta "¿Cuál es el nombre del operador *?": El término técnico es "asterisco" (proviene de la palabra latina asteriscum , que significa "pequeña estrella", que, a su vez, proviene del griego ἀστερίσκος ). A menudo, sin embargo, se lo llamará "estrella" o, como se dijo anteriormente, "splat".
Lo he estado llamando "expansión de listas", pero no creo que esa sea la terminología estándar (no creo que haya ninguna ...). Lisp en todas las versiones (Scheme incluido), y Haskell y otros lenguajes funcionales, pueden hacerlo con la suficiente facilidad, pero no creo que sea fácil de hacer en lenguajes "mainstream" (tal vez puedas llevarlo a cabo como un truco de "reflexión" ¡en algunos!-).
Los documentos de Python llaman a esto Listas de argumentos de desempaquetado . Es una característica bastante práctica. En Python, también puede usar un asterisco doble (**) para descomprimir un diccionario (hash) en argumentos de palabra clave. También funcionan al revés. Puedo definir una función como esta:
def sum(*args):
result = 0
for a in args:
result += a
return result
sum(1,2)
sum(9,5,7,8)
sum(1.7,2.3,8.9,3.4)
Para empacar todos los argumentos en una lista de tamaño arbitrario.
En ruby, a menudo se llama "splat".
También en ruby, puedes usarlo para indicar ''todos los otros elementos en la lista''.
a, *rest = [1,2,3,4,5,6]
a # => 1
rest # => [2, 3, 4, 5, 6]
También puede aparecer en cualquier lado del operador de asignación:
a = d, *e
En este uso, es un poco como el cdr del esquema, aunque no necesita ser todo menos el encabezado de la lista.
La terminología típica para esto se llama "aplicar una función a una lista", o "aplicar" para abreviar.
Ver http://en.wikipedia.org/wiki/Apply
Ha estado en LISP desde su origen en 1960. Glad python lo redescubrió: -}
Aplicar normalmente está en una lista o una representación de una lista, como una matriz. Sin embargo, uno puede aplicar funciones a argumentos que provienen de otros espacios, como estructuras. Nuestro lenguaje PARLANSE tiene tipos fijos (int, float, string, ...) y estructuras. Por extraño que parezca, una lista de argumentos de funciones se parece mucho a una definición de estructura, y en PARLANSE, es una definición de estructura, y puedes "aplicar" una función PARLANSE a una estructura compatible. También puede "crear" instancias de estructura, así:
(define S (structure [t integer] [f float] [b (array boolean 1 3)] )structure )define s (= A (array boolean 1 3 ~f ~F ~f)) (= s (make S -3 19.2 (make (array boolean 1 3) ~f ~t ~f)) (define foo (function string S) ...) (foo +17 3e-2 A) ; standard function call (foo s) ; here''s the "apply"
PARLANSE parece lisp pero no lo es.
Ruby lo llama splat , aunque David Black también ha encontrado el operador unar {, ra} y ordenado (es decir, el operador unarray unario )