কার্যকরী পন্থা বা " দেখি মা কোনও লুপ নেই! ":
from itertools import chain, repeat
prompts = chain(["Enter a number: "], repeat("Not a number! Try again: "))
replies = map(input, prompts)
valid_response = next(filter(str.isdigit, replies))
print(valid_response)
Enter a number: a
Not a number! Try again: b
Not a number! Try again: 1
1
অথবা আপনি যদি অন্য উত্তরের মতো একটি ইনপুট প্রম্পট থেকে "খারাপ ইনপুট" বার্তা আলাদা করতে চান:
prompt_msg = "Enter a number: "
bad_input_msg = "Sorry, I didn't understand that."
prompts = chain([prompt_msg], repeat('\n'.join([bad_input_msg, prompt_msg])))
replies = map(input, prompts)
valid_response = next(filter(str.isdigit, replies))
print(valid_response)
Enter a number: a
Sorry, I didn't understand that.
Enter a number: b
Sorry, I didn't understand that.
Enter a number: 1
1
এটা কিভাবে কাজ করে?
prompts = chain(["Enter a number: "], repeat("Not a number! Try again: "))
এই সমন্বয় itertools.chainএবং itertools.repeatকোনো ইটারেটরে যা স্ট্রিং সমর্পণ করা হবে তৈরি করবে "Enter a number: "একবার, এবং "Not a number! Try again: "সময়ের অসীম সংখ্যা:
for prompt in prompts:
print(prompt)
Enter a number:
Not a number! Try again:
Not a number! Try again:
Not a number! Try again:
# ... and so on
replies = map(input, prompts)- এখানে ফাংশনে পূর্ববর্তী পদক্ষেপ থেকে mapসমস্ত promptsস্ট্রিং প্রয়োগ করা হবে input। উদাহরণ:
for reply in replies:
print(reply)
Enter a number: a
a
Not a number! Try again: 1
1
Not a number! Try again: it doesn't care now
it doesn't care now
# and so on...
- আমরা কেবল সেই সংখ্যাগুলিতে থাকা স্ট্রিংগুলি ফিল্টার করতে
filterএবং ব্যবহার str.isdigitকরতে পারি:
only_digits = filter(str.isdigit, replies)
for reply in only_digits:
print(reply)
Enter a number: a
Not a number! Try again: 1
1
Not a number! Try again: 2
2
Not a number! Try again: b
Not a number! Try again: # and so on...
এবং আমরা ব্যবহার করি কেবলমাত্র প্রথম সংখ্যাগুলির জন্য কেবল স্ট্রিং next।
অন্যান্য বৈধতা বিধি:
স্ট্রিং পদ্ধতি: অবশ্যই আপনি অন্যান্য স্ট্রিং পদ্ধতি ব্যবহার করতে পারেন str.isalphaকেবলমাত্র বর্ণানুক্রমিক স্ট্রিং str.isupperপেতে , বা কেবল বড় হাতের অক্ষর পেতে। সম্পূর্ণ তালিকার জন্য ডক্স দেখুন ।
সদস্যতা পরীক্ষা:
এটি সম্পাদন করার বিভিন্ন উপায় রয়েছে। এর মধ্যে একটি __contains__পদ্ধতি ব্যবহার করে :
from itertools import chain, repeat
fruits = {'apple', 'orange', 'peach'}
prompts = chain(["Enter a fruit: "], repeat("I don't know this one! Try again: "))
replies = map(input, prompts)
valid_response = next(filter(fruits.__contains__, replies))
print(valid_response)
Enter a fruit: 1
I don't know this one! Try again: foo
I don't know this one! Try again: apple
apple
সংখ্যা তুলনা:
দরকারী তুলনা পদ্ধতি আছে যা আমরা এখানে ব্যবহার করতে পারি। উদাহরণস্বরূপ, __lt__( <) এর জন্য:
from itertools import chain, repeat
prompts = chain(["Enter a positive number:"], repeat("I need a positive number! Try again:"))
replies = map(input, prompts)
numeric_strings = filter(str.isnumeric, replies)
numbers = map(float, numeric_strings)
is_positive = (0.).__lt__
valid_response = next(filter(is_positive, numbers))
print(valid_response)
Enter a positive number: a
I need a positive number! Try again: -5
I need a positive number! Try again: 0
I need a positive number! Try again: 5
5.0
অথবা, যদি আপনি ডান্ডার পদ্ধতিগুলি ব্যবহার করতে পছন্দ করেন না (ডান্ডার = ডাবল-আন্ডারস্কোর), আপনি সর্বদা আপনার নিজের ফাংশনটি সংজ্ঞায়িত করতে পারেন, বা operatorমডিউলটি ব্যবহার করতে পারেন ।
পথের অস্তিত্ব:
এখানে একটি pathlibগ্রন্থাগার এবং এর Path.existsপদ্ধতি ব্যবহার করতে পারে :
from itertools import chain, repeat
from pathlib import Path
prompts = chain(["Enter a path: "], repeat("This path doesn't exist! Try again: "))
replies = map(input, prompts)
paths = map(Path, replies)
valid_response = next(filter(Path.exists, paths))
print(valid_response)
Enter a path: a b c
This path doesn't exist! Try again: 1
This path doesn't exist! Try again: existing_file.txt
existing_file.txt
সীমাবদ্ধ প্রচেষ্টা:
আপনি যদি কোনও ব্যবহারকারীকে অসীম সংখ্যক বার জিজ্ঞাসা করে অত্যাচার করতে না চান তবে আপনি কলটিতে একটি সীমা নির্দিষ্ট করতে পারেন itertools.repeat। এটি nextফাংশনটির একটি ডিফল্ট মান প্রদানের সাথে একত্রিত হতে পারে :
from itertools import chain, repeat
prompts = chain(["Enter a number:"], repeat("Not a number! Try again:", 2))
replies = map(input, prompts)
valid_response = next(filter(str.isdigit, replies), None)
print("You've failed miserably!" if valid_response is None else 'Well done!')
Enter a number: a
Not a number! Try again: b
Not a number! Try again: c
You've failed miserably!
পূর্ববর্তী ইনপুট ডেটা:
কখনও কখনও আমরা কোনও ইনপুট প্রত্যাখ্যান করতে চাই না যদি ব্যবহারকারী দুর্ঘটনাক্রমে এটি ক্যাপগুলিতে সরবরাহ করে বা স্ট্রিংটির শুরুতে বা শেষের সাথে কোনও স্থান সরবরাহ করে । এই সাধারণ ভুলগুলি অ্যাকাউন্টে নেওয়ার জন্য আমরা প্রয়োগ করে str.lowerএবং ইনপুট ডেটা প্রিপ্রসেস করতে পারিstr.strip পদ্ধতিগুলির । উদাহরণস্বরূপ, সদস্যপদের ক্ষেত্রে পরীক্ষার কোডটি দেখতে এরকম হবে:
from itertools import chain, repeat
fruits = {'apple', 'orange', 'peach'}
prompts = chain(["Enter a fruit: "], repeat("I don't know this one! Try again: "))
replies = map(input, prompts)
lowercased_replies = map(str.lower, replies)
stripped_replies = map(str.strip, lowercased_replies)
valid_response = next(filter(fruits.__contains__, stripped_replies))
print(valid_response)
Enter a fruit: duck
I don't know this one! Try again: Orange
orange
ক্ষেত্রে যখন আপনার প্রিপ্রোসেসিংয়ের জন্য অনেকগুলি ফাংশন ব্যবহার করা থাকে তখন কোনও ফাংশন রচনা সম্পাদন করে কোনও ফাংশন ব্যবহার করা সহজ । উদাহরণস্বরূপ, এখান থেকে একটি ব্যবহার করে :
from itertools import chain, repeat
from lz.functional import compose
fruits = {'apple', 'orange', 'peach'}
prompts = chain(["Enter a fruit: "], repeat("I don't know this one! Try again: "))
replies = map(input, prompts)
process = compose(str.strip, str.lower) # you can add more functions here
processed_replies = map(process, replies)
valid_response = next(filter(fruits.__contains__, processed_replies))
print(valid_response)
Enter a fruit: potato
I don't know this one! Try again: PEACH
peach
বৈধতা নিয়মের সংমিশ্রণ:
একটি সাধারণ ক্ষেত্রে, উদাহরণস্বরূপ, যখন প্রোগ্রামটি 1 থেকে 120 এর মধ্যে বয়সের জন্য জিজ্ঞাসা করে, একজন কেবল অন্যটিকে যুক্ত করতে পারে filter :
from itertools import chain, repeat
prompt_msg = "Enter your age (1-120): "
bad_input_msg = "Wrong input."
prompts = chain([prompt_msg], repeat('\n'.join([bad_input_msg, prompt_msg])))
replies = map(input, prompts)
numeric_replies = filter(str.isdigit, replies)
ages = map(int, numeric_replies)
positive_ages = filter((0).__lt__, ages)
not_too_big_ages = filter((120).__ge__, positive_ages)
valid_response = next(not_too_big_ages)
print(valid_response)
কিন্তু যখন অনেকগুলি বিধি থাকে তখন লজিকাল সংমিশ্রণ সম্পাদন করে কোনও ফাংশন প্রয়োগ করা ভাল । নিম্নলিখিত উদাহরণে আমি এখান থেকে প্রস্তুত একটি ব্যবহার করব :
from functools import partial
from itertools import chain, repeat
from lz.logical import conjoin
def is_one_letter(string: str) -> bool:
return len(string) == 1
rules = [str.isalpha, str.isupper, is_one_letter, 'C'.__le__, 'P'.__ge__]
prompt_msg = "Enter a letter (C-P): "
bad_input_msg = "Wrong input."
prompts = chain([prompt_msg], repeat('\n'.join([bad_input_msg, prompt_msg])))
replies = map(input, prompts)
valid_response = next(filter(conjoin(*rules), replies))
print(valid_response)
Enter a letter (C-P): 5
Wrong input.
Enter a letter (C-P): f
Wrong input.
Enter a letter (C-P): CDE
Wrong input.
Enter a letter (C-P): Q
Wrong input.
Enter a letter (C-P): N
N
দুর্ভাগ্যক্রমে, যদি প্রতিটি ব্যর্থ মামলার জন্য কারও কাছে কাস্টম বার্তা প্রয়োজন হয় তবে আমি ভয় করি, এর থেকে সুন্দর কোনও কার্যকরী উপায় নেই। বা, কমপক্ষে, আমি একটিও পাইনি।