trouble understanding None

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Jakle

    trouble understanding None

    I'm trying to write a program (with my very limited knowledge of python)
    that will convert text I type into those letters drawn with ascii symbols. I
    did 2 letters then went to test it. Here's the code I have so far:

    *************** *************** *************
    def S():
    print " ________ "
    print " /--------\ "
    print "// \\"
    print "|| ^^"
    print "|| "
    print "\\________ "
    print " \--------\ "
    print " \\"
    print " ||"
    print "_ ||"
    print "\\________//"
    print " \--------/ ",

    def T():
    print "______________ "
    print "------ ------"
    print " || "
    print " || "
    print " || "
    print " || "
    print " || "
    print " || "
    print " || "
    print " || "

    print S(), T()
    *************** *************** *************

    WOW, that came out weird, but if you copy/paste it into idle it looks fine.
    That an "S" and a "T". Anyways, The idea is to have a function for each
    letter, then use a for loop and a ton of if statements to traverse and print
    the letters/functions. I understand that I might be doing too much work to
    do this, but I'm trying to practice what I am learning. OK, the test prints
    the letters, but also prints "None" at the end of each function. I don't
    understand it. I'm reading "How To Think Like A Computer Scientist: Learning
    With Python", and it only has one little paragraph about the "None" return
    value, and that's only regarding conditional statements. If someone could
    throw some wisdom my way I'm be very greatful. Thanks ahead of time.


  • Edo

    #2
    Re: trouble understanding None

    You should not print the function result, just invoke them.

    Ed.

    Jakle wrote:
    [color=blue]
    > I'm trying to write a program (with my very limited knowledge of python)
    > that will convert text I type into those letters drawn with ascii symbols. I
    > did 2 letters then went to test it. Here's the code I have so far:
    >
    > *************** *************** *************
    > def S():
    > print " ________ "
    > print " /--------\ "
    > print "// \\"
    > print "|| ^^"
    > print "|| "
    > print "\\________ "
    > print " \--------\ "
    > print " \\"
    > print " ||"
    > print "_ ||"
    > print "\\________//"
    > print " \--------/ ",
    >
    > def T():
    > print "______________ "
    > print "------ ------"
    > print " || "
    > print " || "
    > print " || "
    > print " || "
    > print " || "
    > print " || "
    > print " || "
    > print " || "
    >
    > print S(), T()
    > *************** *************** *************
    >
    > WOW, that came out weird, but if you copy/paste it into idle it looks fine.
    > That an "S" and a "T". Anyways, The idea is to have a function for each
    > letter, then use a for loop and a ton of if statements to traverse and print
    > the letters/functions. I understand that I might be doing too much work to
    > do this, but I'm trying to practice what I am learning. OK, the test prints
    > the letters, but also prints "None" at the end of each function. I don't
    > understand it. I'm reading "How To Think Like A Computer Scientist: Learning
    > With Python", and it only has one little paragraph about the "None" return
    > value, and that's only regarding conditional statements. If someone could
    > throw some wisdom my way I'm be very greatful. Thanks ahead of time.
    >
    >[/color]

    Comment

    • Ben Finney

      #3
      Text looking weird

      On Wed, 12 Nov 2003 02:56:43 GMT, Jakle wrote:[color=blue]
      > WOW, that came out weird, but if you copy/paste it into idle it looks
      > fine.[/color]

      It looks fine in any newsreader and editor that uses a fixed-pitch font.
      This is highly recommended, since you know that the spacing of the text
      you type will be the same for any other fixed-pitch font (as used by
      other people). This can't be said of any proportional font.

      --
      \ "Marriage is a wonderful institution, but who would want to |
      `\ live in an institution." -- Henry L. Mencken |
      _o__) |
      Ben Finney <http://bignose.squidly .org/>

      Comment

      • Ben Finney

        #4
        Re: trouble understanding None

        On Wed, 12 Nov 2003 02:56:43 GMT, Jakle wrote:[color=blue]
        > def S():
        > # [print a bunch of stuff]
        >
        > def T():
        > # [print a bunch of other stuff]
        >
        > print S(), T()
        > *************** *************** *************
        >
        > OK, the test prints the letters, but also prints "None" at the end of
        > each function.[/color]

        That's because you've asked for the following sequence of events:

        - Invoke S()...
        - which prints a bunch of stuff
        - then returns None.
        - Print the return value of S().
        - Invoke T()...
        - which prints a bunch of other stuff
        - then returns None.
        - Print the return value of T().

        If you just want the functions invoked (called) instead of getting their
        return value and printing it, then do that.

        Define the function:
        [color=blue][color=green][color=darkred]
        >>> def S():[/color][/color][/color]
        ... print "Bunch of stuff"
        ...

        Print the return result of S(), which necessitates calling the function
        and doing whatever is inside it:
        [color=blue][color=green][color=darkred]
        >>> print S()[/color][/color][/color]
        Bunch of stuff
        None

        Call the function, thus doing whatever is inside it, then throw away the
        return value:
        [color=blue][color=green][color=darkred]
        >>> S()[/color][/color][/color]
        Bunch of stuff


        Please try to get into the practice of reducing the problem you want to
        describe to a minimal working example. This often has the side effect
        that you understand the problem better, and don't end up needing to
        post it. In the cases where that doesn't happen, at least you've got
        something that doesn't have irrelevant extra code in it.

        --
        \ "If you ever drop your keys into a river of molten lava, let |
        `\ 'em go, because, man, they're gone." -- Jack Handey |
        _o__) |
        Ben Finney <http://bignose.squidly .org/>

        Comment

        • Alex Martelli

          #5
          Re: trouble understanding None

          Ben Finney wrote:
          ...[color=blue]
          > Please try to get into the practice of reducing the problem you want to
          > describe to a minimal working example. This often has the side effect
          > that you understand the problem better, and don't end up needing to
          > post it. In the cases where that doesn't happen, at least you've got
          > something that doesn't have irrelevant extra code in it.[/color]

          Excellent advice! For lots more excellent advice on how to best ask
          questions on Usenet and technical mailing lists, also see




          Alex

          Comment

          • Peter Otten

            #6
            Re: trouble understanding None

            Jakle wrote:
            [color=blue]
            > I'm trying to write a program (with my very limited knowledge of python)
            > that will convert text I type into those letters drawn with ascii symbols.
            > I did 2 letters then went to test it. Here's the code I have so far:
            >[/color]
            [...]
            [color=blue]
            > WOW, that came out weird, but if you copy/paste it into idle it looks
            > fine. That an "S" and a "T". Anyways, The idea is to have a function for
            > each letter, then use a for loop and a ton of if statements to traverse
            > and print the letters/functions. I understand that I might be doing too
            > much work to do this, but I'm trying to practice what I am learning. OK,
            > the test prints the letters, but also prints "None" at the end of each
            > function. I don't understand it. I'm reading "How To Think Like A Computer
            > Scientist: Learning With Python", and it only has one little paragraph
            > about the "None" return value, and that's only regarding conditional
            > statements. If someone could throw some wisdom my way I'm be very
            > greatful. Thanks ahead of time.[/color]

            Never put print statements into functions that shall themselves produce a
            printable result

            Be aware that in order to get a single printable backslash, you have to put
            it twice into a string constant:
            [color=blue][color=green][color=darkred]
            >>> print "\\"[/color][/color][/color]
            \

            For a learning experience it would probably be best to stick with your
            approach and just write

            S(); T(); S()

            instead of

            print S(), T(), S()

            The next step would then be to put the functions into a dictionary and look
            them up:

            d = {"S": S, "T": T}
            for c in "some string":
            d[c]()

            However, you did appeal to the "child in the man", so I put together some
            code that does what you want but didn't dare ask :-)
            I won't go into the details, but the concept is to store an entire line of
            text and translate it into the twelve partial lines of your ascii art
            charset. With

            print >> obj, "some string"

            you can redirect the output to any obj that provides a write(s) method.

            Peter


            import sys
            charset = { "S":
            [
            " ________ ",
            " /--------\ ",
            "// \\\\",
            "|| ^^",
            "|| ",
            r"\\________ ",
            r" \--------\ ",
            " \\\\",
            " ||",
            "_ ||",
            r"\\________//",
            r" \--------/ ",
            ],
            "T":
            [
            "______________ ",
            "------ ------",
            " || ",
            " || ",
            " || ",
            " || ",
            " || ",
            " || ",
            " || ",
            " || ",
            " || ",
            " || ",
            ],
            " ":
            [" "] * 12
            }

            class Big:
            def __init__(self, charset=charset , height=None, write=None,
            defaultchar=" "):
            self.charset = charset
            if height is None:
            height = len(charset.ite rvalues().next( ))
            self.height = height
            self.cache = []
            self.defaultcha r = charset[defaultchar]
            if write is None:
            write = sys.stdout.writ e
            self.rawWrite = write

            def _writeLine(self ):
            line = [self.charset.ge t(c, self.defaultcha r) for c in
            "".join(self.ca che)]
            self.cache = []
            for row in range(self.heig ht):
            self.rawWrite(" ".join([c[row] for c in line]))
            self.rawWrite(" \n")

            def write(self, s):
            while True:
            pos = s.find("\n")
            if pos == -1:
            break
            self.cache.appe nd(s[:pos])
            self._writeLine ()
            s = s[pos+1:]
            self.cache.appe nd(s)
            def close(self):
            self.write("\n" )

            big = Big()

            print >> big, "ST", "TS"
            print >> big, "STS"
            print >> big, "S\nT\nS"
            print >> big, "TS",
            big.close()

            Comment

            • Andrew Dalke

              #7
              Re: trouble understanding None

              Jakle:[color=blue]
              > I'm trying to write a program (with my very limited knowledge of python)
              > that will convert text I type into those letters drawn with ascii symbols.[/color]

              BTW, if you get really into this you might want to take a look
              at figlet (http://www.figlet.org/ ) which both does this and provides
              fonts for you to do your own ASCII graphics.

              Andrew
              dalke@dalkescie ntific.com


              Comment

              • Terry Reedy

                #8
                Re: trouble understanding None


                "Peter Otten" <__peter__@web. de> wrote in message
                news:bot32t$mf3 $00$1@news.t-online.com...[color=blue]
                > import sys
                > charset = { "S":
                > [
                > " ________ ",
                > " /--------\ ",
                > "// \\\\",
                > "|| ^^",
                > "|| ",
                > r"\\________ ",
                > r" \--------\ ",
                > " \\\\",
                > " ||",
                > "_ ||",
                > r"\\________//",
                > r" \--------/ ",
                > ],[/color]

                Unless the OP actually needs a list of lines, I think I would make the
                value corresponding to each letter one string with embedded newlines:
                bigletter = {
                'S': r'''
                ________
                /--------\
                // \\
                || ^^
                ||
                \\________
                \--------\
                \\
                ||
                _ ||
                \\________//
                \--------/'''

                # etc
                }
                print bigletter['S']

                This is very easy to edit (with a fixed pitch editor), aud to use.
                [color=blue][color=green][color=darkred]
                >>> print bigletter['S'][/color][/color][/color]

                ________
                /--------\
                // \\
                || ^^
                ||
                \\________
                \--------\
                \\
                ||
                _ ||
                \\________//
                \--------/

                The only real problem is (maybe) the extra newline at the beginning of
                the file, which makes the first line line-up with the rest. The raw
                mode input makes it impossible (as far as I know) to escape it (with
                the usual '\', which gets printed instead). So one could either
                postprocess the dict to slice all values or delete the initial newline
                in the source code after getting the letter right.

                Terry J. Reedy


                Comment

                • Peter Otten

                  #9
                  Re: trouble understanding None

                  Terry Reedy wrote:
                  [color=blue]
                  > Unless the OP actually needs a list of lines, I think I would make the
                  > value corresponding to each letter one string with embedded newlines:[/color]
                  [...][color=blue]
                  > This is very easy to edit (with a fixed pitch editor), aud to use.[/color]

                  Yes, this would be a cleaner approach.
                  [color=blue]
                  > The only real problem is (maybe) the extra newline at the beginning of
                  > the file, which makes the first line line-up with the rest. The raw
                  > mode input makes it impossible (as far as I know) to escape it (with
                  > the usual '\', which gets printed instead). So one could either
                  > postprocess the dict to slice all values or delete the initial newline
                  > in the source code after getting the letter right.[/color]

                  I mixed normal and raw strings because I recalled a problem with backslashes
                  at the end of a raw string. I've since found out that this applies only to
                  a single last backslash at the end of the string:
                  [color=blue][color=green][color=darkred]
                  >>> r"\\"[/color][/color][/color]
                  '\\\\'[color=blue][color=green][color=darkred]
                  >>> r"\"[/color][/color][/color]
                  File "<stdin>", line 1
                  r"\"
                  ^
                  SyntaxError: EOL while scanning single-quoted string[color=blue][color=green][color=darkred]
                  >>>[/color][/color][/color]

                  For my Big writer class , that somewhat extends the original task,
                  postprocessing would be the way to go, because of other problems:

                  - every line of a character must be of the same length
                  - every character must have the same height
                  - if character definitions with different heights are allowed, additional
                  information about the baseline is required for the program to decide where
                  to fill in the blank lines


                  Peter

                  Comment

                  • Alex Martelli

                    #10
                    Re: trouble understanding None

                    Peter Otten wrote:
                    ...[color=blue]
                    > I mixed normal and raw strings because I recalled a problem with
                    > backslashes at the end of a raw string. I've since found out that this
                    > applies only to a single last backslash at the end of the string:[/color]

                    Nope, any ODD number of backslashes at the end (1, 3, 5, 7, ...).


                    Alex

                    Comment

                    Working...