Định dạng chuỗi trong Python 3


115

Tôi làm điều này trong Python 2:

"(%d goals, $%d)" % (self.goals, self.penalties)

Phiên bản Python 3 này là gì?

Tôi đã thử tìm kiếm các ví dụ trực tuyến nhưng tôi vẫn nhận được các phiên bản Python 2.


Nó không bị phản đối; mã của bạn hoạt động tốt. Đọc thêm ở đây .
jackcogdill

32
Lưu ý cho người đọc bình thường: Ký hiệu đô la không có ý nghĩa đặc biệt. Nó chỉ là một ký hiệu đô la ở đây. (Cảm ơn Martijn Pieters)
kevinarpe


1
Ký hiệu đô la làm cho điều này rất khó hiểu ..
cchamberlain

Câu trả lời:


173

Dưới đây là các tài liệu về cú pháp định dạng "mới". Một ví dụ sẽ là:

"({:d} goals, ${:d})".format(self.goals, self.penalties)

Nếu cả hai goalspenaltieslà số nguyên (nghĩa là định dạng mặc định của chúng là ok), nó có thể được rút ngắn thành:

"({} goals, ${})".format(self.goals, self.penalties)

Và vì các tham số là các trường của self, nên cũng có một cách thực hiện bằng cách sử dụng một đối số hai lần (như @Burhan Khalid đã lưu ý trong các nhận xét):

"({0.goals} goals, ${0.penalties})".format(self)

Giải thích:

  • {} có nghĩa chỉ là đối số vị trí tiếp theo, với định dạng mặc định;
  • {0}có nghĩa là đối số với chỉ mục 0, với định dạng mặc định;
  • {:d} là đối số vị trí tiếp theo, với định dạng số nguyên thập phân;
  • {0:d}là đối số với chỉ mục 0, với định dạng số nguyên thập phân.

Có nhiều thứ khác bạn có thể làm khi chọn đối số (sử dụng đối số được đặt tên thay vì đối số vị trí, truy cập trường, v.v.) và nhiều tùy chọn định dạng (đệm số, sử dụng hàng nghìn dấu phân cách, hiển thị dấu hiệu hoặc không, v.v.). Một số ví dụ khác:

"({goals} goals, ${penalties})".format(goals=2, penalties=4)
"({goals} goals, ${penalties})".format(**self.__dict__)

"first goal: {0.goal_list[0]}".format(self)
"second goal: {.goal_list[1]}".format(self)

"conversion rate: {:.2f}".format(self.goals / self.shots) # '0.20'
"conversion rate: {:.2%}".format(self.goals / self.shots) # '20.45%'
"conversion rate: {:.0%}".format(self.goals / self.shots) # '20%'

"self: {!s}".format(self) # 'Player: Bob'
"self: {!r}".format(self) # '<__main__.Player instance at 0x00BF7260>'

"games: {:>3}".format(player1.games)  # 'games: 123'
"games: {:>3}".format(player2.games)  # 'games:   4'
"games: {:0>3}".format(player2.games) # 'games: 004'

Lưu ý: Như những người khác đã chỉ ra, định dạng mới không thay thế trước đây, cả hai đều có sẵn trong Python 3 và các phiên bản mới hơn của Python 2. Một số người có thể nói đó là vấn đề ưu tiên, nhưng IMHO mới hơn biểu cảm hơn nhiều so với cũ và nên được sử dụng bất cứ khi nào viết mã mới (tất nhiên trừ khi nó nhắm mục tiêu vào môi trường cũ hơn).


9
Bạn cũng có thể làm"({0.goals} goals, ${0.penalties})".format(self)
Burhan Khalid

Bạn cần lấy '%' bên ngoài dấu ngoặc nhọn, ví dụ: {: .2f%} -> {: .2f}%
SuperElectric

@SuperElectric bạn có nghĩa là, trong dòng này : "conversion rate: {:.2%}".format(self.goals / self.shots)? Nó hoạt động tốt với tôi vì nó là ... (Python 3.4) Lưu ý rằng không có ftrong đó, tôi yêu cầu định dạng theo tỷ lệ phần trăm, không phải là số dấu phẩy động.
mgibsonbr

Bạn đúng; nó dường như hoạt động trong Python 3.4, vì vậy điều đó rất tốt vì OP đã hỏi về Python3. Tôi chỉ thấy nó không hoạt động với python 2.7.6. "{:.2f}%".format(float_num)hoạt động tốt cho cả hai.
SuperElectric

1
@JohnSchmitt Vâng, ví dụ này được cho là cung cấp đầu ra chính xác giống như mã được đưa ra trong câu hỏi. Không $có ý nghĩa đặc biệt ở đây, không phải trong cú pháp định dạng cũ cũng như mới, do đó, nên có mặt trong chuỗi được tạo, không thay đổi.
mgibsonbr

67

Python 3.6 hiện hỗ trợ phép nội suy chuỗi ký tự bằng chữ viết tắt với PEP 498 . Đối với trường hợp sử dụng của bạn, cú pháp mới chỉ đơn giản là:

f"({self.goals} goals, ${self.penalties})"

Điều này tương tự với .formattiêu chuẩn trước đó , nhưng cho phép người ta dễ dàng thực hiện những việc như :

>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal('12.34567')
>>> f'result: {value:{width}.{precision}}'
'result:      12.35'

12

Dòng đó hoạt động như trong Python 3.

>>> sys.version
'3.2 (r32:88445, Oct 20 2012, 14:09:29) \n[GCC 4.5.2]'
>>> "(%d goals, $%d)" % (self.goals, self.penalties)
'(1 goals, $2)'

ĐỒNG Ý. MÁT MẺ. Sau khi tôi đăng câu hỏi, tôi đang tiếp tục tìm kiếm và thấy rằng chúng tôi phải thực hiện {% d} thay vì chỉ% d có đúng không? Hay cách Python2 là cách duy nhất để làm điều đó?
JoseBazBaz

2
Python 3 giới thiệu một cú pháp mới - đó là dấu ngoặc nhọn - nhưng bạn không bắt buộc phải sử dụng nó. Bạn có thể sử dụng cái cũ hoặc cái mới. Nhưng họ khác nhau; nếu bạn đang sử dụng curlies, bạn không sử dụng dấu phần trăm.
Mark Reed

2

Tôi thích cách tiếp cận này

my_hash = {}
my_hash["goals"] = 3 #to show number
my_hash["penalties"] = "5" #to show string
print("I scored %(goals)d goals and took %(penalties)s penalties" % my_hash)

Lưu ý nối d và s vào dấu ngoặc tương ứng.

đầu ra sẽ là:

I scored 3 goals and took 5 penalties
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.