zoukankan      html  css  js  c++  java
  • 基础补充

    一、字符串格式化

    Python的字符串格式化有两种方式: 百分号方式、format方式

     百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存。

    1、百分号方式


     %[(name)][flags][width].[precision]typecode

    • (name)      可选,用于选择指定的key
    • flags          可选,可供选择的值有:
      • +       右对齐;正数前加正好,负数前加负号;
      • -        左对齐;正数前无符号,负数前加负号;
      • 空格    右对齐;正数前加空格,负数前加负号;
      • 0        右对齐;正数前无符号,负数前加负号;用0填充空白处
    • width         可选,占有宽度
    • .precision   可选,小数点后保留的位数
    • typecode    必选
      • s,获取传入对象的__str__方法的返回值,并将其格式化到指定位置
      • r,获取传入对象的__repr__方法的返回值,并将其格式化到指定位置
      • c,整数:将数字转换成其unicode对应的值,10进制范围为 0 <= i <= 1114111(py27则只支持0-255);字符:将字符添加到指定位置
      • o,将整数转换成 八  进制表示,并将其格式化到指定位置
      • x,将整数转换成十六进制表示,并将其格式化到指定位置
      • d,将整数、浮点数转换成 十 进制表示,并将其格式化到指定位置
      • e,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(小写e)
      • E,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(大写E)
      • f, 将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位)
      • F,同上
      • g,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是e;)
      • G,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是E;)
      • %,当字符串中存在格式化标志时,需要用 %%表示一个百分号

    注:Python中百分号格式化是不存在自动将整数转换成二进制表示的方式

    常用的格式化:

    s1 = "i am %s" % "wenchong"
    s2 = "i am %s age %d" % ("wenchong", 8)
    s3 = "i am %(name)s age %(age)d" % {"name": "wenchong", "age": 8}
    s4 = "percent %.2f" % 99.999999
    s5 = "i am %(pp).2f" % {"pp": 123.425556, }
    s6 = "i am %(pp).2f %%" % {"pp": 123.425556, }

    输出结果:

    s1: i am wenchong
    s2: i am wenchong age 8
    s3: i am wenchong age 8
    s4: percent 100.00
    s5: i am 123.43
    s6: i am 123.43 %
    格式化结果

    2、format 方式


     [[fill]align][sign][#][0][width][,][.precision][type]

    • fill           【可选】空白处填充的字符
    • align        【可选】对齐方式(需配合width使用)
      • <,内容左对齐
      • >,内容右对齐(默认)
      • =,内容右对齐,将符号放置在填充字符的左侧,且只对数字类型有效。 即使:符号+填充物+数字
      • ^,内容居中
    • sign         【可选】有无符号数字
      • +,正号加正,负号加负;
      •  -,正号不变,负号加负;
      • 空格 ,正号空格,负号加负;
    • #            【可选】对于二进制、八进制、十六进制,如果加上#,会显示 0b/0o/0x,否则不显示
    • ,            【可选】为数字添加分隔符,如:1,000,000
    • width       【可选】格式化位所占宽度
    • .precision 【可选】小数位保留精度
    • type         【可选】格式化类型
      • 传入” 字符串类型 “的参数
        • s,格式化字符串类型数据
        • 空白,未指定类型,则默认是None,同s
      • 传入“ 整数类型 ”的参数
        • b,将10进制整数自动转换成2进制表示然后格式化
        • c,将10进制整数自动转换为其对应的unicode字符
        • d,十进制整数
        • o,将10进制整数自动转换成8进制表示然后格式化;
        • x,将10进制整数自动转换成16进制表示然后格式化(小写x)
        • X,将10进制整数自动转换成16进制表示然后格式化(大写X)
      • 传入“ 浮点型或小数类型 ”的参数
        • e, 转换为科学计数法(小写e)表示,然后格式化;
        • E, 转换为科学计数法(大写E)表示,然后格式化;
        • f , 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
        • F, 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
        • g, 自动在e和f中切换
        • G, 自动在E和F中切换
        • %,显示百分比(默认显示小数点后6位)

    常用格式化:

    s1 = "i am {}, age {}, {}".format("wenchong", 8, 'WenChong')
    s2 = "i am {}, age {}, {}".format(*["wenchong", 1, 'WenChong'])
    s3 = "i am {0}, age {1}, really {0}".format("WenChong", 8)
    s4 = "i am {0}, age {1}, really {0}".format(*["WenChong", 8])
    s5 = "i am {name}, age {age}, really {name}".format(name="WenChong", age=8)
    s6 = "i am {name}, age {age}, really {name}".format(**{"name": "WenChong", "age": 18})
    s7 = "i am {0[0]}, age {0[1]}, really {0[2]}".format([1, 2, 3], [11, 22, 33])
    s8 = "i am {:s}, age {:d}, money {:f}".format("WenChong", 8, 88888.1)
    s9 = "i am {:s}, age {:d}".format(*["WenChong", 8])
    s10 = "i am {name:s}, age {age:d}".format(name="WenChong", age=8)
    s11 = "i am {name:s}, age {age:d}".format(**{"name": "WenChong", "age": 8})
    s12 = "numbers: {:b},{:o},{:d},{:x},{:X}, {:%}".format(15, 15, 15, 15, 15, 15.87623, 2)
    s13 = "numbers: {:b},{:o},{:d},{:x},{:X}, {:%}".format(15, 15, 15, 15, 15, 15.87623, 2)
    s14 = "numbers: {0:b},{0:o},{0:d},{0:x},{0:X}, {0:%}".format(15)
    s15 = "numbers: {num:b},{num:o},{num:d},{num:x},{num:X}, {num:%}".format(num=15)

    输出结果:

    s1: i am wenchong, age 8, WenChong
    s2: i am wenchong, age 1, WenChong
    s3: i am WenChong, age 8, really WenChong
    s4: i am WenChong, age 8, really WenChong
    s5: i am WenChong, age 8, really WenChong
    s6: i am WenChong, age 18, really WenChong
    s7: i am 1, age 2, really 3
    s8: i am WenChong, age 8, money 88888.100000
    s9: i am WenChong, age 8
    s10: i am WenChong, age 8
    s11: i am WenChong, age 8
    s12: numbers: 1111,17,15,f,F, 1587.623000%
    s13: numbers: 1111,17,15,f,F, 1587.623000%
    s14: numbers: 1111,17,15,f,F, 1500.000000%
    s15: numbers: 1111,17,15,f,F, 1500.000000%
    格式化结果

    二、迭代器和生成器

    迭代器

    迭代器是 python 最强大的功能之一,是访问集合元素的一种方式,迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问结束。迭代器只能往前不能后退。

    迭代器并不是一次将所有的元素都准备好,而是在迭代到这个元素时,才会计算该元素,在这之前或之后,元素可以被销毁或者不存在。这个特点可以是迭代器处理很大的文件。

    迭代器有两个基本的方法:iter() 和 next()

    字符串、列表、元组对象都可以用于生成迭代器

    >>> li = [1,2,3]
    # 生成迭代器
    >>> it = iter(li)
    # 通过 next() 方法获取迭代器的元素
    >>> print(next(it))
    1
    >>> print(next(it))
    2
    >>> print(next(it))
    3
    # 当迭代器的最后一个元素被访问后,如果继续访问会报错
    >>> print(next(it))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration

    迭代器对象也可以通过 for 循环访问

    li = [1,2,3]
    it = iter(li)
    
    for i in it:
        print(i)

    生成器

    在 python 中使用了 yield 的函数被称之为生成器(generator),和普通的函数不一样的地方在于生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点的理解是生成器就是一个迭代器

    在调用生成器运行的过程中,当遇到 yield 时,函数就会暂停并记录当前所有的运行信息,返回 yield 的值,并且在下一次运行 next() 时从当前位置继续运行

    使用 yield 实现一个斐波那契数列

    def fibonacci(n):
        a, b, counter = 0, 1, 0
        while True:
            if counter > n:
                return
            yield a
            a, b = b, a+b
            counter += 1
    
    f = fibonacci(10)
    for i in f:
        print(i, end=" ")

    三、递归函数

    在函数内部可以调用其他的函数,那么函数的内部也可以调用自己,这类函数称之为递归函数

    通过递归函数写一个阶乘: 1*2*3*4*5

    def foo(n):
        if n == 1:
            return 1
        return n * foo(n - 1)

    每一个函数在调用时需要存储一些内存,所以递归函数会占用更多的内存。python 会在调用自身 1000 次时停止函数调用

    如上面的阶乘函数 foo(1000) 的报错如:RecursionError: maximum recursion depth exceeded in comparison

     

  • 相关阅读:
    A1066 Root of AVL Tree (25 分)
    A1099 Build A Binary Search Tree (30 分)
    A1043 Is It a Binary Search Tree (25 分) ——PA, 24/25, 先记录思路
    A1079; A1090; A1004:一般树遍历
    A1053 Path of Equal Weight (30 分)
    A1086 Tree Traversals Again (25 分)
    A1020 Tree Traversals (25 分)
    A1091 Acute Stroke (30 分)
    A1103 Integer Factorization (30 分)
    A1032 Sharing (25 分)
  • 原文地址:https://www.cnblogs.com/wenchong/p/5816352.html
Copyright © 2011-2022 走看看