Bir satıra birden fazla ifade nasıl eklenir?


143

Bu soruyu tam olarak düşünmek için hangi başlık altında emin değildim, golf kodlaması biraz spesifik değilse uygun görünüyor.

Python'da biraz kavrayış biliyorum ama 'okumak' çok zor görünüyor. Gördüğüm gibi, bir anlama aşağıdaki kodla aynı şeyi başarabilir:

for i in range(10): if i == 9: print('i equals 9')

Bu kodu okumak şu anda anlama nasıl çalışır çok daha kolay ama bir satırda iki ':' olamaz fark ettim ... bu da beni getiriyor ...

benim sorum:

Aşağıdaki örneği BİR HATT içine almanın herhangi bir yolu var mı?

try:
    if sam[0] != 'harry':
        print('hello',  sam)
except:
    pass

Böyle bir şey harika olurdu:

try: if sam[0] != 'harry': print('hellp',  sam)
except:pass

Ama yine çelişkili bir şekilde karşılaşıyorum: 'Ben de denemek için bir yol (ya da onun gibi) çalıştırmak için bir yol olup olmadığını bilmek isterdim , o dışarıya koymak gerekir tamamen anlamsız görünüyor: oraya geçmek. boşa giden bir çizgi.

Girdiğiniz için teşekkür ederim ... ve burada bir surat var : D


Neden bir istisna atsın ki?
Ignacio Vazquez-Abrams

1
sam [2] mevcut olmayabilir. Varsayımsal bir örnek. teşekkürler
Rhys

4
Anlama Python'da farklı bir şeydir. Her şeyi tek bir satıra koymak anlama değildir.
Felix Kling

Bunun evet olduğunun farkındayım. Teşekkürler. Sadece kavrayışımın daha iyi çalışabileceğini ama sorunumun / sorumun kökü olan kolondan kaynaklanamayacağını düşündüm
Rhys

Sadece \ns kullanın ve girintiler için boşluk kullanın.

Yanıtlar:


144

Ne yazık ki, Python ile (Python'u komut satırı tek satırlı programlar için işe yaramaz hale getiren) istediğiniz şey mümkün değildir. Parantezlerin açık kullanımı bile sözdizimi istisnasından kaçınmaz. Noktalı virgülle ayrılmış bir dizi basit deyimden kurtulabilirsiniz:

for i in range(10): print "foo"; print "bar"

Ancak girintili bir blok (gibi if) tanıtan bir yapı eklediğinizde , satır sonuna ihtiyacınız vardır. Ayrıca,

for i in range(10): print "i equals 9" if i==9 else None

yasaldır ve ne istediğinize yaklaşabilir.

Gelince try ... exceptşey: Tamamen yararsız olacaktır olmadanexcept . try"Bu kodu çalıştırmak istiyorum, ancak bir istisna atabilir" diyor. İstisnayı umursamıyorsanız try,. Ama içeri koyar koymaz, "Potansiyel bir istisnayı ele almak istiyorum" diyorsunuz. O passzaman özellikle ele almak istemediğinizi söyler. Ancak bu, kodunuzun çalışmaya devam edeceği anlamına gelir.


1
ilginç, ikinci örneğinizin aradığım cevaba en yakın olduğunu düşünüyorum. teşekkürler
Rhys

'denemek' sorusu ile ilgili olarak ... Ne olursa, bir noktada bir istisna atacağını biliyorum ama sadece kodun çalışmaya devam etmesini istiyorum ... örneğin, bir dize bir tamsayı olup olmadığını kontrol etmek için try: int (string) ... Yapamazsa, bir sonraki satıra devam edin, istisnaya gerek yok. Ne dediğini görüyorum, ancak bu tür kontrol / hata işleme için uygun olabilecek başka bir yol var mı
Rhys

4
Re try:: Python sözdizimi kuralları basitçe tek bir "try" yan tümcesi ile "hariç" yan tümcesine eşlik etmenize izin vermez. Yaptığım şey try-hariç kendi fonksiyonunda kaydırma ve bunun yerine bunu çağırmak. Gibi if (checkint(s))...ve def checkint(s): try: int(s)\nreturn True\nexcept: return False.
ThomasH

ThomasH, yorumunun bir yerdeki bir soruya cevap olmasını isterdim, böylece onu değerlendirebilirim. Mükemmel.
Ivan X

5
@ThomasH " (Python'u komut satırı tek satırlı programlar için işe yaramaz hale getirir) ": beni engellemez. % 95 vakaların yeni hatta ihtiyacı yoktur. Ve geri kalanı \ n: python -c "exec\"print 'A' \nfor i in 1,2,3: print i \""
kxr

52

Yerleşik exec deyimini kullanabilirsiniz, örn .:

exec("try: \n \t if sam[0] != 'harry': \n \t\t print('hello',  sam) \nexcept: pass")

Yeni \nsatır nerede ve \tgirinti olarak kullanılır (sekme).
Ayrıca, kullandığınız boşlukları saymalısınız, böylece girinti tam olarak eşleşir.

Diğer tüm yanıtlar zaten dediğim gibi gerçekten Ancak, bu kullanılacak ders sadece biridir var bir satırda koymak.

exec keyfi bir Python kodunun yürütülmesine izin verdiği için (özellikle bir webapp oluştururken) oldukça tehlikeli bir ifadedir.


4
Teşekkür ederim! Bu, diğerlerinden farklı olarak, gerçekten işe yaradığı için doğru cevap olarak işaretlenmelidir. Ama elbette, gerekmedikçe bunu asla yapmayın! Ben sabit bir tek satırlık metin kutusuna komut dosyaları girmek zorunda gibi aslında, ancak bu sözdizimi gerekir.
Sanjay Manohar

Teşekkürler ! Hayat kurtarıcı! Bunu senaryomda kullanmıyorum, ancak etkileşimli kabukta bu hata ayıklama için kullanışlıdır ... Genellikle etkileşimli kabuktan çıkıp temiz bir ortam elde etmek için yeniden başlatırım ve sonra belirli adımları tekrarlamalıyım, yani bir modülü, bazı işlevleri çalıştırarak belirli bir işlevle bazı testler yapın. Soooo, bir modülde "bir modülü içe aktarmak, bazı işlevleri çalıştırmak" koymak için bir yol arıyordum, bu yüzden hızlı bir şekilde geçmişten geri çağırabilir ve çalıştırabilirim (geçmişten 5 farklı öğeyi geri çağırmak yerine) +1
oneindelijk

exec("try: \n if sam[0] != 'harry': print('hello', sam) \nexcept: pass") nicer :)
kxr

Thank you kxr :) (Cevabınızı geliştirmek için fikrinizi kullandım)
elecprog

7

Evet bu yazı 8 yaşında, ancak birileri buraya gelirse bir cevap arıyor: artık sadece noktalı virgül kullanabilirsiniz. Ancak, eğer / elif / else ifadelerini, / while döngülerinde kullanamazsınız ve işlevleri tanımlayamazsınız. Bunun temel kullanımı, herhangi bir işlev tanımlamanız veya içe aktarılan / elif / else / for / while ifadeleri / döngüler kullanmanız gerekmeyen ithal modüller kullanmanızdır.

Bir şarkının sanatçısını, şarkı adını alan ve sözleri bulmak için dahiyi arayan bir örnek:

import bs4, requests; song = input('Input artist then song name\n'); print(bs4.BeautifulSoup(requests.get(f'https://genius.com/{song.replace(" ", "-")}-lyrics').text,'html.parser').select('.lyrics')[0].text.strip())

6

Ben tavsiye değil bunu ...

Açıkladığınız şey bir anlama değildir .

Python Kodu için PEP 8 Stil Kılavuzu I do tavsiye bu bileşik cümleler hakkında şu yorumu yapmaktadır:

  • Bileşik ifadeler (aynı satırdaki birden çok ifadeler) genellikle önerilmez.

Evet:

      if foo == 'blah':
          do_blah_thing()
      do_one()
      do_two()
      do_three()

Aksine değil:

      if foo == 'blah': do_blah_thing()
      do_one(); do_two(); do_three()

İşte ayrım yapmak için örnek bir kavrayış:

>>> [i for i in xrange(10) if i == 9]
[9]

6

Bunu teşvik etmiyorum, ama komut satırında olduğunuzu, Python'dan başka bir şeyiniz olmadığını ve gerçekten bir astara ihtiyacınız olduğunu söyleyin, bunu yapabilirsiniz:

python -c "$(echo -e "a='True'\nif a : print 1")"

Burada yaptığımız, \nPython kodunu değerlendirmeden önce ön işlem yapmaktır.

Süper hacky! Böyle bir kod yazmayın.


1

belki "ve" veya "veya"

yanlış "veya" yazdıktan sonra

"ve"

sevmek

n=0
def returnsfalse():
    global n
    n=n+1
    print ("false %d" % (n))
    return False
def returnstrue():
    global n
    n=n+1
    print ("true %d" % (n))
    return True
n=0
returnsfalse() or  returnsfalse() or returnsfalse() or returnstrue() and returnsfalse()

sonuç:

false 1
false 2
false 3
true 4
false 5

ya da belki

(returnsfalse() or true) and (returnstrue() or true) and ...

google "doğrudan bir satır python birden çok istatistik koymak" arayarak, doğrudan soruya cevap değil, belki başka birinin buna ihtiyacı var.


1

Bir İçin python -codaklı çözümü ve Bash kabuğu kullanarak İşletmesi, evet bu örnekte gibi basit bir tek satırlık sözdizimi sahip olabilir:

Böyle bir şey yapmak istediğinizi varsayalım ( except: passtalimat dahil olmak üzere örneğinize çok benzer ):

python -c  "from __future__ import print_function\ntry: import numpy; print( numpy.get_include(), end='\n' )\nexcept:pass\n" OUTPUT_VARIABLE __numpy_path

Bu işe yaramaz ve bu hatayı üretmez:

  File "<string>", line 1
    from __future__ import print_function\ntry: import numpy; print( numpy.get_include(), end='\n' )\nexcept:pass\n
                                                                                                                  ^
SyntaxError: unexpected character after line continuation character `

Bunun nedeni, Bash ve Python \nkaçış dizilerinin yorumlanması arasındaki rekabettir . Sorunu çözmek için $'string'Bash sözdizimini \nPython'dan ÖNCE Bash yorumlamasını zorlamak için kullanabilirsiniz . Örneği daha zorlaştırmak end=..\n..için Python baskı çağrısına tipik bir Python belirtimi ekledim : sonunda \nbash ve Python'dan her biri ilgili metin parçası üzerinde birlikte çalışarak İKİ yorumları elde edebileceksiniz . Böylece nihayet doğru çözüm şöyle:

python -c  $'from __future__ import print_function\ntry:\n import numpy;\n print( numpy.get_include(), end="\\n" )\n print( "Hello" )\nexcept:pass\n' OUTPUT_VARIABLE __numpy_path

Bu, hatasız temiz çıktıya yol açar:

/Softs/anaconda/lib/python3.7/site-packages/numpy/core/include
Hello

Not: bu durum aynı zamanda execyönlendirilmiş çözümlerle de çalışmalıdır , çünkü sorun hala aynıdır (Bash ve Python tercümanlar yarışması).

Not 2: biri bazı değiştirerek sorununu geçici olabilir \nbazıları tarafından ;ama benim çözümü her zaman "tek hat" klasik çok hatlı Python programının herhangi bir parça sağlayan ederken, iş zaman (Python yapılara bağlı olarak) olmaz.

Not3: Tabii ki, tek astarlı olduğunda, her zaman Python boşlukları ve girinti ile ilgilenmek zorundadır, çünkü aslında burada kesinlikle "tek astarlı" değiliz, AMA \nbash ve Python arasında uygun bir kaçış dizisi düzgün bir şekilde yönetiyoruz . Klasik çok satırlı Python programının herhangi bir parçasını bu şekilde ele alabiliriz. Çözelti örneği bunu da gösterir.


0

Birçok şeyi karıştırıyorsunuz, bu da sorunuzu cevaplamayı zorlaştırıyor. Kısa cevap: Bildiğim kadarıyla, Python'da yapmak istediğiniz şey mümkün değil - iyi bir nedenle!

Daha uzun cevap, Python'da gelişmek istiyorsanız, kendinizi Python ile daha rahat hale getirmeniz gerektiğidir. Anlamaları okumak zor değil. Onları okumaya alışık olmayabilirsiniz, ancak bir Python geliştiricisi olmak istiyorsanız buna alışmanız gerekir. İhtiyaçlarınıza daha uygun bir dil varsa, bunu seçin. Python'u seçerseniz, sorunları pythonic bir şekilde çözmeye hazır olun. Tabii ki Python ile savaşmakta özgürsünüz, ama eğlenceli olmayacak! ;-)

Ve eğer bize gerçek sorununun ne olduğunu söyleseydin, pythonic bir cevap bile alabilirsin. "Bir satırda bir şey almak" genellikle bir programlama problemi değildir.


Python'u seviyorum! Ben sadece kavrayışların nasıl daha iyi yapılandırılmış olabileceğini ama problemimin / sorumun kökü olan kolondan kaynaklanamayacağını düşünüyorum. 0]! = 'Harry': yazdır ('hellp', sam) mümkün değil ... bu doğru mu? teşekkürler ... im sadece bazı hata ayıklama amaçları için bu yüzden kolay kaldırılabilir ve çok fazla alan lol almaz küçük basit kod arıyorum
Rhys

Evet, bildiğim kadarıyla bu mümkün değil. Ama birisinin zaten statet ettiği gibi: Yaptığınız şey anlamadan farklı bir şey. Kodu kolayca kaldırabilmek istiyorsanız bir işleve yerleştirin. "Dışında: geçmek" sorunu ile ilgili olarak, istisna ya da bunun gibi bir şeyi yok sayan bir dekoratör düşünün. Tekrar: Her zaman gerçek sorununuzu tarif etmeye çalışın, zaten aklınızdaki çözümle ilgili sorunu değil. ;-)
Achim

3
Neden insanlar "birçok şeyi karıştırıyorsunuz" gibi kışkırtıcı ifadeler için cevaplarına çaresizce başlamak zorunda kalıyorlar? Aşağı oy eğer yapabilirsem.
John Jiang

"Bir satırda bir şey almak" bize genellikle bir programlama sorunu değil. "-> ama bu genellikle bir sysadmin sorunu, bu yüzden soru hala bu açıdan alakalı.
Alex F

0

Gerçekten mümkün ;-)

# not pep8 compatible^
sam = ['Sam',]
try: print('hello',sam) if sam[0] != 'harry' else rais
except: pass

Python'da çok çirkin şeyler yapabilirsiniz:

def o(s):return''.join([chr(ord(n)+(13if'Z'<n<'n'or'N'>n else-13))if n.isalpha()else n for n in s])

99 karakterli bir satırda rot13 / cesa şifreleme işlevi.


-2

İşte bir örnek:

(80, 90) aralığında i için: (i! = 89) başka yazdırırsa (i) yazdır (i, bitiş = "")

Çıktı: 80 81 82 83 84 85 86 87 88 89

>

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.