(番外篇4)python 简介(python整体介绍 -> python基础 ->numpy模块)

学习python的一些方式:

  1. 实践入门: 廖雪峰官网
  2. 经典书籍:
    Head_First_Python(中文版)
    利用Python进行数据分析
    python源码剖析…
  3. 思考与实践

第一部分:python整体介绍

  1. python是一种解释型高级语言
  2. 设计理念:一切皆对象
  3. 语言的动态性
  4. 函数的引用传参
  5. 自动垃圾回收机制
  6. 包罗万象的模块资源

python是一种解释型高级语言

解释型语言与编译型语言(C语言)的区别:
优势:代码量小、抽象程度更高(解放大脑)…
劣势:运行速度慢、维护难、解释器的GIL锁…

设计理念:一切皆对象 (Object)

对象 = 存在(属性) + 变化(方法)
特性:封装、继承、多态

语言的动态性

变量名机制
对象的可变与不可变

函数的引用传参

函数传参全部是引用传参(传入对象的内存地址)
区分全局变量与局部变量

垃圾回收机制

引用计数

包罗万象的模块资源

爬虫:
Requests:请求网页
BeautifulSoup:对网页的html文本进行解析分析
网络编程:
sockets:
数据分析:
numpy: 一个多维数组对象,ndarray
pandas:一个数据框,DataFrame
其他例子:
Scrapy:爬虫
Pillow: 图形库
matplotlib:数据可视化
Pygame:游戏编程

  • 爬虫
import requests
from bs4 import BeautifulSoup
  • 网络编程
from socket import *
  • 数据分析
import numpy as np
import pandas as pd

第二部分:python基础

  1. 基本数据类型
  2. 逻辑控制结构
  3. 算术与逻辑运算
  4. 函数的定义
  5. 面向对象编程

基本数据类型

3种原子数据类型:int、float、str。分别表示整数、小数、字符串,其实它们均是类,有相应的属性和方法。
3中组合数据类型:list、tuple、dict。分别表示列表、元组、字典。list最为常用,他有非常常用的方法,比如

1、list.count()统计:
2、list.append()添加对象:
3、list.extend()扩展列表:
4、list.pop()删除对象:
5、list.remove()删除匹配项:
6、list.insert()插入对象:
7、list.copy复制列表:
8、list.reverse()反向排序:
9、list.index()获取索引:
10、list.sort()排序:

通过下面命令了解某个类的详细的用法。

help(className)
e.g. 
help(str)
help(list)

注:除此之外,想要自定义自己的数据类型,可以通过定义类来实现。

逻辑控制结构

for迭代

for 变量 in 可迭代对象:

e.g. 
for x in range(n):
	do someting...

注:可迭代对象:对象中有定义next()方法,常见的列表、元组、字符串均是可迭代对象。range(n)返回一个可迭代对象。

while循环:

while(n <= 30):
	do something
	n += 1

if-elif-else 条件语句

if(condition 0):
	process block 0
elif(condition 1):
	process block 1
else:
	process block 2

break、continue

break:强行终止本循环
continue:强行终止本循环

算术与逻辑运算

算术://:整除 **:乘方 %:取余
逻辑: and or not : 与或非
比较运算: ==、 !=
赋值运算: +=、 *=、 /=、 //=
隶属运算: in、 not in (字符串、列表…)
对象恒等:is、 is not

函数的定义

def logistic(X,Y,alpha=0.1,epsilon=1,numIter=20,method='SGD'):
	coding your function
	return sth

四种参数:
位置参数:依位置传入,logistic(xData,yData)
默认参数:已有默认值,必须放置在位置参数后面,如epsilon=1,numIter=20,method=‘SGD’
关键字参数:
可变长参数:

面向对象编程

封装:属性与方法的集成。属性可分为公开的和私有的。

class Person:
	def __init__(self,high,weight,age):
		self.high = high
		self.__weight = weight    # 私有属性
		self.__age = age          # 私有属性
	def dressUp(self):
		need 5 minutes
		return 5

继承:从一个父类衍生出一个子类,子类继承了父类全部属性和方法,还可以针对子类自身的特点进行重写。

class Women(Person):
	def dressUp(self):
		need 50 minutes
		return 50
class Man(Person):
	def __init__(self,high,weight,age):
		self.high = high
		self.weight = weight
		self.age = age

多态:一个函数的功能可以面向不同的类,不必专门针对每一个类各自写一个函数。

例如,对男人与女人,想要输出他们的打扮时间,用一个函数就可以。只需要把这个函数的接受参数定义成二者的父类即可。

def printTime(Person):
	print(Person.dressUp)
	return sth
boy = Man(175,140,20)		# 创建一个实例
girl = Women(170,100,20)	# 创建一个实例
printTime(boy)				# 输出 5 minutes
printTime(girl)				# 输出 50 minutes

第三部分:numpy模块简介:

参考资料:《利用python进行数据分析》第4章:Numpy基础:数据与矢量计算。

numpy中的多维数据对象ndarray的简要介绍:

  1. 属性
  2. 索引
  3. 矢量化计算
  4. 常用的数据处理函数
  5. 其他方面

属性:

dtype:数组元素的类型,如int、float、str等。
shape:数组的维度情况,如(5,5)表示5*5的二维数组。

索引:

熟悉数组的索引对操作数据非常有帮助。索引大概可以分为两类:
返回内存地址映像:(切片索引,连续型)
返回数组副本:(花式索引,离散型)

返回内存地址映像:

  • a r r [ x 0 , x 1 , . . . , x n − 1 ] arr[x_0,x_1,...,x_{n-1}] arr[x0,x1,...,xn1]。这里面每一个 x i x_i xi表示的是一个切片" a i : b i a_i:b_i ai:bi"(左闭右开[a,b)),切取对应维度的相应位置。
e.g. 
arr[a0:b0,a1:b1,a2:b2]
  • a r r [ a , x 2 , . . . , x n − 1 ] arr[a,x_2,...,x_{n-1}] arr[a,x2,...,xn1]:此时,a不是一个切片,而是一个值,此时返回的数组将降低一个维度。

注:如果不想降低维度,可用 a r r [ a : a + 1 , x 2 , . . . , x n − 1 ] arr[a:a+1,x_2,...,x_{n-1}] arr[a:a+1,x2,...,xn1]代替。

e.g. 
arr[a0,a1:b1,a2:b2]
  • a r r [ x 0 ] arr[x_0] arr[x0]:后续没有指明的维度,默认为:,表示对该维度进行全选,即相当于 a r r [ a : b , : , : , : , : ] arr[a:b,:,:,:,:] arr[a:b,:,:,:,:]
e.g. 
arr[a0:b0]

返回数组的副本:

  • a r r [ x 0 , x 1 , . . . , x n − 1 ] arr[x_0,x_1,...,x_{n-1}] arr[x0,x1,...,xn1]。这里面每一个 x i x_i xi表示的是一个整数列表" [ a i , b i , c i ] [a_i,b_i,c_i] [ai,bi,ci]",它返回对应维度对应排列的数组副本。

  • a r r [ x 0 , x 1 , . . . , x n − 1 ] arr[x_0,x_1,...,x_{n-1}] arr[x0,x1,...,xn1],返回对应索引的值副本,他是一个行向量,可以利用它来去数组的特定位置的元素。

e.g. 
arr[[0,4,2],[1,2,3]]        # arr为二维数组,则返回3个元素,其索引分为为[0,1]、[4,2]、[2,3]
  • a r r [ x 0 ] arr[x_0] arr[x0] ,只有一个 x 0 x_0 x0,后续未指明的维度默认为全选:,因此相当于返回数组对应维度对应排列的副本,在选取一些特定行时非常方便。
e.g. 
arr[[0,4,2]]        # arr为二维数组,则返回第0、4、2行,相当于arr[[0,4,2],:]
  • a r r [ x ] arr[x] arr[x],此时x为一个布尔型的对应数组,他返回bool数组中对应的位置为True的数值。
e.g. 
arr[arr<0] = 0        # 将arr中的负值替换为0

矢量化计算:

  1. arr1 * arr2 : 点乘
  2. np.dot(arr1,arr2):叉乘(矩阵乘法)
  3. np.sqrt 、 np.exp、 np.log(arr):对矩阵的每一个元素都进行相应的运算
  4. np.sum(array,axis = 0,keepdims = True):沿数组的0号维度进行求和
  5. np.max(array,axis = 1,keepdims = True):沿数组的1号维度进行求最大值
  6. np.argmax(array, axis = 0):沿数组的0号维度返回最大值所对应的索引
  7. arr.any()、arr.all():对bool值数组做逻辑判断,返回True 或者 False
  8. np.where(condition,x,y):类似于 x if condition else y,根据布尔值矩阵condition 快速处理数组。

注:一般而言,有些情况数组是没有维度的概念,这时其shape为(n,)。因为为了避免莫名其妙的错误,我们可以抛弃这种写法。在上述的的矢量化计算函数中,如np.sum,np.max等其返回的结果均是这种序列,因此需要加上一个参数keepdims = True,此时才能保持维度,避免出错。

常用的数据处理函数:

  • array.T 返回array的转置
  • array.copy() 返回array的副本
  • reshape(array,newshape),对array进行维度的重塑
  • np.hstack(arr1,arr2)、np.vstack(arr1,arr2):前者以水平的方向合并两个数组,后者以竖直的方向合并两个数组。
  • 格式化输出 "{0:*[<^>]n} … ".format{“str0”,“str1”,“str2”}

其他方面:

你可能感兴趣的:(番外篇)