Python'un gizli özellikleri [kapalı]


1419

Python programlama dilinin daha az bilinen ama yararlı özellikleri nelerdir?

  • Cevapları Python çekirdeğine sınırlamaya çalışın.
  • Yanıt başına bir özellik.
  • Yalnızca belgelere bir bağlantı değil, özelliğin bir örneğini ve kısa bir açıklamasını verin.
  • İlk satır olarak bir başlık kullanarak özelliği etiketleyin.

Yanıtlara hızlı bağlantılar:

Yanıtlar:


740

Zincirleme karşılaştırma operatörleri:

>>> x = 5
>>> 1 < x < 10
True
>>> 10 < x < 20 
False
>>> x < 10 < x*10 < 100
True
>>> 10 > x <= 9
True
>>> 5 == x > 4
True

Yaptığını düşünüyorsanız 1 < x, hangi olarak ortaya çıkıyor Trueve sonra da karşılaştırıyor True < 10, ki o da Truehayır, o zaman gerçekten bu değil (son örneğe bakın.) Gerçekten çeviriyor 1 < x and x < 10ve x < 10 and 10 < x * 10 and x*10 < 100daha az yazarak ve her biri terim sadece bir kez değerlendirilir.


121
Bu çok yardımcı oldu. Tüm diller için standart olmalıdır. Ne yazık ki öyle değil.
08:23, stalepretzel

8
yanlış döndüren bazı örnekler eklemeniz gerekir. gibi >>> 10 <x <20 Yanlış
ShoeLace

19
Bu, diğer karşılaştırma operatörleri için de geçerlidir, bu yüzden insanlar bazen ([5] 'de 5 doğrudur) gibi kodun neden yanlış olduğu konusunda şaşırırlar (ancak başlamak için böyle boolean'lara karşı açıkça test etmek unpythonic).
Miles

19
İyi ama 'in' ve '=' gibi eşit prize dikkat edin. 'B'deki A == C'deki A', beklenmedik olabilecek '(B'deki A) ve (B == C) ve (D'deki C)' anlamına gelir.
Charles Merriam

15
Azafe: Lisp'in karşılaştırmaları doğal olarak bu şekilde işliyor. Özel bir durum değil çünkü yorumlamanın başka (makul) bir yolu yok (< 1 x 10). Bunları tek argümanlara bile uygulayabilirsiniz, örneğin (= 10): cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/…
Ken

512

Regex hata ayıklamak için python regex ayrıştırma ağacı alın.

Düzenli ifadeler python'un harika bir özelliğidir, ancak bunları ayıklamak bir acı olabilir ve regex'i yanlış yapmak çok kolaydır.

Neyse ki, piton, belgesiz, deneysel, gizli bayrağı re.DEBUG(aslında 128) ileterek normal ifade ayrıştırma ağacını yazdırabilir re.compile.

>>> re.compile("^\[font(?:=(?P<size>[-+][0-9]{1,2}))?\](.*?)[/font]",
    re.DEBUG)
at at_beginning
literal 91
literal 102
literal 111
literal 110
literal 116
max_repeat 0 1
  subpattern None
    literal 61
    subpattern 1
      in
        literal 45
        literal 43
      max_repeat 1 2
        in
          range (48, 57)
literal 93
subpattern 2
  min_repeat 0 65535
    any None
in
  literal 47
  literal 102
  literal 111
  literal 110
  literal 116

Sözdizimini anladıktan sonra hatalarınızı tespit edebilirsiniz. Biz kaçmaya unuttum Orada görebilirsiniz []in [/font].

Elbette, yorumlanmış normal ifadeler gibi istediğiniz bayraklarla birleştirebilirsiniz:

>>> re.compile("""
 ^              # start of a line
 \[font         # the font tag
 (?:=(?P<size>  # optional [font=+size]
 [-+][0-9]{1,2} # size specification
 ))?
 \]             # end of tag
 (.*?)          # text between the tags
 \[/font\]      # end of the tag
 """, re.DEBUG|re.VERBOSE|re.DOTALL)

3
Normal ifadeyi kullanarak HTML'yi ayrıştırma dışında yavaş ve acı vericidir. Yerleşik 'html' ayrıştırıcı modülü bile işi yapmak için normal ifadeleri kullanmaz. Ve html modülü sizi memnun etmiyorsa, tekerleği yeniden icat etmeden işi yapan çok sayıda XML / HTML ayrıştırıcı modülü var.
BatchyX

Çıktı sözdizimindeki belgelere bir bağlantı harika olurdu.
Personman

1
Bu deneysel değil, Python'un resmi bir parçası olmalı ... RegEx her zaman yanıltıcıdır ve olanları izleyebilmek gerçekten yararlıdır.
Cahit

460

numaralandırmak

Bir yinelenebilir numaralandırma ile sarın ve öğeyi indeksi ile birlikte verecektir.

Örneğin:


>>> a = ['a', 'b', 'c', 'd', 'e']
>>> for index, item in enumerate(a): print index, item
...
0 a
1 b
2 c
3 d
4 e
>>>

Referanslar:


56
Bu python listeleri hakkında konuşurken öğreticiler rutin olarak kapsamadığı şaşırdım.
Draemon

45
Ve tüm bu zaman boyunca kodlama yapıyordum: (len (a)) aralığında i için: ... ve sonra geçerli öğeyi almak için [i] kullanarak.
Fernando Martin

4
@Berry Tsakala: Bildiğim kadarıyla itiraz edilmedi.
JAB

23
Kutsal saçmalık bu harika. for i in xrange (len (a)): her zaman en az favori python deyimim olmuştur.
Personman

15
numaralandırma rasgele dizinden başlayabilir, gerekli değildir. Örnek: 'i için numaralandırılan öğe ( liste , başlat = 1): yazdır i, öğe' numaralandırma 0'dan değil 1'den başlayacaktır.
dmitry_romanov

419

Jeneratör nesneleri oluşturma

Yazarsan

x=(n for n in foo if bar(n))

jeneratörü çıkarabilir ve x'e atayabilirsiniz. Şimdi yapabileceğiniz anlamına geliyor

for n in x:

Bunun avantajı, ara depolamaya ihtiyacınız olmamasıdır.

x = [n for n in foo if bar(n)]

Bazı durumlarda bu önemli bir hızlanmaya yol açabilir.

Temelde döngüler için yuvalanmış çoğaltmayı üretecin sonuna birçok if ifadesi ekleyebilirsiniz:

>>> n = ((a,b) for a in range(0,2) for b in range(4,6))
>>> for i in n:
...   print i 

(0, 4)
(0, 5)
(1, 4)
(1, 5)

Bunun için iç içe bir liste kavrayışı da kullanabilirsiniz, değil mi?
shapr

54
Özellikle dikkat edilmesi gereken nokta, genel bellek tasarrufudur. Değerler isteğe bağlı olarak hesaplanır, bu nedenle bellekte liste kavrayışının hiçbir sonucuna asla sahip olmazsınız. Bu, daha sonra liste kavrayışının yalnızca bir bölümünü yinelerseniz özellikle istenir.
saffsd

19
Bu özellikle "gizli" imo değil, aynı zamanda bir jeneratör nesnesini geri sartamayacağınız, ancak bir listeyi istediğiniz zaman tekrarlayabileceğiniz gerçeğidir.
susmits

13
Jeneratörlerin "geri sarma yok" özelliği biraz karışıklığa neden olabilir. Özellikle, bir jeneratörün içeriğini hata ayıklamak için yazdırırsanız, daha sonra verileri işlemek için kullanın, çalışmaz. Veriler yazdırılır () tarafından tüketilir ve normal işleme tabi tutulmaz. Bu, tam olarak bellekte depolandıkları için liste kavrayışları için geçerli değildir.
johntellsall

4
Benzer (dup?) Cevap: stackoverflow.com/questions/101268/hidden-features-of-python/… Ancak, burada bağladığım cevabın jeneratörlerin gücü hakkında GERÇEKTEN İYİ bir sunumdan bahsettiğini unutmayın. Gerçekten kontrol etmelisin.
Denilson Sá Maia

353

iter () çağrılabilir bir argüman alabilir

Örneğin:

def seek_next_line(f):
    for c in iter(lambda: f.read(1),'\n'):
        pass

iter(callable, until_value)Fonksiyonu sürekli çağırır callableve dek sonucu verir until_valuedöndürülür.


Python'a yeni başlayan biri olarak, lambdaburada anahtar kelimenin neden gerekli olduğunu açıklayabilir misiniz ?
SiegeX

@ Lambda içermeyen SiegeX, f.read (1), iter fonksiyonuna geçirilmeden önce değerlendirilir (bir dize döndürerek). Bunun yerine, lambda anonim bir işlev yaratır ve bunu ona iletir.
jmilloy

339

Değişken varsayılan bağımsız değişkenlere dikkat edin

>>> def foo(x=[]):
...     x.append(1)
...     print x
... 
>>> foo()
[1]
>>> foo()
[1, 1]
>>> foo()
[1, 1, 1]

Bunun yerine, "verilmez" i gösteren bir sentinel değeri kullanmalı ve varsayılan olarak istediğiniz mutable ile değiştirmelisiniz:

>>> def foo(x=None):
...     if x is None:
...         x = []
...     x.append(1)
...     print x
>>> foo()
[1]
>>> foo()
[1]

39
Bu kesinlikle daha kötü gizli özelliklerden biri. Zaman zaman onunla karşılaşıyorum.
Torsten Marek

77
Varsayılan argümanların işlevin bir özniteliği olan bir demet içinde yaşadığını öğrendiğimde bunu daha kolay anladım foo.func_defaults. Bir demet olmak, değişmez.
Robert Rossney

2
@grayger: def ifadesi yürütüldüğünde argümanları yorumlayıcı tarafından değerlendirilir. Bu, kod nesnesine (işlevin paketi) bir ad oluşturur (veya yeniden bağlar). Ancak, varsayılan bağımsız değişkenler tanım sırasında nesneler olarak başlatılır. Bu, varsayılan nesnenin herhangi bir zamanı için geçerlidir, ancak nesne değiştirilebilir olduğunda yalnızca önemli (görünür anlambilim gösterme). Herhangi bir çağrı için açıkça geçersiz kılınabileceği veya tüm işlev yeniden tanımlanabilmesine rağmen, işlevin kapanışındaki varsayılan bağımsız değişken adını yeniden bağlamanın bir yolu yoktur).
Jim Dennis

3
@Robert elbette tartışmalar grubunun değişmez olabilir, ama işaret ettiği nesnelerin değişmez olması gerekmez.
poolie

16
Başlamanızı biraz daha kısa hale getirmek için hızlı bir saldırı: x = x veya []. Bunu 2 satırlı if ifadesi yerine kullanabilirsiniz.
dave mankoff

317

Jeneratör fonksiyonlarına değer gönderme . Örneğin, bu işleve sahip olmak:

def mygen():
    """Yield 5 until something else is passed back via send()"""
    a = 5
    while True:
        f = (yield a) #yield a and possibly get f in return
        if f is not None: 
            a = f  #store the new value

Yapabilirsin:

>>> g = mygen()
>>> g.next()
5
>>> g.next()
5
>>> g.send(7)  #we send this back to the generator
7
>>> g.next() #now it will yield 7 until we send something else
7

Kabul. Bunu Python'un gizli bir özelliğinin kötü bir örneği olarak ele alalım :)
Rafał Dowgird

89
Diğer dillerde, bu büyülü cihaza "değişken" denildiğine inanıyorum.
finnw

5
coroutines coroutines olmalı ve karıştırıcı olmadan da genenerator kendileri olmalıdır. Mega-harika bağlantı ve konuşma ve bununla
u0b34a0f6ae

31
@finnw: örnek, bir değişkene benzer bir şey uygular. Bununla birlikte, özellik bir değişkenden farklı olarak başka birçok şekilde kullanılabilir. Benzer semantiklerin nesneler ( özellikle Python'un çağrı yöntemini uygulayan bir sınıf) kullanılarak da uygulanabileceği açık olmalıdır .
Jim Dennis

4
Bu, rutinleri hiç görmemiş (ve muhtemelen anlamayacak) insanlar için çok önemsiz bir örnektir. Toplam değişken taşması riski olmadan çalışma ortalamasını uygulayan örnek iyi bir örnektir.
Prashant Kumar

313

Kapsamları belirtmek için boşluk kullanmaktan hoşlanmıyorsanız, C-stili {} kullanarak şunları yapabilirsiniz:

from __future__ import braces

122
Bu şeytani. :)
Jason Baker

37
>>> __future__ import braces Dosya "<stdin>", satır 1 Sözdizimi Hatası: bir şans değil: P
Benjamin W. Smith

40
bu küfür!
Berk D. Demir

335
Burada sözdizimsel bir hata olabileceğini düşünüyorum, bu " __past__ import braces" den olmamalı mı?
Bill K

47
dan __cruft__ ithalat ayraçlar
Phillip B Oldham

305

Dilim işleçlerinde adım bağımsız değişkeni. Örneğin:

a = [1,2,3,4,5]
>>> a[::2]  # iterate over the whole list in 2-increments
[1,3,5]

Özel durum x[::-1], 'x ters çevrilmiş' için yararlı bir deyimdir.

>>> a[::-1]
[5,4,3,2,1]

31
bence, tersine çevrilmiş () fonksiyon. >>> liste (ters çevrildi (aralık (4))) [3, 2, 1, 0]
Christian Oudard

3
o zaman daha iyi bir şekilde "bu ia dize" [:: - 1] yazmak nasıl? ters gibi görünmüyor
Berry Tsakala

24
Reversed () ile ilgili sorun, bir yineleyici döndürmesidir, bu nedenle ters sıranın türünü (tuple, string, list, unicode, kullanıcı türleri ...) korumak istiyorsanız, geri dönüştürmek için ek bir adıma ihtiyacınız vardır. .
Rafał Dowgird

6
def reverse_string (string): dönüş dizesi [:: - 1]
pi.

4
@pi Eğer biri ters gibi tanımlamak için yeterli biliyorsa o zaman biri [:: - 1] kodunuzda bırakın ve anlamı ve uygun duygu ile rahat olabilir düşünüyorum.
physicsmichael

289

Dekoratörler

Dekoratörler , bir işlev veya yöntemi işlevsellik ekleyebilecek, bağımsız değişkenleri veya sonuçları değiştirebilecek vb. Bir başka işleve sarmaya izin verir.

Örnek, print_argsdekore edilmiş işlevin bağımsız değişkenlerini çağırmadan önce yazdıran bir dekoratörü gösterir :

>>> def print_args(function):
>>>     def wrapper(*args, **kwargs):
>>>         print 'Arguments:', args, kwargs
>>>         return function(*args, **kwargs)
>>>     return wrapper

>>> @print_args
>>> def write(text):
>>>     print text

>>> write('foo')
Arguments: ('foo',) {}
foo

54
Dekoratörleri tanımlarken, dekoratörü @decorator ile süslemenizi tavsiye ederim. Üzerinde iç gözlem yaparken bir işlev imzasını koruyan bir dekoratör oluşturur. Daha fazla bilgi için: phyast.pitt.edu/~micheles/python/documentation.html
sirwart

45
Bu nasıl gizli bir özellik?
Vetle

50
Pek çok basit Python dersinde mevcut değil ve Python'u kullanmaya başladıktan uzun bir süre sonra tökezledim. Gizli özellik olarak adlandırdığım şey budur, buradaki diğer en popüler yayınlarla hemen hemen aynıdır.
DzinX

16
vetler, sorular "Python programlama dilinin daha az bilinen ama yararlı özellikleri" diye soruyor. 'Daha az bilinen ancak yararlı özellikleri' nasıl ölçersiniz? Yani bu yanıtlardan herhangi biri gizli özellikler nasıl?
Johnd

4
@vetler Buradaki şeylerin çoğu "gizlidir".
Humphrey Bogart

288

For ... else sözdizimi (bkz. Http://docs.python.org/ref/for.html )

for i in foo:
    if i == 0:
        break
else:
    print("i was never 0")

"Else" bloğu, break çağrılmadığı sürece normalde for döngüsünün sonunda yürütülür.

Yukarıdaki kod aşağıdaki gibi taklit edilebilir:

found = False
for i in foo:
    if i == 0:
        found = True
        break
if not found: 
    print("i was never 0")

218
For / else sözdiziminin garip olduğunu düşünüyorum. Döngünün gövdesi asla yürütülmezse, başka bir cümle yürütülmesi gerektiği gibi "hissedilir".
codeape

14
Ah. Bunu hiç görmedim! Ama bunun biraz yanlış isim olduğunu söylemeliyim. Kim başka bir bloğun sadece mola asla yapmazsa yürütülmesini bekler ki? Ben codeape ile aynı fikirdeyim: Boş foos için başka bir şey girilmiş gibi görünüyor.
Daren Thomas

52
anahtar kelimenin nihayet olması gerektiği gibi görünüyor, başka değil
Jiaaro

21
Nihayet bu paketin her zaman yürütüldüğü bir şekilde zaten kullanılır.

7
Kesinlikle 'başka' olmamalı. Belki 'sonra' ya da bir şey, ve sonra döngü asla yürütülmediğinde 'başka' olabilir.
Tor Valamo

258

2,5'ten itibaren diktelerin __missing__eksik öğeler için çağrılan özel bir yöntemi vardır:

>>> class MyDict(dict):
...  def __missing__(self, key):
...   self[key] = rv = []
...   return rv
... 
>>> m = MyDict()
>>> m["foo"].append(1)
>>> m["foo"].append(2)
>>> dict(m)
{'foo': [1, 2]}

Bir dict alt sınıf da vardır collectionsdenilen defaultdicthemen hemen aynı yapar ama mevcut değil öğeler için bağımsız değişkeni olmayan bir işlevini çağırır:

>>> from collections import defaultdict
>>> m = defaultdict(list)
>>> m["foo"].append(1)
>>> m["foo"].append(2)
>>> dict(m)
{'foo': [1, 2]}

Bu gibi alt sınıfları beklemeyen işlevlere geçirmeden önce bu tür dikmeleri düzenli dikimlere dönüştürmenizi öneririm. Pek çok kod, d[a_key]sözlüğe yeni bir öğe ekleyecek bir öğe olup olmadığını kontrol etmek için KeyErrors kullanır ve yakalar.


10
Setdefault kullanmayı tercih ederim. m = {}; m.setdefault ('foo', 1)
greyder

22
@grayger bunu kastediyordu m={}; m.setdefault('foo', []).append(1).
Cristian Ciupitu

1
Ancak defaultdict'i geçmenin çok kullanışlı olduğu durumlar vardır. İşlev örneğin değerin üzerinde olabilir ve varsayılan boş bir liste olduğu için fazladan kodu olmayan tanımsız tuşlar için çalışır.
Marian

3
defaultdict bazı durumlarda setdefault değerinden daha iyidir, çünkü anahtar eksik olmadığı sürece varsayılan nesneyi oluşturmaz . setdefault onu eksik olsun ya da olmasın oluşturur. Varsayılan nesneniz oluşturmak için pahalıysa, bu bir performans isabeti olabilir - sadece tüm setdefault çağrılarını değiştirerek bir programdan iyi bir hız kazandım.
Whatang

2
defaultdictsetdefaultdiğer durumlarda da yöntemden daha güçlüdür . Örneğin, bir sayaç-için dd = collections.defaultdict(int) ... dd[k] += 1vs d.setdefault(k, 0) += 1.
Mike Graham

247

Yerinde değer değişimi

>>> a = 10
>>> b = 5
>>> a, b
(10, 5)

>>> a, b = b, a
>>> a, b
(5, 10)

Ödevin sağ tarafı yeni bir grup oluşturan bir ifadedir. Ödevin sol tarafı, adların (referanssız) grubunu derhal açar ave b.

Atamadan sonra yeni demet referans alınmaz ve çöp toplama için işaretlenir ve değerler bağlı ave bdeğiştirilir.

Veri yapıları ile ilgili Python öğretici bölümünde belirtildiği gibi ,

Çoklu atamanın gerçekten sadece demet paketlemenin ve sıralı paketlemenin bir kombinasyonu olduğunu unutmayın.


1
Bu geleneksel yoldan daha fazla gerçek bellek kullanıyor mu? Sadece bir takas değişkeni yerine bir demet oluşturduğunuz için yapardım
Nathan

75
Daha fazla bellek kullanmaz. Daha az kullanır .. Ben sadece her iki şekilde de yazdım ve bayt kodunu derledi .. derleyici umarız gibi optimize eder. dis sonuçları vars ve sonra ROT_TWOing kurdu gösterdi. ROT_TWO 'en üstteki iki yığını değiştirir' anlamına gelir ... Aslında oldukça şık.
kraliyet

5
Ayrıca yanlışlıkla Python'un başka bir güzel özelliğini de işaret edersiniz, bu da bir öğeyi virgülle ayırarak dolaylı olarak bir dizi öğe oluşturabileceğinizdir.
asmeurer

3
Sane Dana: Python'daki atama bir ifade değil, bir ifadedir, böylece = daha yüksek önceliğe sahipse ifade geçersiz olur (yani, a, (b = b), a) olarak yorumlanır.
hbn

5
Bu, burada okuduğum en az gizli özellik. Güzel, ama her Python eğitiminde açıkça tanımlanmıştır.
Thiago Chaves

235

Okunabilir düzenli ifadeler

Python'da normal bir ifadeyi birden çok satıra bölebilir, eşleşmelerinize ad verebilir ve yorum ekleyebilirsiniz.

Örnek ayrıntılı sözdizimi (Dive'dan Python'a ):

>>> pattern = """
... ^                   # beginning of string
... M{0,4}              # thousands - 0 to 4 M's
... (CM|CD|D?C{0,3})    # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
...                     #            or 500-800 (D, followed by 0 to 3 C's)
... (XC|XL|L?X{0,3})    # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
...                     #        or 50-80 (L, followed by 0 to 3 X's)
... (IX|IV|V?I{0,3})    # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
...                     #        or 5-8 (V, followed by 0 to 3 I's)
... $                   # end of string
... """
>>> re.search(pattern, 'M', re.VERBOSE)

Örnek adlandırma eşleşmeleri ( Normal İfade NASIL belgesinden )

>>> p = re.compile(r'(?P<word>\b\w+\b)')
>>> m = p.search( '(((( Lots of punctuation )))' )
>>> m.group('word')
'Lots'

Ayrıca re.VERBOSE, dizgi değişmezi birleştirme sayesinde kullanmadan ayrıntılı bir şekilde normal ifade yazabilirsiniz .

>>> pattern = (
...     "^"                 # beginning of string
...     "M{0,4}"            # thousands - 0 to 4 M's
...     "(CM|CD|D?C{0,3})"  # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
...                         #            or 500-800 (D, followed by 0 to 3 C's)
...     "(XC|XL|L?X{0,3})"  # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
...                         #        or 50-80 (L, followed by 0 to 3 X's)
...     "(IX|IV|V?I{0,3})"  # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
...                         #        or 5-8 (V, followed by 0 to 3 I's)
...     "$"                 # end of string
... )
>>> print pattern
"^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$"

7
Gerçekten bir Python özelliği olduğunu düşünür müydüm bilmiyorum, çoğu RE motorlarında ayrıntılı bir seçenek var.
Jeremy Banks

18
Evet, ancak bunu grep'te veya çoğu editörde yapamadığınız için, birçok insan orada olduğunu bilmiyor. Diğer dillerin eşdeğer bir özelliğe sahip olması, onu python'un kullanışlı ve az bilinen bir özelliği haline getirmez
Mark Baker

7
Çok sayıda optimize edilmiş düzenli ifadeye sahip büyük bir projede (okuma: makine için optimize edilmiş, ancak insanlar için değil), mermiyi ısırdım ve hepsini ayrıntılı sözdizimine dönüştürdüm. Artık yeni geliştiricileri projelere tanıtmak çok daha kolay. Şu andan itibaren her projede ayrıntılı RE'ler uyguluyoruz.
Berk D. Demir

Şunu söylemeyi tercih ederim: yüzlerce = "(CM | CD | D? C {0,3})" # 900 (CM), 400 (CD), vb. yorum eklemenin ve dizeleri birleştirmenin bir yolu. Dilin zaten mükemmel şekilde yaptığı şeyler için neden özel kütüphane sözdizimini kullanıyorsunuz? Doğrudan Perlis'in Epigram 9'una karşı çıkıyor gibi görünüyor
Ken

3
@Ken: Normal ifade her zaman doğrudan kaynakta olmayabilir, ayarlardan veya bir yapılandırma dosyasından okunabilir. Yorumlara veya yalnızca ek boşluklara (okunabilirlik için) izin vermek çok yardımcı olabilir.

222

İşlev bağımsız değişkeninin açılması

Bir liste veya kullanarak işlev parametresi olarak bir sözlük paketten *ve **.

Örneğin:

def draw_point(x, y):
    # do some magic

point_foo = (3, 4)
point_bar = {'y': 3, 'x': 2}

draw_point(*point_foo)
draw_point(**point_bar)

Listeler, tuples ve dikenler kaplar olarak yaygın olarak kullanıldığından çok yararlı bir kısayol.


27
* uyarısı operatörü olarak da bilinir
Gabriel

3
Bu özelliği seviyorum, ancak pylint ne yazık ki sevmiyor.
Stephen Paulger

5
pylint'in tavsiyesi bir yasa değildir. Diğer bir şekilde, uygula (callable, arg_seq, arg_map), 2.3'ten beri kullanımdan kaldırılmıştır.
Yann Vernier

1
pylint'in tavsiyesi yasa olmayabilir, ama çok iyi bir tavsiye. Bunun gibi şeylere aşırı şımartan kod hata ayıklama saf bir cehennemdir. Orijinal afişin belirttiği gibi, bu yararlı bir kısayoldur .
Andrew

2
Bu kodda bir kez kullanıldığını gördüm ve ne yaptığını merak ettim. Ne yazık ki "Python **" için google zor
Fraser Graham

205

Kod dosyasının üstünde doğru kodlama bildirimini kullandığınızda, ROT13 kaynak kodu için geçerli bir kodlamadır:

#!/usr/bin/env python
# -*- coding: rot13 -*-

cevag "Uryyb fgnpxbiresybj!".rapbqr("rot13")

10
Harika! Bayt dizelerinin tam olarak nasıl alındığına dikkat edin, ancak unicode dizelerin kodu çözülür: trycevag h"Uryyb fgnpxbiresybj!"
u0b34a0f6ae

12
ne yazık ki py3k kaldırıldı
mykhal

9
Bu, virüsten koruma programını atlamak için iyidir.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

96
Kodlama ile ilgisi yok, sadece Galce dilinde yazılmış Python. :-P
Olivier Verdier

33
Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn!
Manuel Ferreria

183

Tamamen dinamik bir şekilde yeni türler oluşturma

>>> NewType = type("NewType", (object,), {"x": "hello"})
>>> n = NewType()
>>> n.x
"hello"

ki tam olarak aynı

>>> class NewType(object):
>>>     x = "hello"
>>> n = NewType()
>>> n.x
"hello"

Muhtemelen en faydalı şey değil, ama bilmek güzel.

Düzenleme : Yeni türün sabit adı, ifadeyle NewTypeaynı şey olmalıdır class.

Düzenle : Özelliği daha doğru bir şekilde tanımlamak için başlığı ayarladı.


8
Bunun yararlı olma potansiyeli çok fazla, örneğin, JIT ORM'leri
Mark Cidade

8
Dinamik bir girdiye dayalı HTML-Form sınıfları oluşturmak için kullanıyorum. Çok hoş!
pi.

15
Not: tüm sınıflar çalışma zamanında oluşturulur. Böylece 'class' ifadesini bir koşul içinde veya bir işlev içinde kullanabilirsiniz (kapanış görevi gören sınıf veya sınıf aileleri oluşturmak için çok yararlıdır). 'Type'ın getirdiği gelişme, dinamik olarak oluşturulmuş bir dizi öznitelikleri (veya tabanları) düzgün bir şekilde tanımlama yeteneğidir.
spookylukey

1
Ayrıca boş bir dize ile anonim türler oluşturabilirsiniz: type ('', (object,), {'x': 'blah'})
bluehavana

3
Kod enjeksiyonları için çok yararlı olabilir.
Avihu Turzion

179

Bağlam yöneticileri ve "with " Bildirimi

PEP 343'te tanıtıldı bir bağlam yöneticisi , bir ifade takımı için çalışma zamanı bağlamı olarak işlev gören bir nesnedir.

Özellik yeni anahtar kelimeler kullandığı için, yavaş yavaş tanıtıldı: Python 2.5'te __future__ yönerge . Python 2.6 ve üstü (Python 3 dahil) varsayılan olarak mevcuttur.

Ben kullandım açıklamada "ile" çok kullandım çünkü çok yararlı bir yapı olduğunu düşünüyorum, İşte hızlı bir demo:

from __future__ import with_statement

with open('foo.txt', 'w') as f:
    f.write('hello!')

Burada perde arkasında olan, "with" ifadesinin özel__enter____exit__ dosya nesnesindeki ve yöntemleri çağırmasıdır. İfade __exit__gövdesinden herhangi bir istisna oluşturulmuşsa, istisna işlemenin orada gerçekleşmesine izin verirse istisna ayrıntıları da iletilir .

Bu özel durumda, bunun sizin için yaptığı şey, yürütme işlemin kapsamı dışında kaldığında dosyanın kapatılmasını garanti etmesidir. with ne yaparsa, normalde meydana gelip gelmediğine veya bir istisna atıp atılmadığına bakılmaksızın, paketin . Temelde ortak istisna işleme kodunu soyutlamanın bir yoludur.

Bunun diğer yaygın kullanım durumları, iş parçacıkları ve veritabanı işlemleri ile kilitleme içerir.


3
Gelecekten bir şey ithal bir kod inceleme onaylamak olmaz . Özellikler kullanışlıdan daha sevimli ve genellikle Python yeni gelenleri kafa karıştırıyor.
ücretli bir inek

6
Evet, yuvalanmış kapsamlar ve jeneratörler gibi "sevimli" özellikler, ne yaptıklarını bilenlere daha iyi bırakılır. Ve Python'un gelecekteki sürümleriyle uyumlu olmak isteyen herkes. Yuvalanmış kapsamlar ve jeneratörler için Python'un "gelecek sürümleri" sırasıyla 2.2 ve 2.5 anlamına gelir. With ifadesi için Python'un "gelecekteki sürümleri" 2.6 anlamına gelir.
Chris B.17

10
Bu söylemeden geçebilir, ancak python v2.6 + ile artık gelecekten içe aktarmanıza gerek yoktur . with artık birinci sınıf bir anahtar kelime.
fitzgeraldsteele

25
2.7'de birden fazla olabilir withs:) with open('filea') as filea and open('fileb') as fileb: ...
Austin Richardson

5
@ Austin o sözdizimini 2.7 üzerinde çalışmak için alamadım. Ancak bu işe yaradı: with open('filea') as filea, open('fileb') as fileb: ...
wim

168

Sözlüklerin bir get () yöntemi vardır

Sözlüklerin bir 'get ()' yöntemi vardır. D ['anahtar'] yaparsanız ve anahtar orada yoksa, bir istisna alırsınız. D.get ('anahtar') yaparsanız, 'anahtar' yoksa Yok'u alırsınız. Bu öğeyi Geri almak yerine ikinci bir argüman ekleyebilirsiniz, örneğin: d.get ('anahtar', 0).

Sayı eklemek gibi şeyler için harikadır:

sum[value] = sum.get(value, 0) + 1


39
ayrıca setdefault yöntemini kontrol edin.
Daren Thomas

27
Ayrıca, collections.defaultdict sınıfı kontrol edin.
jfs

8
Python 2.7 veya üstünü ya da 3.1 veya üstünü kullanıyorsanız, koleksiyon modülündeki Counter sınıfına bakın. docs.python.org/library/collections.html#collections.Counter
Elias Zamaria

Ah adamım, bu kadar zamandır yapıyordum get(key, None). NoneVarsayılan olarak sağlanan hiçbir fikrim yoktu .
Jordan Reiter

152

Tanımlayıcılar

Bir sürü temel Python özelliğinin ardındaki sihir.

Bir üyeyi aramak için noktalı erişimi kullandığınızda (örneğin, xy), Python ilk olarak örneği örnek sözlüğünde arar. Bulunmazsa, sınıf sözlüğünde arar. Sınıf sözlüğünde bulursa ve nesne, yalnızca döndürmek yerine tanımlayıcı protokolünü uygularsa, Python bunu yürütür. Bir tanımlayıcı uygulayan her sınıf __get__, __set__ya da__delete__ yöntemleri.

Tanımlayıcıları kullanarak mülkün kendi (salt okunur) sürümünü nasıl uygulayacağınız aşağıda açıklanmıştır:

class Property(object):
    def __init__(self, fget):
        self.fget = fget

    def __get__(self, obj, type):
        if obj is None:
            return self
        return self.fget(obj)

ve bunu yerleşik özellik gibi kullanırsınız ():

class MyClass(object):
    @Property
    def foo(self):
        return "Foo!"

Python'da, diğer şeylerin yanı sıra özellikleri, bağlı yöntemleri, statik yöntemleri, sınıf yöntemlerini ve yuvaları uygulamak için tanımlayıcılar kullanılır. Onları anlamak, daha önce Python 'tuhaflıkları' gibi görünen birçok şeyin neden oldukları gibi olduğunu görmeyi kolaylaştırır.

Raymond Hettinger, onları tanımlamak benden daha iyi bir iş yapan mükemmel bir öğreticiye sahiptir.


Bu dekoratörün bir kopyası, değil mi? ( stackoverflow.com/questions/101268/… )
gecco

2
Hayır, dekoratörler ve tanımlayıcılar tamamen farklı şeyler olsa da, örnek kodda, bir tanımlayıcı dekoratör oluşturuyorum. :)
Nick Johnson

1
Bunu yapmanın diğer yolu bir lambda ile:foo = property(lambda self: self.__foo)
Pete Peterson

1
@PetePeterson Evet, ama propertybenim görevimin noktası olan tanımlayıcılarla uygulandı.
Nick Johnson

142

Koşullu Atama

x = 3 if (y == 1) else 2

Tam olarak göründüğü gibi yapar: "y 1 ise 3'e x, aksi takdirde 2'ye x atayın". Parens gerekli değildir, ancak okunabilirlik için onları seviyorum. Daha karmaşık bir şeyiniz varsa zincirleyebilirsiniz:

x = 3 if (y == 1) else 2 if (y == -1) else 1

Belli bir noktada, biraz fazla ileri gidiyor.

Herhangi bir ifadede if ... else komutunu kullanabileceğinizi unutmayın. Örneğin:

(func1 if y == 1 else func2)(arg1, arg2) 

Burada y, 1 ve f22 ise func1 çağrılır, aksi takdirde. Her iki durumda da ilgili işlev arg1 ve arg2 bağımsız değişkenleriyle çağrılır.

Benzer şekilde, aşağıdakiler de geçerlidir:

x = (class1 if y == 1 else class2)(arg1, arg2)

burada class1 ve class2 iki sınıftır.


29
Ödev özel bir bölüm değildir. Kolayca şöyle bir şey yapabilirsiniz: eğer geri dön eğer 3 y (= = 1) 2.
Brian

25
Bu alternatif yol ilk kez şaşırmış Python'u gördüm.
Craig McQueen

3
Kylebrooks: Bu durumda boole operatörleri kısa devre yapmaz. Yalnızca bool (3) == False ise 2 değerini değerlendirir.
RoadieRich

15
bu geriye dönük kodlama beni şaşırttı. gibi bir şey x = ((y == 1) ? 3 : 2)benim için daha anlamlı
mpen

13
@Mark'ın tam tersini hissediyorum, C tarzı üçlü operatörler beni her zaman karıştırdı, yanlış durumda değerlendirilen doğru taraf mı orta mı? Python'un üçlü sözdizimini çok tercih ediyorum.
Jeffrey Harris

141

doctest : aynı anda dokümantasyon ve birim testi.

Python belgelerinden çıkarılan örnek:

def factorial(n):
    """Return the factorial of n, an exact integer >= 0.

    If the result is small enough to fit in an int, return an int.
    Else return a long.

    >>> [factorial(n) for n in range(6)]
    [1, 1, 2, 6, 24, 120]
    >>> factorial(-1)
    Traceback (most recent call last):
        ...
    ValueError: n must be >= 0

    Factorials of floats are OK, but the float must be an exact integer:
    """

    import math
    if not n >= 0:
        raise ValueError("n must be >= 0")
    if math.floor(n) != n:
        raise ValueError("n must be exact integer")
    if n+1 == n:  # catch a value like 1e300
        raise OverflowError("n too large")
    result = 1
    factor = 2
    while factor <= n:
        result *= factor
        factor += 1
    return result

def _test():
    import doctest
    doctest.testmod()    

if __name__ == "__main__":
    _test()

6
Doctests kesinlikle harika, ama bir şeyin bir istisna yaratması gerektiğini test etmek için yazmanız gereken tüm şeyleri gerçekten sevmiyorum
TM.

60
Doctest'ler abartılıyor ve belgeleri kirletiyor. Herhangi bir setUp () olmadan bağımsız bir işlevi ne sıklıkta test edersiniz?
ücretli bir inek

2
kim bir doctest kurulum kuramazsınız diyor? bağlamı oluşturan ve geri dönen bir işlev yazın ve locals()sonra doctestinizde do locals().update(setUp())= D
Jiaaro

12
Tek başına bir işlev bir setUp gerektiriyorsa, bunun ilgisiz bazı şeylerden ayrılması veya bir sınıfa konması olasılığı yüksektir. Sınıf doctest ad alanı daha sonra sınıf yöntemi doctest'lerinde yeniden kullanılabilir, bu yüzden biraz setUp, sadece DRY ve okunabilir gibi.
Andy Mikhaylenko

4
"Bağımsız bir işlevi ne sıklıkta test edersiniz" - çok. Cephelere karar verdiğimde, genellikle test sürecinden doğal olarak ortaya çıkan bir test var.
Gregg Lind

138

Adlandırılmış biçimlendirme

% -formatting bir sözlük alır (% i /% s vb. doğrulama da uygular).

>>> print "The %(foo)s is %(bar)i." % {'foo': 'answer', 'bar':42}
The answer is 42.

>>> foo, bar = 'question', 123

>>> print "The %(foo)s is %(bar)i." % locals()
The question is 123.

Ve locals () da bir sözlük olduğundan, bunu bir dikte olarak iletebilir ve yerel değişkenlerinizden% -substitions alabilirsiniz. Bence bu kaşlarını çattı, ama işleri basitleştirir ..

Yeni Stil Biçimlendirme

>>> print("The {foo} is {bar}".format(foo='answer', bar=42))

60
Aşamalı hale getirilecek ve sonunda dizenin format () yöntemiyle değiştirilecektir.
Constantin

3
Adlandırılmış biçimlendirme, çevirmenler için çok yararlıdır, çünkü sadece bağlam için değişken adları olmayan biçim dizesini görme eğilimindedirler
pixelbeat

2
Python 3.0.1'de çalışıyor gibi görünüyor (yazdırma çağrısının çevresine parantez eklemek için gereklidir).
Pasi Savolainen

9
Bir karma , ha? Nereden geldiğini görüyorum.
parlak

11
% s biçimlendirmesi aşamalı olarak kaldırılmayacak. str.format () kesinlikle daha pitoniktir, ancak aslında basit dize değiştirme için 10x'in daha yavaştır. Benim inancım% s biçimlendirme hala en iyi uygulama.
Kenneth Reitz

132

Daha fazla python modülü eklemek için (özellikle 3. taraf olanlar), çoğu insan PYTHONPATH ortam değişkenlerini kullanıyor gibi görünüyor veya site paketleri dizinlerine sembolik veya dizin ekliyor. Başka bir yol da, * .pth dosyalarını kullanmaktır. İşte resmi python doc'ın açıklaması:

"Python'un arama yolunu değiştirmenin en kolay yolu, zaten Python'un yolunda bulunan bir dizine, genellikle ... / site-paketleri / dizinine bir yol yapılandırma dosyası eklemektir. Yol yapılandırma dosyalarının uzantısı .pth'dir. ve her satırın sys.path öğesine eklenecek tek bir yol içermesi gerekir. (Yeni yollar sys.path dosyasına eklendiğinden, eklenen dizinlerdeki modüller standart modülleri geçersiz kılmaz. standart modüllerin sabit sürümlerini kurmak için.) "


1
Ben asla setuptools site paketleri dizinindeki bu .pth dosyası ile bu fikir arasındaki bağlantıyı. müthiş.
dave paola

122

Başka istisna maddesi:

try:
  put_4000000000_volts_through_it(parrot)
except Voom:
  print "'E's pining!"
else:
  print "This parrot is no more!"
finally:
  end_sketch()

Else yan tümcesinin kullanımı, try deyimi tarafından korunan kod tarafından korunmayan bir istisna yakalamadan kaçındığından, try yan tümcesine ek kod eklemekten daha iyidir.

Bkz. Http://docs.python.org/tut/node10.html


8
+1 bu harika. Try bloğu herhangi bir istisna bloğu girmeden yürütülürse, else bloğu girilir. Ve sonra elbette, nihayet blok yürütülür
inspectorG4dget

Sonunda neden 'başka' orada olduğunu anladım! Teşekkürler.
taynaron

Kullanmaya devam etmek daha mantıklı olurdu, ama sanırım zaten alınmış;)
Paweł Pra Decak

Python2'nin eski sürümlerinde her ikisine birden sahip olamayacağınızı unutmayın: ve son olarak: aynı deneme için maddeler: blok
Kevin Horn

1
@ Paweł Prażak, Kevin Horn'un belirttiği gibi, bu sözdizimi Python'un ilk sürümünden sonra tanıtıldı ve mevcut dile yeni ayrılmış anahtar kelimeler eklemek her zaman sorunludur. Bu nedenle mevcut bir anahtar kelime genellikle tekrar kullanılır (son C ++ standardında "otomatik" ifadesi).
Constantin

114

İstisnaları yeniden yükseltme :

# Python 2 syntax
try:
    some_operation()
except SomeError, e:
    if is_fatal(e):
        raise
    handle_nonfatal(e)

# Python 3 syntax
try:
    some_operation()
except SomeError as e:
    if is_fatal(e):
        raise
    handle_nonfatal(e)

Bir hata işleyicisinin içinde argüman bulunmayan 'zam' ifadesi, Python'a istisnayı orijinal geri izleme bozulmadan yeniden yükseltmesini söyler ve "oh, üzgünüm, üzgünüm, bunu yakalamak demek istemedim, üzgünüm, üzgünüm. "

Orijinal geri izleme ile yazdırmak, depolamak veya keman çalmak istiyorsanız, sys.exc_info () ile alabilirsiniz ve Python 'traceback' modülüyle yazdırıldığı gibi yazdırmak mümkündür.


Üzgünüm ama bu hemen hemen tüm dillerin iyi bilinen ve ortak bir özelliğidir.
Lucas

6
İtalik metni not edin. Bazı insanlar raise ebunun yerine, orijinal izlemeyi korumaz.
03'te habnabit

12
Belki daha büyülü, buna exc_info = sys.exc_info(); raise exc_info[0], exc_info[1], exc_info[2]eşdeğerdir, ancak bu değerleri değiştirebilirsiniz (örn. İstisna türünü veya mesajını değiştirin)
ianb

3
@Lucas S. Eh, bilmiyordum ve burada yazıldığı için memnunum.
e-satis

Burada gençliğimi gösteriyor olabilirim, ama her zaman python 2.7'de python 3 sözdizimini hiç sorunla kullandım
wim

106

Ana mesajlar :)

import this
# btw look at this module's source :)

Şifrelenmemiş :

Python'un Zen'i, Tim Peters

Güzel, çirkin olmaktan iyidir.
Açık, örtük olmaktan iyidir.
Basit, karmaşık olmaktan iyidir.
Karmaşık karmaşık olmaktan iyidir.
Düz iç içe geçmişten daha iyidir.
Seyrek yoğun olmaktan iyidir.
Okunabilirlik önemlidir.
Özel durumlar kuralları ihlal edecek kadar özel değildir.
Pratiklik saflığı yenmesine rağmen.
Hatalar asla sessizce geçmemelidir.
Açıkça susturulmadıkça.
Belirsizlik karşısında, tahmin etme isteğini reddet. Bunu yapmanın tek ve tercihen tek bir yolu olmalı.
Her ne kadar Hollandalı değilseniz bu yol ilk başta belli olmayabilir.
Şimdi hiç olmadığı kadar iyi.
Her ne kadar asla genellikle daha iyi olmasa daDoğru şimdi.
Uygulamanın açıklanması zorsa, bu kötü bir fikirdir.
Uygulamanın açıklanması kolaysa, iyi bir fikir olabilir.
İsim alanları harika bir fikirdir - hadi bunlardan daha fazlasını yapalım!


1
Kaynağın neden bu şekilde şifrelenmiş olduğu hakkında bir fikrin var mı? Sadece eğlenmek için miydi, yoksa başka bir sebep var mıydı?
MiniQuark

42
kaynağın yazılış şekli zen aleyhine!
hasen


2
/Usr/lib/python2.6/this.py eski kodu bununla değiştirerek güncelledim print s.translate("".join(chr(64<i<91 and 65+(i-52)%26 or 96<i<123 and 97+(i-84)%26 or i) for i in range(256)))ve şimdi çok daha iyi görünüyor !! :-D
fortran


105

Etkileşimli Tercüman Sekmesi Tamamlama

try:
    import readline
except ImportError:
    print "Unable to load readline module."
else:
    import rlcompleter
    readline.parse_and_bind("tab: complete")


>>> class myclass:
...    def function(self):
...       print "my function"
... 
>>> class_instance = myclass()
>>> class_instance.<TAB>
class_instance.__class__   class_instance.__module__
class_instance.__doc__     class_instance.function
>>> class_instance.f<TAB>unction()

Ayrıca bir PYTHONSTARTUP ortam değişkeni ayarlamanız gerekir.


2
Bu çok kullanışlı bir özellik. O kadar ki, bunu etkinleştirmek için basit bir komut dosyası (artı birkaç diğer introspection geliştirmesi) var: pixelbeat.org/scripts/inpy
pixelbeat

43
IPython size bu artı ton diğer temiz şeyler verir
akaihola

Bu, pdb isteminde normal python isteminden daha yararlı olurdu (IPython yine de bu amaca hizmet ettiği için). Ancak, pdb isteminde işe yaramaz gibi görünüyor, çünkü pdb sekme için kendi kendine bağlanır (ki bu daha az yararlıdır). Pdb isteminde parse_and_bind () çağırmayı denedim, ama yine de işe yaramadı. IPython ile pdb istemi alma alternatif daha fazla iş bu yüzden kullanmaya eğilimindedir.
haridsv

2
@haridsv - easy_install ipdb- o zaman kullanabilirsinizimport ipdb; ipdb.set_trace()
Doug Harris

1
Osx [ve ben libedit kullanan diğer sistemleri hayal] yapmak zorundareadline.parse_and_bind ("bind ^I rl_complete")
Foo Bah

91

Yuvalanmış liste kavrayışları ve jeneratör ifadeleri:

[(i,j) for i in range(3) for j in range(i) ]    
((i,j) for i in range(4) for j in range(i) )

Bunlar, büyük iç içe geçmiş döngü parçalarının yerini alabilir.


"(i) aralığındaki j için" - bu bir yazım hatası mı? Normalde i ve j için sabit aralıklar istersiniz. Bir 2d dizisine erişiyorsanız, öğelerinizin yarısını kaçırırsınız.
Peter Gibson

Bu örnekte herhangi bir diziye erişemiyorum. Bu kodun tek amacı, iç aralıklardan gelen ifadelerin dış aralıklardan gelen ifadelere erişebileceğini göstermektir. Yan ürün, 4> x> y> 0 olacak şekilde (x, y) çiftlerinin bir listesidir.
Rafał Dowgird

2
matematikte çift entegrasyon veya çift toplam gibi sorta.
Yoo

22
Burada hatırlanması gereken kilit nokta (fark etmem uzun zaman aldı), forifadelerin sırasının, dışarıdan içeri doğru standart bir döngü içinde yazılmasını beklediğiniz sırada yazılmasıdır.
sykora

2
Sykora'nın yorumuna eklemek için: İçinde bir fors ve ifs yığını ile başladığınızı hayal edin yield x. Bunu bir jeneratör ifadesine dönüştürmek için xönce taşıyın , tüm sütunları (ve yield) silin ve her şeyi parantez içine alın. Bunun yerine bir liste kavraması yapmak için dış parensleri köşeli parantezlerle değiştirin.
Ken Arnold

91

Yerleşik için aşırı yük operatörü set:

>>> a = set([1,2,3,4])
>>> b = set([3,4,5,6])
>>> a | b # Union
{1, 2, 3, 4, 5, 6}
>>> a & b # Intersection
{3, 4}
>>> a < b # Subset
False
>>> a - b # Difference
{1, 2}
>>> a ^ b # Symmetric Difference
{1, 2, 5, 6}

Standart kitaplık başvurusundan daha fazla ayrıntı: Küme Türleri


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.