分享

1

 LQuan 2018-02-12

Python基本知识

在工作和学习中,我们常常需要一种量化分析或者数据处理的工具。而Python无疑是一个好的选择。

为什么Python这么受欢迎?

简单的来说,有下面三点原因:

  1. Python可以在多种计算机操作系统中运行(Unix,Windows,MacOS,Ubuntu等等)。
  2. Python能够实现交互式命令输出。对于非专业程序员而言,都希望边编写程序,边查看结果。
  3. Python是开源免费的,有很多强大易用的标准库。对于非专业的程序员而言,使用这些库可以免去自己编写的烦恼。
    那么,说的高深一些,还有一些原因:
  4. Python是一种解析性的、面向对象的编程语言。面向对象编程和一般的编程不太一样,有其自身的优势。
  5. Python是可以连接多种语言的胶水语言。

Python与其他数据分析语言对比


软件费用处理逻辑版本更新编程难度应用场景
Python
免费
内存计算
广
Matlab
内存计算
广
R
免费
内存计算
SPSS
内存计算
SAS
非内存计算
Excel
内存计算

一、Python基础语法

初次使用Python,首先要明确三点:

  1. Python的标识符(例如变量名、函数名等),可用字母、数字和下划线构成,不能以数字开头,且区分大小写。
  2. Python对于缩进敏感。在Python中,是使用缩进来写代码块。
  3. Python的注释语句一般用#开头。多行注释可以有用三引号。
x
'''
1 2 3 4 5
1
'''
15
1
'''

二、Python基础数据类型

Python中基础的数据类型只有两类:字符串string和数字。在数字类型下,可细分为4个类型整型int、长整型long、浮点数float和复数complex。常用的数字类型为整型int和浮点数float。

2.1 字符串string

关于字符串,有下面三点需要注意。其中第三点尤为关键,且不光是针对字符串,对于python中所有的索引都是适用的。

  1. Python用单引号'',双引号'',三引号''''''来标识字符串,三引号用于多行文本
  2. 字符串也是一个序列,可以截断和切片
  3. 注意python中的索引:从左到右索引默认从0开始,最大范围为字符串长度-1。从右向左索引默认从-1开始,最大范围是字符串开头
1
string = 'I love Wind!'
I love Wind!I love Windand Wind welcomes everyoneWe are a family
1
print('字符串的第一个元素(注意索引为0): ',string[0])
字符串的第一个元素(注意索引为0): I字符串的倒数第一个元素(支持负索引): !原字符串(注意空格也占据一个字符): I love Wind!字符串索引2至5(注意索引的话左包含右不包含): love字符串索引2至最后: love Wind!字符串索引-2至最后: d!
1
'''
字符串重复2遍: I love Wind!I love Wind!字符串的拼接: I love Wind! and Wind welcomes everyone!
1
'''
我想换行换行成功
1
'''
我想插入一个制表符 插入成功

2.2 数字number

数字可以细分为四个类型,一般常用的是整形int和浮点数float。


类型
描述
示例
整型int
正或负的整数,无小数点
10
长整型long
无限大小的整数
6321L
浮点数float
整数和小数构成
2.23,2.5e2
复数complex
实数和虚数构成
2+3j
1
x1 = 10 ; x2 = 2.23 #用分号;隔开 可以在一行中写多个语句

三、Python数据集合类型

在基础数据类型的基础上,Python有6中数据集合的类型:

  1. 列表list,最常用的数据类型,以[]为标识
  2. 元组tuple,和list很相似,但是不能二次赋值,用()标识
  3. 集合set,和list类似,但是set中没有重复的元素,常用于集合间的运算,用{}标识
  4. 字典dict,无序的对象集合,字典中的元素通过关键词key来调用,同样以{}来标识
  5. 数组array,科学计算和代数运算常用的数据类型,在后续numpy库系列详细说明
  6. 数据框dataframe,数据分析处理常用的数据类型,在后续pandas库系列详细说明

3.1 列表list

1
print('这里定义了一个列表list——x1,注意到列表x1中的元素是可以不同的,这里由两个数字1和2,一个字符串James,一个列表[1,2,3]这四个元素构成了x1这个列表list。')
这里定义了一个列表list——x1,注意到列表x1中的元素是可以不同的,这里由两个数字1和2,一个字符串James,一个列表[1,2,3]这四个元素构成了x1这个列表list。[1, 2, 'James', [1, 2, 3]]
1
print('如何来调用列表x1中的某个或者某几个元素呢??\n') #这里的\n的含义是空一行
如何来调用列表x1中的某个或者某几个元素呢??调用列表x1的第一个元素(注意第一个元素的索引为0): 1调用列表x1的最后一个元素(注意最后一个元素的索引为-1): [1, 2, 3]调用列表x1的前2个元素(注意索引的时候右不包含): [1, 2]

这里要说明的是,python下序列(例如数组,列表,元组等)的索引,是从0开始而非从1开始。从左到右索引默认从0开始,从右到左索引默认从-1开始。
一般索引的方式为 序列[索引开始:索引结尾],且要注意python索引是右不包含,即索引结尾对应的元素是不包含在结果中的。

1
print('关于列表的运算\n')
关于列表的运算将两个列表x1和x2拼接起来 [1, 2, 'James', [1, 2, 3], 'a', 'b', 'c']在列表x1中添加一个元素 [1, 2, 'James', [1, 2, 3], '新增元素']将列表x2重复两遍 ['a', 'b', 'c', 'a', 'b', 'c']
1
'''
原列表: [1, 2, 'James', [1, 2, 3], '新增元素']在索引2位置添加了新的元素: [1, 2, 1000, 'James', [1, 2, 3], '新增元素']
1
'''
原列表: [1, 2, 1000, 'James', [1, 2, 3], '新增元素']删除索引3上的元素后: [1, 2, 1000, [1, 2, 3], '新增元素']
1
'''
原列表: [1, 2, 1000, [1, 2, 3], '新增元素']添加多个元素后: [1, 2, 1000, [1, 2, 3], '新增元素', 0, 1, 2, 3, 4, 5, 6]
1
'''
原列表: [1, 2, 1000, [1, 2, 3], '新增元素', 0, 1, 2, 3, 4, 5, 6]删除'新增元素'元素后: [1, 2, 1000, [1, 2, 3], 0, 1, 2, 3, 4, 5, 6]
1
x2 = [1,1,1,1,2,2,2,3,43,4,5,6,4]
查看元素1在列表中出现的次数: 4
1
print('关于列表的排序\n')
关于列表的排序原列表: [-10, -2, 1, -100, 333, 1000]按从小到大排序: [-100, -10, -2, 1, 333, 1000]按从大到小排序: [1000, 333, 1, -2, -10, -100]

3.2 元组tuple

1
x3 = (66.6,'万得资讯',1.0000)
这是一个元组tuple: (66.6, '万得资讯', 1.0)
1
print('关于元组tuple的相关计算:')
关于元组tuple的相关计算:(66.6, '万得资讯', 1.0, 'a', 'b')(66.6, '万得资讯', 1.0, 66.6, '万得资讯', 1.0)

可以发现,当想对一个元组tuple的第一个元素(索引0)重新赋值时,则会报错。说明元组一旦定义好了就不能二次赋值了。但是要注意如下这种情况

1
x4 = ('jack',1000,[1,2,3])

在x4这个元组中,索引2对应的元素是一个列表[1,2,3],那么这个列表中的元素做一个更改的话是可以的

3.3 集合set

1
x0 = [1,1,2,2,3,3,4,4,5,5]
含有重复元素的一个列表x0: [1, 1, 2, 2, 3, 3, 4, 4, 5, 5]将列表x0转化一个集合: {1, 2, 3, 4, 5}可以发现集合x0_set中没有重复的元素
1
print('关于集合set的计算')
关于集合set的计算集合set1: {1, 2, 3, 4, 5} 集合set2: {2, 3, 4}集合set1和集合set2的差集: {1, 5}集合set1和集合set2的交集: {2, 3, 4}
1
print('集合set1:',set1,'\n','集合set2:',set2)
集合set1: {1, 2, 3, 4, 5} 集合set2: {2, 3, 4}集合set1和集合set2的交集: {2, 3, 4}集合set1和集合set2的并集: {1, 2, 3, 4, 5}

3.4 字典dict

1
# 字典定义方式一
{'能力值': 1000, '年龄': 0.5, '姓名': '万矿'}{'身高': 198, '冠军数': 5, '姓名': 'Kobe Bryant'}
1
# 字典定义方式三
{'B': 1000, 'A': 1000, 'C': 1000}{'B': 10, 'A': 1, 'C': 100}
1
print('字典由关键词key和值value两个部分构成')
字典由关键词key和值value两个部分构成查看字典dict2的关键词: dict_keys(['身高', '冠军数', '姓名'])查看字典dict2的值: dict_values([198, 5, 'Kobe Bryant'])
1
'''
删除关键词“姓名”: {'能力值': 1000, '年龄': 0.5}
1
dict1.clear()
清除字典中的所有元素: {}

四、Python基本运算符

算数运算符

运算符描述示例
+相加1+1→2
-相减1-1→0
*相乘1*2→2
/相除1/2→0.5
%取余数3%2→1
**幂运算2**2→4
1
5%2

关系运算符

运算符描述示例
==相等1 == 1→True
!=不等于1 != 1→False
>大于1 > 2→False
小于1 <>
>=大于等于1 >= 1→True
<>小于等于1 <=>
1
10 != 10

赋值运算符

运算符示例描述
=a = 1将1的值赋给a
+=b += ab = b + a
-=b -= ab = b - a
*=b *= ab = b * a
/=b /= ab = b / a
%=b %= ab = b % a
**=b **= ab = b ** a
1
a = 1

逻辑/成员运算符

运算符描述示例
andTrue and False → False
or或者True or False → True
notnot True → False
in包含1 in [1,2,3] → True
not in不包含1 not in [1,2,3] → False
1
1 in [1,2,3,4]

五、条件和循环

5.1 条件语句

条件语句基本框架如下:
if 判断语句1:
   执行语句块1
elif 判断语句2:
   执行语句块2
else:
   执行语句块3

1
a = 10
10 是偶数
1
b = '张三'
张三 是张家人
1
c = 20
20 在20~80之间

5.2 循环语句

5.2.1 for循环

1
sum = 0 #实现0+1+2+。。+9
45
1
sum = 0
45

5.2.2 while循环

1
j = 1
循环结果为: 6

5.2.3 循环控制语句——break

break语句的含义是终止当前循环,且跳出整个循环

1
for j in range(10):
当前j的值为: 0当前j的值为: 1当前j的值为: 2当前j的值为: 3当前j的值为: 4当前j的值为: 5

5.2.4 循环控制语句——continue

continue语句的含义是终止当次循环,跳出该次循环,直接执行下一次循环

1
for j in range(10):
当前j的值为: 0当前j的值为: 1当前j的值为: 2当前j的值为: 3当前j的值为: 4当前j的值为: 5当前j的值为: 7当前j的值为: 8当前j的值为: 9

5.2.5 pass语句

当执行到pass语句时,其含义就是不执行任何操作

1
for j in range(10):
当前j的值为: 0当前j的值为: 1当前j的值为: 2当前j的值为: 3当前j的值为: 4当前j的值为: 5当前j的值为: 7当前j的值为: 8当前j的值为: 9

5.2.6 循环、条件嵌套

例如我们要寻找2-100中的所有素数,本身需要一个循环。而判断某一个数是否为素数也需要一个循环,所以这里嵌套了两个循环。循环中还有一些条件语句。

1
#寻找2-100中的所有素数
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

六、函数

函数基本框架如下(【】中的内容表示是或选的,可以不写):
def 函数名(参数):
   【'''函数说明文档'''】
    函数主体
   【return 返回对象】

函数小例子

1
#我们先定义一个函数
1
#调用函数
序列最大值: 1111

默认参数的使用

1
def pos_neg(x=1):
1
pos_neg() #这里没有传入参数x,仍然可以运行,因为在未传入参数的情况下,默认x参数为1
1 是正数
1
pos_neg(-10) #当然自己也是可以传入参数
-10 不是正数

事实上,在调用很多python函数时,我们都使用了默认的参数设置

可变参数

1
def summation(*series): #注意这里参数前面的有一个* 表示的series这个参数是可变参数
1
summation(1,2,3,4,5,6,7) #可变参数的设置 使得我们可以传入任意个参数 函数调用时会自动组装为一个tuple

如果不设置为可变参数的话,需要传入一个序列形式的参数

1
def summation(series):
1
summation(1,2,3,4,5,6,7) #这样输入就会报错
1
summation([1,2,3,4,5,6,7])

关键词参数

1
def info_insert(name, age, university, **other):

注意参数**other,这个参数允许我们传入任意个含参数名的参数,这些关键词参数在函数调用时会自动组装为一个dict
例如我们在做信息录入时,姓名,年龄,学校是必填信息,而其他信息是选填的,这时候就可以使用关键词参数

1
info_insert('娜塔莎 罗曼诺夫',99,'圣地亚哥大学')
姓名: 娜塔莎 罗曼诺夫 年龄: 99 学校: 圣地亚哥大学 其他信息: {}
1
info_insert('娜塔莎 罗曼诺夫',99,'圣地亚哥大学',性别='女',工作='特工')
姓名: 娜塔莎 罗曼诺夫 年龄: 99 学校: 圣地亚哥大学 其他信息: {'性别': '女', '工作': '特工'}

混合参数

在python函数定义中,可以用必选参数,默认参数,可变参数,关键词参数。注意这些参数的定义顺序为:必选参数,默认参数,可变参数和关键词参数

1
def info_insert(name, age, married='未婚',*schools, **kw):
1
info_insert('娜塔莎 罗曼诺夫',99)
姓名: 娜塔莎 罗曼诺夫 年龄: 99 婚姻状况: 未婚 就读学校: () 其他信息: {}
1
info_insert('娜塔莎 罗曼诺夫',99,'已婚','浙江大学','上海财经大学')
姓名: 娜塔莎 罗曼诺夫 年龄: 99 婚姻状况: 已婚 就读学校: ('浙江大学', '上海财经大学') 其他信息: {}
1
info_insert('娜塔莎 罗曼诺夫',99,'已婚','浙江大学','上海财经大学',性别='女',工作='特工')
姓名: 娜塔莎 罗曼诺夫 年龄: 99 婚姻状况: 已婚 就读学校: ('浙江大学', '上海财经大学') 其他信息: {'性别': '女', '工作': '特工'}

递归函数

递归函数的含义是在函数定义过程中,会调用函数本身

1
def factorial(n):
1
factorial(5)

匿名函数——lambda函数

lambda函数的基本格式为: lambda 参数: 表达式
匿名函数定义更为简便(控制在一行),有些简单的函数可以用它来写,或者作为复杂函数的组成部分

1
s = lambda x:print(x,'大于 1') if x>1 else print(x,'小于 1')
1
s(10)
10 大于 1-10 小于 1

七、模块

模块简单来说是一个保存了python代码的文件
很多python开源库就是模块

1
#例如我们调用科学计算库 numpy
调用numpy产生10个标准正态随机数 [-0.86123492 -0.91268667 0.83897686 0.29236517 -1.30950825 -1.14943404 -0.36781918 0.13990052 0.4298387 -0.80505142]
1
#对于一个模块 我们可以先查看该模块下的所有子模块、变量和函数
查看math模块下的所有子模块、变量和函数 ['__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']

八、异常处理

在程序编写过程中,难免会有一些错误。python中有一些语句可以处理这些异常或者错误,使得程序能够运行,且识别到错误的位置

try..except函数

在下面的例子中,当j=0,10/0是会报错的,利用try..except语句之后还是可以将其他部分正常运行出来

1
x = 10
1
x = 10
除数不能为010.05.03.3333333333333335
1
x = 10
除数不能为010.05.03.3333333333333335

九、面向对象

面向对象是Python的特点。面向对象主要通过类class的定义来实现。类class是用来描述具有相同属性和方法的对象的集合。类定义了该集合中的每个对象的共有属性和方法
可以将类理解为一个模块,模块中包含很多个函数,每个函数用来实现某一个功能
对象是根据类创建的实例,通过实例化对象就可以执行类中的各个函数

面向对象不好理解。这里用一个小例子来说明面向对象的基本用法,关于面向对象在后面的系列中还会详述其更高层次的用法
例如,我们想创建一个简单的游戏程序,涉及到游戏人物的创建,几个游戏环节的设计等等

1
class charater:
1
#定义好上面的类之后 我们就可以开始游戏了 我们先创建3个游戏人物 rogers stark 和 natasha
1
# 先查看 三个游戏人物的 属性
史蒂夫 罗杰斯,18岁,男,1000战斗力托尼 斯塔克,20岁,男,1800战斗力娜塔莎 罗曼诺夫,19岁,女,2500战斗力
1
# 创建人物之后 每个人物可以进行不同的游戏环节 例如他们三个人 进行不同的游戏环节
史蒂夫 罗杰斯参加了一次多人PK,消耗战斗力500托尼 斯塔克参加了一次自我修炼,增长战斗力100娜塔莎 罗曼诺夫参加了一次野外战斗,消耗战斗力200
1
# 在经过了上面的环节之后 我们再来查看三个游戏人物的属性是否产生了变化
史蒂夫 罗杰斯,18岁,男,500战斗力托尼 斯塔克,20岁,男,1900战斗力娜塔莎 罗曼诺夫,19岁,女,2300战斗力

十、文件读写

在进行数据分析之前,可能需要读写自己的数据文件。或者在完成数据分析之后,想把结果输出到外部的文件
在Python中,利用pandas模块中的几个函数,可以轻松实现这些功能,利用pandas读取文件之后数据的格式为数据框,且如果想用pandas将数据输出为外部文件,也要先确保要输出的文件的格式为数据框
注意因为这里演示了文件的操作,需要将文件上传到网站的数据文件目录下才可以成功运行程序

1
import pandas as pd

10.1 读取txt文件

1
text = pd.read_table('data/test2.txt',index_col=0,delimiter=' ')
x1 x2 x3 y
day
0 1 2 3 0
1 2 2 2 1
2 3 1 1 1
3 2 1 1 0

10.2 读取excel/csv文件

1
data_excel = pd.read_excel('data/test3.xlsx')
代码 名称 证券简称 上市日期 所属申万行业 近10日涨跌幅 近1月涨跌幅 近3月涨跌幅
0 002161.SZ 远望谷 远望谷 2007-08-21 其他电子Ⅲ -1.411290 -13.143872 -20.681265
1 002162.SZ 悦心健康 悦心健康 2007-08-23 其他建材Ⅲ -2.460457 -7.035176 -7.960199
2 002699.SZ 美盛文化 美盛文化 2012-09-11 其他服装 -1.148796 -3.317282 33.357934
3 600009.SH 上海机场 上海机场 1998-02-18 机场Ⅲ -1.872321 8.641359 17.823843
4 600115.SH 东方航空 东方航空 1997-11-05 航空运输Ⅲ 1.183432 3.012048 1.333333
1
data_csv = pd.read_csv('data/test3_csv.csv',encoding='GBK')
代码 名称 证券简称 上市日期 所属申万行业 近10日涨跌幅 近1月涨跌幅 近3月涨跌幅
0 002161.SZ 远望谷 远望谷 2007-08-21 其他电子Ⅲ -1.4113 -13.1439 -20.6813
1 002162.SZ 悦心健康 悦心健康 2007-08-23 其他建材Ⅲ -2.4605 -7.0352 -7.9602
2 002699.SZ 美盛文化 美盛文化 2012-09-11 其他服装 -1.1488 -3.3173 33.3579
3 600009.SH 上海机场 上海机场 1998-02-18 机场Ⅲ -1.8723 8.6414 17.8238
4 600115.SH 东方航空 东方航空 1997-11-05 航空运输Ⅲ 1.1834 3.0120 1.3333

10.3 输出为excel/csv文件

由于使用了pandas库,我们在将想要的数据集输出为外部的excel/csv文件时,首先要确保文件的格式为数据框

1
# DataFrame生成 这里生成了一个数据框 各位可以先不考虑这个细节,在之后的pandas库中详细说明了数据框的所有操作 这里只是为了说明文件的输出
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002
1
# 将数据集frame输出为外部文件

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多