অজগরটি ঠিক কীভাবে কোনও () ফাংশন কাজ করে?


111

অজগর ডক্স পৃষ্ঠায় any, any()ফাংশনের সমতুল্য কোডটি এইভাবে দেওয়া হয়েছে:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

এই ফাংশনটি কীভাবে জানতে পারে যে আমি কী উপাদানটি পরীক্ষা করতে চাই যদি এই ফর্মটিতে এটি কল করে?

any(x > 0 for x in list)

ফাংশন সংজ্ঞা থেকে, আমি কেবল দেখতে পাচ্ছি যে আমি একটি পুনরাবৃত্ত বস্তুটি পার করছি। forলুপ কীভাবে জানতে পারে যে আমি কিছু খুঁজছি > 0?

উত্তর:


164

আপনি যদি ব্যবহার করেন তবে any(lst)দেখুন lstএটি পুনরাবৃত্তিযোগ্য যা কিছু আইটেমের একটি তালিকা a যদি এটিতে থাকে [0, False, '', 0.0, [], {}, None](যার সকলের বুলিয়ান মান রয়েছে False) তবে any(lst)তা হবে False। যদি lstনিম্নলিখিতগুলির মধ্যে [-1, True, "X", 0.00001](যাঁর সকলের কাছে মূল্যায়ন হয় True) থাকে তবে any(lst)তা হবে True

আপনার পোস্ট করা কোডে x > 0 for x in lst, এটি এক ভিন্ন ধরণের পুনরাবৃত্তিযোগ্য, যাকে জেনারেটর এক্সপ্রেশন বলে । পাইথনে জেনারেটর এক্সপ্রেশন যুক্ত হওয়ার আগে আপনি একটি তালিকা উপলব্ধি তৈরি করতে পারবেন যা দেখতে খুব অনুরূপ, তবে আশেপাশের []: এর সাথে [x > 0 for x in lst]। থেকে lstধারণকারী [-1, -2, 10, -4, 20], আপনি এই পেতে হবে ঢুকা তালিকা : [False, False, True, False, True]। এই অভ্যন্তরীণ মানটি anyফাংশনে পাস হবে, যা ফিরে আসবে True, যেহেতু কমপক্ষে একটি Trueমান রয়েছে।

তবে জেনারেটর এক্সপ্রেশন সহ পাইথনকে আর সেই অভ্যন্তরীণ তালিকা তৈরি করতে হবে না True(s)এবং False(s), anyজেনারেটর এক্সপ্রেশন দ্বারা একসাথে উত্পন্ন মানগুলির মাধ্যমে ফাংশনটি পুনরাবৃত্তি হওয়ার সাথে মানগুলি উত্পন্ন হবে। এবং , anyশর্ট সার্কিট থেকে যেহেতু এটি প্রথম Trueমানটি দেখার সাথে সাথে এটি পুনরাবৃত্তি বন্ধ করবে । আপনি যদি (বা আপনি পাইথন 2.x ব্যবহার করছেন ) এর lstমতো কিছু ব্যবহার করে তৈরি করে থাকেন তবে এটি বিশেষত কার্যকর y যদিও এই মত প্রকাশের বিলিয়ন এন্ট্রি উপর তৈরি করবে, শুধুমাত্র যখন এটি পায় তৃতীয় এন্ট্রি হিসেবে যতটা যেতে হবে , যা মূল্যায়ণ জন্য , এবং তাই আসতে পারেন ।lst = range(-1,int(1e9))xrangeany1Truex>0anyTrue

যদি আপনি একটি তালিকা উপলব্ধি তৈরি করে থাকেন তবে পাইথনকে প্রথমে স্মৃতিতে বিলিয়ন-উপাদান তালিকা তৈরি করতে হবে এবং তারপরে এটি পাস করতে হবে any। তবে জেনারেটর এক্সপ্রেশন ব্যবহার করে আপনি পাইথনের বিল্টিন ফাংশনগুলির মতো করতে পারেন anyএবং allএকটি Trueবা Falseমান দেখা যাওয়ার সাথে সাথে তাড়াতাড়ি বেরিয়ে যেতে পারে ।


25
এটি উল্লেখ করার মতো হবে যে any(x > 0 for x in list)এটি কেবল একটি সিনট্যাকটিক চিনি any((x > 0 for x in list))
জর্জি

3
আপনি যোগ করতে কর্তব্য Noneউপাদান যা বুলিয়ান মান তালিকায়False
অলোক মহীশূর

2
@ জর্জে যোগ করা, সিনট্যাকটিক চিনিটি বিশেষ নয় anydef b(x): return x; print b(x > 1 for x in xs) # prints <generator object ..
শিল্পকর্ম

@ জর্জি এই স্পষ্টির জন্য আপনাকে ধন্যবাদ। এটি একটি অত্যন্ত গুরুত্বপূর্ণ পয়েন্ট যা কোনও বন্ধনী সহ কোড টেস্ট করার সময় আমাকে বিভ্রান্ত করেছিল।
মাসায়ো মিউজিক

38
>>> names = ['King', 'Queen', 'Joker']
>>> any(n in 'King and john' for n in names)
True

>>> all(n in 'King and Queen' for n in names)
False

এটি কেবল কোডের কয়েকটি লাইনকে হ্রাস করে। আপনাকে লম্বা কোডটি লিখতে হবে না:

for n in names:
    if n in 'King and john':
       print True
    else:
       print False

23

(x > 0 for x in list) এই ফাংশন কল একটি জেনারেটর এক্সপ্রেশন যেমন তৈরি করে।

>>> nums = [1, 2, -1, 9, -5]
>>> genexp = (x > 0 for x in nums)
>>> for x in genexp:
        print x


True
True
False
True
False

যা anyব্যবহার করে এবং মূল্যায়নের জন্য প্রথম অবজেক্টের মুখোমুখি শর্টকিটTrue


7

কারণ এটি পুনরাবৃত্তিযোগ্য

(x > 0 for x in list)

লক্ষ্য করুন x > 0আয় হয় Trueবা Falseএবং এইভাবে আপনি Booleans একজন iterable আছে।


7

সরলভাবে বলতে গেলে যে কোনও () এটি কাজ করে: শর্ত অনুসারে তালিকার একটি পরিপূর্ণ মানের মুখোমুখি হলেও, এটি সত্য ফিরে আসে, অন্যথায় এটি মিথ্যা প্রত্যাবর্তন করে।

list = [2,-3,-4,5,6]

a = any(x>0 for x in lst)

print a:
True


list = [2,3,4,5,6,7]

a = any(x<0 for x in lst)

print a:
False
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.