验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

Python中格式化字符串输出的方式有哪些

阅读:311 来源:乙速云 作者:代码code

Python中格式化字符串输出的方式有哪些

      一、%号占位符

      这是一种引入最早的一种,也是比较容易理解的一种方式.使用方式为:

      1、格式化字符串中变化的部分使用占位符
      2、变量以元组形式提供
      3、变量与格式化字符串之间以%连接

      1、格式的字符串(即%s)与被格式化的字符串(即传入的值)必须按照位置一一对应

      ps:当需格式化的字符串过多时,位置极容易搞混

      例如

      a = 'zhangsan'
      b = 'lisi'
      print('%s eated %s' % (a, b))  # zhangsan eated lisi
      print("%s asked %s to do something" % ("zhangsan", 'lisi'))  # zhangsan asked lisi to do something

      2、可以通过字典方式格式化,打破了位置带来的限制与困扰

      print("我的名字是%(name)s,我的年龄是%(age)s" % {"name": 'zhangsan', "age": "list"})  # 我的名字是zhangsan,我的年龄是list
      
      kwargs = {"name": "zhangsan", "age": 18}
      print("my name is %(name)s, my age is %(age)s" % kwargs)  # my name is zhangsan, my age is 18

      二、str.format 内建函数

      该format函数是在python2.6以后引入的,是字符吕类型的内置方法。因为str.format的方式
      比%在性能和灵活性上更好一些。

      1、使用位置参数
      按照位置一一对应

      print("{} and {} is good friedng".format('zhangsan', 'lisi'))  # zhangsan and lisi is good friedng

      2、使用索引
      使用索引取对应位置的值

      print('{0}{0}{1}{0}'.format('哈哈', '隔'))  # 哈哈哈哈隔哈哈

      3、使用关键字参数or字典
      可以通过关键字or字典方式的方式格式化,打破了位置带来的限制与困扰

      print('我的名字是 {name}, 我的年龄是 {age}.'.format(age=18, name='egon'))
      
      kwargs = {'name': 'egon', 'age': 18}
      print("my name is {name}, my age is {age}".format(age=18, name="zhangsan"))
      
      kwargs = {'name': 'zhangsan', "age": 18}
      print("my name is {name}, my age is {age}".format(**kwargs))  # 使用**进行解包操作

      4、填充与格式化

      先取到值,然后在冒号后面设定填充格式:[填充字符][对齐方式][宽度]
      <20: 意思是: 左对齐,总共20个字符,不足部分用号填充

      print("my name is {0:*<20},my age is {1:*<10}".format("zhangsan",
                                                            18))  # my name is zhangsan************,my age is 18********
      
      # *>10: 右对齐,总共10个字符,不足部分用*填充
      print("my name is {0:*<10}".format("zhangsan"))  # my name is zhangsan**
      
      # *^10: 居中,总共18个字符,不足部分用*填充
      print("my name is {0:*^18}".format("zhangsan"))  # my name is *****zhangsan*****
      
      # ^20: 居中,总共20个字符,不足部分用空白填充
      print("my name is {0:^20}".format("zhangsan"))  # my name is       zhangsan

      5、精度与进制

      print("{salary:.2f}".format(salary=123456.1234567))  # 123456.12精确到小数点后3位,四舍五入
      print("{salary:.10f}".format(salary=123456.1234567))  # 123456.1234567890精确到小数点后3位,四舍五入
      print("{:-^10.2f}".format(3.1415926))  # ---3.14--- 取2位小数后,居中,共10位,其余用-填充
      print("{0:b}".format(123))  # 1111011 转成二进制
      print("{0:o}".format(123))  # 173 转成八进制
      print("{0:x}".format(123))  # 7b 转成十六进制
      print("{0:,}".format(1234567))  # 1,234,567 千分位格式化

      三、f-Strings

      由python3.6版本引入的一个特性,称之为字面量格式化字符串
      以F或者f开头,后面跟字符串,字符串中的表达式用大括号{}包起来,它会将变量或表达式计算后的值替换进去

      f-string是以f或F开头的字符串, 核心在于字符串中符号{}的使用

      1、{}中可以是变量名

      name = ‘zhangsan'
      print(f"my name is {name}") # my name is zhangsan

      2 、{}中可以是表达式

      可以在{}中放置任意合法的表达式,会在运行时计算

      print(f"{3 * 3 / 2}")  # 4.5
      
      a = 1
      b = 2
      print(f"a + b = {a + b}")  # a + b = 3

      比如 函数的调用

      name = 'zhangsan'
      print(F"my name is {name.upper()}")  # my name is ZHANGSAN
      
      
      def foo(n):
          print("zhangsan is beautifull")
          return n
      
      
      print(F"{foo(10)}")  # 10  执行时打印函数的返回值
      
      # 在{}中使用‘或者”  保证{}内外使用的不一样即可,如下
      print(F'test {"str"}')  # teststr
      print(F"test {'str'}")  # teststr
      
      # 在{}中需要同时使用'和“,则需要外部字符串使用文档字符串符号'‘'或者”“”
      name = 'zhangsan'
      print(F'''it's name is "{name}" ''')  # it's name is "zhangsan"  注意各个'‘'是不一样的
      print(F"{'{}'}")  # 输出{}  注意两种引号不一样
      
      # {}中不允许出现即使作为函数参数;必须使用的话,可以将包含的内容放到一个变量里,如下
      a = 'zhangsan'
      b = f'my name is {a:-^10}'
      print(b)  # my name is -zhangsan-
      
      # a = f'print the {"t"}'
      # print(a)  # 语法错误
      
      a = 'n'
      print(F"print the {a}")  # print the   n没有显示 但打印正常
      
      # f.str 格式可用于多行字符串,有两种方式:使用连接符  和使用doc签字串。如下
      name = 'zhangsan '
      age = 18
      
      res = f'my name is {name},' 
            F"my age is {age}," 
            F"and i'm happy"
      
      print(res)  # my name is zhangsan ,my age is 18,and i'm happy
      
      res = f'''my name is {name} ,my age is {age},and i'm happy,
      my name is {name} ,my age is {age},and i'm happy
      my name is {name} ,my age is {age},and i'm happy
      my name is {name} ,my age is {age},and i'm happy'''
      
      print(res)  # 输出4行文本

      四、string模块的template

      这是string模块提供的一个模版类,默认使用$ 或者 ${}(建议用这个)来占位,而不是用%
      具体用法如下

      from string import Template
      
      s = 'hi ${name}'
      res = Template(s).substitute(name='zhangsan')  # substitute替代品的意思
      print(res)  # hi zhangsan
      
      # 当需要输出一个$符号时,可以使用$$
      s1 = f'{name}‘s salary is $$1000'
      res = Template(s1).substitute(name='zhangsan')
      print(res)
      
      # Template还有一个safe_substitute函数,
      # 当格式化字符串中有变量未给出值时,此函数将占位符当成字符串输出,
      # 而substitute会报错
      
      name = 'zhangsan'
      
      # s2 = f'{name} and {name2}‘s salary is $$1000'
      # res = Template(s2).substitute()
      # print(res)  #  报错NameError: name 'name2' is not defined
      #学习中遇到问题没人解答?小编创建了一个Python学习交流群:725638078
      
      s3 = 'hi ${apple}, ${peach}'
      res = Template(s3).safe_substitute(apple='apple')
      print(res)  # hi apple, ${peach}

      五、总结四种方式的应用场景

      性能对比

      from timeit import timeit
      
      
      def test_s():
          name = 'zhangsan'
          age = 18
          return "%s:%s" % (name, age)
      
      
      def test_format():
          name = 'zhangsan'
          age = 18
          return '{}:{}'.format(name, age)
      
      
      def test_f():
          name = 'zhangsan'
          age = 18
          return f'{name}:{age}'
      
      
      def test_t():
          return Template('{name}:{age}').substitute(name='zhangsan', age=18)
      
      res1 = timeit(test_s, number = 100000)
      res2 = timeit(test_format, number = 100000)
      res3 = timeit(test_f, number = 100000)
      res4 = timeit(test_t, number = 100000)
      print(res1)  # 0.027567900004214607
      print(res2)  # 0.03230700000131037
      print(res3)  # 0.020800700003746897
      print(res4)  # 0.0893696999992244

      看效率表现,还是 最新的f.str最快

    分享到:
    *特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
    相关文章
    {{ v.title }}
    {{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
    你可能感兴趣
    推荐阅读 更多>