本文全部来自小麦的《大数据公选》课程讲义,包括三篇python和Numpy等数据分析包的相关教程,excel和SPSS的数据分析教程等等,作者是小麦以及懿文同学,是原创资料。本来是课程内部资料,现在开源出来,仅供大家学习。如要转载,请联系我,并尊重版权。
Python2.7极速入门讲义
前言
Python, 是一种面向对象、解释型计算机程序设计语言。结构简洁,风格优雅。而且在数据科学领域非常火爆。
现,小麦特为有C/C++基础的人,推出5分钟上手PYTHON系列教程,结合其他文章的Numpy等包的使用说明,让使用者快速上手。
请特别注意C/C++与python的不同之处,以便快速上手
一、 变量
先来观察一段简单的python程序,虽然你还没有学习过python,但是,我想你仍然能猜出这段程序实在做什么:
a = input()
b = input()
print(a + b)
看出这是在做什么了吗?是的,这段程序要求你输入两个数,然后会输出这两个数之和。
现在来详细解释一下这段程序,1、2行是说,分别输入两个数,并赋值给a和b,然后打印出a+b的值。
Python使用等号进行赋值,你可以随心所欲的定义变量并直接赋值给他们。将你想要的变量名放在左边,将你想赋的值放在右边,中间用等号连起来,就这么简单。只有先定义了变量,才能够使用他们,如上述代码,若去掉了第一行,会产生一个异常。
这里还涉及到了内建函数input()和print(),前者的功能是,输入一个数字,后者则是输出一个变量(可以是字符串或自定义类型),括号里面的是参数,前者不需要参数,后者的参数是要打印的变量,或者表达式,如果是表达式,会先求该表达式的值,再输出。
#####学过C语言的同学可能会发现,python的变量是不用声明类型的,事实也确实是这样,python中的变量自动的通过值的类型来确定变量类型。这是动态语言的特性,提高了编程效率,但同时也使得其运行效率较为低下。
#####关于print函数
print在Python2.7中是一个关键字,如果想要输出某个变量或表达式,可以写成这样。
print a
但是在Python3.4中,print关键字被取消了,因此只能写成函数的形式,即
print(a)
因此,使用括号的形式可以在Python的两个版本下运行。本文后面两种写法都会用到。
二、 选择
同样以代码实例开始:
# "=="表示等于,"%"是取余运算符
a = input()
b = input()
if 0 == a % b:
print("YES")
else:
print("NO")
这次的代码同样很好懂,输入两个变量a和b,如果a余b等于0,则输出YES,否则输出NO。这个程序的功能是判断两个数是否能够整除。
来看新出现的语法if和else,首先if后面会跟一个表达式,这个例子里是“0==a%b”,那么程序运行到这里的时候,会先来计算一下,这个表达式是能够满足的吗?或者说这个式子是“真”的吗?如果结果为真也就是True,那么执行冒号后面的代码,否则,执行else后面的代码。其中else的部分不是必须的。
基本的问题解决了,但这里还有两个小问题。(1)如果我想要让程序当a%b==1时输出“ONE”,a%b==2时输出“TWO”呢?我需要多个分支,但这里只提供了两个,我如何写出更多可能的选择呢?(2)如果我想分支里面再写一个只有if的选择语句,如何让程序识别出else是跟在外面的else后面的?
第一个问题,可以使用elif语句解决(意为else if),可写成如下代码
if a % b == 0:
print("YES")
elif a % b == 1:
print("a余b等于1")
elif a % b == 2:
print("a余b等于2")
else:
print("NO")
用法与if一致。
第二个问题,python通过缩进来区分,语句块的归属。
#version 1: internalelse
a = input()
if a >= 0:
if a == 0:
print("a == 0")
else:
print("a != 0")
#version 2: externalelse
a = input()
if a >= 0:
print("a >= 0")
if a == 0:
print("a == 0")
else:
print("a < 0")
从上述两例中可以看出,当一个语句的从属语句,会相对于该语句往右偏移4个空格或1个Tab的距离。所以说,Python通过缩进来区分语句块的从属问题。
#####关于python的运算符
Python的运算符和大多数的编程语言没有什么区别,这里我们再简单说一下。
加减乘除余分别对应“+-*/%”,比较运算符有小于号“<”,小于等于号“<=”,等于号“==”,不等号“!=”,大于等于号“>=“,大于号“>”。需要特别注意的是等于号,一个“=”的是赋值号,两个的才是等于号。
然后是自增运算符“+=”,比如语句“a+=10”,表示将a自身加10,再赋值给a。减乘除余也有类似的运算符,分别为“-=”,“*=”,“/=”,“%=”
#####学过C语言的同学注意,python中没有++和--运算符。
三、 循环
来看一个求斐波那契数列第n项的程序(不考虑错误的输入)。
#斐波那契数列是满足,f(n)=f(n-1)+f(n-1),f(1)=1,f(2)=1的数列
n = input()
f1 = 0
f2 = 1
i = 1
while i < n:
f3 = f1 + f2
f1 = f2
f2 = f3
i += 1
print f2
首先输入一个正整数n,定义f1,f2,分别赋值为f(0)和f(1),然后进入循环,迭代求解第n项。
i初始值为1,每次判断i是否小于n,如果是,则转入循环体,求出下一项,更新f1,f2的值,将i加1,再次判断,直到i==n。
此时输出f2刚好是数列的第n项。
while的语法相对简单,每次判断跟在后面的表达式是否为True,若是则转入循环体,执行完循环体再次判断,否则跳过该循环体。
这里暂时只介绍while循环,还有一种for循环在接下来介绍列表时再介绍。
四、 列表
接下来介绍一种非常有用的用于顺序存储的数据结构,列表。
Python的列表类似于C++的vector,但同时提供了更多的方法。
还是先从例子看起吧。
numbers =[2,1,"Three",4,9.3,5,7]
for number in numbers:
print(number)
这个程序是什么意思?首先,列表用一对中括号表示,内部的数据用逗号隔开,内部的数据的类型可以是任何类型(包括列表类型)。这个程序的第一句就是将一个列表赋给变量numbers.
然后是一个上一节略过了的for循环,循环的语法形式上是
for var in lists:
……
for后面跟一个变量名,in后面跟一个列表,接下来是执行语句。
其循环是这样执行的,对于列表中的每一个项,将值赋给var,然后执行下面的语句,直到这个列表没有下一项了。
所以,示例程序的内容就是,将所有number列表中的所有项打印出来。
列表提供了很多有用的内置操作,我们通过下一个例子来看一下。
lst = ["This", "is", "a","list", 2.11, 5, 6, 7, -1]
str_list = lst[0:4]
num_list = lst[4:]
lst_copy = lst[:]
num_list.sort()
for i in range(len(num_list)):
print num_list[i]
在这个例子中,我们用到了一些函数,我们先来解释一下这些函数的功能。
l len(object): 返回object的长度,object可以是列表,字符串或其他自定义的类型
l range(n): 返回一个[0,1,…,n-1]的列表。如果range有两个参数,如range(a,b),则返回[a, a+1, a+2, …, b-1],即得到一个a,b的左闭右开的区间。
l list.sort(): list类型的方法,通过点操作符后接方法名来调用,sort方法可讲调用次方法的列表进行从小到大的排序,也可传入一个函数,使列表按照自己需要的规则进行排序。
l list.append(x):list的方法,在list的末尾添加一个新元素x
l list.remove(x):list的方法,移除list中第一个值为x的元素如果这样的元素不存在则抛出一个异常。
然后需要解释一下列表的分片(slice)操作。
我们知道,可以通过在中括号中加索引的方式取得列表(字符串也可以)中的某个值,比如list[0]可以取得list的第一个元素,list[1]是第二个,要注意索引从0开始。可以直接给list[i]的元素赋值。
然后还可以用分片的方式直接获取list的一系列元素并重新组合成一个列表。其基本操作的写法是list[a:b],表示取这个列表的从list[a]到list[b-1]的所有元素。参数也可以缺省,比如list[a:]表示从list[a]处开始到列表尾的所有元素,list[:]表示该列表的所有元素。
所以,回过头来看示例程序,现在应该可以看懂了。
首先,给了一个混杂了各种类型的列表,然后用分片操作将列表分为字符串的部分和数字的部分。然后对于这个数字的部分,添加一个元素,并删除一个元素,然后排序。
之后用len函数和range函数,生成一个刚好能够当num_list的索引的序列。之后,用每个索引来访问该列表,将其输出。
#####关于引用
Python对于列表和其他复杂类型,采用了类似于Java的引用访问。同样类似于C++中的引用,一种封装的更好的C的指针。
具体来说,是这样,比如这段代码:
a = [1,2,3]
b = a
print a, b
b[1] = 999
print a, b
看上去,是有两个列表a和b,先定义了列表a,然后将一个a的拷贝赋值给b。然而,执行一下这段代码,从打印的结果可以看出,a和b,其实是同一个东西的不同名称,改了b,a会同步改变。实际上,对于列表或者其他自定义类型,直接进行变量名到变量名的赋值,只会传入一个引用而非重新生成一个拷贝,所谓引用就是别名,即可以通过这个变量名来找到那个实际的数据,经过这样的赋值,数据还是只有一份,但是名字有了2个,所以一旦修改,两个变量名所索引到的数据都会改变。
五、 函数
在上面,其实我们已经接触过函数了,比如input(),len()等,所谓函数,和数学中的函数有一些区别。函数就是给一些参数作为输入,然后执行一些操作并返回一个输出的代码块。数学中的函数一般更看重输入和输出,但在计算机中,经常是函数中执行的操作更重要。
以下是一个自己定义函数的实例:
def first_str(arr):
for item in arr:
if type(item) == str:
return item
a = [2.1, 2, 6,"cruel", "first", 220, 'bcd']
print first_str(a)
这个程序中,我们首先用def关键字定义了一个函数first_str,这个函数接受一个列表作为参数(如果不是会抛出一个异常),然后会找出第一个类型为字符串的项并返回它。
函数的定义很简单,基本格式为def func_name(variable)将代码放到接下来的语句块中,然后如果需要返回值则使用return关键字。
六、 习题
http://pythontip.sinaapp.com/coding/code_oj
https://leetcode.com/problemset/algorithms/ (困难)
七、 更多资料
这些知识非常基本的知识,即使是上述已经讲过的概念,也可能有很多细节的地方没有讲到。所以推荐从其他网站或者书籍中进一步学习python,有一些有用的概念如字典、元组、类、异常、生成器、装饰器、高阶函数等都有待进一步的学习。
以下是一些不错的学习网站:
l Python2.7中文手册 http://docs.pythontab.com/python/python2.7/
l 廖雪峰的python3教程http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
l Codecademy在线学习网站https://www.codecademy.com/learn/python
l 计蒜客——Python程序设计http://www.jisuanke.com/course/95
l Python 2.7——官方文档(英文)https://docs.python.org/2.7/
l Python 2.7——官方库函数说明https://docs.python.org/2.7/library/index.html
附python安装方法(如果你想安装纯净的Python):
进入Python官方网站https://www.python.org/
选择Downloads->Python 2.7.11(写该教程时的最新版本)进行下载
下载后点击安装包,选择Install for all users,然后确定安装的位置,进入下一步,将“Add python.exe to Path”项选为要安装。
等待安装完毕,之后可从开始菜单IDLE打开内置的IDE进行编程。
这里推荐新手使用jetbrains的pyCharm,百度搜索jetbrains,第一个即可。目前community版是完全免费的,也足够初学者在很长时间内的使用了!