Credit card validator in Python 3.7.1











up vote
1
down vote

favorite












I am doing some projects so I can teach myself programming. The one that I finished states:
"Credit Card Validator - Takes in a credit card number from a common credit card vendor and validates it to make sure that it is a valid number (look into how credit cards use a checksum)."
Would be glad if i can get a constructive feedback on this one.



import sys

cardnumb_input = input('Enter your credit card number: ')


def list_tweak():
try:
cardnumb = [int(i) for i in cardnumb_input]
cardnumb[0::2] = [x * 2 for x in cardnumb[0::2]]
cardnumb = [str(i) for i in cardnumb]
cardnumb = list(''.join(cardnumb))
cardnumb = [int(i) for i in cardnumb]
return cardnumb

except ValueError:
print('Please enter only number in format: xxxxxxxxxxxxxxxx')
sys.exit(1)


def valid_or_not():
total = sum(list_tweak())
if total % 10 != 0:
print('It seems that this credit card number is not valid.')
else:
print('This credit card number is valid. ')


valid_or_not()









share|improve this question




























    up vote
    1
    down vote

    favorite












    I am doing some projects so I can teach myself programming. The one that I finished states:
    "Credit Card Validator - Takes in a credit card number from a common credit card vendor and validates it to make sure that it is a valid number (look into how credit cards use a checksum)."
    Would be glad if i can get a constructive feedback on this one.



    import sys

    cardnumb_input = input('Enter your credit card number: ')


    def list_tweak():
    try:
    cardnumb = [int(i) for i in cardnumb_input]
    cardnumb[0::2] = [x * 2 for x in cardnumb[0::2]]
    cardnumb = [str(i) for i in cardnumb]
    cardnumb = list(''.join(cardnumb))
    cardnumb = [int(i) for i in cardnumb]
    return cardnumb

    except ValueError:
    print('Please enter only number in format: xxxxxxxxxxxxxxxx')
    sys.exit(1)


    def valid_or_not():
    total = sum(list_tweak())
    if total % 10 != 0:
    print('It seems that this credit card number is not valid.')
    else:
    print('This credit card number is valid. ')


    valid_or_not()









    share|improve this question


























      up vote
      1
      down vote

      favorite









      up vote
      1
      down vote

      favorite











      I am doing some projects so I can teach myself programming. The one that I finished states:
      "Credit Card Validator - Takes in a credit card number from a common credit card vendor and validates it to make sure that it is a valid number (look into how credit cards use a checksum)."
      Would be glad if i can get a constructive feedback on this one.



      import sys

      cardnumb_input = input('Enter your credit card number: ')


      def list_tweak():
      try:
      cardnumb = [int(i) for i in cardnumb_input]
      cardnumb[0::2] = [x * 2 for x in cardnumb[0::2]]
      cardnumb = [str(i) for i in cardnumb]
      cardnumb = list(''.join(cardnumb))
      cardnumb = [int(i) for i in cardnumb]
      return cardnumb

      except ValueError:
      print('Please enter only number in format: xxxxxxxxxxxxxxxx')
      sys.exit(1)


      def valid_or_not():
      total = sum(list_tweak())
      if total % 10 != 0:
      print('It seems that this credit card number is not valid.')
      else:
      print('This credit card number is valid. ')


      valid_or_not()









      share|improve this question















      I am doing some projects so I can teach myself programming. The one that I finished states:
      "Credit Card Validator - Takes in a credit card number from a common credit card vendor and validates it to make sure that it is a valid number (look into how credit cards use a checksum)."
      Would be glad if i can get a constructive feedback on this one.



      import sys

      cardnumb_input = input('Enter your credit card number: ')


      def list_tweak():
      try:
      cardnumb = [int(i) for i in cardnumb_input]
      cardnumb[0::2] = [x * 2 for x in cardnumb[0::2]]
      cardnumb = [str(i) for i in cardnumb]
      cardnumb = list(''.join(cardnumb))
      cardnumb = [int(i) for i in cardnumb]
      return cardnumb

      except ValueError:
      print('Please enter only number in format: xxxxxxxxxxxxxxxx')
      sys.exit(1)


      def valid_or_not():
      total = sum(list_tweak())
      if total % 10 != 0:
      print('It seems that this credit card number is not valid.')
      else:
      print('This credit card number is valid. ')


      valid_or_not()






      python beginner python-3.x programming-challenge checksum






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 18 mins ago









      200_success

      127k15149412




      127k15149412










      asked 6 hours ago









      skyn37

      434




      434






















          1 Answer
          1






          active

          oldest

          votes

















          up vote
          2
          down vote













          What should the type signature of these functions be?



          I would really separate the IO from data. In addition, I would display data that you already have. I would not have valid_or_not print stuff out. Instead I would have it return a value. But what value?



          Furthermore, don't read global variables. valid_or_not and list_tweak should take paramters.



          We'll get to printing stuff in the end.



          What do you want to do with an invalid credit card number?



          You are both throwing an error, and also printing out whether it is a valid card number. I would say there is a couple ways to go, but I prefer this approach:




          Return an enum that ends up being either: VALID, INVALID_CHECKSUM, or INVALID_FORMAT. Instead of doing printing.




          Rework the flow of valid_or_not.



          Consider reworking valid_or_not to do the following:




          1. Check to see if the format is valid, and return INVALID_FORMAT if it is not.

          2. The run list_tweak, but don't do try-except on it, return either INVALID_CHECKSUM or VALID depending on list_tweak.


          Naming.



          I am not sure what list_tweak means, but I am assuming only because I've seen this problem show up time and time again that it is the Luhn algorithm. Name it something appropriate like luhn_checksum.



          IO



          So what should we really be doing for input? First we should have a main function (see the link for more information why. Thus we get:



          def main():
          cardnumber = input('Enter your credit card number: ')
          print(valid_or_not(cardnumber))


          if __name__ == '__main__':
          main()


          See all the data is manipulated in valid_or_not which is then displayed, instead of displaying information withing valid_or_not).






          share|improve this answer





















            Your Answer





            StackExchange.ifUsing("editor", function () {
            return StackExchange.using("mathjaxEditing", function () {
            StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
            StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
            });
            });
            }, "mathjax-editing");

            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "196"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            convertImagesToLinks: false,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: null,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f209326%2fcredit-card-validator-in-python-3-7-1%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes








            up vote
            2
            down vote













            What should the type signature of these functions be?



            I would really separate the IO from data. In addition, I would display data that you already have. I would not have valid_or_not print stuff out. Instead I would have it return a value. But what value?



            Furthermore, don't read global variables. valid_or_not and list_tweak should take paramters.



            We'll get to printing stuff in the end.



            What do you want to do with an invalid credit card number?



            You are both throwing an error, and also printing out whether it is a valid card number. I would say there is a couple ways to go, but I prefer this approach:




            Return an enum that ends up being either: VALID, INVALID_CHECKSUM, or INVALID_FORMAT. Instead of doing printing.




            Rework the flow of valid_or_not.



            Consider reworking valid_or_not to do the following:




            1. Check to see if the format is valid, and return INVALID_FORMAT if it is not.

            2. The run list_tweak, but don't do try-except on it, return either INVALID_CHECKSUM or VALID depending on list_tweak.


            Naming.



            I am not sure what list_tweak means, but I am assuming only because I've seen this problem show up time and time again that it is the Luhn algorithm. Name it something appropriate like luhn_checksum.



            IO



            So what should we really be doing for input? First we should have a main function (see the link for more information why. Thus we get:



            def main():
            cardnumber = input('Enter your credit card number: ')
            print(valid_or_not(cardnumber))


            if __name__ == '__main__':
            main()


            See all the data is manipulated in valid_or_not which is then displayed, instead of displaying information withing valid_or_not).






            share|improve this answer

























              up vote
              2
              down vote













              What should the type signature of these functions be?



              I would really separate the IO from data. In addition, I would display data that you already have. I would not have valid_or_not print stuff out. Instead I would have it return a value. But what value?



              Furthermore, don't read global variables. valid_or_not and list_tweak should take paramters.



              We'll get to printing stuff in the end.



              What do you want to do with an invalid credit card number?



              You are both throwing an error, and also printing out whether it is a valid card number. I would say there is a couple ways to go, but I prefer this approach:




              Return an enum that ends up being either: VALID, INVALID_CHECKSUM, or INVALID_FORMAT. Instead of doing printing.




              Rework the flow of valid_or_not.



              Consider reworking valid_or_not to do the following:




              1. Check to see if the format is valid, and return INVALID_FORMAT if it is not.

              2. The run list_tweak, but don't do try-except on it, return either INVALID_CHECKSUM or VALID depending on list_tweak.


              Naming.



              I am not sure what list_tweak means, but I am assuming only because I've seen this problem show up time and time again that it is the Luhn algorithm. Name it something appropriate like luhn_checksum.



              IO



              So what should we really be doing for input? First we should have a main function (see the link for more information why. Thus we get:



              def main():
              cardnumber = input('Enter your credit card number: ')
              print(valid_or_not(cardnumber))


              if __name__ == '__main__':
              main()


              See all the data is manipulated in valid_or_not which is then displayed, instead of displaying information withing valid_or_not).






              share|improve this answer























                up vote
                2
                down vote










                up vote
                2
                down vote









                What should the type signature of these functions be?



                I would really separate the IO from data. In addition, I would display data that you already have. I would not have valid_or_not print stuff out. Instead I would have it return a value. But what value?



                Furthermore, don't read global variables. valid_or_not and list_tweak should take paramters.



                We'll get to printing stuff in the end.



                What do you want to do with an invalid credit card number?



                You are both throwing an error, and also printing out whether it is a valid card number. I would say there is a couple ways to go, but I prefer this approach:




                Return an enum that ends up being either: VALID, INVALID_CHECKSUM, or INVALID_FORMAT. Instead of doing printing.




                Rework the flow of valid_or_not.



                Consider reworking valid_or_not to do the following:




                1. Check to see if the format is valid, and return INVALID_FORMAT if it is not.

                2. The run list_tweak, but don't do try-except on it, return either INVALID_CHECKSUM or VALID depending on list_tweak.


                Naming.



                I am not sure what list_tweak means, but I am assuming only because I've seen this problem show up time and time again that it is the Luhn algorithm. Name it something appropriate like luhn_checksum.



                IO



                So what should we really be doing for input? First we should have a main function (see the link for more information why. Thus we get:



                def main():
                cardnumber = input('Enter your credit card number: ')
                print(valid_or_not(cardnumber))


                if __name__ == '__main__':
                main()


                See all the data is manipulated in valid_or_not which is then displayed, instead of displaying information withing valid_or_not).






                share|improve this answer












                What should the type signature of these functions be?



                I would really separate the IO from data. In addition, I would display data that you already have. I would not have valid_or_not print stuff out. Instead I would have it return a value. But what value?



                Furthermore, don't read global variables. valid_or_not and list_tweak should take paramters.



                We'll get to printing stuff in the end.



                What do you want to do with an invalid credit card number?



                You are both throwing an error, and also printing out whether it is a valid card number. I would say there is a couple ways to go, but I prefer this approach:




                Return an enum that ends up being either: VALID, INVALID_CHECKSUM, or INVALID_FORMAT. Instead of doing printing.




                Rework the flow of valid_or_not.



                Consider reworking valid_or_not to do the following:




                1. Check to see if the format is valid, and return INVALID_FORMAT if it is not.

                2. The run list_tweak, but don't do try-except on it, return either INVALID_CHECKSUM or VALID depending on list_tweak.


                Naming.



                I am not sure what list_tweak means, but I am assuming only because I've seen this problem show up time and time again that it is the Luhn algorithm. Name it something appropriate like luhn_checksum.



                IO



                So what should we really be doing for input? First we should have a main function (see the link for more information why. Thus we get:



                def main():
                cardnumber = input('Enter your credit card number: ')
                print(valid_or_not(cardnumber))


                if __name__ == '__main__':
                main()


                See all the data is manipulated in valid_or_not which is then displayed, instead of displaying information withing valid_or_not).







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered 59 mins ago









                Dair

                4,380727




                4,380727






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Code Review Stack Exchange!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    Use MathJax to format equations. MathJax reference.


                    To learn more, see our tips on writing great answers.





                    Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                    Please pay close attention to the following guidance:


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f209326%2fcredit-card-validator-in-python-3-7-1%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    404 Error Contact Form 7 ajax form submitting

                    How to know if a Active Directory user can login interactively

                    Refactoring coordinates for Minecraft Pi buildings written in Python