Başlangıç: Neden işlemler komut komutlarında yer almıyor?


23

Giriş programlama kitapçığından geçiyorum ve sözde kodda basit bir örnek:

Start
  input myNumber
  set myAnswer = myNumber * 2
  output myAnswer
Stop

Neden şöyle adlandırılan başka bir değişken yaratmayı ihmal edemiyoruz myAnswerve işlemi sadece output komutuna koyalım:

Start
  input myNumber
  output myNumber * 2
Stop

İlki neden doğru ve ikincisi değil?


39
Kitap yapamayacağını mı söylüyor?
Tulains Córdova 19

2
Kitap yapamayacağımı söylemez; bunun hakkında hiçbir şey söylemiyor.
user1475207 19

5
Sanırım daha kısa ikinci blokla başlamak, sonra gerekirse ilkine geçmek oldukça mantıklı.
Mateen Ulhaq,

13
Kısa cevap: Bunu yapabilirsiniz, yazar bunu sadece (çabasıyla) netleştirmek için yapıyor (dürüst olmakla birlikte, muhtemelen hiç netleştirmiyor ...).
Jules

1
Her iki yol da işe yarıyor. Daha fazla tecrübe ile, ciddi kodlama için okunabilirliğin, kodun basitliğinden veya orijinalliğinden çok daha önemli olduğunu göreceksiniz. Kodunuz, bakımı yapan başkaları tarafından kolayca okunabilir olmalıdır.
Frantisek Kossuth

Yanıtlar:


36

Yapabilirsin, diğeri ise neler olduğunu görüyorsun myAnswerve programın ilerleyen bölümlerinde kullanabiliyorsun . İkincisini kullanıyorsanız, tekrar kullanamazsınız myAnswer.

Yani daha sonra programda isteyebilirsiniz:

myAnswer + 5
myAnswer + 1
etc.

Kullanmak istediğiniz farklı işlemleriniz olabilir.

Numaraları değiştirmeyi düşünün:

Start
  input myNumber
  set myAnswerA = myNumber * 2
  output myAnswerA
  set myAnswerB = myNumber * 3
  output myAnswerB
  set temp = myAnswerA
  set myAnswerA = myAnswerB
  set myAnswerA = temp
  output myAnswerA
  output myAnswerB
Stop

Değişkenler olmadan zor olurdu. Bilgisayar kitapları gerçek temel başlar ve karmaşıklığı görene kadar çoğu programlama kolaydır. Çoğu şey öğreticilerde önemsizdir ve sadece karmaşıklığın içinde, şeylerin nerede olduğunu veya anlamsız olduğunu görürsünüz.


1
Bu geçerli bir mantık ama en iyi uygulama değil, çünkü bu işlemi programın diğer bölümlerinde tekrar kullanmama izin vermiyor.
user1475207 19

@ user1475207 Düzenlememe bakın. Bu küçük programda önemli değil. Yazar, daha sonra değeri vermekten çok daha fazlasını yapacağınızı bilir. Bunu sadece karmaşıklıkla görüyorsunuz. Yapıştır.
johnny

ah tamam anlıyorum. Bu akılda kitap ile devam edeceğim. Teşekkürler.
user1475207,

29
@ user1475207 Her iki yolun da yeri var. Bazen ekstra değişken kullanmanız gerekebilir. Bazen ekstra değişkene ihtiyacınız olmayabilir, ancak yine de kullanmak isteyebilirsiniz, çünkü bazı durumlarda iyi düşünülmüş bir isim vermek onu çok daha net bir hale getirir. Bazen ekstra değişken kullanmak istemezsiniz çünkü gürültü daha yeni eklenmiştir. Ve çoğu zaman, fark gerçekten önemli değil.
8bittree

3
Bir işlemin sonucunu önceden bir değişkene atamadan döndürmenin geçerli olduğunu düşünüyorum. Ancak resultkısa işlevler için bile bir değişken oluşturma alışkanlığı edindim , böylece ekleme yaparak hata ayıklama print(result)çok hızlı oluyor. Yine de iyi uygulamalardan daha kolay değil.
Sağ bacak

33

Başka bir neden, ödev set myAnswer = myNumber * 2sonuçta elde edilen değere bir isim verir . Kodunuzun iki satır sürümünü okuyan bir kişi yalnızca değerini yazdığını bilir myNumber * 2. Üç satır sürümünü okuyan bir kişi myNumber * 2bunun cevabını görebilir .

Bu kadar önemsiz bir örnekte önemli görünmeyebilir, ancak bazen anlamlı bir ada sahip bir değişkene sonuç değeri atamak , diğer programcıların kodunuzu okumasını ve anlamasını çok daha kolaylaştırabilir.


10
+1, bu yalnızca isim anlamlı olduğunda geçerlidir. İsimli bu gibi geçici değişkenler kullanarak i, resultveya başka anlamsız tanımlayıcı sadece netliğini artırmak için hiçbir şey yapmaz, ve kod Clutterlar
Alexander - Eski Monica

7
@Alexander: Anlamsız isimler hala anlamlı olabilir. iDizi indeksi olsa iyi olur. Eğer bir varsa result, işlev return resultahlaki bir eşdeğeri ile bitmelidir . Ve böylece ...
Kevin

6
@Kevin "Anlamsız isimler hala anlamlı olabilir" uhhh ... emin misin? lol
Alexander - Reinstate Monica

3
@Kevin Eğer gidecekseniz return result, sonuç olarak atadığınız şeyi geri döndürmek için sadece satır içi olabilirsiniz. Bunun bir sonucu olduğunu görebiliriz. Geri veriyorsun, anlıyoruz.
Alexander - Monica,

5
@Alexander: Açıkçası, basit bir ifade ise geri dönüşü satır içi yapabilirsiniz, ancak birden fazla ifadeye göre oluşturmaya ihtiyacınız varsa? Tutarlı bir adlandırma şeması kullanmak, bu durumlarda ne yaptığınızı açıkça gösterir.
Kevin,

14

Bu sahte kod. Uygulanan herhangi bir dil olduğu söylenemez.

Bazı programlama dilleri bir ifadeyi değerlendirmeyi desteklemiyor ve sonucu aynı kod satırında tutuyor. Örneğin çoğu montajcı bunu desteklemez. Belki de kitabın yazarı şeyleri düşük seviyede göstermek istemiştir.


2
Ve bazı diller (örneğin C) aynı anda ikisine de izin verir - eğer gerçekten istiyorsanız "output (answer = answer * 2)" gibi şeyler yazabilirsiniz! (ama "çıktı (cevap == cevap * 2)" den daha dikkatli olun, oldukça farklı bir şey ifade eder ...
alephzero

9

Diğer cevaplar belirli mekanik detaylara ve bir veya diğer formun ne zaman daha iyi olacağına dair örneklere değindi, fakat biraz felsefi:

Bir dil öğreniyorsun.

Dil, fikirlerin ifade edilip anlaşılabildiği (iletilebildiği) bir şeydir. Bir bilgisayar programlama dili, bu dili kullanarak belirtilen ve beslenen fikirlere (kararlara) dayanarak harekete geçmek (yürütmek) için tasarlanmış bir makine tarafından mekanik olarak ayrıştırılabilecek ek bir özelliğe sahiptir.

Hiç faydalı olmayan HERHANGİ bir dilde, o dilde neredeyse her fikri ifade etmenin birden fazla yolu vardır.


İngilizce dilinde mevcut olan çok çeşitli nüansları düşünün. Hatta basit bir cümle

Kedi kutuya atladı.

aynı fiziksel evren eylemine atıfta bulunurken , biraz farklı fikirler ifade etmek veya sahnenin farklı kısımlarına vurgu yapmak için değiştirilebilir.

İlk olarak gramer değişimleri var:

Kutu kedi tarafından atlandı.

Kutuya kedi atladı.

O zaman hala aynı fiziksel eyleme atıfta bulunarak daha geniş ve daha geniş çeşitlilikler var:

Kutu kedinin etkisiyle salladı.

Kedi kutunun üstünde bir thud ile geldi.

Kedi hafifçe havaya sıçradı ve yakındaki bir kutuya özenle indi.

Sadece bu son cümlede "yakındaki" kelimesinin anlamlarına bakın. İçerme, başka türlü mevcut olmayan yepyeni bir kavram dizisini taşır.


Bunu yapmanın birden fazla yolu her zaman vardır, aksine Python Zen.


Tabii ki, niyeti tam olarak ifade eden ve tam olarak neyi iletmek istediğinize bağlı olarak yukarıdaki İngilizce cümlelerin sadece BİRİNİ seçeceğiniz gibi en uygun olan BİR yol olacaktır . Python'un Zen'i bununla ilgili.

Ancak bir giriş programlama kursunda veya bir giriş kursunda, en uygun olanı seçmek için yargıyı geliştirmeden önce bir fikri bir araya getirebileceğiniz çeşitli yolları (kelimeler, kod parçacıkları) öğrenmelisiniz .


3
Tabii ki, Python kendi kurallarını ihlal ediyor. Kuzuların ve yuvalanmış fonksiyonların var; döngüler, liste anlama ve üretici ifadeleri; yüzer, ondalık sayılar ve kesirler; ve __init__ve __new__sadece birkaçını adlandırmak için. Mesele şu ki, her biri çok farklı bir probleme uygun. Bu İngilizce cümlelerden birini rastgele seçemezsiniz veya bu Python dili özelliklerinden birini de rastgele seçemezsiniz.
Kevin

1
@Kevin, evet, kabul etti. Nokta birisi için olduğunu tamamen yeni programlamaya, gerekli sözdizimi doğruluk olabilir bunu yapmak tek bir yolu şey başarılabilir-yani edilebilir kopyalama olduğu görünüyor kesin kod öğretici harfi harfine nasıl ortaokul matematik problemlerine benzer (573 x 247) yalnızca bir doğru cevaba sahip. " Dosyaları küçültmek için program nedir ?" Cevabımı okursanız, rastgele bir şey yapmak demiyorum; Diyorum ki sen edilir hep seçimler yapma programlamak zaman.
Wildcard

1
Bu kesinlikle adil. Bence asıl sorun biraz Python Zenini basitleştiriyor / yanlış tanıtıyor olmanız. Bütün mesele, bu kararların nihayetinde problemin kıvrımları tarafından belirlenmesi ve serbestçe yapabileceğiniz seçimler değil. Gereksinimlerinize mükemmel şekilde uyan tek yol, bunu yapmanın bir yolunu bulmak için çok fazla yineleme ve yeniden düzenleme yapmanız gerekebilir , okunabilir, kısa ve hatta zarif. Ancak verilen herhangi bir sorun için, böyle ideal bir çözüm olmalı ve iyi tasarlanmış bir dil sizi nazikçe yönlendirecektir. Zen'in anlamı budur.
Kevin

4
Bir alaycı 'Python'da bunu yapmanın tek bir yolu vardır, ancak Python'un her yeni sürümü önceki sürümün yaptığı gibi "ve şimdi tamamen farklı bir şey için" işlevini uygular';)
alephzero

3
PEP20'den alıntı: "Bunu yapmanın açık ve net bir yolu olmalı. Her ne kadar bu yol ilk başta Hollandalı değilseniz belli olmayabilir."
vaxquis

5

Sadece myAnswergereksiz görünen değişkenleri soruyorsunuz . Diğer cevaplar, niçin ve ne zaman bunu ihmal etmenin veya kullanmanın anlamlı olacağını açıklıyor, ancak işte bir tane daha: Peki ya bu?

Start
  output input * 2
Stop

hatta bu

Start output input * 2 Stop

Çoğu dilde bu hala işe yarar ama okuyabilir misiniz? Zor, bu yüzden sık sık yardımcı değişkenler kullanıyoruz, çünkü kodları okuyan sadece bilgisayarlar değil. Bunu birkaç ay içinde sürdürmemiz ve anlamamız gerekiyor ve daha sonra çalışmakta olandan sonra hala anlayabileceğiniz bir kod yazmak daha da zor ... genellikle sadece birkaç gün sonra neden belirli bir şey yaptığınızı bilemezsiniz .


2
... ya da sadece (*2). Bununla birlikte, girdiyi gerçekleştirmenin mutlaka bir değişkene erişmek / aritmetik bir işlemi gerçekleştirmek kadar güvenli bir şekilde ifade edilemeyeceğini itiraz ediyorum: gözlemlenebilir yan etkileri olabilir.
leftaroundabout

2

Her iki değişkeni de yapabilirsiniz (bu basit durumda), ancak ilk değişken daha karmaşık durumlar için daha okunaklı ve yapılandırılmış hale gelir. İlk değişken, her adım için bir satırlı IPO modelini gösterir (zaten doğru adı olanlardan ikisi):

Start
  input myNumber                       // Input
  set myAnswer = myNumber * 2          // Process
  output myAnswer                      // Output
Stop
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.