前言:之前在读研究生的时候系统学习了Python全栈的内容,沉淀了专栏【Python全栈】,如今看文章阅读量都达到了将近10万,还是小有震撼,打算一周的时间,精细的回顾基础和粗略的回顾应用,基础还是在的,只不过时间久了手生了!虽然自己之前有写过100多篇文章(有的可能是直接看完了粘过来的),anyway还是找了一些简明扼要的资料快速唤醒!毕竟之前雪Python全栈那是小白硬啃,其他的没记住,就记住当时很痛苦的坚持下来了。
附上资料
- Python基础:学习资料
- 通信和爬虫:学习链接
- 《numpy与pandas基础》:学习链接
- 《matplotlib绘图可视化知识点整理》http://t.cn/RqDxDo8
- 工具anaconda:http://t.cn/RW92Dcn
基础功能
- 数据类型和变量:整数、浮点数、字符串、转义字符(\、\n、\t…)、布尔值(and、or、not…)、空值(NULL)、变量、常量;
- 字符串和编码:字符串(ASCII、Unicode、UTF-8…)、格式化(%d、%f、%s、%x…)、format(‘Hello, {0}, 成绩提升了 {1:.1f}%’.format(‘小明’, 17.125))、f-string(f“my number is{num:.2f}”)
- 列表lists:c1 = [‘Michael’, 1, A],值c1[2],追加append(“be”),insert(1,B),删除pop(3),修改c1[2] = 23,多维c2 = [‘s1’,1,D,[2,“like”]]
- 元组tuple:定义后不可改变,即不可增加、插入、修改,tuples = (1,2,3,[“he”,4])
,tuples[3][1] 输出4 - 条件判断:if … elif … else …,注意点①冒号;②从上往下判断,满足即跳出;
height = 1.75
weight = 80.5
BMI = weight/height*height
print(BMI)
if BMI<18.5:
print("too light")
elif 18.5< BMI <20:
print("正常")
else:
print("OK")
- 模式匹配:
score = 'B'
match score:
case 'A':
print('score is A.')
case 'B':
print('score is B.')
case 'C':
print('score is C.')
case _: # _表示匹配到其他任何情况,类似于 C 和 Java 中的default:
print('score is 其他.')
- 循环:for x in… 、while循环、break跳出循环、while跳出当前循环
name = ["zxx","djw","zy"]
for x in name:
print(x)
if x=="djw":
break #跳出循环
number = 10
while number<100:
print("too small")
number = number+1
if number%2==0:
continue #跳出当前循环
print(number)
- dict和set: dict字典(key:value):x in…查看字典中是否存在x、pop删除; set集合(key):add(key)、remove(key),无序无重复元素;
进阶功能
- 函数:https://docs.python.org/3/library/functions.html
- 定义函数:def 函数名(参数):函数体,函数值用return 返回
- 函数参数:在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
# a,b是必选参数,c是默认参数
# *args是可变参数,args接收的是一个tuple;
# **kw是关键字参数,kw接收的是一个dict。
# 命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。
def f1(a, b, c=0, *args, **kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
>>> f1(1, 2)
a = 1 b = 2 c = 0 args = () kw = {}
>>> f1(1, 2, c=3)
a = 1 b = 2 c = 3 args = () kw = {}
>>> f1(1, 2, 3, 'a', 'b')
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
>>> f1(1, 2, 3, 'a', 'b', x=99)
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}
def f2(a, b, c=0, *, d, **kw):
print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
>>> f2(1, 2, d=99, ext=None)
a = 1 b = 2 c = 0 d = 99 kw = {'ext': None}
- 递归函数:在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
- 切片:name[start : stop: step],支持字符串、tuple和list,取值方式,eg:a[:3]、b[1:5]、c[-2:]
迭代:for…in…,可以遍历任何可迭代序列的项目,如列表、字符串、字典、字符串等 - 列表生成式:[表达式 for 变量 in 列表 if 条件],eg:偶数的平方[x **2 for x in range(1, 11) if x % 2 == 0]
- [x]生成器:使用了yield函数,一边循环一边计算,保存的是算法,一般采用for循环读取,不用next(),eg:(x **2 for x in range(1, 11) if x % 2 == 0)
generator函数和普通函数的执行流程不一样。普通函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
generator保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
- 迭代器:
小结:可以直接作用于for循环的数据类型有以下几种:一类是集合数据类型,如list、tuple、dict、set、str等;一类是generator,包括生成器和带yield的generator
function。这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。可以使用isinstance()判断一个对象是否是Iterable对象:凡是可作用于for循环的对象都是Iterable类型;凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
面向对象编程
- 类和实例(对象):对象名 = 类名(参数列表)
- 访问限制
- 实例属性和类属性:实例属性(对象所有,互不干扰);类属性(类所有,所有对象共享)
class Student(object): #类:创建实例的模板
def __init__(self, name, score,gender): #①构造方法:初始化对象;②封装
self.name = name #公有属性
self.score = score
self._gender = gender # 私有属性:双下划线,访问限制
height = 100
def get_gender(self):
return self.__gender
def set_gender(self, gender):
self.__gender = gender
def get_grade(self): #函数
if self.score >= 90:
return 'A'
elif self.score >= 60:
return 'B'
else:
return 'C'
stu1 = Student("zhuxiaoxia",100,"nv")
stu1.set_gender("nan")
print(stu1.name) #公有属性访问
print(stu1.get_grade())
print(stu1.get_gender())#私有属性访问
- 继承、多继承:通过继承的机制,可使得子类轻松的拥有父类中的属性和方法。继承也是一种代码复用的方式,继承的类叫做子类或派生类,被继承的类叫做父类或基类。
- 方法覆盖&方法重载:当方法名与参数列表都一样时会发生方法覆盖;当方法名一样,参数列表不一样时,会发生方法重载。
- 多态:多态从字面上理解就是一个事物可以呈现多种状态。继承是多态的基础。见案例:https://zhuanlan.zhihu.com/p/156737414
- 其他:装饰器等
通信与爬虫
策略:以之前学习的【Python全栈】为主,增加1-2个实操案例
- 爬虫基础:
- 使用Python的HTTP库(如Requests)发送HTTP请求。
- 解析HTML内容,通常使用HTML解析库(如Beautiful Soup)。
- 使用正则表达式来处理和提取文本数据。
- 数据存储:
- 学习如何将爬取的数据保存到不同类型的数据存储中,如文本文件、CSV、Excel、数据库等。
- 数据清洗和处理:
- 数据爬取后可能需要进行清洗和处理,以确保数据质量和一致性。
- 反爬虫技术:
- 了解常见的反爬虫机制,如IP封锁、User-Agent检测、验证码等,并学会如何规避这些机制。
- 框架和库:
- 探索使用Web爬虫框架(如Scrapy)和其他Python库来加速开发和提高效率。
- 案例 1:爬取HTML保存或图片下载
#/usr/bin/env.python
import requests #发请求
import os
from bs4 import BeautifulSoup #解析数据:beautifulsoup是一个解析器,可以特定的解析出内容,省去了我们编写正则表达式的麻烦
import csv #保存数据
def getHtml(url):
try:
ua = {'user-agent':'Mozilla/5.0'} #来源审查
r = requests.get(url,headers = ua,timeout=30) # r = requests.get(url,params=None,**kwargs)
print(r.request.headers)
r.raise_for_status #如果不是200,产生异常request.HTTPError
r.encoding =r.apparent_encoding #从内容分析出的响应内容编码方式(备选编码方式)
return r.text[:100]
except:
return "wrong"
def getPhotos(root,url):
#1 创建保存的位置
path = root + url.split('/')[-1]
try:
if not os.path.exists(root):
os.mkdir(root)
if not os.path.exists(path):
#2 获取图片
r =requests.get(url)
#3.保存图片
with open(path,'wb') as f:
f.write(r.content)
f.close
print('saved')
else:
print('not saved')
except:
print('wrong!')
print(__name__) #会输出__main__
if __name__ == "__main__": #“__name__”是Python的内置变量,用于指代当前模块,仅模块为当前模块执行,解释:https://zhuanlan.zhihu.com/p/340997807
url1 ="http://www.baidu.com"
print(getHtml(url1))
root = 'D://'
url2 = "https://b-ssl.duitang.com/uploads/item/201501/01/20150101084426_sVcze.thumb.700_0.jpeg"
print(getPhotos(root,url2))
soup = BeautifulSoup(getHtml(url1),"html.parser") #soup=beautifulsoup(解析内容,解析器);常用解析器:html.parser,lxml,xml,html5lib
print(soup.prettify("gbk")) #打印整个 html 文件的 dom 树
- 案例 2:爬取高校排名
# /usr/bin/env.python
# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
import bs4
import sys
#1.获取网页信息
def getHtmlText(url):
try:
r = requests.get(url,timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
#2 提取信息到数据结构
def fillUnivList(ulist,html):
soup = BeautifulSoup(html,"html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr,bs4.element.Tag):
tds = tr('td')
ulist.append([tds[0],tds[1],tds[2]])
return ulist
#利用数据结构展示并输出结果
def printList(ulist,num):
print("{:^10}\t{:^10}\t{:^10}\t".format("排名","学校","总分"))
for i in range(num):
u = ulist[i]
print("{:^10}\t{:^10}\t{:^10}\t".format(u[0].text,u[1].text,u[2].text)) #u[x]是个Tag对象,需要通过.text来获取文本内容
if __name__ == "__main__":
url = "https://www.shanghairanking.cn/rankings/bcur/2023"
txt = getHtmlText(url)
#print(txt)
lists = []
fillUnivList(lists,txt)
#print(lists)
printList(lists,5)
Python数据分析 :Numpy和Pandas
几个总结性的资料:
- https://zhuanlan.zhihu.com/p/639733816
- https://blog.csdn.net/wuyoudeyuer/article/details/131532383
- https://zhuanlan.zhihu.com/p/30132591
- https://blog.csdn.net/weixin_41168304/article/details/123384713
概念说明
- 相同点
- Numpy和Pandas都是Python的第三方库,用于数据处理和分析。
- 都提供了高效的数据结构和函数,可以处理大规模数据。
- 都支持向量化操作,可以对整个数组或数据框进行快速计算。
- 都具有广泛的功能和方法,可以进行数据的读取、转换、筛选、聚合等操作。
- 差异点
- 应用不同
- Numpy主要用于数值计算和科学计算,提供了多维数组对象(ndarray)和相关的数学函数;
- Pandas更适用于数据处理和分析,提供了数据框(DataFrame)和序列(Series)等数据结构;
-
操作不同
Numpy的操作更底层,更适合进行数值计算和数组操作;
而Pandas提供了更高级的数据操作和分析功能,例如数据的合并、重塑、分组、透视等; -
性能不同
Numpy的性能更高,适用于处理大规模的数值计算;
而Pandas的性能相对较低,但更适合处理结构化的数据和进行数据分析。
细节对比
1. 相同点:
通用函数(ufunc): 一种对ndarray中的数据执行元素级运算的函数。对pandas中的Series和DataFrame也适用。
一元ufunc: abs, sqrt, square, exp, log, sign, isnan, ceil, floor, rint, modf, isfinit, isinf, cos, cosh, sin, sinh, tan, tanh,…
用法:np.abs(arr)
二元ufunc:add, substract, multiply, divide, floor_divide, power, maximum, minimum, mod, copysign, greater, greater_equal, less, less_equal, equal, not_equal, logical_and, logical_or
用法:np.add(arr1, arr2)
2. 不同点
应用场景
1. Numpy应用场景
-
数值计算:numpy 提供了高效的数组运算方法,可以处理包含大量数字的数据集,比如矩阵运算、向量运算、数组加减乘除等等。
-
科学计算:numpy 提供了大量的方法和函数,用于处理科学计算相关的数据,比如数据可视化、积分、微分、信号处理等等。
-
机器学习:numpy 提供了大量的方法和函数,用于处理机器学习相关的数据,比如神经网络模型训练、自编码器、条件随机场等等。
-
图像处理:numpy 提供了大量的方法和函数,用于处理图像相关的数据,比如图像滤波、图像变换、图像分割等等。
-
科学数据分析:numpy 提供了大量的方法和函数,用于处理科学数据相关的数据,比如天文学、物理学、地球科学等等。
2. Pandas 应用场景
-
数据分析:pandas 提供了大量的方法和函数,用于处理数据的不同方面,比如数据读取、数据过滤、数据分组、数据排序、数据汇总、数据分析等等。
-
金融分析:pandas 提供了大量的方法和函数,用于处理金融数据相关的数据,比如股票数据分析、债券数据分析、期货数据分析等等。
-
商业智能:pandas 提供了大量的方法和函数,用于处理商业数据相关的数据,比如销售数据分析、客户数据分析、市场数据分析等等。
-
数据可视化:pandas 提供了大量的方法和函数,用于处理数据可视化相关的数据,比如图表绘制、数据地图生成等等。
-
人工智能:pandas 提供了大量的方法和函数,用于处理人工智能相关的数据,比如自然语言处理、图像识别、语音识别等等
-
数据结构不同:Numpy的数据结构是多维数组,适用于处理数值型数据;而Pandas的数据结构更灵活,可以处理不同类型的数据,包括数值型、字符串型、时间序列等;
Python可视化 :Matplotlib
Matplotlib 通常与 NumPy 和 SciPy(Scientific Python)一起使用, 这种组合广泛用于替代 MatLab,是一个强大的科学计算环境,有助于我们通过 Python 学习数据科学或者机器学习。SciPy 是一个开源的 Python 算法库和数学工具包。SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。
这里回顾一下matplotlib的结构,有助于理解这个工具的使用:
- 容器层:
- Canvas(画板)
- Figure(画板)
- Axes(绘图区);
- 辅助显示层:Axes内除了数据绘制图像外的内容;
- 图像层:Axes内根据数据绘制出的图像
该部分的内容我大概画了几个基础的图,可以观察Excel的图标都包含哪些元素,结合我们Excel作图的步骤,程序化代码即可。
此外:有个工具网站可以快速查阅用法:https://www.runoob.com/matplotlib/matplotlib-zh.html