基于股票大数据分析的Python入门实战(视频教学版)
上QQ阅读APP看书,第一时间看更新

1.2 快速入门Python语法

在入门阶段,我们建议的学习方法是:先运行书中给出的范例程序,再通过运行结果理解关键代码的含义。开始不建议大家直接动手编写代码,因为这样很容易由于细小的语法错误而导致程序无法运行,不断的挫败感会让学习积极性逐渐消退。

1.2.1 Python的缩进与注释

Python语言不是用大括号来定义语句块,也没有用类似End之类的结束符来表示语句块的结束,而是通过缩进来标识语句块的层次。大家能在之前的HelloPython范例程序中体会到这一点。

注释是代码里不可或缺的要素,之前我们是通过#来编写一行的注释,此外,还可以用三个单引号(' ' ')或三个双引号(" " ")来进行多行的注释。下面改写HelloPython范例程序,来示范一下缩进和注释的具体用法。

1    #coding=utf-8
2    #Print Hello World
3    print("Hello World")
4    '''
5    1到10的累加和
6    '''
7        #sum=0
8    sum=0
9    for i in range(11):
10    #sum += i
11        sum += i
12    print(sum)

在第1行里,通过#coding的方式指定了本程序的编码格式是utf-8,在第2行里,通过#编写了一行注释。在第4行到第6行里,是通过了' ' '来编写了跨行的注释(即多行的注释)。

请注意,在第11行中,通过缩进来定义了for循环语句的语句块,这里缩进了4个空格。在Python语言中并没有严格规定缩进多少空格,但要求同一个语句块层级缩进的空格数是一样的,比如当我们注释第11行的代码,同时取消第10行代码的注释(#),由于没有缩进,Python解释器就会提示语法错误。按照一般的习惯,Python语句块以四个空格一组作为一个基本单位进行缩进。

同样,如果我们取消第7行代码的注释,由于这行代码没有同之前的代码有逻辑上的从属关系或层级关系,所以不该缩进,如果缩进了也会报错。而且,这里我们缩进的单位是4个空格,所以之后的缩进都应该是4个空格为一组作为缩进的基本单位,即在同一种编码风格中,相同层次语句块(或代码段)的缩进空格数必须保持一致。

1.2.2 定义基本数据类型

在Python中,定义变量时不需要声明类型可以直接赋值,这看上去是好事,因为编程更方便了。其实不然,正因为没有约束,所以初学者更不能随心所欲地使用,否则会让程序代码的可读性变得很差。在下面的PythonDataDemo.py程序中,我们来看下基本数据类型的用法。

1    # coding=utf-8
2    # 演示基本数据类型
3    age=12        # 整数类型
4    # age=15.5 错误的用法
5    print(age)       # 打印12
6    price=69.8       # 浮点型
7    print(price)        # 打印69.8
8    #distance=20L     # 长整型,仅限Python2
9    #print(distance)     # 打印20
10    isMarried=True     # 布尔类型
11    print(isMarried)      # 打印True
12    msg="Hello"      # 字符串
13    print(msg)          # Hello

通过注释可以很清晰地看到,从第3行到第13行的程序语句定义并输出了各种类型的数据。语法非常简单,但请大家注意两点。

(1)由于在定义变量前,没有像Java或其他程序设计语言那样,通过int、long、string等关键字显式地定义数据类型,因此变量名应该尽量通俗易懂,让其他人一看就能知道变量的含义,而少用i, j之类的不含实际意义的单个字母。

(2)如果取消第4行的注释,代码也能运行,这时第5行就会输出15.5。这种做法其实改变了age变量的数据类型,这样随意改变变量类型的做法不仅会增加代码的维护难度,更会在使用时造成很大的混淆,所以在定义和使用变量时,不要轻易地变动变量的类型。

1.2.3 字符串的常见用法

在1.2.2小节的样例代码中,我们是通过双引号定义了一个字符串。下面通过范例程序PythonStrDemo.py来演示字符串的基本用法。

1    # !/usr/bin/env python
2    # coding=utf-8
3    str='My String'
4    print(str)            # 输出完整字符串
5    print(str[0])         # 输出第1个字符M
6    print(str[3:9])       # 输出第3至第9个字符串,即String
7    print(str[3:])        # 输出第3至最后的字符串,也是String
8    print(str * 2)        # 输出字符串2次,但这种写法不常用
9    print("He"+"llo")     # 字符串连接,输出Hello

比起之前的代码,在本范例程序的第1行指定了执行Python的命令。

在Windows的MyEclipse中,是通过“Run As”的方式运行Python代码,但如果这段程序放入到Linux等其他操作系统中,就需要指定执行这段代码的Python命令,这里通过/usr/bin/env目录下的“python”命令执行本Python脚本程序。

在第3行中定义了一个字符串(注意这里用的是一对单引号,在Python语言中,成对的单引号和成对的双引号都可以用来定义字符串常量),随后在第4行到第9行中,以各种方式输出了字符串。请注意,在第5行到第7行中,用到了字符串的下标(或称为索引),而下标值是从0开始的。在第9行中是通过“+”运算符拼接了字符串。

此外,Python还提供了查找替换等字符串操作的方法,在下面的PythonStrMore.py范例程序中,可以看到平时项目中针对字符串的常见用法。

1    # !/usr/bin/env python
2    # coding=utf-8
3    
4    Print("Hello 'World'")       # 双引号单引号夹杂使用
5    print ('Hello "World"')       # 单引号里套双引号
6    print ("Hello: \name is Peter." ) # \n是换行符
7    print (r"Hello \name is Peter." ) # 加了前缀r,则会原样输出
8    str="123456789"
9    print (str.index("234"))       # 查找234这个字符串的位置,返回1
10    #print (str.index("256"))      # 没找到则会抛出异常
11    print (str.find("456"))        # 查找456所在的位置,返回3
12    print (str.find("256"))        # 没找到,返回-1
13    print (len(str) )                # 返回长度,结果是9
14    print (str.replace("234", "334"))  # 把234替换成334

前面讲过,在Python语言中,可以通过单引号定义字符串,在上述第4行和第5行中的代码里,演示了两种符号混合使用的效果。对此的建议是,在同一个Python项目中,如果没有特殊的需要,最好用统一的风格来定义字符串,比如都用单引号或都用双引号。如果确有必要混合使用,那么需要通过注释来说明。

在第6行中,是输出“Hello \name is Peter.”这个字符串,但由于\n是换行符,因此中间会换行,输出效果如下所示。因为“\”是转义字符,如果不想转义,则可以像第7行那样,在字符串之前加r。

1    Hello:
2    ame is Peter.

从第9行到第12行的程序语句分别通过index和find来查找字符串,它们的差别是,通过index方法如果没找到,则会抛出异常,而find则会返回-1。这两种方法的相同点是:如果找到,则返回目标字符串的下标(或索引)位置。

在第13行和第14行的程序语句中,演示了计算字符串长度和字符串替换的方法,上述代码同样是通过注释给出了运行结果,读者可以自己运行,并在控制台中对比一下运行结果。

1.2.4 定义函数与调用函数

为了提升代码的可读性和维护性,需要把调用次数比较多的代码块封装到函数中。函数(Function)在面向对象的程序设计中也叫方法(Method),在Python语言中,可以通过def来定义函数或方法,并且在函数名或方法名之后加冒号。

在下面的PythonFuncDemo.py范例程序中,演示了定义和调用带有返回值和不带返回值函数的两种方式。

1    # !/usr/bin/env python
2    # coding=utf-8
3    # 定义没返回的函数
4    def printMsg(x,y):
5        print ("x is %d" %x)
6        print ("y is %d" %y)
7    # 通过return返回
8    def add(x,y):
9        return x + y
10    
11    # 调用函数
12    printMsg(1,2)
13    # printMsg("1",2)     # 报错,这就是不注意参数类型的后果
14    print (add(100,50))

在第4行到第6行的代码中,通过def定义了printMsg函数,它有两个参数。在Python语言中,没有像其他程序设计语言那样通过大括号的方式来定义函数体,而是通过像第5行和第6行的缩进方式来定义函数体内部的语句块。在这个函数内部的print语句中,通过%d、%x和%y方式来输出参数传入的x和y这两个值。

在第8行和第9行的add函数中,同样是通过缩进定义了函数的层次结构,其中使用了return语句来返回函数内部的计算结果。

定义好函数之后,上面的范例程序中分别在第12行和第14行调用了printMsg和add这两个函数。这个范例程序的输出结果如下所示,其中前两行是printMsg函数的输出,第3行是add函数的输出。

    x is 1
    y is 2
150

由于在定义Python变量时,无法通过像其他程序设计语言那样用int等变量数据类型声明的方式来指定变量的数据类型,因此在使用变量时尤其要注意,如果像第13行那样,调用函数时本来要传入整型参数,但却传入了字符串类型的参数,结果就会报错。