পাইথনের কোনও এবং সমস্ত ফাংশন কীভাবে কাজ করে?


225

আমি বুঝতে কিভাবে চেষ্টা করছি any()এবং all()পাইথন বিল্ট-ইন ফাংশান হবে।

আমি টিপলগুলি তুলনা করার চেষ্টা করছি যাতে কোনও মান পৃথক Trueহলে তা ফিরে আসবে এবং যদি সেগুলি একই হয় তবে এটি ফিরে আসবে False। [মিথ্যা, মিথ্যা, মিথ্যা] ফিরিয়ে দেওয়ার জন্য তারা কীভাবে এই ক্ষেত্রে কাজ করছে?

dএকটি defaultdict(list)

print d['Drd2']
# [[1, 5, 0], [1, 6, 0]]
print list(zip(*d['Drd2']))
# [(1, 1), (5, 6), (0, 0)]
print [any(x) and not all(x) for x in zip(*d['Drd2'])]
# [False, False, False]

আমার জ্ঞান অনুযায়ী, এটি আউটপুট করা উচিত

# [False, True, False]

যেহেতু (1,1) একই, (5,6) আলাদা এবং (0,0) একই are

এটি কেন সমস্ত টিপলসকে মিথ্যা বলে মূল্যায়ন করছে?


4
যেকোন (পুনরাবৃত্ত): সত্য সত্য বস্তুর প্রথম মুখোমুখি হলে সত্য প্রত্যাবর্তন করে অন্যথায় মিথ্যা প্রত্যাবর্তন করে। সমস্ত (পুনরাবৃত্ত): মিথ্যা অবজেক্টের প্রথম মুখোমুখি হয়ে ফ্লাস ফেরত দেয় অন্যথায় সত্য হয়।
छाया0359

উত্তর:


374

আপনি যথাক্রমে লজিকাল এবং অপারেটরগুলির সিরিজ হিসাবে anyএবং এটি সম্পর্কে প্রায় চিন্তা করতে পারেন ।allorand

কোন

anyফিরে আসবে Trueযখন কমপক্ষে উপাদানগুলির মধ্যে একটি সত্যবাদী হয়। সত্য মান পরীক্ষা সম্পর্কে পড়ুন

সব

allসমস্ত উপাদান সত্যবাদী Trueহলেই ফিরে আসবে।

সঠিক তালিকা

+-----------------------------------------+---------+---------+
|                                         |   any   |   all   |
+-----------------------------------------+---------+---------+
| All Truthy values                       |  True   |  True   |
+-----------------------------------------+---------+---------+
| All Falsy values                        |  False  |  False  |
+-----------------------------------------+---------+---------+
| One Truthy value (all others are Falsy) |  True   |  False  |
+-----------------------------------------+---------+---------+
| One Falsy value (all others are Truthy) |  True   |  False  |
+-----------------------------------------+---------+---------+
| Empty Iterable                          |  False  |  True   |
+-----------------------------------------+---------+---------+

নোট 1: খালি পুনরাবৃত্তিযোগ্য কেসটি সরকারী ডকুমেন্টেশনে এর মতো ব্যাখ্যা করা হয়েছে

any

Trueপুনরাবৃত্তিযোগ্য কোনও উপাদান সত্য হলে ফিরে আসুন । যদি পুনরাবৃত্তিযোগ্য খালি থাকে তবে ফিরে আসুনFalse

যেহেতু উপাদানগুলির কোনওটিই সত্য নয়, এটি Falseএই ক্ষেত্রে ফিরে আসে ।

all

Trueপুনরাবৃত্তিযোগ্য সমস্ত উপাদান সত্য হলে ( বা যদি পুনরাবৃত্তিযোগ্য খালি থাকে ) ফিরে আসুন ।

যেহেতু উপাদানগুলির কোনওটিই মিথ্যা নয়, এটি Trueএই ক্ষেত্রে ফিরে আসে ।


নোট 2:

আরেকটি গুরুত্বপূর্ণ বিষয় সম্পর্কে জানার anyএবং allতা হ'ল এটি কার্যকরকরণের শর্ট সার্কিট করবে, যে মুহুর্তে তারা ফলাফলটি জানবে। সুবিধাটি হ'ল, পুরো পুনরাবৃত্তিযোগ্য গ্রাস করার প্রয়োজন নেই। উদাহরণ স্বরূপ,

>>> multiples_of_6 = (not (i % 6) for i in range(1, 10))
>>> any(multiples_of_6)
True
>>> list(multiples_of_6)
[False, False, False]

এখানে, (not (i % 6) for i in range(1, 10))একটি জেনারেটর এক্সপ্রেশন যা প্রতীয়মান হয় Trueযদি 1 এবং 9 এর মধ্যে বর্তমান সংখ্যাটি 6 এর একক হয় তবে এটি anyপুনরাবৃত্তি করে multiples_of_6এবং যখন এটি মিলিত হয় তখন এটি 6সত্যবাদী মান খুঁজে পায়, তাই এটি অবিলম্বে ফিরে আসে Trueএবং বাকী অংশটি multiples_of_6পুনরাবৃত্তি হয় না। এটা কি আমরা দেখতে পেলে আমরা ছাপি হয় list(multiples_of_6), ফল 7, 8এবং 9

এই চমৎকার জিনিস খুব চালাকি করে ব্যবহার করা হয় এই উত্তরটি


এই বেসিক বোঝার সাথে, আমরা যদি আপনার কোডটি দেখি তবে আপনি তা করুন

any(x) and not all(x)

যা নিশ্চিত করে যে, সর্বনিম্ন একটি মান সত্যবাদী তবে সেগুলি সব নয়। সে কারণেই এটি ফিরছে [False, False, False]। আপনি যদি সত্যিই উভয় সংখ্যা এক নয় কিনা তা পরীক্ষা করতে চেয়েছিলেন,

print [x[0] != x[1] for x in zip(*d['Drd2'])]

@ অ্যানিওন: যদি খালি তালিকার জন্য এটি সত্য ফিরে আসে তবে কেবল আমার যদি সমস্ত ব্যবহারের প্রয়োজন হয় তবে আমরা কী করব? তালিকার তালিকা খালি থাকলে সত্য দেওয়ার পিছনে যুক্তি আমি বুঝতে পারি না ... এর অর্থ সমস্ত ([]) == সত্য
জাভাসা

1
@ জাভাসা আপনি তালিকাটি খালি কিনা তা আপনি স্পষ্টভাবে পরীক্ষা করতে পারেন। আমি বিশ্বাস করি এরকম কিছু bool(data) and all(...)কাজ করা উচিত।
thefourtheye

43

পাইথন anyএবং allফাংশনগুলি কীভাবে কাজ করে?

anyএবং allপুনরাবৃত্তি গ্রহণ করুন এবং Trueযদি উপাদানগুলির কোনও এবং সমস্ত (যথাক্রমে) থাকে তবে ফিরে আসুন True

>>> any([0, 0.0, False, (), '0']), all([1, 0.0001, True, (False,)])
(True, True)            #   ^^^-- truthy non-empty string
>>> any([0, 0.0, False, (), '']), all([1, 0.0001, True, (False,), {}])
(False, False)                                                #   ^^-- falsey

যদি পুনরাবৃত্তি খালি থাকে তবে anyফিরে আসে Falseএবং allফিরে আসে True

>>> any([]), all([])
(False, True)

আমি প্রদর্শক ছিল allএবং anyআজ ক্লাসে ছাত্রদের জন্য। তারা বেশিরভাগ ফাঁকা পুনরাবৃত্তির জন্য ফেরতের মানগুলি সম্পর্কে বিভ্রান্ত ছিল। এটি এভাবে ব্যাখ্যা করার ফলে প্রচুর লাইটব্লাব চালু হয়েছিল।

শর্টকাটটিং আচরণ

তারা anyএবং allউভয়ই এমন এক অবস্থার সন্ধান করে যা তাদের মূল্যায়ন বন্ধ করতে দেয়। আমি যে প্রথম উদাহরণগুলি দিয়েছি তাদের পুরো তালিকার প্রতিটি উপাদানগুলির জন্য বুলিয়ান মূল্যায়ন করা প্রয়োজন to

(দ্রষ্টব্য যে তালিকার আক্ষরিকটি নিজেই অলসভাবে মূল্যায়ন করা হয় না - আপনি এটি কোনও আইট্রেটারের সাথে পেতে পারেন - তবে এটি কেবল চিত্রিত উদ্দেশ্যে))

এখানে যেকোন এবং সমস্তটির একটি পাইথন বাস্তবায়ন:

def any(iterable):
    for i in iterable:
        if i:
            return True
    return False # for an empty iterable, any returns False!

def all(iterable):
    for i in iterable:
        if not i:
            return False
    return True  # for an empty iterable, all returns True!

অবশ্যই, বাস্তব বাস্তবায়ন সি-তে লিখিত এবং আরও পারফরম্যান্সযুক্ত, তবে আপনি উপরেরটিকে বিকল্প হিসাবে চিহ্নিত করতে এবং এই (বা অন্য কোনও) উত্তরে কোডের জন্য একই ফলাফল পেতে পারেন।

all

allউপাদানগুলির জন্য চেক করে False(যাতে এটি ফিরে আসতে পারে False), তবে Trueসেগুলির কোনওটি না থাকলে এটি ফিরে আসে False

>>> all([1, 2, 3, 4])                 # has to test to the end!
True
>>> all([0, 1, 2, 3, 4])              # 0 is False in a boolean context!
False  # ^--stops here!
>>> all([])
True   # gets to end, so True!

any

পথ anyকাজ এটি উপাদানের জন্য চেক হতে হয় True(তাই এটা আসতে পারেন True), then it returnsমিথ্যা if none of them wereTRUE`।

>>> any([0, 0.0, '', (), [], {}])     # has to test to the end!
False
>>> any([1, 0, 0.0, '', (), [], {}])  # 1 is True in a boolean context!
True   # ^--stops here!
>>> any([])
False   # gets to end, so False!

আমি মনে করি আপনি যদি স্বল্প-বিস্তৃত আচরণের বিষয়টি মাথায় রাখেন তবে আপনি স্বজ্ঞাতভাবে বুঝতে পারবেন যে তারা কোনও সত্য সারণীর উল্লেখ না করে কীভাবে কাজ করে।

প্রমাণ allএবং anyshortcutting:

প্রথমে একটি শোরগোলের_সামগ্রী তৈরি করুন:

def noisy_iterator(iterable):
    for i in iterable:
        print('yielding ' + repr(i))
        yield i

এবং এখন আসুন কেবল আমাদের উদাহরণগুলি ব্যবহার করে তালিকাগুলি শোরগোলের মাধ্যমে পুনরাবৃত্তি করুন:

>>> all(noisy_iterator([1, 2, 3, 4]))
yielding 1
yielding 2
yielding 3
yielding 4
True
>>> all(noisy_iterator([0, 1, 2, 3, 4]))
yielding 0
False

আমরা allপ্রথম ফলস বুলিয়ান চেকের স্টপগুলি দেখতে পারি ।

এবং anyপ্রথম সত্য বুলিয়ান চেক বন্ধ করে দেয়:

>>> any(noisy_iterator([0, 0.0, '', (), [], {}]))
yielding 0
yielding 0.0
yielding ''
yielding ()
yielding []
yielding {}
False
>>> any(noisy_iterator([1, 0, 0.0, '', (), [], {}]))
yielding 1
True

উৎস

উপরেরটি নিশ্চিত করার জন্য উত্সটি দেখুন।

এর উত্সany এখানে :

static PyObject *
builtin_any(PyObject *module, PyObject *iterable)
{
    PyObject *it, *item;
    PyObject *(*iternext)(PyObject *);
    int cmp;

    it = PyObject_GetIter(iterable);
    if (it == NULL)
        return NULL;
    iternext = *Py_TYPE(it)->tp_iternext;

    for (;;) {
        item = iternext(it);
        if (item == NULL)
            break;
        cmp = PyObject_IsTrue(item);
        Py_DECREF(item);
        if (cmp < 0) {
            Py_DECREF(it);
            return NULL;
        }
        if (cmp > 0) {
            Py_DECREF(it);
            Py_RETURN_TRUE;
        }
    }
    Py_DECREF(it);
    if (PyErr_Occurred()) {
        if (PyErr_ExceptionMatches(PyExc_StopIteration))
            PyErr_Clear();
        else
            return NULL;
    }
    Py_RETURN_FALSE;
}

এবং এর উত্সall এখানে :

static PyObject *
builtin_all(PyObject *module, PyObject *iterable)
{
    PyObject *it, *item;
    PyObject *(*iternext)(PyObject *);
    int cmp;

    it = PyObject_GetIter(iterable);
    if (it == NULL)
        return NULL;
    iternext = *Py_TYPE(it)->tp_iternext;

    for (;;) {
        item = iternext(it);
        if (item == NULL)
            break;
        cmp = PyObject_IsTrue(item);
        Py_DECREF(item);
        if (cmp < 0) {
            Py_DECREF(it);
            return NULL;
        }
        if (cmp == 0) {
            Py_DECREF(it);
            Py_RETURN_FALSE;
        }
    }
    Py_DECREF(it);
    if (PyErr_Occurred()) {
        if (PyErr_ExceptionMatches(PyExc_StopIteration))
            PyErr_Clear();
        else
            return NULL;
    }
    Py_RETURN_TRUE;
}

1
দ্রষ্টব্য: এটি গণিতের পূর্বাভাসের সাথে সামঞ্জস্যপূর্ণ: "সকলের জন্য" এবং "এটি বিদ্যমান"। বিভ্রান্তির হতে পারে "সবার জন্য" এবং "কোনো" অন্যান্য প্রসঙ্গে প্রতিশব্দের ... হয় en.wikipedia.org/wiki/List_of_logic_symbols
mcoolive

1
@ থানোস.এ এতে রয়েছে Python/bltinmodule.c- আমি এটি উপরেরটিতে যুক্ত করেছি।
অ্যারন হল

13

আমি জানি এটি পুরানো, তবে আমি ভেবেছিলাম যে কোডগুলিতে এই ফাংশনগুলি কেমন দেখাচ্ছে তা দেখাতে এটি সহায়ক হতে পারে। এটি যুক্তিটি সত্যই টেক্সট বা একটি টেবিল আইএমওর চেয়ে ভাল চিত্রিত করে। বাস্তবে এগুলি খাঁটি পাইথনের পরিবর্তে সি তে প্রয়োগ করা হয় তবে এগুলি সমান।

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

def all(iterable):
    for item in iterable:
        if not item:
            return False
    return True

বিশেষত, আপনি দেখতে পাচ্ছেন যে খালি পুনরাবৃত্তির জন্য ফলাফলটি কেবল প্রাকৃতিক ফলাফল, কোনও বিশেষ ক্ষেত্রে নয়। আপনি সংক্ষিপ্ত-সার্কিট আচরণও দেখতে পারেন; সেখানে শর্ট সার্কিট না হওয়ার জন্য এটি আরও কাজ করবে ।

গাইডো van Rossum (পাইথন স্রষ্টার) যখন প্রথম যোগ প্রস্তাবিত any()এবংall() তিনি তাদের শুধু ঠিক কোডের উপরে স্নিপেট পোস্ট করে ব্যাখ্যা।


9

প্রশ্ন বলছি কোড সম্পর্কে আমার উত্তর দেওয়া থেকে আসে এখানে । এটি একাধিক বিট অ্যারের তুলনা করার সমস্যা সমাধানের উদ্দেশ্যে করা হয়েছিল - অর্থাত্ সংগ্রহ 1এবং 0

anyএবং allদরকারী যখন আপনি মানগুলির "সত্যতা" - যেমন বুলিয়ান প্রসঙ্গে তাদের মান নির্ভর করতে পারেন। 1 হ'ল Trueএবং 0 হ'ল Falseএকটি সুবিধাগুলি যা উত্তরটি উত্তর দিয়েছিল। ৫ টি হ'ল Trueতাই, যখন আপনি এটি আপনার সম্ভাব্য ইনপুটগুলিতে মিশ্রিত করবেন ... ভাল। কাজ করে না।

পরিবর্তে আপনি এর মতো কিছু করতে পারেন:

[len(set(x)) == 1 for x in zip(*d['Drd2'])]

এটিতে পূর্ববর্তী উত্তরের নান্দনিকতার অভাব রয়েছে (আমি সত্যিই এর চেহারা পছন্দ করেছি any(x) and not all(x)) তবে এটি কাজটি সম্পন্ন করে।


কলবার্টের প্রভাব সিএস / সিই পৌঁছেছে: en.wikedia.org/wiki/Truthiness ? আমরা কি অস্পষ্ট যুক্তি কথা বলছি? : ডি
জিওফ সাওয়ায়া

8
>>> any([False, False, False])
False
>>> any([False, True, False])
True
>>> all([False, True, True])
False
>>> all([True, True, True])
True


1

ধারণাটি সহজ:

M =[(1, 1), (5, 6), (0, 0)]

1) print([any(x) for x in M])
[True, True, False] #only the last tuple does not have any true element

2) print([all(x) for x in M])
[True, True, False] #all elements of the last tuple are not true

3) print([not all(x) for x in M])
[False, False, True] #NOT operator applied to 2)

4) print([any(x)  and not all(x) for x in M])
[False, False, False] #AND operator applied to 1) and 3)
# if we had M =[(1, 1), (5, 6), (1, 0)], we could get [False, False, True]  in 4)
# because the last tuple satisfies both conditions: any of its elements is TRUE 
#and not all elements are TRUE 

0
list = [1,1,1,0]
print(any(list)) # will return True because there is  1 or True exists
print(all(list)) # will return False because there is a 0 or False exists
return all(a % i for i in range(3, int(a ** 0.5) + 1)) # when number is divisible it will return False else return True but the whole statement is False .
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.