% S có nghĩa là gì trong chuỗi định dạng python?


166

Không gì %scó nghĩa là bằng Python? Và các bit sau đây làm gì?

Ví dụ...

 if len(sys.argv) < 2:
     sys.exit('Usage: %s database-name' % sys.argv[0])

 if not os.path.exists(sys.argv[1]):
     sys.exit('ERROR: Database %s was not found!' % sys.argv[1])

4
Các %nhà điều hành bị phản đối ủng hộ mạnh mẽ hơn str.formatphương pháp, xem PEP-3101 .
Paulo Scardine

35
Trên thực tế, PEP nói "Trong Python 3.0, toán tử% được bổ sung bằng phương thức định dạng chuỗi mạnh hơn" và nó được nhập vào Python 2.6. Nơi tôi đến từ "bổ sung" có nghĩa là thêm vào, không được thay thế. PEP không nói "thay thế" và không có phần nào trong PEP, nó nói rằng toán tử% không được chấp nhận (tuy nhiên, nó nói rằng những thứ khác không được chấp nhận ở phía dưới). Bạn có thể thích str.format và điều đó tốt, nhưng cho đến khi có một PEP nói rằng nó không được chấp nhận thì không có ý nghĩa gì khi tuyên bố đó là khi nó không.
Ben

Câu trả lời:


198

Nó là một cú pháp định dạng chuỗi (mà nó mượn từ C).

Vui lòng xem "PyFormat" :

Python hỗ trợ định dạng các giá trị thành chuỗi. Mặc dù điều này có thể bao gồm các biểu thức rất phức tạp, cách sử dụng cơ bản nhất là chèn các giá trị vào một chuỗi với %strình giữ chỗ.

Chỉnh sửa: Đây là một ví dụ thực sự đơn giản:

#Python2
name = raw_input("who are you? ")
print "hello %s" % (name,)

#Python3+
name = input("who are you? ")
print("hello %s" % (name,))

%sthông báo cho phép tôi chèn (và có khả năng định dạng) một chuỗi. Lưu ý rằng %smã thông báo được thay thế bằng bất cứ thứ gì tôi chuyển đến chuỗi sau %ký hiệu. Cũng lưu ý rằng tôi cũng đang sử dụng một tuple ở đây (khi bạn chỉ có một chuỗi sử dụng một tuple là tùy chọn) để minh họa rằng nhiều chuỗi có thể được chèn và định dạng trong một câu lệnh.


11
Lưu ý rằng loại nội suy chuỗi này không được dùng trong str.formatphương thức mạnh hơn .
Paulo Scardine

6
Trong python3 raw_input () bây giờ chỉ là input () cho những người bạn đang cố gắng cho chính mình.
Gothburz

1
Tại sao (name,), và không chỉ name?
Cameron Hudson

111

Câu trả lời của Andrew là tốt.

Và chỉ để giúp bạn hiểu thêm một chút, đây là cách bạn sử dụng nhiều định dạng trong một chuỗi

"Hello %s, my name is %s" % ('john', 'mike') # Hello john, my name is mike".

Nếu bạn đang sử dụng ints thay vì chuỗi, hãy sử dụng% d thay vì% s.

"My name is %s and i'm %d" % ('john', 12) #My name is john and i'm 12

2
đẹp. % d giúp bạn tiết kiệm từ việc đúc str (int). bất kỳ ý tưởng nào mà% s và% d đại diện cho? tôi đoán tôi sẽ nhớ chúng dưới dạng chuỗi và chữ số.
dùng391339

1
@ user391339 là viết tắt của chữ số thập phân :) họ đang tất cả ở đây docs.python.org/2/library/...
sqram

Tôi không biết đối với các phiên bản trước, nhưng ít nhất là với 3.6, nó hoạt động như nhau ngay cả khi bạn sử dụng %strên các số nguyên, nó sẽ chỉ được chuyển đổi thành một chuỗi.
lapin

@lapin bạn đúng :). nhưng đó có thể không phải luôn luôn là những gì bạn muốn. Nói rằng bạn muốn đệm một chữ số, ví dụ. print('This number will be padded with 4 zeros: %05d ' % 1)- điều này sẽ làm việc. print('This number will be padded with 4 zeros: %05s ' % 1)- điều này sẽ không `
sqram

28

Các formatphương pháp được giới thiệu vào Python 2.6. Nó có khả năng hơn và không khó sử dụng hơn nhiều:

>>> "Hello {}, my name is {}".format('john', 'mike')
'Hello john, my name is mike'.

>>> "{1}, {0}".format('world', 'Hello')
'Hello, world'

>>> "{greeting}, {}".format('world', greeting='Hello')
'Hello, world'

>>> '%s' % name
"{'s1': 'hello', 's2': 'sibal'}"
>>> '%s' %name['s1']
'hello'

11
Câu trả lời này sẽ được cải thiện nếu giải thích rằng cú pháp trong câu hỏi là định dạng văn bản và sau đó trình bày phương pháp mới hơn. Bằng cách đó, nó có thể tự đứng vững. Cung cấp một ví dụ tương đương với ví dụ trong câu hỏi cũng sẽ là một điểm cộng.
Steve S

13

%scho biết loại chuyển đổi của chuỗi khi sử dụng các khả năng định dạng chuỗi của python. Cụ thể hơn, %schuyển đổi một giá trị được chỉ định thành một chuỗi bằng cách sử dụng str()hàm. So sánh điều này với %rloại chuyển đổi sử dụng repr()chức năng để chuyển đổi giá trị.

Hãy xem các tài liệu để định dạng chuỗi .


13

%s%dlà Trình xác định định dạng hoặc trình giữ chỗ để định dạng chuỗi / số thập phân / số float, v.v.

Định dạng định dạng được sử dụng phổ biến nhất MOST :

%s : chuỗi

%d : số thập phân

%f : Phao nổi

Mã tự giải thích:

name = "Gandalf"
extendedName = "the Grey"
age = 84
IQ = 149.9
print('type(name):', type(name)) #type(name): <class 'str'>
print('type(age):', type(age))   #type(age): <class 'int'>   
print('type(IQ):', type(IQ))     #type(IQ): <class 'float'>   

print('%s %s\'s age is %d with incredible IQ of %f ' %(name, extendedName, age, IQ)) #Gandalf the Grey's age is 84 with incredible IQ of 149.900000 

#Same output can be printed in following ways:


print ('{0} {1}\'s age is {2} with incredible IQ of {3} '.format(name, extendedName, age, IQ))          # with help of older method
print ('{} {}\'s age is {} with incredible IQ of {} '.format(name, extendedName, age, IQ))          # with help of older method

print("Multiplication of %d and %f is %f" %(age, IQ, age*IQ)) #Multiplication of 84 and 149.900000 is 12591.600000          

#storing formattings in string

sub1 = "python string!"
sub2 = "an arg"

a = "i am a %s" % sub1
b = "i am a {0}".format(sub1)

c = "with %(kwarg)s!" % {'kwarg':sub2}
d = "with {kwarg}!".format(kwarg=sub2)

print(a)    # "i am a python string!"
print(b)   # "i am a python string!"
print(c)    # "with an arg!"
print(d)   # "with an arg!"

6

Trả lời câu hỏi thứ hai của bạn: Mã này làm gì? ...

Đây là mã kiểm tra lỗi khá chuẩn cho tập lệnh Python chấp nhận đối số dòng lệnh.

Vì vậy, ifcâu lệnh đầu tiên chuyển thành: nếu bạn không truyền cho tôi một đối số, tôi sẽ cho bạn biết làm thế nào bạn nên truyền cho tôi một đối số trong tương lai, ví dụ: bạn sẽ thấy điều này trên màn hình:

Usage: myscript.py database-name

Câu iflệnh tiếp theo kiểm tra xem 'tên cơ sở dữ liệu' mà bạn chuyển đến tập lệnh có thực sự tồn tại trên hệ thống tập tin hay không. Nếu không, bạn sẽ nhận được một tin nhắn như thế này:

ERROR: Database database-name was not found!

Từ tài liệu :

argv [0] là tên tập lệnh (nó phụ thuộc vào hệ điều hành cho dù đây có phải là tên đường dẫn đầy đủ hay không). Nếu lệnh được thực thi bằng tùy chọn dòng lệnh -c cho trình thông dịch, argv [0] được đặt thành chuỗi '-c'. Nếu không có tên tập lệnh nào được chuyển đến trình thông dịch Python, argv [0] là chuỗi rỗng.


2

Đây là một ví dụ tốt trong Python3.

  >>> a = input("What is your name?")
  What is your name?Peter

  >>> b = input("Where are you from?")
  Where are you from?DE

  >>> print("So you are %s of %s" % (a, b))
  So you are Peter of DE
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.