যদি একটি বিবৃতিতে পাইথনের সমতুল্য &&& (যৌক্তিক-এবং)


827

আমার কোডটি এখানে:

def front_back(a, b):
  # +++your code here+++
  if len(a) % 2 == 0 && len(b) % 2 == 0:
    return a[:(len(a)/2)] + b[:(len(b)/2)] + a[(len(a)/2):] + b[(len(b)/2):] 
  else:
    #todo! Not yet done. :P
  return

আমি একটি ত্রুটি পেয়ে করছি যদি শর্তাধীন।
আমি কি ভুল করছি?


10
স্পষ্টতই সার্জিও তাঁর কোডটি কেন ভেঙে গেছে তা জানতে চেয়েছিলেন, তবে আমি প্রশ্নের শিরোনামে আরও কিছুটা পড়েছি। কেন & কেন যেভাবে পাওয়া যায় না? == এবং! = উপলভ্য (তবে এটির চেয়ে আলাদা এবং আমি জানি)। এই সিনট্যাক্সটি কেন অন্তর্ভুক্ত করবেন না? ব্যক্তিগত পছন্দ?
পদার্থবিজ্ঞান

5
@ ভিজিএম :৪: রিডান্ট্যান্ট সিনট্যাক্সকে কেন অন্তর্ভুক্ত করুন যা একটি দিকের উন্নতি করে না?
কনরাড রুডল্ফ

27
আমার কাছে মনে হয়েছে যে দোভাষীকে একটি ক্রিপ্টিক "সিনট্যাক্স এরিয়ার: অবৈধ সিনট্যাক্স" প্রিন্ট না করে সনাক্ত করা উচিত - ব্যবহারকারী সনাক্ত করেছেন &&এবং তাদের পরামর্শ দিয়েছেন যে andপরিবর্তে তারা কীওয়ার্ডটি ব্যবহার করতে চান । একই ++ভাষা এবং অন্যান্য ভাষা থেকে অন্যান্য সাধারণ অপারেটরগুলির জন্য যায় ।
আর্টঅফ ওয়ারফেয়ার

3
@ ফিজিক্সমিক্যাল "এটির করার সুস্পষ্ট উপায় কেবল একটিই হওয়া উচিত fe import this
নিক টি টি

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

উত্তর:


1468

আপনি andবরং চাইবেন &&


2
এর জন্য আমার কী করা উচিত: যদি x == 'n' এবং y == 'a' বা y == 'বি': <কিছু করুন> এটি কি কাজ করবে !? @ChristopheD
diffracteD

7
@ ডিফ্রেটডিডি: আপনি যদি স্ট্যান্ডার্ড অপারেটর অগ্রাধিকারকে ওভাররাইড করতে চান তবে প্রথম বন্ধনী ব্যবহার করুন (যা আপনি এখানে শিখতে পারেন: ibiblio.org/g2swap/byteofpython/read/operator-precedence.html )
ক্রিস্টোফিড 21

3
আমি পছন্দ করি যে ডেভিড টাইটারেন্সো একটি কাট-এন-পেস্টের উদাহরণ দিয়েছেন
অ্যালেক্সেক্স রোচে

7
আমি উভয় টাইপ করার পরে এখানে পৌঁছেছি &&এবং ANDএকটি ত্রুটি পেয়েছি (পাইথনটি ছোট হাতের শব্দটি চাইবে না বলে আশা করি না and)।
জিওনক্রস

2
আমার মনে হয় আপনি ব্যবহার & দেখুন উচিত: stackoverflow.com/questions/36921951/...
user1761806

229

পাইথন ব্যবহার করে andএবং orশর্তযুক্ত।

অর্থাত

if foo == 'abc' and bar == 'bac' or zoo == '123':
  # do something

5
ভুলে যাবেন না যে অজগরটিরও নেই (ভাল, এবং!)
ইন্সপেক্টর

9
আপনার উদাহরণটি "(যদি এটি এবং এটি) বা" OR "যদি এটি এবং (এটি বা এটি)" মূল্যায়ন করে?
জেফ

12
@ জেফ আপনার প্রথম উপায় and এর চেয়ে বেশি অগ্রাধিকার রয়েছে or
বুগ

1
@ বুগ দেখে মনে হচ্ছে আপনি যে টেবিলটি সংযুক্ত করেছেন তাতে "বা" উচ্চতর উপরে রয়েছে
ম্যাট

5
@ ম্যাট টেবিলটি সর্বনিম্ন নজরে থেকে সর্বোচ্চে চলে যায়। যদি আপনি বুলিয়ান বীজগণিত অধ্যয়ন করেন তবে এর নজিরটি মনে রাখা সহজ; "বা" সংযোজন এবং "এবং" হ'ল গুণ।
মাইকেল স্ট্রাউড

48

শর্তসাপেক্ষে আমি একটি ত্রুটি পাচ্ছি। আমি কি ভুল করছি?

আপনি যেটি পেয়েছেন তার কারণ পাইথনে SyntaxErrorকোনও &&অপারেটর নেই । অনুরূপভাবে ||এবং !হয় বৈধ নয় পাইথন অপারেটর।

আপনি অন্যান্য ভাষাগুলি থেকে জানতে পারেন এমন কিছু অপারেটরের পাইথনের আলাদা নাম রয়েছে। লজিকাল অপারেটর &&এবং ||প্রকৃতপক্ষে বলা হয় andএবং or। তেমনি লজিকাল নেগেশন অপারেটর !বলা হয় not

সুতরাং আপনি শুধু লিখতে পারে:

if len(a) % 2 == 0 and len(b) % 2 == 0:

অথবা এমনকি:

if not (len(a) % 2 or len(b) % 2):

কিছু অতিরিক্ত তথ্য (এটি কার্যকর হতে পারে):

আমি এই টেবিলটিতে অপারেটর "সমতুল্য" সংক্ষেপিত করেছি:

+------------------------------+---------------------+
|  Operator (other languages)  |  Operator (Python)  |
+==============================+=====================+
|              &&              |         and         |
+------------------------------+---------------------+
|              ||              |         or          |
+------------------------------+---------------------+
|              !               |         not         |
+------------------------------+---------------------+

আরও দেখুন পাইথন ডকুমেন্টেশন: 6.11। বুলিয়ান অপারেশন

লজিকাল অপারেটর ছাড়াও পাইথনের বিটওয়াইজ / বাইনারি অপারেটর রয়েছে:

+--------------------+--------------------+
|  Logical operator  |  Bitwise operator  |
+====================+====================+
|        and         |         &          |
+--------------------+--------------------+
|         or         |         |          |
+--------------------+--------------------+

পাইথনে কোনও বিটওয়াইজ অবহেলা নেই (কেবল বিটওয়াস ইনভার্স অপারেটর ~- তবে এটি সমান নয়not )।

6.6 দেখুন অ্যানারি গণিত এবং বিটওয়াইজ / বাইনারি অপারেশন এবং 7.7। বাইনারি গাণিতিক অপারেশন

লজিকাল অপারেটরগুলির (অন্যান্য অনেক ভাষায়) এর সুবিধা রয়েছে যে এগুলি সংক্ষিপ্ত প্রচারিত। এর অর্থ যদি প্রথম অপারেন্ড ইতিমধ্যে ফলাফলটি সংজ্ঞায়িত করে, তবে দ্বিতীয় অপারেটরটি মোটেও মূল্যায়ন করা হয় না।

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

>>> def print_and_return(value):
...     print(value)
...     return value

>>> res = print_and_return(False) and print_and_return(True)
False

আপনি দেখতে পাচ্ছেন যে কেবলমাত্র একটি মুদ্রণ বিবৃতি কার্যকর করা হয়েছে, তাই পাইথন সত্যিকার অর্থে সঠিক অপারেণ্ডের দিকেও তাকাননি।

বাইনারি অপারেটরদের ক্ষেত্রে এটি হয় না। যারা সর্বদা উভয় অপারেশনকে মূল্যায়ন করে:

>>> res = print_and_return(False) & print_and_return(True);
False
True

তবে যদি প্রথম অপারেন্ডটি পর্যাপ্ত না হয় তবে অবশ্যই দ্বিতীয় অপারেটরটি মূল্যায়ন করা হয়:

>>> res = print_and_return(True) and print_and_return(False);
True
False

এটি সংক্ষেপে এখানে অন্য সারণি:

+-----------------+-------------------------+
|   Expression    |  Right side evaluated?  |
+=================+=========================+
| `True` and ...  |           Yes           |
+-----------------+-------------------------+
| `False` and ... |           No            |
+-----------------+-------------------------+
|  `True` or ...  |           No            |
+-----------------+-------------------------+
| `False` or ...  |           Yes           |
+-----------------+-------------------------+

Trueএবং Falseপ্রতিনিধিত্ব কি bool(left-hand-side), তারা হতে হবে না আয় Trueবা Falseতারা শুধু ফিরে করতে হবে, Trueঅথবা Falseযখন boolতাদের (1) তে বলা হয়।

সুতরাং সিউডো কোডে (!) এ andএবং orফাংশনগুলি এগুলির মতো কাজ করে:

def and(expr1, expr2):
    left = evaluate(expr1)
    if bool(left):
        return evaluate(expr2)
    else:
        return left

def or(expr1, expr2):
    left = evaluate(expr1)
    if bool(left):
        return left
    else:
        return evaluate(expr2)

দ্রষ্টব্য যে এটি সিউডো কোড নয় পাইথন কোড। পাইথন আপনি ফাংশন বলা তৈরি করতে পারবেন না andবা orকারণ এই কীওয়ার্ড আছে। এছাড়াও আপনার কখনই "মূল্যায়ন" বা ব্যবহার করা উচিত নয় if bool(...)

আপনার নিজের ক্লাসের আচরণ কাস্টমাইজ করা

এই অন্তর্নিহিত boolকল কাস্টমাইজ কিভাবে আপনার ক্লাস সঙ্গে আচরণ ব্যবহার করা যেতে পারে and, orএবং not

এটি কীভাবে কাস্টমাইজ করা যায় তা দেখানোর জন্য আমি এই ক্লাসটি ব্যবহার করছি যা আবার printঘটছে তা ট্র্যাক করার জন্য কিছু:

class Test(object):
    def __init__(self, value):
        self.value = value

    def __bool__(self):
        print('__bool__ called on {!r}'.format(self))
        return bool(self.value)

    __nonzero__ = __bool__  # Python 2 compatibility

    def __repr__(self):
        return "{self.__class__.__name__}({self.value})".format(self=self)

সুতরাং আসুন দেখুন এই অপারেটরের সাথে সম্মিলন করে সেই শ্রেণীর সাথে কী ঘটে:

>>> if Test(True) and Test(False):
...     pass
__bool__ called on Test(True)
__bool__ called on Test(False)

>>> if Test(False) or Test(False):
...     pass
__bool__ called on Test(False)
__bool__ called on Test(False)

>>> if not Test(True):
...     pass
__bool__ called on Test(True)

যদি আপনার কোনও __bool__পদ্ধতি না থাকে তবে পাইথন এটিও পরীক্ষা করে দেখায় যে কোনও বস্তুর কোনও __len__পদ্ধতি আছে এবং যদি এটি শূন্যের চেয়ে বেশি মান দেয়। আপনি সিকোয়েন্স পাত্রে তৈরি করার ক্ষেত্রে এটি জেনে রাখা কার্যকর হতে পারে।

এছাড়াও দেখুন 4.1। সত্য মান পরীক্ষা

NumPy অ্যারে এবং সাবক্লাস

সম্ভবত আসল প্রশ্নের ক্ষেত্রের বাইরে কিছুটা হলেও আপনি যদি NumPy অ্যারে বা সাবক্লাস (যেমন পান্ডা সিরিজ বা ডেটা ফ্রেমস) এর সাথে কাজ করছেন তবে অন্তর্নিহিত boolকলটি ভয়ঙ্কর উত্থাপন করবে ValueError:

>>> import numpy as np
>>> arr = np.array([1,2,3])
>>> bool(arr)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> arr and arr
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

>>> import pandas as pd
>>> s = pd.Series([1,2,3])
>>> bool(s)
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> s and s
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

এই ক্ষেত্রে আপনি NumPy থেকে যৌক্তিক এবং ফাংশনটি ব্যবহার করতে পারেন যা একটি উপাদান-ভিত্তিক and(বা or) সম্পাদন করে :

>>> np.logical_and(np.array([False,False,True,True]), np.array([True, False, True, False]))
array([False, False,  True, False])
>>> np.logical_or(np.array([False,False,True,True]), np.array([True, False, True, False]))
array([ True, False,  True,  True])

আপনি যদি কেবল বুলিয়ান অ্যারে ব্যবহার করে থাকেন তবে আপনি বাইনারি অপারেটরগুলিও নুমপাইয়ের সাহায্যে ব্যবহার করতে পারেন, এগুলি উপাদান-ভিত্তিক (তবে বাইনারি) তুলনাও করে:

>>> np.array([False,False,True,True]) & np.array([True, False, True, False])
array([False, False,  True, False])
>>> np.array([False,False,True,True]) | np.array([True, False, True, False])
array([ True, False,  True,  True])

(1)

যে booloperands এই কল আসতে হয়েছে Trueবা Falseসম্পূর্ণরূপে সঠিক নয়। এটি কেবল প্রথম অপারেন্ড যার __bool__পদ্ধতিতে একটি বুলিয়ান ফিরিয়ে আনতে হবে :

class Test(object):
    def __init__(self, value):
        self.value = value

    def __bool__(self):
        return self.value

    __nonzero__ = __bool__  # Python 2 compatibility

    def __repr__(self):
        return "{self.__class__.__name__}({self.value})".format(self=self)

>>> x = Test(10) and Test(10)
TypeError: __bool__ should return bool, returned int
>>> x1 = Test(True) and Test(10)
>>> x2 = Test(False) and Test(10)

কারণ andপ্রথম অপারেন্ডটি যদি প্রথম অপারেন্ডকে মূল্যায়ন করে Falseএবং যদি এটি মূল্যায়ন করে Trueতবে এটি দ্বিতীয় অপারেন্ডকে ফেরত দেয়:

>>> x1
Test(10)
>>> x2
Test(False)

একইভাবে orতবে চারপাশে কেবল অন্যভাবে:

>>> Test(True) or Test(10)
Test(True)
>>> Test(False) or Test(10)
Test(10)

তবে আপনি যদি কোনও ifবিবৃতিতে এগুলি ব্যবহার করেন তবে ifফলাফলটিও স্পষ্টতই কল করবে bool। সুতরাং এই সূক্ষ্ম পয়েন্টগুলি আপনার পক্ষে প্রাসঙ্গিক নাও হতে পারে।


36

দুটি মন্তব্য:

  • পাইথনে লজিকাল অপারেশনের জন্য andএবং orব্যবহার করুন ।
  • 2 এর পরিবর্তে 4 টি স্পেন ব্যবহার করুন You আরও তথ্যের জন্য পিইপি 8 দেখুন ।

10

আপনি সি এবং সি ++ এর মতো যৌক্তিক ক্রিয়াকলাপগুলি ব্যবহার andএবংor করতে to ভালো লেগেছে আক্ষরিক andহয় &&এবং orহয়||


এই মজাদার উদাহরণটি একবার দেখুন,

বলুন আপনি পাইথনে লজিক গেটগুলি তৈরি করতে চান:

def AND(a,b):
    return (a and b) #using and operator

def OR(a,b):
    return (a or b)  #using or operator

এখন তাদের কল করার চেষ্টা করুন:

print AND(False, False)
print OR(True, False)

এটি আউটপুট দেবে:

False
True

আশাকরি এটা সাহায্য করবে!


9

আমি একটি সম্পূর্ণ গাণিতিক সমাধান নিয়ে গিয়েছিলাম:

def front_back(a, b):
  return a[:(len(a)+1)//2]+b[:(len(b)+1)//2]+a[(len(a)+1)//2:]+b[(len(b)+1)//2:]

7
এটি প্রকৃত প্রশ্নের উত্তর নয়।
ম্যাথু

5

সম্ভবত এই কাজের জন্য এটি সেরা কোড নয়, তবে কাজ করছে -

def front_back(a, b):

 if len(a) % 2 == 0 and len(b) % 2 == 0:
    print a[:(len(a)/2)] + b[:(len(b)/2)] + a[(len(a)/2):] + b[(len(b)/2):]

 elif len(a) % 2 == 1 and len(b) % 2 == 0:
    print a[:(len(a)/2)+1] + b[:(len(b)/2)] + a[(len(a)/2)+1:] + b[(len(b)/2):] 

 elif len(a) % 2 == 0 and len(b) % 2 == 1:
     print a[:(len(a)/2)] + b[:(len(b)/2)+1] + a[(len(a)/2):] + b[(len(b)/2)+1:] 

 else :
     print a[:(len(a)/2)+1] + b[:(len(b)/2)+1] + a[(len(a)/2)+1:] + b[(len(b)/2)+1:]

-3

একটি একক &(দ্বিগুণ নয় &&) যথেষ্ট বা শীর্ষ উত্তর হিসাবে আপনি 'এবং' ব্যবহার করতে পারবেন বলে পরামর্শ দেওয়া হয়েছে। আমি এটি পান্ডাতেও পেয়েছি

cities['Is wide and has saint name'] = (cities['Population'] > 1000000) 
& cities['City name'].apply(lambda name: name.startswith('San'))

আমরা যদি "এবং" এর সাথে "এবং" প্রতিস্থাপন করি তবে এটি কার্যকর হবে না।


1
একক এবং এক্সপ্রেশনটি সংক্ষিপ্ত-সার্কিট করবে না (যার অর্থ প্রথম প্রকাশের ফেরতের মূল্য নির্বিশেষে তারা উভয়ই মূল্যায়ন করা হবে)
ব্যবহারকারী ৫২৮০২২

-4

সম্ভবত & এর পরিবর্তে% এর চেয়ে আরও দ্রুত এবং ম্যানটেন পঠনযোগ্যতা

অন্যান্য পরীক্ষা এমনকি / বিজোড়

এক্স কি সমান? x% 2 == 0

এক্স কি বিজোড়? x% 2 == 0 নয়

সম্ভবত বিটওয়াইস এবং 1 এর সাথে আরও স্পষ্ট

এক্স কি বিজোড়? এক্স এবং 1

এক্স কি সমান? এক্স ও 1 নয় (বিজোড় নয়)

def front_back(a, b):
    # +++your code here+++
    if not len(a) & 1 and not len(b) & 1:
        return a[:(len(a)/2)] + b[:(len(b)/2)] + a[(len(a)/2):] + b[(len(b)/2):] 
    else:
        #todo! Not yet done. :P
    return

-4

শর্তাধীন "এবং" এর ব্যবহার। বৃহত্তর নোটবুক আমদানি করার সময় আমি প্রায়শই এটি ব্যবহার করি:

def find_local_py_scripts():
    import os # does not cost if already imported
    for entry in os.scandir('.'):
        # find files ending with .py
        if entry.is_file() and entry.name.endswith(".py") :
            print("- ", entry.name)
find_local_py_scripts()

-  googlenet_custom_layers.py
-  GoogLeNet_Inception_v1.py

14
এই প্রশ্নটি জিজ্ঞাসা করা হয়েছিল এবং প্রায় 7 বছর আগে উত্তর দেওয়া হয়েছিল। আপনার উত্তরটি ইতিমধ্যে এখানে থাকা উত্তরগুলিতে কী যুক্ত করে? সাধারণভাবে, যদি বলার মতো চমকপ্রদভাবে আপনার কাছে নতুন কিছু না থাকে তবে আপনার পুরানো প্রশ্নের কোনও নতুন উত্তর যুক্ত করা উচিত নয় - যেখানে পুরানোটি একাধিক বছর হিসাবে পরিমাপ করা হয় - যখন ইতিমধ্যে ভাল উত্তর পাওয়া যায়।
জোনাথন লেফলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.