Composition of functions

M

Mladen Gogala

If I write things with the intermediate variables like below, everything
works:
['q', 'u', 'i', 'c', 'k', ' ', 'b', 'r', 'o', 'w', 'n', ' ', 'f', 'o',
'x', ' ', 'j', 'u', 'm', 'p', 's', ' ', 'o', 'v', 'e', 'r', ' ', 'a', '
', 'l', 'a', 'z', 'y', ' ', 'd', 'o', 'g']['g', 'o', 'd', ' ', 'y', 'z', 'a', 'l', ' ', 'a', ' ', 'r', 'e', 'v',
'o', ' ', 's', 'p', 'm', 'u', 'j', ' ', 'x', 'o', 'f', ' ', 'n', 'w',
'o', 'r', 'b', ' ', 'k', 'c', 'i', 'u', 'q']'god yzal a revo spmuj xof nworb kciuq'

That is all well and kosher. Now, if I try to shorten things up, I will
get a type error:
Traceback (most recent call last):

Why is TypeError being thrown? The reason for throwing the type error is
the fact that the internal expression evaluates to None and cannot,
therefore, be joined:
None

And that is strange. From the example above, I saw that if I assigned the
intermediate array to hold list(x), did the reverse on that variable and
then did "join", everything works as advertised. Version of Python is
2.6.5 on Ubuntu 10. Why is the intermediate variable necessary?
I am a complete newbie and am trying the usual stuff, reversing strings,
displaying them in hex, writing things to file "test1.txt" and alike.
 
S

Stephen Hansen

Traceback (most recent call last):


Why is TypeError being thrown? The reason for throwing the type error is
the fact that the internal expression evaluates to None and cannot,
therefore, be joined:

The "reverse" method, like "sort" and a couple others, are in-place
operations. Meaning, they do not return a new list but modify the
existing list. All methods that are "in-place" modifications return None
to indicate this. This way you can't make a mistake and think its
returning a sorted / reversed copy but it isn't.

However, you can easily get what you want by using the 'reversed'
function (and similarly, the 'sorted' function), a la:

The 'reversed' and 'sorted' functions are generators that lazilly
convert an iterable as needed.

--

... Stephen Hansen
... Also: Ixokai
... Mail: me+list/python (AT) ixokai (DOT) io
... Blog: http://meh.ixokai.io/
 
C

Chris Rebert

Hello,
y=list(x).reverse()
print y None
L = ["a", "b", "c"]
L.reverse()
L
["c", "b", "a"]

As you can see, L.reverse() performs the operation on itself and returns
nothing. Hence, the return type None.

Instead of

y=''.join(list(x).reverse())

you should probably do,

Er, I don't think you thought that one entirely through (/ tried it out):

chris@morpheus ~ $ python
Python 2.6.5 (r265:79063, May 25 2010, 18:21:57)
[GCC 4.2.1 (Apple Inc. build 5659)] on darwin
Type "help", "copyright", "credits" or "license" for more information.Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError

Cheers,
Chris
 
M

Mladen Gogala

The "reverse" method, like "sort" and a couple others, are in-place
operations. Meaning, they do not return a new list but modify the
existing list. All methods that are "in-place" modifications return None
to indicate this. This way you can't make a mistake and think its
returning a sorted / reversed copy but it isn't.
Thanks.


However, you can easily get what you want by using the 'reversed'
function (and similarly, the 'sorted' function), a la:


The 'reversed' and 'sorted' functions are generators that lazilly
convert an iterable as needed.

Ah, that is even better. Thanks.
 
T

Terry Reedy

Ah, that is even better. Thanks.

It is better if you do not mind making an unnecessary copy. If the list
had 10 million elements, you might prefer your original. And by the way,
sequential statements are a form of composition, even if strict
functionalists do not like to see it that way.
 
S

Stephen Hansen

It is better if you do not mind making an unnecessary copy. If the list
had 10 million elements, you might prefer your original.

The original that did not work? :)

--

... Stephen Hansen
... Also: Ixokai
... Mail: me+list/python (AT) ixokai (DOT) io
... Blog: http://meh.ixokai.io/
 
W

Wolfram Hinderer

The 'reversed' and 'sorted' functions are generators that lazilly
convert an iterable as needed.

'sorted' returns a new list (and is not lazy).
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top