Thanks for the explanations. I now know how to use the tab completion in SAGE and it's useful. Best, Valerio
On Wednesday, February 8, 2017 at 4:21:31 PM UTC-6, Simon King wrote: > > Hi! > > On 2017-02-08, [email protected] <javascript:> <[email protected] > <javascript:>> wrote: > > Is there a difference between > > return expand(f^2) > > and > > return (g^2).expand() > > or are they perfect synonyms? > > SageMath's language is Python, in particular it is object oriented. > Personally, I'd always prefer calling a method of an object (that's to > say (g^2).expand()) over calling a function that is defined in the > global namespace (that's to say expand(g^2)). > > Reasons: > - If you have a function F in the global namespace and some object x, > how would you know that applying F to x makes any sense? If, on the > other hand, you have a method x.f of x, then you know that it makes > sense. > - Do you know how to get information in Python (and thus in SageMath) > by "tab completion"? If you have an object x and start to type > x. > and then hit the <tab> key, you will see a list of all methods > available for x. (And if you start typing x.e and then hit the <tab> > key, the list will only comprise methods whose name starts with e). > This list will be a lot more concise then the list of all functions in > the global namespace. > - A function such as "expand" will normally just call a method anyway. > Do you know how to access the source code in Python? Just put a > question mark after an object x and hit return (resp. shift-return in > the SageMath notebook) -- you will see the documentation of x. Or put > two question marks after x, and you will see the source code. > > Do this with the "expand" function. The result is (basically) this: > > sage: expand?? > Signature: expand(x, *args, **kwds) > Source: > def expand(x, *args, **kwds): > """ > EXAMPLES:: > ... > """ > try: > return x.expand(*args, **kwds) > except AttributeError: > return x > > So, you can see from the code that they basically are synonymous, except > that that "expand" function just returns x if x happens to not have an > "expand" method. > > > The same question for > > lambda f: (f^2).expand() > > (in Simon's answer): is the lambda construction just a shortcut, > equivalent > > to > > return (g^2).expand() > > or is it something different? > > That's again a question on Python. Both ways give you an object of the > same type: > > sage: def f_1(x): > ....: return 2*x > ....: > sage: f_2 = lambda x: 2*x > sage: type(f_1) > <type 'function'> > sage: type(f_1) is type(f_2) > True > > I guess from a theoretical point of view ("lambda calculus"), it is > possible to do everything using the "lambda" construction. However, as > soon as it gets a little more complicated, "def" constructions are > easier to read. > > Best regards > Simon > > -- You received this message because you are subscribed to the Google Groups "sage-support" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/sage-support. For more options, visit https://groups.google.com/d/optout.
