Pemula: Mengapa operasi tidak dimasukkan dalam perintah output?

23

Saya akan membaca buku pemrograman pengantar dan daftar contoh sederhana di pseudocode:

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

Mengapa kita tidak bisa menghilangkan membuat variabel lain yang disebut myAnswerdan hanya memasukkan operasi ke perintah output, seperti ini:

Start
  input myNumber
  output myNumber * 2
Stop

Mengapa yang pertama benar dan yang terakhir tidak?

pengguna1475207
sumber
39
Apakah buku itu mengatakan Anda tidak bisa?
Tulains Córdova
2
Buku itu tidak mengatakan bahwa saya tidak bisa; itu tidak mengatakan apa-apa tentang itu.
user1475207
5
Saya pikir itu cukup masuk akal untuk memulai dengan blok kedua yang lebih pendek, kemudian konversi ke yang pertama jika Anda membutuhkannya.
Mateen Ulhaq
13
Jawaban singkat: Anda bisa, penulis hanya melakukan ini (dalam upaya) untuk membuatnya lebih jelas (walaupun jujur, itu mungkin tidak benar-benar membuatnya lebih jelas sama sekali ...).
Jules
1
Keduanya bekerja. Dengan lebih banyak pengalaman Anda akan menemukan, bahwa untuk pembacaan kode serius jauh lebih penting daripada kesederhanaan atau keaslian kode. Kode Anda harus mudah dibaca oleh banyak orang lain yang mempertahankannya.
Frantisek Kossuth

Jawaban:

36

Anda bisa tetapi yang lain adalah agar Anda melihat apa yang sedang terjadi dan Anda dapat menggunakannya myAnswernanti dalam program. Jika Anda menggunakan yang kedua, Anda tidak dapat menggunakan kembali myAnswer.

Jadi nanti dalam program Anda mungkin ingin:

myAnswer + 5
myAnswer + 1
etc.

Anda mungkin memiliki operasi berbeda yang ingin Anda gunakan.

Pertimbangkan bertukar nomor:

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

Itu akan sulit tanpa variabel. Buku-buku komputer mulai dasar yang nyata, dan sebagian besar pemrograman mudah sampai Anda melihat kerumitan. Kebanyakan semuanya sepele dalam tutorial, dan hanya dalam kompleksitas Anda melihat di mana hal-hal masuk akal atau tidak.

johnny
sumber
1
Jadi itu logika yang valid tetapi bukan praktik terbaik karena itu tidak memungkinkan saya untuk menggunakan kembali operasi di bagian lain dari program?
user1475207
@ user1475207 Lihat hasil edit saya. Dalam program kecil ini tidak masalah. Penulis tahu Anda akan melakukan lebih dari menghasilkan nilai nanti. Hanya dalam kompleksitas Anda bisa melihat ini. Tetap dengan itu.
johnny
ah ok, saya mengerti. Saya akan melanjutkan membaca buku ini dengan mengingat hal ini. Terima kasih.
user1475207
29
@ user1475207 Kedua cara mendapatkan tempatnya. Terkadang Anda mungkin harus menggunakan variabel tambahan. Kadang-kadang Anda mungkin tidak memerlukan variabel tambahan tetapi tetap ingin menggunakannya karena dalam beberapa situasi, hanya memberikan sesuatu nama yang dipikirkan dengan matang membuatnya jauh lebih jelas. Terkadang Anda tidak ingin menggunakan variabel tambahan karena itu hanya menambahkan noise. Dan seringkali, perbedaannya tidak terlalu penting.
8bittree
3
Saya pikir itu sah untuk mengembalikan hasil operasi tanpa menugaskannya ke variabel sebelumnya. Tetapi saya mengambil kebiasaan untuk membuat resultvariabel bahkan untuk fungsi pendek, sehingga debugging dengan menambahkanprint(result) sangat cepat. Ini lebih karena kenyamanan daripada latihan yang baik.
Kaki kanan
33

Alasan lain, penugasan set myAnswer = myNumber * 2memberikan nilai yang dihasilkan nama . Seseorang yang membaca versi dua baris kode Anda hanya tahu bahwa itu mencetak nilai myNumber * 2. Seseorang yang membaca versi tiga baris dapat melihat bahwa myNumber * 2itulah jawabannya .

Ini mungkin tidak terlihat penting dalam contoh sepele seperti itu, tetapi kadang-kadang, menetapkan nilai hasil ke variabel dengan nama yang bermakna dapat membuatnya lebih mudah bagi programmer lain untuk membaca dan memahami kode Anda.

Solomon Lambat
sumber
10
+1, meskipun ini hanya berlaku ketika nama bermakna Menggunakan vars sementara seperti ini bernama i,, resultatau pengenal tidak berarti lainnya tidak melakukan apa pun untuk meningkatkan kejelasan, dan hanya mengacaukan kode
Alexander - Reinstate Monica
7
@Alexander: Nama yang tidak berarti masih bisa berarti. ilebih baik menjadi indeks array. Jika ada result, fungsi harus diakhiri dengan return resultatau setara moral. Dan seterusnya ...
Kevin
6
@Kevin "Nama yang tidak berarti masih bisa berarti" uhhh ... apakah Anda yakin? lol
Alexander - Reinstate Monica
3
@Kevin Jika Anda ingin return result, maka Anda mungkin juga hanya ingin mengembalikan apa pun yang Anda tetapkan untuk hasil. Kita bisa melihat hasilnya. Anda mengembalikannya, kami mengerti.
Alexander - Pasang kembali Monica
5
@Alexander: Jelas Anda dapat menguraikan pengembalian jika itu ekspresi sederhana, tetapi bagaimana jika Anda perlu membangunnya di atas banyak pernyataan? Menggunakan skema penamaan yang konsisten memperjelas apa yang Anda lakukan dalam kasus ini.
Kevin
14

Itu pseudocode. Ini tidak dianggap sebagai bahasa yang diterapkan tertentu.

Beberapa bahasa pemrograman tidak mendukung mengevaluasi ekspresi dan kemudian oututut hasilnya di baris kode yang sama. Misalnya kebanyakan assembler tidak mendukungnya. Mungkin penulis buku ingin menunjukkan sesuatu dengan cara tingkat rendah.

Tulains Córdova
sumber
2
Dan beberapa bahasa (misalnya C) memungkinkan keduanya sekaligus - Anda dapat menulis hal-hal seperti "output (answer = answer * 2)" jika Anda benar-benar ingin! (tapi waspadalah daripada "output (answer == answer * 2)" berarti sesuatu yang sangat berbeda ...
alephzero
9

Jawaban lain telah membahas rincian mekanis spesifik dan contoh-contoh kapan satu atau bentuk lain akan lebih baik, tetapi saya ingin menyebutkan sedikit latar belakang lebih jauh, semacam filosofis:

Anda sedang belajar bahasa.

Bahasa adalah sesuatu di mana gagasan dapat diekspresikan dan dipahami (dikomunikasikan). Bahasa pemrograman komputer memiliki properti tambahan yang dapat diuraikan secara mekanis oleh mesin yang dirancang untuk mengambil tindakan (mengeksekusi) berdasarkan ide (keputusan) yang ditentukan dan dimasukkan dalam penggunaan bahasa itu.

Dalam bahasa APA SAJA yang sangat berguna, ada lebih dari satu cara untuk mengekspresikan hampir semua ide yang dapat diungkapkan dalam bahasa itu.


Pertimbangkan berbagai macam nuansa yang tersedia dalam bahasa Inggris. Bahkan kalimat sederhana, seperti

Kucing itu melompat ke kotak.

dapat bervariasi untuk mengekspresikan ide-ide yang sedikit berbeda atau menempatkan penekanan pada bagian-bagian berbeda dari pemandangan sambil merujuk pada tindakan alam semesta fisik yang sama persis.

Pertama adalah variasi tata bahasa:

Kotak itu dilompati oleh kucing.

Ke kotak melompat kucing.

Kemudian variasi yang lebih luas dan lebih luas, masih mengacu pada aksi fisik yang sama:

Kotak itu bergetar di bawah tumbukan kucing.

Kucing itu turun dengan bunyi gedebuk di atas kotak.

Si kucing melompat ringan ke udara dan mendarat dengan rapi di kotak terdekat.

Lihat saja implikasi kata "dekat" dalam kalimat terakhir itu. Dimasukkannya menyampaikan berbagai konsep baru yang tidak hadir.


Ada selalu lebih dari satu cara untuk melakukannya, Python Zen sebaliknya.


Tentu saja, akan ada SATU cara yang dengan sempurna mengungkapkan niat Anda dan paling cocok, sama seperti Anda hanya akan memilih SATU kalimat bahasa Inggris di atas tergantung pada apa yang ingin Anda komunikasikan. Itulah Zen tentang Python.

Tetapi dalam kursus pemrograman pengantar atau kursus bahasa Inggris pengantar, Anda harus terlebih dahulu mempelajari berbagai cara (kata-kata, cuplikan kode) di mana Anda dapat menulis ide sebelum Anda akan mengembangkan penilaian untuk memilih yang paling pas.

Wildcard
sumber
3
Tentu saja, Python melanggar aturannya sendiri. Anda memiliki fungsi lambda dan bersarang; loop, daftar pemahaman, dan ekspresi generator; pelampung, Desimal, dan pecahan; dan __init__dan __new__, hanya untuk beberapa nama. Intinya adalah bahwa masing-masing cocok untuk masalah yang agak berbeda. Anda tidak akan memilih salah satu dari kalimat bahasa Inggris secara acak, Anda juga tidak akan memilih salah satu dari fitur bahasa Python ini secara acak.
Kevin
1
@ Kevin, ya, setuju. Intinya adalah bahwa untuk seseorang yang sama sekali baru dalam pemrograman, ketepatan sintaksis yang diperlukan dapat membuatnya tampak bahwa hanya ada satu cara apa pun dapat dicapai — yaitu, menyalin kode persis dari tutorial kata demi kata, mirip dengan bagaimana masalah matematika sekolah menengah (573 x 247) hanya memiliki satu jawaban yang benar. Lihat juga pertanyaan-pertanyaan seperti "Apa yang program untuk mengecilkan file?" Jika Anda membaca jawaban saya, saya tidak mengatakan untuk melakukan sesuatu secara acak; Saya mengatakan bahwa Anda sedang selalu membuat pilihan ketika Anda program.
Wildcard
1
Itu tentu adil. Saya pikir masalahnya adalah Anda agak menyederhanakan / salah menggambarkan Zen dari Python. Intinya adalah bahwa keputusan itu pada akhirnya ditentukan oleh kontur masalah Anda, dan bukan pilihan yang bisa Anda buat dengan bebas. Anda mungkin harus melalui banyak iterasi dan refactoring untuk menemukan satu cara untuk melakukannya, satu cara yang sangat sesuai dengan kebutuhan Anda, dapat dibaca, ringkas, bahkan elegan. Tetapi untuk masalah apa pun, harus ada solusi ideal, dan bahasa yang dirancang dengan baik akan memandu Anda ke arah itu. Itulah yang dimaksudkan Zen.
Kevin
4
Orang yang sinis mungkin mengatakan 'Dalam Python hanya ada satu cara untuk melakukannya, tetapi setiap versi baru dari Python menerapkan fungsi "dan sekarang untuk sesuatu yang sama sekali berbeda" dengan cara versi sebelumnya melakukannya';)
alephzero
3
kutipan dari PEP20: "Seharusnya ada satu - dan lebih disukai hanya satu - cara yang jelas untuk melakukannya. Meskipun cara itu mungkin tidak jelas pada awalnya kecuali Anda orang Belanda."
vaxquis
5

Anda hanya bertanya tentang myAnswervariabel yang tampaknya berlebihan. Jawaban lain sudah menjelaskan beberapa alasan dan kapan masuk akal untuk menghilangkan atau menggunakannya tetapi ada satu lagi: bagaimana dengan ini?

Start
  output input * 2
Stop

atau bahkan itu

Start output input * 2 Stop

Dalam sebagian besar bahasa ini masih berfungsi, tetapi bisakah Anda membacanya? Sulit jadi kami sering menggunakan variabel pembantu karena komputer bukan satu-satunya yang membaca kode. Kita perlu memeliharanya dan memahaminya dalam beberapa bulan dan bahkan lebih sulit untuk menulis kode yang masih dapat Anda pahami kemudian kode yang berfungsi ... biasanya setelah hanya beberapa hari Anda tidak akan tahu mengapa Anda melakukan sesuatu dengan cara tertentu .

t3chb0t
sumber
2
... atau bahkan adil (*2). Saya akan keberatan, bagaimanapun, melakukan input tidak selalu dapat dinyatakan dengan aman hanya dengan mengakses variabel / melakukan operasi aritmatika: ia dapat memiliki efek samping yang dapat diamati.
leftaroundabout
2

Anda dapat melakukan kedua varian (dalam kasus sederhana ini), tetapi varian pertama menjadi lebih mudah dibaca dan terstruktur untuk kasus yang lebih kompleks. Varian pertama menunjukkan model IPO dengan satu baris untuk setiap langkah (dua di antaranya sudah dengan nama kanan):

Start
  input myNumber                       // Input
  set myAnswer = myNumber * 2          // Process
  output myAnswer                      // Output
Stop
Raidri mendukung Monica
sumber