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

2.3 Python的赋值语句

Python 3的赋值语句比较灵活,有多种语句格式。下面看看这些赋值语句的使用方法。

1.简单赋值

命令格式:

        变量名=表达式

变量名的数据类型根据表达式的运算结果而定。

请看示例2-5。

        a=10                  #变量a的值是整数10
        b=10.5+a*2.3         #变量b的值是表达式的计算结果33.5
        c=[1,2,4,5]           #变量c是一个列表
        d=(1,2,3,4,5)       #变量d是元组
        e=True                #变量e是逻辑变量,值为True
        f=1.5+2.5j            #变量f是复数
        g='hello Python ! '   #变量g是字符串
        print('a= ', a)
        print('b= ', b)
        print('c= ', c)
        print('d= ', d)
        print('e= ', e)
        print('f= ', f)
        print('g= ', g)

程序运行结果略去,读者可自行尝试运行上面代码。

2.多重赋值

多重赋值命令格式如下:

        变量名1=变量名2=…=变量名n=表达式

对于基本类型来说,如int,分配独立内存空间赋值给相同值,其中一个变量值变化不会影响其他变量值。

对于对象类型来说,如Pandas的DataFrame类型,所有变量指向一个对象类型空间地址,其中任何一个变量对DataFrame类型进行数据处理,其他变量的数据内容也会变化。这种复制方式叫作浅复制。

例如:

        df1=df2 = ts.get_k_data('000001', ktype='D')

df1和df2指向同一个数据,其中任何一个变量数据发生变化,另外一个变量数据也会随之变化,因为它们是同一份数据。

如果想要新建一份数据,就需要用copy()函数,这种复制方式称为深复制。

        df3=df1.copy()

此时,df1的数据变化不会影响df3的内容,请看示例2-6。

        import HP_global as g
        import HP_data as hp
        from HP_sys import *

       a=b=10.4                                 #变量a和b的值赋值为 10.4
        a=a*3                                   #变量a的值乘3

       print('a= ', a)                        #显示变量a的值
        print('b= ', b)                        #显示变量b的值,b值没有随a值变化

       ds='2017-01-01'                          #开始日期
        de='2017-12-30'                          #结束日期
        stockn='600521'                          #股票代码,600521华海药业
        df=hp.get_k_data(stockn, ktype='D', start=ds, end=de, index=False, autype=
    'qfq').head(2)                            #获取股票数

       df2=df3=df                               #给变量df2和df3浅复制df
        df4=df.copy()                          #给变量df4深复制df
        print('------下面是df2的内容-------------')
        print(df2)
        print('------下面是df4的内容-------------')
        print(df4)

       df3.open=df3.open*4                     #给df3['open']的值放大4倍
        print('--下面是浅复制df2的内容,open值放大了4倍-------------')
        print(df2)
        print('--可以看到浅复制,df3修改,df2的值也变化了。')
        print('--下面是深复制df4的内容,深复制open-------------')
        print(df4)
        print('-可以看到深复制,df4的值没有变化。')
        print('-不难想象,修改浅复制的df2或df3,也破坏了原始数据df。')
        print('------下面是原始数据df的内容-------------')
        print(df)
        print('--df与df4比较open,原始数据df也被修改掉了。')

程序运行结果如下:

        a=  31.200000000000003
        b=  10.4
        ------下面是df2的内容-------------
                date   open   close   high    low   volume   code
        0  2017-01-03  18.234  18.234  18.283  18.127  25855.0  600521
        1  2017-01-04  18.258  18.193  18.258  18.028  55337.0  600521
        ------下面是df4的内容-------------
                date   open   close   high    low   volume   code
        0  2017-01-03  18.234  18.234  18.283  18.127  25855.0  600521
        1  2017-01-04  18.258  18.193  18.258  18.028  55337.0  600521
        --下面是浅复制df2的内容,open值放大了4倍-------------
                date   open   close   high    low   volume   code
        0  2017-01-03  72.936  18.234  18.283  18.127  25855.0  600521
        1  2017-01-04  73.032  18.193  18.258  18.028  55337.0  600521
        --可以看到浅复制,df3修改,df2的值也变化了。
        --下面是深复制df4的内容,深复制open-------------
                date   open   close   high    low   volume   code
        0  2017-01-03  18.234  18.234  18.283  18.127  25855.0  600521
        1  2017-01-04  18.258  18.193  18.258  18.028  55337.0  600521
        -可以看到深复制,df4的值没有变化。
        -不难想象,修改浅复制的df2或df3,也破坏了原始数据df。
        ------下面是原始数据df的内容-------------
                date   open   close   high    low   volume   code
        0  2017-01-03  72.936  18.234  18.283  18.127  25855.0  600521
        1  2017-01-04  73.032  18.193  18.258  18.028  55337.0  600521
        -df与df4比较open,原始数据df也被修改掉了。

上例演示结果表明,复杂数据类型一定要用深复制,这样才能避免原始数据被误修改。

3.多元赋值

多元赋值是指一条赋值语句实现多个变量的赋值过程。例如,“a, b, c=1,2,3”。多元赋值要求变量名的个数和表达式的个数相等,否则会出现错误。

例如,4个变量仅提供3个表达式“a, b, c, d=1,2,3*5”,就会出现错误信息“ValueError: not enough values to unpack(expected 4, got 3)”。

又如,3个变量提供4个表达式“a, b, c=1,2,3*5,18*2”,也会出现错误信息“ValueError: too many values to unpack(expected 3)”。

多元赋值使程序编写更加简洁、方便,常常被用于函数中,使一个函数返回多个变量值。

请看示例2-7。

        a, b, c=1,2,3*5
        print('a= ', a)
        print('b= ', b)
        print('c= ', c)

       def xyz(n):
            x=n*n
            y=n^2
            z=n%2
            return x, y, z

       x, y, z=xyz(6)
        print('x= ', x)
        print('y= ', y)
        print('z= ', z)

程序运行结果:

        a=  1
        b=  2
        c=  15

       x=  36
        y=  4
        z=  0

4.增强赋值

增强赋值是指赋值运算符。

例如,“a*=3”相当于“a=a*3”。

请看示例2-8。

        a=5
        a+=10
        print('a=5, a+=10 , a=  ', a)

       a=35
        a-=10
        print('a=35, a-=10 , a=  ', a)

       a=35
        a*=10
        print('a=35, a*=10 , a=  ', a)

       a=35
        a/=10
        print('a=35, a/=10 , a=  ', a)

       a=35
        a%=10
        print('a=35, a%=10 , a=  ', a)

程序运行结果:

        a=5, a+=10 , a=   15
        a=35, a-=10 , a=   25
        a=35, a*=10 , a=   350
        a=35, a/=10 , a=   3.5
        a=35, a%=10 , a=   5