Kurzusok
/
Python
Python
/
Tanterv
/
Összehasonlítások
Ös

Összehasonlítások ebben a kurzusban: Python

7 feladat

A(z) Összehasonlítások fogalomról

A Pythonban az összehasonlító operátor (más néven relációs operátor) két operandus értékét vizsgálja, és Boolean True vagy False értéket ad vissza aszerint, hogy a comparison feltétel teljesül-e vagy sem.

Az alábbi táblázat a leggyakoribb összehasonlító operátorokat mutatja be a Pythonban:

Operátor Művelet Leírás
> „nagyobb, mint” a > b akkor True, ha a értéke szigorúan nagyobb, mint b értéke
< „kisebb, mint” a < b akkor True, ha a értéke szigorúan kisebb, mint b értéke
== „egyenlő” a == b akkor True, ha a értéke szigorúan egyenlő b értékével
>= „nagyobb vagy egyenlő” a >= b akkor True, ha a > b VAGY a == b
<= „kisebb vagy egyenlő” a <= b akkor True, ha a < b vagy a == b
!= „nem egyenlő” a != b akkor True, ha a == b értéke False
is „azonosság” a is b akkor True, ha és csakis akkor, ha a és b ugyanaz az objektum
is not „tagadott azonosság” a is not b akkor True, ha és csakis akkor, ha a és b nem ugyanaz az objektum
in „tartalmazásvizsgálat” a in b akkor True, ha a tagja, részhalmaza vagy eleme b-nek
not in „tagadott tartalmazásvizsgálat” a not in b akkor True, ha a nem tagja, részhalmaza vagy eleme b-nek

Mindegyikük azonos prioritású (ez magasabb, mint a Boolean-műveleteké, de alacsonyabb, mint az aritmetikai vagy bitenkénti műveleteké).

Összehasonlítás különböző adattípusok között

A különböző típusú objektumok (a numerikus típusok kivételével) alapértelmezés szerint soha nem lesznek egyenlők. Egy class nem azonos példányai szintén nem számítanak egyenlőnek, hacsak a class nem definiál speciális gazdag összehasonlító metódusokat, amelyek testre szabják az object alapértelmezett összehasonlítási viselkedését. Ennél (sokkal) részletesebb leírásért lásd az Értékek összehasonlítása szakaszt a Python dokumentációjában.

A numerikus típusok (többnyire) kivételt képeznek ez alól a típusegyeztetési szabály alól. Egy integer egyenlőnek tekinthető egy float típussal (vagy egy octal egy hexadecimal típussal), amennyiben a típusok az összehasonlításhoz implicit módon átalakíthatók.

A többi numerikus típusnál (complex, decimal, fractions) az összehasonlító operátorok ott vannak definiálva, ahol „van értelmük” (ahol az implicit átalakítás nem változtatja meg az eredményt), de TypeError hibát dobnak, ha a mögöttes objektumok nem alakíthatók pontosan át az összehasonlításhoz. A numerikus átalakítás szabályairól, amelyeket a Python használ, bővebben az aritmetikai átalakítások szakaszban olvashatsz a Python dokumentációjában.

>>> import fractions

# A string cannot be converted to an int.
>>> 17 == '17'
False

# An int can be converted to float for comparison.
>>> 17 == 17.0
True

# The fraction 6/3 can be converted to the int 2
# The int 2 can be converted to 0b10 in binary.
>>> 6/3 == 0b10
True

# An int can be converted to a complex 
# number with a 0 imaginary part.
>>> 17 == complex(17)
True

# The fraction 2/5 can be converted to the float 0.4
>>> 0.4 == 2/5
True

>>> complex(2/5, 1/2) == complex(0.4, 0.5)
True

Ha egy számot rendezés szerint összehasonlítasz egy NaN (nem szám) típussal, az eredmény False lesz. A NaN Python-beli definíciójának zavarba ejtő mellékhatása, hogy a NaN soha nem egyenlő önmagával. Ha kíváncsi vagy rá, miért definiálták a NaN-t így a Pythonban, ez a Stack Overflow-poszt a NaN-ról a nemzetközi szabvány megalkotásáról érdekes olvasmány.

>>> x = float('NaN')

>>> 3 < x
False

>>> x < 3
False

# NaN never compares equal to NaN
>>> x == x
False

Stringek összehasonlítása

A stringeket (str) lexikográfiailag hasonlítjuk össze, az egyedi Unicode-kódpontjaik alapján (amit úgy kapunk, hogy a str minden kódpontját átadjuk a beépített ord() függvénynek, amely egy int értéket ad vissza). Ha a két string összes kódpontja megegyezik, és ugyanabban a sorrendben követik egymást, a két string egyenlőnek számít. Ez az összehasonlítás „páronkénti” módon történik: elsőt az elsővel, másodikat a másodikkal, és így tovább. A Python 3.x-ben a str és a bytes nem konvertálható és nem hasonlítható össze közvetlenül.

>>> 'Python' > 'Rust'
False

>>> 'Python' > 'JavaScript'
True

# Examples with Mandarin.
# hello < goodbye
>>> '你好' < '再见'
True

# ord() of first characters
>>> ord('你'), ord('再')
(20320, 20877)

# ord() of second characters
>>> ord('好'), ord('见')
(22909, 35265)

# And with Korean words.
# Pretty < beautiful.
>>> '예쁜' < '아름다운'
False

>>> ord('예'), ord('아')
(50696, 50500)

Konténer adattípusok összehasonlítása

A konténer adattípusok (lists, tuples, sets, dicts stb.) szintén lexikográfiailag hasonlítódnak össze: akkor egyenlők, ha mindkét konténer ugyanazokat az adatokat és ugyanazokat az adattípusokat tartalmazza (lists és tuples esetén a sorrendjüknek is meg kell egyeznie), egyébként nem egyenlők.

>>> [1, 2] == [1, 2]
True

# But if the data is not in the same order, they are not equal.
>>> [2, 1] == [1, 2]
False

# The same holds true for tuples
>>> (3,4,5) == (5,4,3)
False

# Length is also compared
>>> [1, 2] < [1, 2, 3]
True

# Comparing dicts
>>> {'name': 'John', 'age': 19} == {'name': 'John', 'age': 18}
False

>>> {'name': 'John', 'age': 19} == {'name': 'John', 'age': 19}
True

Összehasonlítások láncolása

Az összehasonlító operátorok tetszőlegesen láncolhatók. Fontos, hogy egy kifejezés kiértékelése left-tól right felé halad. Például az x < y <= z egyenértékű az x < y and y <= z kifejezéssel, azzal a kivétellel, hogy y csak egyszer kerül kiértékelésre. Mindkét esetben z egyáltalán nem kerül kiértékelésre, ha x < y értéke False. Ezt gyakran short-circuit evaluation-nek nevezik: a kiértékelés leáll, ha a kifejezés igazságértéke már megállapítható.

A Short circuiting-et több Boolean-operátor és függvény támogatja, valamint a Pythonban az összehasonlítások láncolása is. Sok más programozási nyelvtől eltérően, többek között a C, C++, C# és Java nyelvtől, a Pythonban az a < b < c-hez hasonló láncolt kifejezéseknek hagyományos matematikai értelmezése és precedenciája van.

>>> x = 2
>>> y = 5
>>> z = 10

>>> x < y < z
True

>>> x < y > z
False

>>> x > y < z
False

Azonosság-összehasonlítások

Az is és az is not operátor egy objektum azonosságát vizsgálja, szemben az objektum értékével. Egy objektum azonossága a létrehozása után soha nem változik, és az id() függvénnyel deríthető ki.

A <apple> is <orange> akkor True, ha és csakis akkor, ha id(<apple>) == id(<orange>). A <apple> is not <orange> ennek az ellenkezőjét adja.

Mivel egyedi (singleton) értékek, a None és a NotImplemented összehasonlításához mindig az is és az is not operátort használd. Erről a konvencióról bővebben a Python referenciadokumentációjának értékek összehasonlítása szakaszában és a PEP8 útmutatóban olvashatsz.


# A list of favorite numbers.
>>> my_fav_numbers = [1, 2, 3]

>>> your_fav_numbers = my_fav_numbers

>>> my_fav_numbers is your_fav_numbers
True

# The returned id will differ by system and Python version.
>>> id(my_fav_numbers)
4517478208

# your_fav_numbers is only an alias pointing to the original my_fav_numbers object.
# Assigning a new name does not create a new object.
>>> id(your_fav_numbers)
4517478208


>>> my_fav_numbers is not your_fav_numbers
False

>>> my_fav_numbers is not None
True

>>> my_fav_numbers is NotImplemented
False

Tagságvizsgálatok

Az in és a not in operátor a tagságot vizsgálja. A <fish> in <soup> akkor True, ha <fish> tagja <soup>-nak (azaz ha <fish> részhalmaza <soup>-nak, vagy benne foglaltatik), egyébként False. A <fish> not in <soup> a tagadását, vagyis a <fish> in <soup> ellentétét adja vissza.

String- és bytes-típusok esetén a <name> in <fullname> akkor True, ha és csakis akkor, ha <name> részstringje a <fullname>-nek.


# A set of lucky numbers.
>>> lucky_numbers = {11, 22, 33}
>>> 22 in lucky_numbers
True

>>> 44 in lucky_numbers
False

# A dictionary of employee information.
>>> employee = {'name': 'John Doe', 'id': 67826, 'age': 33, 'title': 'ceo'}

# Checking for the membership of certain keys.
>>> 'age' in employee
True

>>> 33 in employee
False

>>> 'lastname' not in employee
True

# Checking for substring membership
>>> name = 'Super Batman'
>>> 'Bat' in name
True

>>> 'Batwoman' in name
False

Az objektumok összehasonlítási viselkedése a rich comparison methods implementálásával szabható testre. További információért lásd a Python Tutorial: osztályok, a Python-osztályok és mágikus metódusok (Dan Bader) és a Speciális metódusnevek oldalt.

Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg

Tanuld meg a(z) Összehasonlítások fogalmat

A gyakorlás zárolva

Oldj fel még 4 feladatot, hogy gyakorolhasd a(z) Összehasonlítások fogalmat