Bagaimana Anda mencetak berdampingan dengan python?

Proyek yang rapi, Steve. Itu banyak kode. Apakah Anda memiliki pertanyaan tentang bagian tertentu darinya? . Ini terkadang disebut "kode mainan"; . )

Terima kasih telah meletakkan kode Anda di antara backticks. Coba tambahkan

print("This line")
print("Next line")
print("\033[FMy text overwriting the previous line.")
0 ke set backticks pertama, seperti ini
``` python

```
Saya pikir Anda akan menyukai hasilnya

EDIT. Saya melihat bahwa pertanyaan Anda dipagari oleh backticks dan harus dibebaskan

Bagaimana Anda mencetak berdampingan dengan python?
steve sullivan

when I run the script it displays the cards from top to bottom. How can I get it to display the cards in a single row left to right?
I have tried using end="" and sep="" and also """ """ when showing cards but to no avail.
_

Sebuah contoh selalu SANGAT jauh untuk menunjukkan situasinya. Anda ingin kartu-kartu itu berdampingan, bukan? . Sepintas lalu, sepertinya aplikasi

print("This line")
print("Next line")
print("\033[FMy text overwriting the previous line.")
2 dua dimensi. Saat ini saya tidak punya waktu untuk menyusun ide mendetail, tetapi ini terlihat seperti tantangan yang akan dinikmati Steve D'Aprano–dan mungkin akan muncul dengan sesuatu yang brilian. Mari kita lihat siapa yang mengambilnya…

┌───────┐
| 5     |
|       |
|   ♥   |
|       |
|     5 |
└───────┘
┌───────┐
| 8     |
|       |
|   ♥   |
|       |
|     8 |
└───────┘
_

IDE 1. Anda mungkin dapat menggunakan karakter escape baris sebelumnya untuk mengontrol kursor dan memindahkan "kursor" keluaran

print("This line")
print("Next line")
print("\033[FMy text overwriting the previous line.")
3 mundur ke atas kartu. Posting StackEchange tentangnya ada DI SINI
Anda masih harus melompat ke kanan melewati kartu yang sudah diberikan, tentu saja
Contoh

print("This line")
print("Next line")
print("\033[FMy text overwriting the previous line.")

Ini akan membosankan dan sama sekali tidak Pythonic. Susunan

print("This line")
print("Next line")
print("\033[FMy text overwriting the previous line.")
2 jauh lebih menarik

Hai Steve,

Terima kasih telah memposting kode Anda, tetapi Anda membuang sekitar 150 baris kode yang tidak relevan dengan pertanyaan Anda

Anda mencoba mencetak sesuatu seperti ini

┌───────┐ ┌───────┐

> 5     | | Q     |

>       > >       >

>   ♥   | |   ♥   |

>       > >       >

>     5 | |     Q |

└───────┘ └───────┘
_

tetapi kedua kartu dicetak di bawah satu sama lain. Benar?

Mari kita potong ini menjadi contoh dasar


def show_card(n):

    print("[ %d ]" % n)

    print("[ H ]")

_

Anda ingin mencetak dua kartu bersebelahan

[ 5 ] [ 6 ]

[ H ] [ H ]

bukannya satu di atas satu sama lain. Anda dapat menambahkan barang-barang mewah nanti

Salah satu caranya adalah dengan menggunakan kode escape ANSI untuk memindahkan posisi kursor. Anda bisa melihat sebagai contoh. Bukan berarti kode pelarian ANSI mungkin tidak didukung di Windows

Cara lain adalah dengan perpustakaan seperti Colorama

Cara ketiga adalah menggunakan pustaka kutukan, tetapi itu hanya untuk Linux/Unix

Tetapi cara paling dasar yang akan bekerja pada sistem apa pun bukanlah mencetak kartu Anda satu per satu, tetapi merakit seluruh tangan sebelum mencetaknya.

Jadi, alih-alih memanggil

print("This line")
print("Next line")
print("\033[FMy text overwriting the previous line.")
_3 untuk setiap baris di setiap kartu secara terpisah, bangun seluruh tangan sekaligus, lalu cetak lotnya

hand = []

# First row.

hand.append('[ 5 ]')

hand.append(' ')

hand.append('[ 6 ]')

hand.append('\n')  # Newline makes a new row

# Second row.

hand.append('[ H ] [ H ]')

print(''.join(hand))

Banyak cara berbeda untuk menangani ini. Ingatlah bahwa rahasianya adalah merakit string yang mewakili seluruh tangan terlebih dahulu, lalu mencetaknya, bukan satu kartu pada satu waktu.

Bagaimana Anda mencetak berdampingan dengan python?
Leland Parker

Anda mungkin dapat menggunakan karakter pelarian baris sebelumnya

Sudah beberapa dekade sejak saya mengendarai atau menerbangkan kursor konsol (lebih dari 4) tetapi ternyata lebih mudah dari yang saya kira. Urutan kode

print("This line")
print("Next line")
print("\033[FMy text overwriting the previous line.")
6 memungkinkan Anda menentukan Garis dan Kolom. Berikut adalah beberapa kode kontrol kursor yang akan membantu Anda membuat hasil yang Anda cari. Sebagai perbaikan kode lebih lanjut sesudahnya, saya sangat merekomendasikan pendekatan daftar untuk membangun "tangan" dan kemudian merendernya melalui serangkaian pernyataan
print("This line")
print("Next line")
print("\033[FMy text overwriting the previous line.")
3 (sebaiknya satu
print("This line")
print("Next line")
print("\033[FMy text overwriting the previous line.")
3 dilingkarkan)

DARI halaman ini. Gerakan Kursor

- Position the Cursor:
  \033[<L>;<C>H
     Or
  \033[<L>;<C>f
  puts the cursor at line L and column C.
- Move the cursor up N lines:
  \033[<N>A
- Move the cursor down N lines:
  \033[<N>B
- Move the cursor forward N columns:
  \033[<N>C
- Move the cursor backward N columns:
  \033[<N>D

- Clear the screen, move to (0,0):
  \033[2J
- Erase to end of line:
  \033[K

Saya hanya menguji kode '

print("This line")
print("Next line")
print("\033[FMy text overwriting the previous line.")
_9' untuk posting pertama saya, tetapi itu sama dengan yang ada di daftar di atas
PERINGATAN. Saya menjalankan cuplikan kode di bawah ini dalam VS Code dan tampaknya berfungsi dengan baik. NAMUN, Python 3. 8 konsol juru bahasa tidak mengenali kode kontrol kursor. Menjalankan ~. Program py di konsol CMD juga tidak berfungsi. Selama Anda hanya berencana untuk menjalankannya di lingkungan yang dapat menginterpretasikan kode, Anda akan baik-baik saja. Skenario ini jelas bukan untuk rilis umum dan tergantung pada niat penggunaan Anda. Kode kontrol akan bermasalah dalam skenario lintas platform, untuk sedikitnya, tetapi mereka baik-baik saja – dan menyenangkan – untuk dimainkan di VS Code

TIP. Jika Anda mengosongkan layar sebelum merender setiap tangan, Anda selalu dapat mulai merender tangan pada [0,0] (kiri atas). Ini mungkin terlihat bersih dan profesional tetapi akan, yang lebih penting, menyelamatkan Anda dari beberapa sakit kepala besar dengan perhitungan mati dari posisi kursor sewenang-wenang (posisi kursor "saat ini" pada titik tertentu dalam program

Ini cuplikan contoh

print("\033[0;0HLook Ma! I'm overwriting the top line starting from screen origin!!")

Inilah solusi yang berfungsi untuk sejumlah kartu di tangan. Saya mengubah skor maksimal '

┌───────┐ ┌───────┐

> 5     | | Q     |

>       > >       >

>   ♥   | |   ♥   |

>       > >       >

>     5 | |     Q |

└───────┘ └───────┘
_0' menjadi '
┌───────┐ ┌───────┐

> 5     | | Q     |

>       > >       >

>   ♥   | |   ♥   |

>       > >       >

>     5 | |     Q |

└───────┘ └───────┘
1' untuk memungkinkan tangan yang lebih besar daripada yang mungkin dimiliki siapa pun dan tetap di bawah 21. Seluruh hasil edit ada dalam metode
┌───────┐ ┌───────┐

> 5     | | Q     |

>       > >       >

>   ♥   | |   ♥   |

>       > >       >

>     5 | |     Q |

└───────┘ └───────┘
2

Alih-alih mengulangi kartu dan merendernya satu per satu, kami mengulang melalui kartu dan merender seluruh garis tangan demi baris
EDIT. Kartu-kartu ini berbentuk persegi di laptop saya. Discourse mobile tidak dirender dengan monospace karena beberapa alasan

when I run the script it displays the cards from top to bottom. How can I get it to display the cards in a single row left to right?
I have tried using end="" and sep="" and also """ """ when showing cards but to no avail.
0
when I run the script it displays the cards from top to bottom. How can I get it to display the cards in a single row left to right?
I have tried using end="" and sep="" and also """ """ when showing cards but to no avail.
1

Sekarang setelah masalah terdekat Anda teratasi, berikut adalah beberapa hal yang perlu dipikirkan untuk menyederhanakan dan meningkatkan kode Anda—masing-masing tidak hanya relevan secara langsung dengan apa yang telah Anda tulis, tetapi menggambarkan teknik bagus yang akan diterapkan ke berbagai macam pemrograman yang Anda lakukan

Gunakan nama variabel yang membantu

Jika Anda ingin orang lain (atau Anda, dalam beberapa hari, minggu atau bulan) dapat memahami kode Anda, sangat membantu untuk memiliki nama variabel yang ringkas namun deskriptif.

┌───────┐ ┌───────┐

> 5     | | Q     |

>       > >       >

>   ♥   | |   ♥   |

>       > >       >

>     5 | |     Q |

└───────┘ └───────┘
3 atau
┌───────┐ ┌───────┐

> 5     | | Q     |

>       > >       >

>   ♥   | |   ♥   |

>       > >       >

>     5 | |     Q |

└───────┘ └───────┘
4 umumnya digunakan dalam Python dan sebagian besar bahasa pemrograman untuk indeks loop, angka yang bertambah satu kali setiap iterasi loop, jadi menggunakannya untuk mewakili kartu adalah samar dan berpotensi membingungkan. Sebagai gantinya, berikan nama yang lebih tepat, seperti, yah,
┌───────┐ ┌───────┐

> 5     | | Q     |

>       > >       >

>   ♥   | |   ♥   |

>       > >       >

>     5 | |     Q |

└───────┘ └───────┘
5

when I run the script it displays the cards from top to bottom. How can I get it to display the cards in a single row left to right?
I have tried using end="" and sep="" and also """ """ when showing cards but to no avail.
_2

Juga, dalam Python, konvensi standar adalah menggunakan

┌───────┐ ┌───────┐

> 5     | | Q     |

>       > >       >

>   ♥   | |   ♥   |

>       > >       >

>     5 | |     Q |

└───────┘ └───────┘
6 untuk nama variabel (dan atribut, metode dan fungsi) daripada
┌───────┐ ┌───────┐

> 5     | | Q     |

>       > >       >

>   ♥   | |   ♥   |

>       > >       >

>     5 | |     Q |

└───────┘ └───────┘
7, sementara
┌───────┐ ┌───────┐

> 5     | | Q     |

>       > >       >

>   ♥   | |   ♥   |

>       > >       >

>     5 | |     Q |

└───────┘ └───────┘
8 dicadangkan untuk kelas (seperti yang telah Anda lakukan)

Hindari banyak penyelesaian print()

Meskipun Anda dapat menggunakan dengan

print("This line")
print("Next line")
print("\033[FMy text overwriting the previous line.")
3 dengan

def show_card(n):

    print("[ %d ]" % n)

    print("[ H ]")

0 seperti yang Anda lakukan, ini mengarah ke kode yang lebih bertele-tele dan kurang efisien, karena Anda harus memanggil
print("This line")
print("Next line")
print("\033[FMy text overwriting the previous line.")
3 banyak dan melacak jeda baris secara manual, yang mudah dikacaukan. Saya sarankan Anda membuat hidup Anda lebih mudah dengan mengutak-atik desain Anda untuk menambahkan setiap baris ke daftar baris dan kemudian menggunakan

def show_card(n):

    print("[ %d ]" % n)

    print("[ H ]")

2 dan mencetak semuanya sekaligus

when I run the script it displays the cards from top to bottom. How can I get it to display the cards in a single row left to right?
I have tried using end="" and sep="" and also """ """ when showing cards but to no avail.
_3

Manfaatkan pemahaman

Sekarang setelah kita membuat daftar sebelum mencetaknya, kita dapat menggunakan pemahaman daftar untuk membuat baris individual kita secara bergantian, yang lebih bersih, lebih pendek, dan lebih efisien daripada menggunakan


def show_card(n):

    print("[ %d ]" % n)

    print("[ H ]")

3 loop. Pemahaman daftar berfungsi seperti ini

when I run the script it displays the cards from top to bottom. How can I get it to display the cards in a single row left to right?
I have tried using end="" and sep="" and also """ """ when showing cards but to no avail.
_4

Jadi misalnya untuk membangun garis dengan nilai kartu, bukan

when I run the script it displays the cards from top to bottom. How can I get it to display the cards in a single row left to right?
I have tried using end="" and sep="" and also """ """ when showing cards but to no avail.
_5

kita bisa

when I run the script it displays the cards from top to bottom. How can I get it to display the cards in a single row left to right?
I have tried using end="" and sep="" and also """ """ when showing cards but to no avail.
_6

Gunakan def show_card(n): print("[ %d ]" % n) print("[ H ]") 4 dan def show_card(n): print("[ %d ]" % n) print("[ H ]") 5 dengan benar

Bagaimana Anda mencetak berdampingan dengan python?
steve sullivan

when I run the script it displays the cards from top to bottom. How can I get it to display the cards in a single row left to right?
I have tried using end="" and sep="" and also """ """ when showing cards but to no avail.
_7

Anda harus menghindari pemanggilan atribut dan metode dunder (yang memiliki Double UNDERscores di sekitar namanya, seperti


def show_card(n):

    print("[ %d ]" % n)

    print("[ H ]")

6) secara langsung, dan sebagai gantinya gunakan fungsi generik yang sesuai dengannya (dalam hal ini, fungsi

def show_card(n):

    print("[ %d ]" % n)

    print("[ H ]")

5 bawaan. Jadi sebagai gantinya (dengan penamaan variabel Pythonic), lakukan saja

when I run the script it displays the cards from top to bottom. How can I get it to display the cards in a single row left to right?
I have tried using end="" and sep="" and also """ """ when showing cards but to no avail.
_8

Tapi tunggu, masih ada lagi. Untuk kelas khusus Anda sendiri seperti


def show_card(n):

    print("[ %d ]" % n)

    print("[ H ]")

_8, Anda dapat menerapkan metode dunder yang sesuai sehingga fungsi standar berfungsi seperti yang diharapkan. Jadi, alih-alih

when I run the script it displays the cards from top to bottom. How can I get it to display the cards in a single row left to right?
I have tried using end="" and sep="" and also """ """ when showing cards but to no avail.
_9

Anda dapat melakukan

┌───────┐
| 5     |
|       |
|   ♥   |
|       |
|     5 |
└───────┘
┌───────┐
| 8     |
|       |
|   ♥   |
|       |
|     8 |
└───────┘
_0

Kemudian, Anda dan pengguna Anda tidak perlu mengingat metode khusus apa yang bertanggung jawab atas panjang dek dan memanggilnya, Anda cukup memanggil


def show_card(n):

    print("[ %d ]" % n)

    print("[ H ]")

5 biasa

┌───────┐
| 5     |
|       |
|   ♥   |
|       |
|     5 |
└───────┘
┌───────┐
| 8     |
|       |
|   ♥   |
|       |
|     8 |
└───────┘
_1

Salah satu bonus dari pendekatan ini adalah memeriksa apakah dek kosong lebih mudah;

┌───────┐
| 5     |
|       |
|   ♥   |
|       |
|     5 |
└───────┘
┌───────┐
| 8     |
|       |
|   ♥   |
|       |
|     8 |
└───────┘
_2

Anda hanya bisa melakukannya

┌───────┐
| 5     |
|       |
|   ♥   |
|       |
|     5 |
└───────┘
┌───────┐
| 8     |
|       |
|   ♥   |
|       |
|     8 |
└───────┘
_3SIDENOTE. Perluas untuk melihat

Ini terutama bersinar ketika berhadapan dengan banyak objek dari tipe berbeda yang masing-masing memiliki panjang, jadi alih-alih melakukan (LBYL)

┌───────┐
| 5     |
|       |
|   ♥   |
|       |
|     5 |
└───────┘
┌───────┐
| 8     |
|       |
|   ♥   |
|       |
|     8 |
└───────┘
_4

atau (EAFP)

┌───────┐
| 5     |
|       |
|   ♥   |
|       |
|     5 |
└───────┘
┌───────┐
| 8     |
|       |
|   ♥   |
|       |
|     8 |
└───────┘
_5

Anda bisa melakukannya

┌───────┐
| 5     |
|       |
|   ♥   |
|       |
|     5 |
└───────┘
┌───────┐
| 8     |
|       |
|   ♥   |
|       |
|     8 |
└───────┘
_6

Kembalikan buku untuk status dan hindari angka ajaib

Dalam kode Anda di atas, alih-alih mengembalikan salah satu dari dua nilai bilangan bulat arbitrer yang berbeda untuk memberi sinyal apakah skornya lebih dari 21 saat menekan atau menangani dan memeriksa nilai persisnya sebagai angka ajaib,

┌───────┐
| 5     |
|       |
|   ♥   |
|       |
|     5 |
└───────┘
┌───────┐
| 8     |
|       |
|   ♥   |
|       |
|     8 |
└───────┘
_7

Cukup kembalikan dan periksa boolean secara langsung—lebih sederhana, lebih jelas, dan lebih kuat

┌───────┐
| 5     |
|       |
|   ♥   |
|       |
|     5 |
└───────┘
┌───────┐
| 8     |
|       |
|   ♥   |
|       |
|     8 |
└───────┘
_8

Hindari duplikat bust yang memeriksa setiap gerakan

Namun, masih ada masalah — saat ini, setiap gerakan yang dapat mengubah skor pemain (

[ 5 ] [ 6 ]

[ H ] [ H ]
0,
[ 5 ] [ 6 ]

[ H ] [ H ]
1, dll) memeriksa kegagalan, yang menyebabkan banyak kode duplikat dan potensi kesalahan. Bagaimana jika Anda juga ingin menambahkan lebih banyak gerakan dari Blackjack asli, seperti Double Down atau Split? . Alih-alih, pindahkan pemeriksaan itu ke metodenya sendiri, atau lakukan langsung di pemanggil

Gunakan properti untuk selalu memperbarui skor Anda

Namun masih ada duplikasi di sini, dan potensi bug yang lebih buruk—metode ini masih harus memanggil

[ 5 ] [ 6 ]

[ H ] [ H ]
2 untuk memperbarui skor saat ini. Jika Anda lupa di suatu tempat, atau mencoba mengakses skor secara langsung saat sedang diperbarui, Anda memiliki bug yang senyap dan seringkali sulit dilacak. Ini juga berarti menduplikasi data dalam daftar
[ 5 ] [ 6 ]

[ H ] [ H ]
3 Anda, yang merupakan resep untuk masalah karena keduanya bisa tidak sinkron, yang merupakan magnet bug besar lainnya

Alih-alih, Anda ingin skor Anda diperbarui secara dinamis setiap kali diakses berdasarkan data di kartu, untuk memastikannya selalu diperbarui. Tapi bagaimana melakukannya? . Tapi sangat nyaman untuk dapat mengaksesnya dengan atribut, karena itu hanya data saja…

Nah, dengan Python, Anda bisa mendapatkan yang terbaik dari kedua dunia menggunakan properti. Untuk membuatnya, Anda menggunakan dekorator

[ 5 ] [ 6 ]

[ H ] [ H ]
6, lalu setiap kali Anda mengakses atribut, nilainya dihitung secara dinamis. Dan yang terbaik, inti apa pun yang saat ini mengakses
[ 5 ] [ 6 ]

[ H ] [ H ]
5 tidak perlu diubah. Kami baru saja menghapus
[ 5 ] [ 6 ]

[ H ] [ H ]
_4 dari mana-mana, dan mengganti atribut
[ 5 ] [ 6 ]

[ H ] [ H ]
5 dengan properti
[ 5 ] [ 6 ]

[ H ] [ H ]
5

┌───────┐
| 5     |
|       |
|   ♥   |
|       |
|     5 |
└───────┘
┌───────┐
| 8     |
|       |
|   ♥   |
|       |
|     8 |
└───────┘
_9

Sekarang, tidak perlu memiliki atau menelepon

[ 5 ] [ 6 ]

[ H ] [ H ]
2 lagi;

Bagaimana Anda mencetak dua baris dengan Python?

"\n" dapat digunakan untuk karakter baris baru, atau jika Anda mencetak hal yang sama berkali-kali maka perulangan for harus digunakan .

Apa itu print ('\ n ') di Python?

Fungsi Python print() menerima data python seperti int dan string, dan mencetak nilai tersebut ke standar keluar . Untuk mengatakan bahwa standar keluar adalah "teks" di sini berarti serangkaian baris, di mana setiap baris adalah serangkaian karakter dengan karakter baris baru '\n' yang menandai akhir setiap baris.

Bagaimana Anda mencetak banyak baris dengan satu cetakan dengan Python?

Anda tidak dapat membagi pernyataan menjadi beberapa baris dengan Python dengan menekan Enter. Alih-alih, gunakan garis miring terbalik ( \ ) untuk menunjukkan bahwa pernyataan dilanjutkan ke baris berikutnya . Dalam skrip versi revisi, spasi kosong dan garis bawah menunjukkan bahwa pernyataan yang dimulai pada baris 1 dilanjutkan pada baris 2.