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.
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.
Câu trả lời:
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 goals
và penalties
là 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).
"({0.goals} goals, ${0.penalties})".format(self)
"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ó f
trong đó, 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.
"{:.2f}%".format(float_num)
hoạt động tốt cho cả hai.
$
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.
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 .format
tiê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'
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)'
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