ข้ามไปยังเนื้อหาหลัก
Editor

การจัดรูปแบบสตริงใน Python: f-string, format() และ %

เริ่มต้น20 นาที5 แบบฝึกหัด75 XP

บทเรียนนี้แปลจากต้นฉบับภาษาอังกฤษRead in EnglishLeer en españolЧитать на русскомLer em portuguêsแจ้งข้อผิดพลาดในการแปล

0/5 แบบฝึกหัด

ลองนึกภาพว่าคุณกำลังทำใบเสร็จให้ร้านกาแฟ ต้องรวมชื่อสินค้า ราคา และจำนวนไว้ในบรรทัดเดียวให้ดูเรียบร้อย คุณ อาจ ใช้ + ต่อสตริงเข้าด้วยกันก็ได้ แต่โค้ดจะรกขึ้นอย่างรวดเร็ว

การจัดรูปแบบสตริงเหมือนแบบฟอร์มเติมคำในช่องว่าง คุณเขียนโครงประโยคครั้งเดียว แล้วใส่ค่าลงไปในตำแหน่งที่ต้องการ วิธีนี้สะอาดกว่า เร็วกว่า และอ่านง่ายกว่ามาก

Python มีวิธีจัดรูปแบบสตริงสามแบบ: f-string, เมธอด .format() และ ตัวดำเนินการ % ในบทเรียนนี้ คุณจะได้เรียนทั้งสามแบบ และรู้ว่าควรใช้แบบไหนเมื่อไร

ทำไมการจัดรูปแบบสตริงจึงดีกว่าการต่อสตริง

เมื่อเริ่มรวมตัวแปรเข้ากับข้อความ มือใหม่มักหยิบตัวดำเนินการ + มาใช้ก่อน ใช้ได้ก็จริง แต่ต้องแปลงตัวเลขเป็นสตริงเอง และต้องใส่เครื่องหมาย + กระจายไปทั่ว

การต่อสตริง (รก)
name = "Latte"
price = 4.5
qty = 2
print("Item: " + name + " | Price: $" + str(price) + " | Qty: " + str(qty))
f-string (สะอาด)
name = "Latte"
price = 4.5
qty = 2
print(f"Item: {name} | Price: ${price} | Qty: {qty}")

ทั้งสองบรรทัดให้ผลลัพธ์เหมือนกัน แต่แบบ f-string สั้นกว่า อ่านง่ายกว่า และไม่ต้องเรียก str() เองเลย Python จัดการแปลงให้อัตโนมัติ

วิธีใช้ f-string ใน Python

f-string (formatted string literal) ขึ้นต้นด้วยตัวอักษร f หน้าเครื่องหมายคำพูดเปิด ภายในสตริง ให้ใส่ตัวแปรหรือนิพจน์ไว้ในวงเล็บปีกกา {}

Python จะประมวลผลสิ่งที่อยู่ในวงเล็บปีกกาแล้วแทรกผลลัพธ์ลงในสตริง f-string เริ่มมีใน Python 3.6 และปัจจุบันเป็นวิธีจัดรูปแบบสตริงที่แนะนำ

การใช้ f-string พื้นฐาน
name = "Alice"
age = 30
city = "Seattle"
print(f"My name is {name}.")
print(f"I am {age} years old.")
print(f"I live in {city}.")
ผลลัพธ์
My name is Alice.
I am 30 years old.
I live in Seattle.

ตัว f หน้าเครื่องหมายคำพูดคือสิ่งที่ทำให้สตริงนี้พิเศษ ถ้าไม่มี Python จะแสดงข้อความ {name} ออกมาตรงตัว แทนที่จะแสดงค่าของตัวแปร

จะเกิดอะไรขึ้นถ้าไม่มี f นำหน้า
# Without the f prefix - curly braces are printed literally
name = "Alice"
print("Hello, {name}!") # No f prefix
print(f"Hello, {name}!") # With f prefix
ผลลัพธ์
Hello, {name}!
Hello, Alice!

ใส่นิพจน์อะไรใน f-string ได้บ้าง

f-string ไม่ได้จำกัดอยู่แค่ตัวแปรธรรมดา คุณใส่นิพจน์ Python ที่ถูกต้องอะไรก็ได้ไว้ในวงเล็บปีกกา ทั้งการคำนวณ การเรียกฟังก์ชัน การเรียกเมธอด หรือแม้แต่เงื่อนไข

นิพจน์ภายใน f-string
# Math expressions
width = 10
height = 5
print(f"Area: {width * height} square units")
# Function and method calls
name = "python"
print(f"Length: {len(name)}")
print(f"Uppercase: {name.upper()}")
# Conditional expressions
score = 85
print(f"Result: {'Pass' if score >= 60 else 'Fail'}")
ผลลัพธ์
Area: 50 square units
Length: 6
Uppercase: PYTHON
Result: Pass

ให้มอง {} แต่ละคู่เป็นเครื่องคิดเลขจิ๋ว Python ประมวลผลนิพจน์ แปลงผลลัพธ์เป็นสตริง แล้ววางลงในตำแหน่งนั้น


วิธีจัดรูปแบบตัวเลขใน f-string ของ Python

ตรงนี้แหละที่ f-string โดดเด่นจริง ๆ หลังชื่อตัวแปร ให้ใส่เครื่องหมายทวิภาค : ตามด้วย ตัวกำหนดรูปแบบ (format specifier) ที่ควบคุมว่าตัวเลขจะแสดงออกมาอย่างไร

จำนวนตำแหน่งทศนิยมด้วย .Nf

ใช้ :.Nf เพื่อแสดงทศนิยม N ตำแหน่งพอดี ตัว f ย่อมาจากรูปแบบ "fixed-point" (ทศนิยมตำแหน่งคงที่) จำเป็นมากสำหรับการแสดงราคา ค่าที่วัดได้ และคะแนน

ควบคุมจำนวนตำแหน่งทศนิยม
price = 4.5
pi = 3.14159265
print(f"Price: ${price:.2f}") # 2 decimal places
print(f"Pi: {pi:.4f}") # 4 decimal places
print(f"Rounded: {pi:.1f}") # 1 decimal place
ผลลัพธ์
Price: $4.50
Pi: 3.1416
Rounded: 3.1

ใส่จุลภาคคั่นหลักให้ตัวเลขขนาดใหญ่

ใช้ :, เพื่อใส่จุลภาคคั่นหลักให้ตัวเลขขนาดใหญ่ ทำให้ตัวเลขอย่าง 1000000 อ่านได้ง่ายขึ้นมากในแวบเดียว

ใส่จุลภาคคั่นหลัก
population = 8900000
salary = 75000.50
print(f"Population: {population:,}")
print(f"Salary: ${salary:,.2f}")
ผลลัพธ์
Population: 8,900,000
Salary: $75,000.50

เปอร์เซ็นต์ด้วย %

ใช้ :.N% เพื่อแสดงเลขทศนิยมเป็นเปอร์เซ็นต์ Python จะคูณค่าด้วย 100 และเติมเครื่องหมาย % ให้อัตโนมัติ

จัดรูปแบบเปอร์เซ็นต์
completion = 0.756
tax_rate = 0.0825
print(f"Progress: {completion:.1%}") # 75.6%
print(f"Tax rate: {tax_rate:.2%}") # 8.25%
ผลลัพธ์
Progress: 75.6%
Tax rate: 8.25%

การเติมช่องว่างและการจัดแนว

คุณกำหนดความกว้างขั้นต่ำให้ค่าได้ และควบคุมได้ว่าจะชิดซ้าย ชิดขวา หรืออยู่กึ่งกลาง เหมาะมากสำหรับการสร้างผลลัพธ์ที่จัดแนวสวยงามอย่างตาราง

การเติมช่องว่างและการจัดแนว
# Width and alignment
print(f"|{'Left':<15}|") # Left-aligned, 15 chars wide
print(f"|{'Center':^15}|") # Center-aligned
print(f"|{'Right':>15}|") # Right-aligned
# Numbers default to right-aligned
print(f"|{42:>10}|") # Right-aligned number
print(f"|{42:010}|") # Zero-padded to 10 digits
ผลลัพธ์
|Left           |
|    Center     |
|          Right|
|        42|
|0000000042|

วิธีใช้เมธอด .format()

ก่อนจะมี f-string นักพัฒนา Python ใช้เมธอด .format() วิธีนี้ทำงานโดยวางตัวยึดตำแหน่ง {} ว่าง ๆ ไว้ในสตริง แล้วเรียก .format() พร้อมค่าที่จะเติมลงไป

ใช้ .format()
name = "Bob"
age = 25
# Positional arguments
print("Hello, {}! You are {} years old.".format(name, age))
# Numbered positions
print("Hello, {0}! You are {1} years old. Nice to meet you, {0}!".format(name, age))
# Named arguments
print("Hello, {n}! You are {a} years old.".format(n=name, a=age))
ผลลัพธ์
Hello, Bob! You are 25 years old.
Hello, Bob! You are 25 years old. Nice to meet you, Bob!
Hello, Bob! You are 25 years old.

เมธอด .format() รองรับตัวกำหนดรูปแบบชุดเดียวกับ f-string ทุกอย่างหลังเครื่องหมายทวิภาคทำงานเหมือนกันทุกประการ

จัดรูปแบบตัวเลขด้วย .format()
price = 19.99
print("Price: ${:.2f}".format(price))
print("Big number: {:,}".format(1000000))
ผลลัพธ์
Price: $19.99
Big number: 1,000,000

การระบุหมายเลขตำแหน่งมีประโยชน์เมื่อต้องใช้ค่าเดิมซ้ำหลายครั้งในสตริงเดียวกัน คุณอ้างถึงดัชนีเดิมกี่ครั้งก็ได้


ตัวดำเนินการ % สำหรับจัดรูปแบบสตริง (แบบเก่า)

ตัวดำเนินการ % เป็นวิธีจัดรูปแบบสตริงที่เก่าที่สุดใน Python ยืมมาจากฟังก์ชัน printf ของภาษา C คุณจะเห็นวิธีนี้ในโค้ดเก่าและควรอ่านออก แต่ไม่จำเป็นต้องใช้ในโค้ดใหม่

การจัดรูปแบบด้วย % แบบเก่า
name = "Charlie"
age = 35
price = 9.99
print("Hello, %s! You are %d years old." % (name, age))
print("Price: $%.2f" % price)
ผลลัพธ์
Hello, Charlie! You are 35 years old.
Price: $9.99

%s หมายถึง "แทรกสตริงตรงนี้" %d หมายถึง "แทรกจำนวนเต็ม" และ %f หมายถึง "แทรกทศนิยม" ค่าต่าง ๆ จะอยู่หลังตัวดำเนินการ % ที่ท้ายสุด


f-string, format() หรือ %: ควรใช้แบบไหน

ทั้งสามวิธีให้ผลลัพธ์เหมือนกัน ที่ต่างกันคือความอ่านง่ายและความสะดวก นี่คือผลลัพธ์เดียวกันที่เขียนได้สามแบบ:

สามวิธีในการจัดรูปแบบสตริงเดียวกัน
item = "Coffee"
price = 4.50
# f-string (Python 3.6+) - recommended
print(f"{item}: ${price:.2f}")
# .format() method (Python 2.6+)
print("{}: ${:.2f}".format(item, price))
# % operator (oldest style)
print("%s: $%.2f" % (item, price))
ผลลัพธ์
Coffee: $4.50
Coffee: $4.50
Coffee: $4.50

f-string หลายบรรทัดและรูปแบบที่ใช้งานจริง

สำหรับสตริงจัดรูปแบบที่ยาวขึ้น ใช้เครื่องหมายคำพูดสามตัวพร้อม f นำหน้าได้ สะดวกสำหรับข้อความหลายบรรทัด รายงาน และแม่แบบอีเมล

f-string หลายบรรทัด
name = "Alice"
order_id = 4821
total = 37.50
message = f"""Hi {name},
Your order #{order_id} has been confirmed.
Total: ${total:.2f}
Thank you for shopping with us!"""
print(message)
ผลลัพธ์
Hi Alice,

Your order #4821 has been confirmed.
Total: $37.50

Thank you for shopping with us!

นี่คือตัวอย่างที่ใช้งานได้จริง: การสร้างตาราง ตัวกำหนดการจัดแนวช่วยให้แต่ละคอลัมน์ตรงกันอย่างเรียบร้อย

สร้างตารางที่จัดรูปแบบแล้ว
# Simple formatted table
products = [
("Laptop", 999.99, 1),
("Mouse", 29.50, 3),
("Keyboard", 74.00, 2),
]
print(f"{'Product':<12} {'Price':>8} {'Qty':>5} {'Total':>10}")
print("-" * 37)
for name, price, qty in products:
total = price * qty
print(f"{name:<12} {price:>8.2f} {qty:>5} {total:>10.2f}")
ผลลัพธ์
Product         Price   Qty      Total
-------------------------------------
Laptop         999.99     1     999.99
Mouse           29.50     3      88.50
Keyboard        74.00     2     148.00
ทางลัด = สำหรับดีบัก
# Debug trick (Python 3.8+)
x = 42
y = 17
print(f"{x=}")
print(f"{y=}")
print(f"{x + y=}")
ผลลัพธ์
x=42
y=17
x + y=59

แบบฝึกหัด

จัดรูปแบบบรรทัดใบเสร็จ
เขียนโค้ด

สร้างตัวแปร item ให้มีค่า "Cappuccino" และ price ให้มีค่า 4.5 จากนั้นใช้ f-string แสดงบรรทัดใบเสร็จในรูปแบบนี้ให้ตรงทุกตัวอักษร:

Cappuccino .......... $4.50

ราคาต้องแสดงทศนิยม 2 ตำแหน่งพอดี ใช้สตริง " .......... $" คั่นระหว่างชื่อกับราคา

# Create the variables and print the formatted receipt line
จัดรูปแบบตัวเลขขนาดใหญ่ด้วยจุลภาค
เขียนโค้ด

สร้างตัวแปร population ให้มีค่า 7900000000 แล้วแสดงด้วย f-string ที่มีจุลภาคคั่นหลัก ให้ได้ผลลัพธ์:

World population: 7,900,000,000
# Format the population with commas
สร้างแถวตารางที่จัดรูปแบบแล้ว
เขียนโค้ด

สร้างตัวแปรสามตัว: name = "Alice", score = 95.8 และ grade = "A+" แล้วแสดงแถวตารางที่จัดรูปแบบดังนี้:

  • ชื่อ ชิดซ้าย ในช่องกว้าง 10 ตัวอักษร
  • คะแนน ชิดขวา ในช่องกว้าง 8 ตัวอักษร พร้อมทศนิยม 1 ตำแหน่ง
  • เกรด อยู่กึ่งกลาง ในช่องกว้าง 6 ตัวอักษร
  • ผลลัพธ์ที่ต้องได้ (ตัวอักษร | เป็นส่วนหนึ่งของผลลัพธ์):

    | Alice      |     95.8 |   A+  |
    # Create the variables and print the formatted table row
    แก้ f-string ที่ผิด
    แก้บั๊ก

    โค้ดด้านล่างควรแสดง "Hello, Sam! You scored 92.5%." แต่กลับแสดงวงเล็บปีกกาออกมาแทนค่า หาบั๊กแล้วแก้ให้ถูกต้อง

    name = "Sam"
    score = 0.925
    print("Hello, {name}! You scored {score:.1%}.")
    สร้างคำทักทายในอีเมลแบบเฉพาะบุคคล
    เขียนโค้ด

    สร้างตัวแปรเหล่านี้:

  • first_name = "Jordan"
  • items = 3
  • total = 89.95
  • จากนั้นใช้ f-string หลายบรรทัด (เครื่องหมายคำพูดสามตัว) แสดงข้อความนี้ให้ตรงทุกตัวอักษร:

    Hi Jordan,
    
    Thank you for your purchase of 3 items.
    Your total is $89.95.
    
    Have a great day!

    ยอดรวมต้องแสดงทศนิยม 2 ตำแหน่งพอดี

    # Create the variables and print the email greeting

    บทเรียนที่เกี่ยวข้อง

    บทเรียนนี้มีประโยชน์หรือไม่