零基础搭建量化投资系统:以Python为工具
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.4 字符串及相关操作

字符串是Python中最常用的数据类型,属于序列类型。Python的很多特殊应用都依赖于字符串。

1.字符串和字符串变量

我们可以使用一对单引号“"”或双引号“""”来创建字符串。

存储字符串的变量,被称为字符串变量。字符串变量也是对象,对象都有方法(函数),因此,一个变量成为字符串变量就会拥有相关字符串处理的方法。例如,示例3-28。

        var1='Hello'
        var2='World'
        var3=var1+var2                  #var3的值为HelloWorld
        var4=var1[0]                    #var4的值H
        print('var1=', var1)
        print('var2=', var2)
        print('var3=', var3)
        print('var4=', var4)

程序运行结果:

      var1= Hello
      var2= World
      var3= HelloWorld
      var4= H

下面我们学习有关字符串的处理。

2.字符串处理

字符串处理函数或方法的种类及意义见表3-14。

表3-14 字符串处理函数或方法

续表

示例3-29:将任何格式的中国股市的股票代码转换为聚宽股票代码格式。

相关知识:中国股市的股票代码是6位数字,中国股市分为上海证券市场和深圳证券市场,它们有不同的证券品种,如表3-15和表3-16所示。表3-17所示的是全国中小企业股份转让系统品种。

表3-15 上海证券市场的交易品种

表3-16 深圳证券市场的交易品种

表3-17 全国中小企业股份转让系统品种

聚宽证券代码标准格式(表3-18),仅适用于A股市场股票代码和基金代码,不含债券。

表3-18 聚宽证券代码标准格式

解题思路:

(1)首先,我们只考虑A股、B股、中小板、创业板及基金。其次,要考虑到输入股票代码的各种格式,如’000001', 'SZ000001', '000001SZ', '000001.sz', '000001.XSHE', '88’等。我们利用函数从各种字符串中提取出0~9的数字,并合成只有数字构成的新字符串。

(2)使用zfill()方法把只含数字的字符串变为长度为6的新字符串,前面补0。

(3)分析股票代码所处的市场,然后增加对应市场的后缀。

下面给出程序代码示例3-29。

        #ston()函数提取字符串中的数字,并返回
        #自定义函数概念和用法后面对应的章节会涉及
        def ston(string):
            s1=''
            for s in string:
              if s.isdecimal():
                  s1=s1+s
            return s1
        #聚宽股票代码转换
        def jqsn(s):
            s=s.strip()
            s=ston(s)
            if(len(s)<6 and len(s)>0):
              s=s.zfill(6)+'.XSHE'
            if len(s)==6:
              if s[0:1]=='6' or s[0:1]=='9' or s[0:1]=='5':
                  s=s+'.XSHG'
              else:
                  s=s+'.XSHE'
            return s
        print('sz1 ==>', jqsn('sz1'))
        print('1.sz ==>', jqsn('1.sz'))
        print('400011 ==>', jqsn('400011'))
        print('SH600011 ==>', jqsn('SH600011'))
        print('900011.sh ==>', jqsn('900011.sh'))
        print('500011.XSHG ==>', jqsn('500011.XSHG'))

程序运行结果:

        sz1 ==> 000001.XSHE
        1.sz ==> 000001.XSHE
        400011 ==> 400011.XSHE
        SH600011 ==> 600011.XSHG
        900011.sh ==> 900011.XSHG
        500011.XSHG ==> 500011.XSHG

3.字符串运算

下面介绍字符串常见的运算方法。

(1)使用加号“+”可以将两个字符串连接到一起,成为一个新的字符串。例如:

        tring='abcd'+'efg'   #结果为’abcdefg'

(2)使用乘号“*”可以将一个字符串的内容复制数次,成为一个新的字符串。例如:

        s='#'*3+'Python'+'#'*3   #结果为’###Python###'

示例3-30:隐藏电话号码中第4位到第7位的数字,换为星号“*”。

        tela = '18578755056'
        telb = tela[:3]+'*'*4+tela[7:]
        print(telb)

程序运行结果:

        185****5056

(3)使用大于“>”、大于等于“>=”、等于“==”、小于“<”、小于等于“<=”等逻辑运算符比较2个字符串的大小。例如示例3-31。

        a='abc'<='aaa'                      #结果False
        name='Tom'                          #给name变量赋值’Tom'
        b=name=='Tom'                       #判断name是否为’Tom',结果为True
        print('a=', a)
        print('b=', b)

程序运行结果:

        a= False
        b= True

(4)使用“in”或“not in”关键字测试某个字符串是否存在于另一个字符串内。例如示例3-32:

        x='ab' in 'abc'                       #结果为True
        print('x= ', x)
        a='2abcd'                             #给变量a赋值’2abcd'
        f=lambda x:x[0] in '0123456789'       #匿名函数f,判断字符串首字母是否为数字
        y=f(a)                             #返回结果为True
        print('y= ', y)

程序运行结果:

        x=  True
        y=  True

示例3-33:输入用户名和密码,判断用户名是否为administrator,密码是否为admin888。如果正确则显示信息“欢迎管理员登录!”,如果错误则显示“用户名或密码错误!”。用户名从第一个字母开始能连续输入5个字符及以上就算正确。判断完,程序结束。

解题思路:这是一个普通用户登录的程序段,可以使用连等于符号(==)来比较。由于用户名比较长,要求从第一个字母开始能够连续输入5个及以上字符,所以我们使用rfind()方法来处理,示例3-33程序代码如下。

        name=input(’请输入用户名:')
        password=input(’请输入密码:')
        if password=='admin888' and 'administrator'.rfind(name)==0 and len
   (name)>=5:
            print(’欢迎管理员登录!')
        else:
            print(’用户名或密码错误!')

程序运行结果:

        请输入用户名:admin
        请输入密码:admin888
        欢迎管理员登录!
        请输入用户名:admi
        请输入密码:asmin888
        用户名或密码错误!

4.字符串格式化

Python 3的字符串格式化有两种方法:%格式符方法和format方法。

1)%格式符方法

字符串格式控制:

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

其中,参数的含义见表3-19。

表3-19 字符串格式控制的参数

表3-19中为typecode格式组成,Python 3字符串的格式类型见表3-20。

表3-20 Python 3字符串的格式类型

示例3-34是关于Python 3字符串的格式类型的示例。

        a=50
        print(’变量a的ASCII码%%c: %c'%a)
        s='Hello World ! '
        print("The length of %s is %d" %(s, len(s)))
        b=-10.8
        print('b=-10.8')
        print("变量b的值为%%d: %d"% b)
        print("变量b的值为%%f: %f"% b)
        print("变量b的值为%%u: %u"% b)
        c=10/3000
        print('c=10/3000')
        print("变量c的值为%%f: %f"% c)
        print("变量c的值为%%e: %e"% c)
        print("变量c的值为%%g: %g"% c)
        d=-2304123
        print('d=-2304123')
        print("变量d的值为%%u: %u"% d)
        print("变量d的值为%%o: %o"% d)
        print("变量d的值为%%x: %x"% d)
        print("变量d的值为%%X: %X"% d)

程序运行结果:

        变量a的ASCII码%c: 2
        The length of Hello World ! is 13
        b=-10.8
        变量b的值为%d: -10
        变量b的值为%f: -10.800000
        变量b的值为%u: -10
        c=10/3000
        变量c的值为%f: 0.003333
        变量c的值为%e: 3.333333e-03
        变量c的值为%g: 0.00333333
        d=-2304123
        变量d的值为%u: -2304123
        变量d的值为%o: -10624173
        变量d的值为%x: -23287b
        变量d的值为%X: -23287B

示例3-35:

        a=’股票代码: %d  股票名称: %s  股票价格: %.2f元’
        b=(600519, ’贵州茅台’,551.65)
        c=a%b
        print(c)
        e ='★'*5+ '%(string)+20s★★★★★'%{'string':’书山有路勤为径’}
        print(e)
        f ='★'*5+ '%(string)-20s★★★★★'%{'string':’书中自有黄金屋’}
        print(f)

程序运行结果:

        股票代码:600519  股票名称:贵州茅台  股票价格:551.65 元
        ★★★★★             书山有路勤为径★★★★★
        ★★★★★书中自有黄金屋             ★★★★★

2)format方法

语法格式:

        <{模板字符串}>.format(<参数表>)

在调用format()方法后会按模板字符串返回一个新的字符串。

模板字符串格式:{i: <格式控制模板>},其中,i是参数表中第i个参数,参数从0开始编号。

格式控制模板:

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

格式控制模板主要包括“[fill][align][sign][width][.precision][type]”六个字段,这些字段都是可选的,也可以组合使用。模板参数说明见表3-21。

表3-21 format方式的控制模板参数说明

见示例3-36:

        #默认数据顺序{}
        aa=’股票代码: {}  股票名称: {}  股票价格: {} 元’.format(600519, ’贵州茅台’,
    551.65)
        print(aa)
        #指定数据顺序{i}
        bb=’股票代码: {2}  股票名称: {0}  股票价格: {1} 元’.format(’贵州茅台’,
    551.65,600519)
        print(bb)
        cc='PI={0:.2f}'.format(3.1415926)
        print(cc)

程序运行结果:

        股票代码:600519  股票名称:贵州茅台  股票价格:551.65 元
        股票代码:600519  股票名称:贵州茅台  股票价格:551.65 元
        PI=3.14