چیک کریں کہ آیا اسٹرنگ میں ازگر میں کوئی نمبر ہے۔

تعارف

چاہے آپ صارف کے ان پٹ کے لیے ایک تصدیقی اسکرپٹ بنا رہے ہوں، ایک لاگ ان فارم جو صارفین سے پاس ورڈ میں ایک حرف شامل کرنے کی درخواست کرتا ہے – یہ جانچنا کہ آیا سٹرنگ میں کوئی حرف ہے کوئی غیر معمولی عمل نہیں ہے۔

اس ٹیوٹوریل میں - ہم ان بہت سے طریقوں پر ایک نظر ڈالیں گے جن سے آپ یہ چیک کر سکتے ہیں کہ آیا سٹرنگ Python میں ہندسوں/نمبر پر مشتمل ہے، جس میں آخر میں سب سے زیادہ موثر انداز کے لیے ایک بینچ مارک بھی شامل ہے۔

چیک کریں کہ آیا اسٹرنگ میں ازگر میں نمبر ہے۔

یہ چیک کرنے کے متعدد طریقے ہیں کہ آیا a کردار ایک عدد ہے (ord(), isnumeric(), isdigit())، جسے آپ فار لوپ کے ساتھ جوڑ سکتے ہیں، کم از کم ایک مثبت ہٹ کو چیک کرنے کے لیے۔ متبادل طور پر، آپ ریگولر ایکسپریشنز کو عام پیٹرن میچرز کے طور پر استعمال کر سکتے ہیں، جو لچکدار، طاقتور اور متن کے بڑے حصوں پر لاگو کرنے کے لیے ڈیزائن کیے گئے ہیں۔ آخر میں - آپ ہمیشہ کر سکتے ہیں۔ map() ہر کردار کو مشروط بیان دیا گیا، اور واپسی True is any() ان کے نتیجے میں True.

ان کے درمیان انتخاب کرنے میں طریقوں کی کارکردگی، لفظی اور کوڈنگ کے انداز کے ساتھ ساتھ آپریشن سے منسلک اپ اسٹریم یا ڈاون اسٹریم کاموں کو بھی مدنظر رکھنا چاہیے۔

چیک کریں کہ آیا اسٹرنگ میں آرڈر () کے ساتھ نمبر ہے

۔ ord() فنکشن ایک کریکٹر لیتا ہے اور اسے واپس کرتا ہے۔ ASCII قدر:

print(ord('0')) 
print(ord('9')) 

کی ASCII قدر 0 48 ہے، اور ASCII کی قدر 9 57 ہے۔ ان کے درمیان کوئی بھی عدد، توسیع کے ذریعے، ASCII ویلیو 48 اور 57 کے درمیان ہے۔. اب یہ چیک کرنے کے لیے کہ آیا سٹرنگ میں کوئی نمبر ہے، ہم پوری ان پٹ سٹرنگ کو عبور کریں گے اور ہر کریکٹر کی ASCII ویلیو چیک کریں گے، اگر ASCII ویلیو 47 سے زیادہ اور 58 سے کم ہے، تو اس کا مطلب ہے کہ یہ ایک نمبر ہے، اور ہم واپس جائیں گے۔ True:

input_string = "My name is Satyam & I am 22 yrs old"
flag = False
for ch in input_string:
    ascii_code = ord(ch)
    if 47 < ascii_code < 58:
        flag = True
        break
if flag:
    print("Yes, the string contains a number.")
else:
    print("No, the string does not contain a number.")

اس کے نتائج:

Yes, the string contains a number.

چیک کریں کہ آیا اسٹرنگ میں isnumeric() کے ساتھ نمبر ہے

۔ isnumeric() فنکشن واپسی True اگر ان پٹ سٹرنگ میں صرف نمبر ہوں، بصورت دیگر، یہ واپس آجائے گا۔ False:

str1 = "918"
print("String is whole numeric?", str1.isnumeric())
str2 = "The meaning of the universe is 42"
print("String is whole numeric?", str2.isnumeric())

اس کے نتائج:

String is whole numeric? True 
String is whole numeric? False

نوٹ: ۔ isnumeric() فنکشن ایسا برتاؤ نہیں کرے گا جس کی آپ توقع کر سکتے ہیں۔ منفی یا فلوٹ نمبر. اگر ہم کسی سٹرنگ کو صرف منفی یا فلوٹ نمبروں کے ساتھ پاس کرتے ہیں تو یہ واپس آجائے گا۔ False، کیونکہ - اور . منفی نمبروں اور فلوٹس سے وابستہ حروف درحقیقت ہیں، نمبر نہیں۔

str1 = "-918"
print("String is whole numeric?", str1.isnumeric()) 

str2 = "91.8"
print("String is whole numeric?", str2.isnumeric()) 

اگرچہ، چونکہ ازگر میں حروف صرف لمبائی 1 کے تار ہیں - آپ حروف کے ذریعے اعادہ کر سکتے ہیں اور استعمال کر سکتے ہیں isnumeric() یہ چیک کرنے کے لیے کہ آیا وہ نمبر ہیں:

input_string = "My name is Satyam & I am 22 yrs old"
flag = False
for ch in input_string:
    if ch.isnumeric():
        flag = True
        break
if flag:
    print("Yes, the string contains a number.")
else:
    print("No, the string does not contain a number.")

چیک کریں کہ آیا اسٹرنگ میں isdigit() کے ساتھ نمبر ہے

۔ isdigit() فنکشن چیک کرتا ہے کہ آیا سٹرنگ کے تمام حروف ہندسے ہیں۔ اگر ہاں - یہ واپس آتا ہے۔ True، اور اگر نہیں، تو یہ واپس آتا ہے۔ False. ایک بار پھر، چونکہ Python میں حروف صرف لمبائی 1 کے تار ہیں - یہ طریقہ ہر کردار کے لیے ایک لوپ میں استعمال کیا جا سکتا ہے:

input_string = "My name is Satyam & I am 22 yrs old"
flag = False
for ch in input_string:
    if ch.isdigit():
        flag = True
        break
if flag:
    print("Yes, the string contains a number.")
else:
    print("No, the string does not contain a number.")

نوٹ: ۔ isdigit() طریقہ صرف اسی طرح برتاؤ کرتا ہے۔ isnumeric()اور اگر آپ فلوٹ یا منفی نمبر پر مشتمل سٹرنگ پاس کرتے ہیں، False خصوصی حروف نمبر نہ ہونے کی وجہ سے لوٹا جاتا ہے۔ کردار کی سطح پر، اگرچہ، جب تک کہ ایک True قدر اس بات کا تعین کرنے کے لیے کافی ہے کہ آیا سٹرنگ نمبر پر مشتمل ہے - یہ قابل اطلاق ہے۔

isnumeric() اور isdigit() کے درمیان فرق؟

تو ، کے درمیان کیا فرق ہے؟ isnumeric() اور isdigit()? جب تک ہم اس پر ہیں - کیا ہوگا؟ isdecimal()?

  • isnumeric() چیک کرتا ہے کہ آیا کوئی کردار a ہے۔ یونیکوڈ کی نمائندگی ایک کے عددی قدر (جس میں رومن عددی نمائندگی، سپر اسکرپٹس، سبسکرپٹس اور فریکشنز شامل ہیں)
  • isdigit() چیک کرتا ہے کہ آیا کوئی کردار a ہے۔ یونیکوڈ ہندسہ (جس میں رومن عددی نمائندگی شامل نہیں ہے، لیکن اس میں سپر/سب اسکرپٹس اور فریکشنز شامل ہیں)
  • isdecimal() چیک کرتا ہے کہ آیا کوئی حرف a ہے۔ اعشاریہ ہندسہ (جو واپس آجائے گا۔ False کسی بھی چیز کے لئے جو نہیں ہے 0..9 بیس 10 میں)

isnumeric() سب سے وسیع طریقہ ہے، جبکہ isdecimal() تینوں کے درمیان سب سے زیادہ تنگ ہے۔

چیک کریں کہ آیا اسٹرنگ میں نقشہ () اور کوئی () کے ساتھ نمبر ہے

۔ map() فنکشن نقشہ فنکشن میں پاس کردہ تکراری عنصر کے ہر عنصر کے لیے فراہم کردہ فنکشن کو انجام دیتا ہے۔ تکراری کے ہر عنصر کو پیرامیٹر کے طور پر فنکشن میں منتقل کیا جاتا ہے:

map(function, iterable)

۔ function کے ہر آئٹم کے لئے پھانسی دی جاتی ہے۔ iterable. یہ بہت لچکدار اور طاقتور منطق کی اجازت دیتا ہے، صرف اس کی وسعت کے ساتھ پابند ہے۔ function آپ ان پٹ پر کال کریں! طریقہ واپسی a map مثال کے طور پر، جسے آسانی سے دوسرے مجموعوں جیسے فہرست یا سیٹ میں تبدیل کیا جا سکتا ہے۔

ہم ایک ایسا فنکشن لکھ سکتے ہیں جو بولین کو ظاہر کرتا ہے کہ آیا کوئی حرف نمبر ہے، اور map() اس طرح کال کے نتیجے میں بولین ویلیوز کی فہرست ہوگی۔

۔ any() واپسی True اگر پاس کردہ دوبارہ قابل کا کوئی عنصر ہے۔ Trueدوسری صورت میں، یہ واپس آتا ہے False.

ان دونوں کو ایک ساتھ جوڑ کر - ہم ایک اعلیٰ سطحی، مختصر اسکرپٹ بنا سکتے ہیں اور فار لوپ کو خلاصہ کر سکتے ہیں:

def func(ch):
    return ch.isdigit() 

input_string = "My name is Satyam & I am 22 yrs old"
contains_number = any(list(map(func, input_string)))
print("Is there a number present?", contains_number)

اس کے نتائج:

Is there a number present? True

اگر آپ کا فنکشن ون لائنر ہے تو اسے ایک نامی فنکشن کے طور پر نکالنے کی ضرورت نہیں ہے۔ آپ ایک گمنام لکھ سکتے ہیں۔ لیمبڈا فنکشن اس کے بجائے اختصار کی خاطر:

بہترین طرز عمل، صنعت کے لیے منظور شدہ معیارات، اور چیٹ شیٹ کے ساتھ Git سیکھنے کے لیے ہمارے ہینڈ آن، عملی گائیڈ کو دیکھیں۔ گوگلنگ گٹ کمانڈز کو روکیں اور اصل میں سیکھ یہ!

input_string = "My name is Satyam & I am 22 yrs old"
contains_number = any(list(map(lambda ch: ch.isdigit(), input_string)))
print("Is there any number present?", contains_number)

اس کا نتیجہ یہ بھی ہوتا ہے:

Is there any number present? True

چیک کریں کہ آیا سٹرنگ ریگولر ایکسپریشنز کے ساتھ ازگر میں نمبر پر مشتمل ہے۔

ریگولر ایکسپریشنز ہیں۔ تلاش کے پیٹرن ان پٹ ٹیکسٹ سے مماثل ہونے کے لیے ڈیزائن کیا گیا ہے۔ وہ لچکدار ہیں اور ان کی نوعیت کے پیش نظر - آپ تلاش کرنے کے لیے اسی پیٹرن کے لیے صوابدیدی تعداد میں اظہار لکھ سکتے ہیں، اور ساتھ ہی کسی بھی قابل عمل پیٹرن کا احاطہ کرسکتے ہیں جس کے بارے میں آپ سوچ سکتے ہیں۔

ازگر کا re ماڈیول کا استعمال ریگولر ایکسپریشنز کے خلاف متن کو لکھنے، مرتب کرنے اور میچ کرنے کے لیے کیا جاتا ہے۔ یہ مختلف طریقوں کو بے نقاب کرتا ہے، جیسے match() جو اس سے میل کھاتا ہے کہ آیا سٹرنگ پیٹرن سے شروع ہوتی ہے، search() جو ایک سٹرنگ میں ممکنہ طور پر بہت سے میچوں کی پہلی موجودگی کو تلاش کرتا ہے، اور findall() جو تمام واقعات کی جانچ کرتا ہے۔

نوٹ: تینوں طریقے قبول کرتے ہیں a pattern اور search دلیل دیں اور تلاش کریں۔ pattern میں search سٹرنگ.

وہ نمونہ جو a کی شناخت کرتا ہے۔ عدد is "d+":

import re
input_string = "My name is Satyam & I am 22 yrs old"
match = re.search(r"d+", input_string)
if match:
    print("Is there any number present?", "Yes")
else:
    print("Is there any number present?", "No")

۔ search() طریقہ a re.Match آبجیکٹ، ملا ہوا ملاپ اور ابتدائی اور اختتامی اشاریوں پر مشتمل:


آبجیکٹ کو بولین ویلیو پر اس بنیاد پر جانچا جا سکتا ہے کہ آیا یہ a ہے۔ re.Match اعتراض یا None. اس کے نتیجے میں:

Is there any number present? Yes

کے برعکس search() طریقہ کار، findall() طریقہ صرف پہلے والے کی بجائے پیٹرن کے تمام واقعات کو واپس کرتا ہے:

import re
input_string = "My name is Satyam & I am 22 yrs old"
match = re.findall(r"d+", input_string)
if match:
    print("Is there any number present?", "Yes")
else:
    print("Is there any number present?", "No")

اس کے نتائج:

Is there any number present? Yes

بنچمارک

کارکردگی کے بارے میں کیا خیال ہے؟ اگر آپ منطق نکالتے ہیں اور غیر ضروری حصوں کو تراشتے ہیں، طریقوں کو صرف نتیجہ واپس کرنے تک محدود کرتے ہیں، تو آپ ایک ہی ان پٹ پر آسانی سے ان کو ایک دوسرے کے خلاف بینچ مارک کر سکتے ہیں:

%timeit ord_check()
%timeit isnumeric_check()
%timeit is_digit_check()
%timeit lambda_check()
%timeit regex_check()

اس کے نتائج:

2.18 µs ± 51.5 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
2.04 µs ± 639 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
1.88 µs ± 448 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
5.07 µs ± 915 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
1.47 µs ± 3.41 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)

عام طور پر فار لوپ اپروچ ایک ہی وقت میں چلتے ہیں، مخصوص طریقوں سے تھوڑا اوور ہیڈ کے ساتھ۔ لیمبڈا کے ساتھ any() ڈیفیکٹو سب سے سست ہے (لسٹ کو لسٹ میں تبدیل کرنے اور پھر اسے کم کرنے کی وجہ سے بہت سارے فالتو آپریشنز)، جبکہ ریگولر ایکسپریشنز کا سب سے تیز رن ٹائم اس کے ارد گرد سب سے کم تغیر کے ساتھ تھا (وہ مسلسل تیز ہیں)۔

تاہم، طویل ان پٹ متن پر، مختلف طریقوں میں سے ہر ایک پر وقت کی پیچیدگیوں پر زور دیا جاتا ہے، خاص طور پر مماثل ہندسوں کی تعداد پر منحصر ہے (چاہے ہندسے عام ہوں یا نہ ہوں):

import random
import string

input_string_random = ''.join(random.choices(string.ascii_uppercase + string.digits, k=1000))
print(input_string_random) 

input_string_with_single_digit = ''.join(random.choices(string.ascii_uppercase, k=1000)) + '1'
print(input_string_with_single_digit) 

پہلی سٹرنگ ہندسوں اور حروف کی تقریباً مساوی تعداد کے ساتھ ایک بے ترتیب ترتیب پیدا کرتی ہے، جب کہ مؤخر الذکر صرف ایک حرف والی تار ہے جس کے آخر میں ایک ہندسہ ہوتا ہے (بدترین وقت کی پیچیدگی):

%timeit ord_check(input_string_random)
504 ns ± 22.6 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
%timeit ord_check(input_string_with_single_digit)
76.2 µs ± 1.36 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit isnumeric_check(input_string_random)
756 ns ± 170 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
%timeit isnumeric_check(input_string_with_single_digit)
76.2 µs ± 8.43 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit is_digit_check(input_string_random)
549 ns ± 102 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
%timeit is_digit_check(input_string_with_single_digit)
65 µs ± 20.6 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit lambda_check(input_string_random)
114 µs ± 8.77 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit lambda_check(input_string_with_single_digit)
119 µs ± 6.23 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit regex_check(input_string_random)
996 ns ± 19.8 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
%timeit regex_check(input_string_with_single_digit)
22.2 µs ± 1.77 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

ہٹس کی کم تعداد کے ساتھ - ریگولر ایکسپریشنز سب سے زیادہ پرفارمنس ہیں۔ بہت سی ہٹ کے ساتھ، لیمبڈا فنکشن اپروچ سب سے زیادہ پرفارمنس ہے، اور یہ اپنے وقت کی پیچیدگی کو برقرار رکھتا ہے۔ قطع نظر اس کے کہ ان پٹ میں کئی ہٹس ہیں یا ایک۔ اہم منفی پہلو (ریڈنٹنٹ کمپیوٹیشن جب ہٹ ریٹ کم ہوتا ہے) اس کی اہم طاقت میں بدل جاتا ہے کیونکہ فالتو پن اسے ان پٹ میں مضبوط بناتا ہے۔

نتیجہ

اس ٹیوٹوریل میں، ہم نے یہ چیک کرنے کے متعدد طریقوں پر ایک نظر ڈالی کہ آیا Python میں ایک سٹرنگ کم از کم ایک کریکٹر پر مشتمل ہے۔ ہم نے اس پر ایک نظر ڈالی ہے۔ ord(), isnumeric(), isdigit() اور isdecimal() فنکشن کے ساتھ ساتھ لیمبڈا فنکشن کال کے ذریعے اس منطق کو کیسے خلاصہ کیا جائے۔ map() اور any(). پھر، ہم نے ریگولر ایکسپریشنز کو دریافت کیا اور مختلف ان پٹ کے ساتھ نقطہ نظر کو بینچ مارک کیا۔

ٹائم اسٹیمپ:

سے زیادہ Stackabuse