কার্যকরী পন্থা বা " দেখি মা কোনও লুপ নেই! ":
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
দুর্ভাগ্যক্রমে, যদি প্রতিটি ব্যর্থ মামলার জন্য কারও কাছে কাস্টম বার্তা প্রয়োজন হয় তবে আমি ভয় করি, এর থেকে সুন্দর কোনও কার্যকরী উপায় নেই। বা, কমপক্ষে, আমি একটিও পাইনি।