1
\$\begingroup\$

I have this code, which isn't for the moment optimized:

def capture_inputs(cleaner):
 return cleaner(input("What are valid programming paradigms?").split(","))
def clean_input(user_input):
 result = []
 for paradigm in user_input:
 result.append(paradigm.strip())
 return result
def count_valid_programming_paradigms(paradigms):
 valid_paradigms = {"imperative","functional","object-oriented","logical","declarative"}
 given_paradigms = set(paradigms)
 return len(valid_paradigms & given_paradigms)
def report_result(user_input, counter):
 valid_paradigms_count = counter(user_input)
 if counter(user_input) > 0:
 print("You found {} valid paradigms".format(valid_paradigms_count))
 else:
 print("You did not find any valid paradigm")
 
report_result(capture_inputs(clean_input),count_valid_programming_paradigms)

My goal is to make a perfect function of this, so it follows the perfect paradigm. How can I optimize it, to be as perfect as it can. I'm very thankful about every answer to you guys!

Sᴀᴍ Onᴇᴌᴀ
29.5k16 gold badges45 silver badges202 bronze badges
asked Aug 28, 2022 at 14:30
\$\endgroup\$
1
  • \$\begingroup\$ In a bit of delightful irony, your quiz on programming paradigms was itself tagged with the incorrect paradigm. This is procedural programming and not functional. \$\endgroup\$ Commented Aug 28, 2022 at 15:20

1 Answer 1

2
\$\begingroup\$

"Perfect" is somewhat subjective, but there is simplification to be had here.

I don't think there's a lot of value in passing around function references as you do; the complexity doesn't warrant it. It also doesn't particularly warrant a "cleaner" separated from the input function.

Your use of set literals and set intersection is reasonable.

report_result can just be your main. Add the call to it from a __main__ guard.

Prefer string interpolation over .format().

Consider calling .lower() for more forgiving string matching.

Suggested

from typing import Iterator, Iterable
def capture_inputs() -> Iterator[str]:
 line = input("What are valid programming paradigms? ")
 for answer in line.split(","):
 yield answer.strip().lower()
def count_valid(paradigms: Iterable[str]) -> int:
 valid_paradigms = {"imperative", "functional", "object-oriented", "logical", "declarative"}
 given_paradigms = set(paradigms)
 return len(valid_paradigms & given_paradigms)
def main() -> None:
 inputs = capture_inputs()
 n_valid = count_valid(inputs)
 if n_valid > 0:
 print(f"You found {n_valid} valid paradigms")
 else:
 print("You did not find any valid paradigm")
if __name__ == '__main__':
 main()

An alternative counting expression that does not need to construct a second set could look like

 return sum(1 for paradigm in paradigms if paradigm in valid_paradigms)

I have a weak preference for the first form over this one.

answered Aug 28, 2022 at 15:19
\$\endgroup\$
1
  • \$\begingroup\$ valid_paradigms would be good as a "constant" \$\endgroup\$ Commented Aug 28, 2022 at 16:32

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.