PYTHON笔记
一些概念
NLP自然语言处理:自然语言处理(NLP)就是在机器语言和人类语言之间沟通的桥梁,以实现人机交流的目的。人类通过语言来交流,狗通过汪汪叫来交流。机器也有自己的交流方式,那就是数字信息。
BERT预训练模型:
Word2vec:
基本语法
声明
py文件开头声明解码方式
#-*- coding: utf-8 -*
文件读写
在文件读写中只有open的文件需要close,其他的是直接在文件中读取
打开文件的方式:
open函数:f=open(path,mode,buffering,encoding,errors)在c里面表示一个指针,指向一个文件流, path表示文件路径,mode表示文件读写方式(r/rb只读,文件指针指向文件的开头;r+文件指针在文件的开头;w只写,会覆盖,指针指在文件开头;w+先写再读,先覆盖;a指针指在文件末尾);buffering表示设置缓冲策略0关闭缓冲,1行缓冲,>1固定大小的块缓冲(缓冲提高执行效率,减少内存负担,读取文件时,数据先进入缓冲区而不是直接写入磁盘区;如参数为1,写入文件时,写一行,同步一行);encoding表示解码方式;error表示处理编码错误的方式(strict;ignore忽略错误;replace将错误部分替换为?;backslashrepalce用 Python 的反斜杠转义序列替换格式错误的数据。)
file=f.read()按字符读入,生成一个字符串str,我们可以对字符串做一个处理,从而将其按行生成列表即使用split()按照空白符分解
file=f.readlines()按行读取,且生成一个列表,带有\n,因此使用strip()去除字符串列表每个元素首尾的空白字符,lis=[i.strip() for i in file]
file=f.readlin()只读取一行字符串,会读取\n字符
f=open("new_s.txt","r",encoding="utf-8")
lis=""
while TRUE:
s=f.read()
if s!='':
lis+=s
else:
break
lis=lis.split("\n")
print(type(lis))
print(lis)
文件写入的方式:
文件csv读写方法
csdn:Python读取csv文件的几种方法_domoNaruto的博客-优快云博客_python 读取csv
利用csv库&open
import csv
from email import header
f=open(".csv","r",encoding="utf-8")
file=csv.reader(f)
for row in file:
print(row)
##输出指定行
list(file)
file的格式为_csv.reader貌似无法输出指定行
按行写入csv文件
import csv
#python2可以用file替代open
with open("test.csv","w") as csvfile: ##最重要
writer = csv.writer(csvfile)
#先写入columns_name
writer.writerow(["index","a_name","b_name"])
#写入多行用writerows
writer.writerows([[0,1,3],[1,2,3],[2,3,4]])
利用numpy库
import numpy as np
data = np.loadtxt(open("路径.csv","rb"),delimiter=",",skiprows=n,usecols=[2,3])
利用pandas
import pandas as pd
f=pd.read_csv("D:\\经管大三\\现代程序设计\\week4\\twitch_gamers\\large_twitch_features.csv","r",encoding="utf-8")
print(type(f))##输出格式为数据框
打印print
f-print可以快速打印,且简洁。
a=1.23142536
b=3.124156657
#方式一
print("a{:.2f}daaf{:.4f}agfqfag".format(a,b))
#方式二
print(f"a{a:.2f}daaf{b:.4f}agfqfag")
#两者的输出结果相等
检查print结果
(8条消息) python中的print信息写入文件_hr_net的博客-优快云博客_python将print结果写入文件
作用域
python中只有模块、类、函数(def、lambda)才会引入新的作用域。其他的代码块如循环语句,条件语句等并不会引入新的作用域。
元素类型判断
[(8条消息) python判断变量是否为数字、字符串、列表、字典等_Fybon的博客-优快云博客_判断列表元素是否为数字](https://blog.youkuaiyun.com/Fybon/article/details/102931750?ops_request_misc=%7B%22request%5Fid%22%3A%22166652787416782395319561%22%2C%22scm%22%3A%2220140713.130102334…%22%7D&request_id=166652787416782395319561&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-102931750-null-null.142v59pc_rank_34_queryrelevant25,201v3control_2&utm_term=python 判断元素是否为数字&spm=1018.2226.3001.4187)
a = 1
b = [1,2,3,4]
c = (1,2,3,4)
d = {‘a‘:1,‘b‘:2,‘c‘:3}
e = "abc"
if isinstance(a,int):
print "a is int"
else:
print "a is not int"
if isinstance(b,list):
print "b is list"
else:
print "b is not list"
if isinstance(c,tuple):
print "c is tuple"
else:
print "c is not tuple"
if isinstance(d,dict):
print "d is dict"
else:
print "d is not dict"
if isinstance(e,str):
print "d is str"
else:
print "d is not str"
进阶语法
数据处理
利用映射map函数
string_date='2016-8-1'
year,month,day=map(int,string_date.split('-'))
s=Data_test(year,month,day)
处理空值
计算相关性
(5条消息) 【Python】pandas计算DataFrame各列相关系数以及显著性检验_Asher117的博客-优快云博客_pandas显著性检验
赋值、深浅拷贝
(4条消息) python对象赋值操作中的空间地址变化_YuanOo。的博客-优快云博客
Python 直接赋值、浅拷贝和深度拷贝解析 | 菜鸟教程 (runoob.com)
import copy
l1=list(range(0,10))
l1_c=l1
l1_b=l1[:]
print(id(l1))#2787012655424
print(id(l1_c))#2787012655424
print(id(l1_b))#2787012654912
#对于赋值的情况,重新开辟了一个内存,因此id改变了,当直接copy或者赋值时,指向同一内存,id相同
l1_c=l1.copy()
l1_c=copy.copy(l1)
l1_c=copy.deepcopy(l1)
l1_c[0],l1_c[-1]=-1,-9
print(l1)
print(l1_c)
l2=list(list(range(0,i)) for i in range(1,5))
#l2_c=l2[:]
#l2_c=l2.copy()
#l2_c=copy.copy(l2)
#l2_c=copy.deepcopy(l2)
#l2_c[0][0],l2_c[-1][-1]=-1,-3
#print(l2)
#print(l2_c)
序列化与反序列化
csdn:python 序列化_python怎么序列化_黄明轩的博客-优快云博客
C语言中文网:[Python pickle模块:实现Python对象的持久化存储 (biancheng.net)](http://c.biancheng.net/view/5736.html#:~:text=pickle.load ()函数 此函数和 dump,() 函数相对应,用于将二进制对象文件转换成 Python 对象。)
异常处理
Python 异常处理 | 菜鸟教程 (runoob.com)
def main():
try:
a = input("输入一个数:")
if(not a.isdigit()):
raise ValueError("a 必须是数字")
return a
except ValueError as e:
print("引发异常:",repr(e))
a=main()
print(a)
当出现raise时,会直接出发except报错,从而跳过return,并不会返回return值
try:
dddd
except <error1>:
ddddd
except <error2>:
dddd
自定义异常&抛出异常&捕获异常
Python:用户自定义异常 - xiaobai小白 - 博客园 (cnblogs.com)
class AccoutError(Exception):
def __init__(self,user):
self.user=user
class AccountNegativeDepositError(AccoutError):
def __init__(self,user,m):
self.user=user
self.m=m
self.message="{} deposit negative amount: {}".format(user,m)
class AccountBalanceNotEnoughError(AccoutError):
def __init__(self,user,balance, m):
self.user=user
self.m=m
self.balance=balance
self.message="{}'s balance {} is smaller than the withdraw amount of {}. Loan is suggested.".format(user,balance,m)
class Account:
def __init__(self,user,balance):
self._user=user
self._balance=balance
def set_balance(self,balance):
self._balance=balance
def get_balance(self):
return self._balance
def get_user(self):
return self._user
def deposit(self,m):
if m<0:
raise AccountNegativeDepositError(self.get_user(),m)
else:
self.set_balance(self.get_balance()+m)
def withdraw(self,m):
if self.get_balance()<m:
raise AccountBalanceNotEnoughError(self.get_user(),self.get_balance(),m)
else:
self.set_balance(self.get_balance()-m)
account=Account('zjc',100)
try:
#account.deposit(-100)
account.withdraw(10000)
except AccountNegativeDepositError as ande:
print(ande.message)
except AccountBalanceNotEnoughError as abnee:
print(abnee.message)
except AccoutError:
print('noname exception')
else:
print('no except...')
print(account.get_balance())
清理行为
通过finally子句实现,定义无论在任何情况下都会执行的清理行为。无论try子句有无发生异常,finally子句都会执行,即使try执行了return
python的try finally (还真不简单) - 永远的幻想 - 博客园 (cnblogs.com)
with…as自动清理
with open as调用结束自动清理空间
warnings
try: except: continue
(8条消息) python try: except: continue 语句,避免程序崩溃_胖虎是只mao的博客-优快云博客
代理模式
【进阶Python】第八讲:代理模式 - 知乎 (zhihu.com)
装饰器
在不修改原始代码的前提下增强或扩展既有的功能
Python 函数装饰器 | 菜鸟教程 (runoob.com)
Python @函数装饰器及用法(超级详细) (biancheng.net)
装饰器如何保存函数名称不发生变化?
def g(装饰器参数):
def deractor(func):
@functools.wraps(func) #为了保持now()的名字不变
def wrapper(*args,**kwrgs):
return func(*,**)
return wrapper
return deractor
@g
def now():
pass
now()#相当于g(装饰器参数)(now)()
装饰器类
装饰器常用方法
functools
(11条消息) Python的functools模块_Python之简的博客-优快云博客_functools
(11条消息) Python 标准库 functools 模块详解_擒贼先擒王的博客-优快云博客_functools
functools.partial(fun,a)
固定部分参数,返回新函数
import functools
def add(a, b):
return a + b
add3 = functools.partial(add, 3)
add5 = functools.partial(add, 5)
print(add3(4))
print(add5(10))
'''
7
15
'''
functools.reduce(function, iterable, initializer=None)
将一个序列归纳为输出,Initializer为从什么值开始.iterable指的是可迭代对象
def f(x,y):
return x*10+y
print(reduce(f,[1,2,3,4]))
#类似与累计拆分
1*10+2=12
12*10+3=123
123*10+4=1234
#下列从2的值开始做序列归纳,结果为21234
def f(x,y):
return x*10+y
print(reduce(f,[1,2,3,4],2))
property实例属性化
将类中的函数变成属性直接调用,可以获取私有属性
(11条消息) Python @property装饰器详解_NickTheRock的博客-优快云博客_python property装饰器
Python_getter和setter方法 - 知乎 (zhihu.com)
class Rect:
def __init__(self,area):
self.__area = area
@property
def area(self):
return self.__area
rect = Rect(30)
#直接通过方法名来访问 area 方法
print("矩形的面积是:",rect.area)
@方法名.setter
修改属性值 ,实现属性的读写
@area.setter
@方法名.setter
def 方法名(self, value):
代码块
class Student(object):
@property
def score(self):
return self.__score
@score.setter
def score(self,value):
if not isinstance(value,int):
raise ValueErro('score must be an integer')
if value < 0 or value > 100:
raise ValueError('score must between 0~100')
self.__score=score
##调用函数和改变属性时直接将实例函数类似于实例属性调用的形式
s=Student()
s.score=60
s.score
s.score=9999
@方法名.deleter
删除属性
@area.deleter
classmethod类方法
python @classmethod 的使用场合 - 知乎 (zhihu.com)
staticmethod静态方法(用的不多)
Python进阶-----静态方法(@staticmethod) - Meanwey - 博客园 (cnblogs.com)
@wraps
使得在使用修饰器时返回的仍然是调用的函数名,而不是内嵌函数
(11条消息) Python装饰器中@wraps作用_Shaun_X的博客-优快云博客_@wraps python
def wrapper(func): # func = holiday
def inner(*args, **kwargs):
print('在被装饰的函数执行之前做的事')
ret = func(*args, **kwargs)
print('在被装饰的函数执行之后做的事')
return ret
return inner
@wrapper #holiday = wrapper(holiday)
def holiday(day):
''' 这是一个放假通知 '''
print('全体放假%s天'%day)
return '好开心'
print(holiday.__name__)print(holiday.__doc__)该实例运行结果为: inner 我是inner函数的注释
上述例子中:holiday()函数为被装饰的函数,其实际内存地址指向了inner()装饰函数。也就是说如果我们想打印holiday()函数的名字、注释等,实际打印的是inner()函数的函数名、注释
那么怎么打印holiday()函数的名字跟注释等方法呢?
################
from functools import wraps
def wrapper(func): # func = holiday
@wraps(func)
def inner(*args, **kwargs):##通用格式,便于func传参
print('在被装饰的函数执行之前做的事')
ret = func(*args, **kwargs)
print('在被装饰的函数执行之后做的事')
return ret
return inner
@wrapper # holiday = wrapper(holiday)
def holiday(day):
''' 这是一个放假通知 '''
print('全体放假%s天'%day)
return '好开心'
print(holiday.__name__)
print(holiday.__doc__)
该实例运行结果为: holiday 这是一个放假通知
我们引入了内置functools模块中的装饰器wraps,这时候就可以正常打印被装饰函数的名字、注释等方法了。
通用格式 用于修饰名字
@wraps(func)
def wrapper(*args,**kwargs):
print(text+' '+'call '+func.__name__)
return func(*args,**kwargs)
return wrapper
@profile代码内存占用分析
Python性能分析工具Profile - -零 - 博客园 (cnblogs.com)
通过memory_profiler库
from memory_profiler import profile
@profile
def my_func():
a = [1] * (10 ** 6)
b = [2] * (2 * 10 ** 7)
del b
return a
my_func()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-opEGegci-1666948434333)(C:\Users\kerrla\AppData\Roaming\Typora\typora-user-images\image-20221023161118520.png)]
@proflie代码执行时长分析
(8条消息) Python性能分析工具Line_profiler_乔宇同学的博客-优快云博客
import time
@profile
def test_time():
for i in range(100):
a=[1]*(10**4)
b=[2]*(10**4)
pass
test_time()
上面的代码需要通过命令行运行
kernprof -lv ld.py##ld.py为文件名
下面的代码在程序中执行
from line_profiler import LineProfiler
import random
def do_other_stuff(numbers):
s = sum(numbers)
def do_stuff(numbers):
do_other_stuff(numbers)
l = [numbers[i]/43 for i in range(len(numbers))]
m = ['hello'+str(numbers[i]) for i in range(len(numbers))]
numbers = [random.randint(1,100) for i in range(1000)]
lp = LineProfiler()#调用类方法
lp.add_function(do_other_stuff) # add additional function to profile
lp_wrapper = lp(do_stuff)
lp_wrapper(numbers)#对打包好的函数进行测试
lp.print_stats()#打印状态结果
闭包
返回函数不宜引用任何循环变量,或者后续会发生变化的变量
添加进度条
tqdm
(8条消息) tqdm-python实现进度条_Dream seeker_z的博客-优快云博客_tqdm 进度条长度
from tqdm import tqdm
import time
import pandas as pd
import numpy as np
alist = list('letters')
bar = tqdm(alist)
for letter in bar:
bar.set_description("Now get "+str(letter))
time.sleep(1)
df = pd.DataFrame(np.random.randint(0, 100, (10000000, 60)))
#print(df.shape)
tqdm.pandas(desc="Processing...")
df.progress_apply(lambda x: x**2)
pysnooper测试代码运行时间
观察者模式、生成器、迭代器
观察者模式
也被称作发布(publish)-订阅(subscribe)模式
一个目标对象管理所有依赖于它的观察者对象,并且在它本身的状态改变时主动发出通知;观察者模式完美地将观察者和被观察的对象分离
Python设计模式:观察者模式 - 知乎 (zhihu.com)
python设计模式之观察者模式 - sfencs - 博客园 (cnblogs.com)
这种方法有点像挂起,延迟使用,关键在于setter函数,当发现属性价格变动且达到提醒的范围时,调用notify函数,此时notify函数里需要写提醒所有观察者的函数
@price.setter
def price(self,value):
if self._price>value:
self.notify()
self._price=value
import time
class Investor:##接口,负责提醒观察者
def __init__(self,name,stock):#传入为一个观察者的名称和一个股票实例
self._name=name
self._stock=stock
@property
def stock(self):
return self._stock
@stock.setter
def stock(self,value):
self._stock=value
def update(self):
print("{} invest on {} with price {}: sell it now!!!".format(self._name,self._stock.name,self._stock.price))
class Stock:#subject用于存储观察者信息以及观察的类
def __init__(self,name,price):
self._name=name
self._price=price
self._investors=[]
@property
def name(self):
return self._name
@property
def price(self):
return self._price
@price.setter
def price(self,value):
if self._price>value:
self.notify()
self._price=value
def attach(self,investor):
self._investors.append(investor)
#deattach
def notify(self):
for investor in self._investors:
investor.update()#update作为操作函数,对所有的观察者通风报信
def main():
s=Stock('区块链',11.11)
i1=Investor('zjc',s)
i2=Investor('lys',s)
s.attach(i1)
s.attach(i2)
s.price=13
time.sleep(1)
s.price=10
if __name__=='__main__':main()
@abstractmethod方法,将类抽象化
(6条消息) Python @abstractmethod 抽象方法_jiang_huixin的博客-优快云博客_python abstractmethod
生成器
获取返回值需要捕获stopIteration异常
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
try:
# 获得下一个值:
x = next(it)
print(x)
except StopIteration:
# 遇到StopIteration就退出循环
break
next()
Python next() 函数 | 菜鸟教程 (runoob.com)
迭代器:Iterable
可以被next()函数调用并不断返回下一个值的对象称为迭代器
iter()
创建迭代器 基于类
把一个类作为一个迭代器使用需要在类中实现两个方法 __ iter __ () 与 __ next __()
__ iter __ ()返回一个特殊的迭代器对象,这个迭代器对象实现了 __ next __()方法
__ next __ () 方法返回下一个元素并通过StopIteration 异常标识迭代完成
迭代器相关工具itertools、内置函数
内置函数
isinstance(a,type)类型判断
max
#key表示返回最大值的方法,如key=dict.get,返回键
max(iterable, *[, key, default])
max(arg1, arg2, *args[, key])
sorted函数
filter()过滤序列
Python3 filter() 函数 | 菜鸟教程 (runoob.com)
对象类型
列表
zip合并多个列表
字典
菜鸟教程:Python3 字典 | 菜鸟教程 (runoob.com)
dict和tuple相互转换
>>> confirm = {'a': 1, 'b': 2, 'c':3}
>>> dict_tuple = zip(confirm.keys(), confirm.values())
>>> type(dict_tuple)
<class 'zip'>
>>> for i in dict_tuple:
... print(type(i))
... print(i)
...
<class 'tuple'>
('a', 1)
<class 'tuple'>
('b', 2)
<class 'tuple'>
('c', 3)
>>> confirm = [('a', 1), ("b", 2), ("c", 3)]
>>> dict(confirm)
{'a': 1, 'b': 2, 'c': 3}
可以利用zip函数,使列表被打包,用来生成两列表的对应关系,其次对于zip的打印,需要转化为list。对于索引的调用,需要记住python索引不包括最后一位。
dict.get()
dic={}
dic[key]=dic.get(key,0)+1
用于生成一个字典,并且统计词频时使用,dict.get(key,default)函数表示当key存在时,返回键值,否则返回默认值default
键值操作
提取键值对
dic={1:2,2:"ds",3:443}
print(list(dic.items()))
key=[]
value=[]
for item in list(dic.items()):
x,y=item
key.append(x)
value.append(y)
print(key)
print(value)
对键值大小排序
(3条消息) 【Python】按照字典中值的大小对键进行排序(lambda、sorted()、zip())_Vivid-victory的博客-优快云博客
数据框
Python:Pandas创建Dataframe数据框的六种方法_AHU-丁少侠的博客-优快云博客_python创建数据框
利用列表生成数据框
模块
菜鸟教程:Python3 输入和输出 | 菜鸟教程 (runoob.com)
__ name __ 属于内建变量
__ name __内置变量表示当前调用的模块是否在本模块里运行,如果在test.py内测试,则打印“在本模块内调用”;如果在其他模块中调用test.py则打印“在模块外调用”。在调用模块的时候注意不能加入.py的后缀
#文件为test.py
if __name__=="__main__":
print("在本模块内调用")
else:
print("在模块外调用")
模块仅被导入一次,多次调用模块也只出现一次“在模块外调用”
dir(module)返回定义在模块内的所有名称
包
包中有目录,且每个保重必须有__ init __.py才被视为一个包
包是一个含有__ init __.py文件的文件夹,这个py文件本身不需要具有含义,注意init文件为双下滑线。以下为文件夹的形式,注意对于模块的调用必须一次到位,调用到模块,如果说之import了package包,是无法正常使用的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S4dIQXz3-1666948434334)(C:\Users\kerrla\AppData\Roaming\Typora\typora-user-images\image-20220923191941378.png)]
import package.package_2.one as R
R.x()
使用R.reload(x)用来更新x模块,因为import只解释一次,在交互式情况下可以使用该函数
在模块的调用时,可以通过对目录内添加某些文件对其进行优化。
函数
在调用函数时,我发现,当我不对函数添加括号时,跳出来了一串地址,是因为此时调用了函数本身,返回函数对象,无需等结果运行出来。
当对函数添加括号时,返回的是函数的调用结果。
可变长度参数
(11条消息) Python函数的可变长参数_Python 学习者的博客-优快云博客_python函数可变长参数
可变长度参数 : *a表示一个可变长度的元组参数,**b表示一个可变长度的字典,在导入参数的时候可以参照以下例子
def func(*a,**b):
print(a)
print(b)
func(1,2,'x'=1,'y'=2)
'''
(1,2)
{'x':1,'y':2}
'''
类
菜鸟教程:Python3 面向对象 | 菜鸟教程 (runoob.com)
W3 school:Python 类和对象 (w3school.com.cn)
比较好使的:Python类和对象 (biancheng.net)
类对象支持两种操作:属性引用和实例化
类对象创建后,类命名空间中的所有属性都是有效属性名。实例化类,创建一个类的对象。在类的定义中,self表示一个类的实例。实例对象只能对数据或者方法进行引用。
对象的状态:当下实例域的值的特定组合。
类的方法:在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self, 且为第一个参数,self 代表的是类的实例。
类的私有方法只能在类内调用,而不能在类外调用。__ init __() 函数始终在启动类时,使用该函数将值赋给对象属性,或者在创建对象时需要执行的其他操作。私有方法在类内部使用
#self指的时未来在调用类时的一个实例,对于每个类基本上都会设置该函数
class Person:
ID=0#类属性,属于类本生,与实例无关
def __init__(self, id,name, major):#如果没有实例化,是不会产生下方属性的
self.__name = name#私用属性,不希望外部调用
self.__major = major
self.__id=id
def set_major(self,new_major):#函数里调用时需要使用self.parameter
self._major=new_major
def get_name(self):
return self.__name
def main():
s1=Person(33,"lb","MIS")#构建了一个实例s1,自动作为self传入
s1.set_major("cs")
print(s1.get_name())#由调用可见,这种私用属性的调用是不希望出现的
print(s1.__name)#这一步会报错,因为该属性被改变,使得找不到路径
类有私有属性,在前面加一个__双下划线,私有属性只能在类内使用,不能在类外随意调用,貌似类外调用类内属性会被伪装。
*xx: 公有变量
_x: 单前置下划线,私有化属性或方法,from somemodule import 禁止导入,类对象和子类可以访问
_xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)
xx:双前后下划线,用户名字空间的魔法对象或属性。例如:init , __ 不要自己发明这样的名字
xx:单后置下划线,用于避免与Python关键词的冲突
通过name mangling(名字重整(目的就是以防子类意外重写基类的方法或者属性)如:_Class__object)机制就可以访问private了。
__ dict __ :
类的数据属性,默认情况下通过字典__ dict __ 维护数据属性。Python 中的 类,都会从 object 里继承一个 dict 属性,这个属性中存放着类的 属性 和 方法 对应的键值对。一个类 实例化 之后,这个类的实例也具有 dict 属性。Python 类中的 __ dict __ 属性是以 字典 的形式存放着属性和方法,键为属性名,值为属性的值。
>>> class A(object):
... a = 0
... b = 1
... def __init__(self):
... self.a = 2
... self.b = 3
... def test(self):
... print("a normal func.")
...
... @staticmethod
... def static_test(self):
... print("a static func.")
...
... @classmethod
... def class_test(self):
... print("a class func.")
...
>>> obj = A()
>>> print(A.__dict__)
{'__module__': '__main__', 'a': 0, 'b': 1, '__init__': <function A.__init__ at 0x10b5f61e0>, 'test': <function A.test at 0x10b5f6268>, 'static_test': <staticmethod object at 0x10b5f16d8>, 'class_test': <classmethod object at 0x10b5f1748>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
>>>
>>> print(obj.__dict__)
{'a': 2, 'b': 3}
__ slot __:
__ new __:
__ call __:
将实例变为可调用对象
(11条消息) python类中的 call()方法运用_我是天才很好的博客-优快云博客
class Log:
def __init__(self,logfile='out.log'):
self.logfile=logfile
def __call__(self,func):
@wraps(func)
def wrapper(*args,**kwargs):
info="INFO: "+func.__name__+" was called"
with open(self.logfile,'a') as file:
file.write(info+'\n')
return func(*args,**kwargs)
return wrapper
@Log('test.log')
def myfunc():
pass
myfunc()#等价于log('test.log')(myfunc)() 其中表示将实例变为可调用的函数
类内的各种调用操作
类内调用类内函数
(8条消息) python中class(类)的使用,类的教程,类中的函数怎么调用。_狗风暴的博客-优快云博客_python调用class
类名.函数名
self.函数名
cls
[(8条消息) python 中的self和cls_GTFQAQ的博客-优快云博客_python中cls和self](https://blog.youkuaiyun.com/gtf215998315/article/details/106868558?ops_request_misc=%7B%22request%5Fid%22%3A%22166652375416782427492243%22%2C%22scm%22%3A%2220140713.130102334.pc%5Fall.%22%7D&request_id=166652375416782427492243&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-4-106868558-null-null.142v59pc_rank_34_queryrelevant25,201v3control_2&utm_term=类 cls&spm=1018.2226.3001.4187)
类的继承:
重点关注super(). __ init __()用于继承父类的初始化,非常重要
继承其他类的类称为派生类,被其它类继承的类被称为这些类的基类。
继承语法:
class derivedclassname(modname.baseclassname):#从任意模块继承一个类
#类定义
class people:
#定义基本属性
name = ''
age = 0
#定义私有属性,私有属性在类外部无法直接进行访问
__weight = 0
#定义构造方法
def __init__(self,n,a,w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s 说: 我 %d 岁。" %(self.name,self.age))
#单继承示例
class student(people):
grade = ''
def __init__(self,n,a,w,g):
#调用父类的构函
people.__init__(self,n,a,w)
self.grade = g
#覆写父类的方法
def speak(self):
print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
s = student('ken',10,60,3)
s.speak()
#####甚至可以继承多个类
#另一个类,多重继承之前的准备
class speaker():
topic = ''
name = ''
def __init__(self,n,t):
self.name = n
self.topic = t
def speak(self):
print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic))
#多重继承
class sample(speaker,student):
a =''
def __init__(self,n,a,w,g,t):
student.__init__(self,n,a,w,g)
speaker.__init__(self,n,t)
test = sample("Tim",25,80,4,"Python")
test.speak() #方法名同,默认调用的是在括号中参数位置排前父类的方法
派生类可能会覆盖其基类的方法
super()多继承顺序
(3条消息) Python基础:super()用法_硝烟_1994的博客-优快云博客_python super()
super() 函数是用于调用父类(超类)的一个方法。
super() 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。
class X(object):pass
class Y(object):pass
class A(X, Y):pass
class B(Y):pass
class C(A, B):pass
print C.__mro__
# (<class '__main__.C'>, <class '__main__.A'>,
# <class '__main__.X'>, <class '__main__.B'>,
# <class '__main__.Y'>, <type 'object'>)
##查找顺序
(3条消息) Python 魔法方法(六) 从__mro__ 了解类多继承顺序和原理_yusuiyu的博客-优快云博客
class A:
def __init__(self):
self.n = 2
def add(self, m):
print('self is {0} @A.add'.format(self))
self.n += m
class B(A):
def __init__(self):
self.n = 3
def add(self, m):
print('self is {0} @B.add'.format(self))
super().add(m)
self.n += 3
class C(A):
def __init__(self):
self.n = 4
def add(self, m):
print('self is {0} @C.add'.format(self))
super().add(m)
self.n += 4
class D(B, C):
def __init__(self):
self.n = 5
def add(self, m):
print('self is {0} @D.add'.format(self))
super().add(m)#对父类的函数直接调用,此时没有重新初始化,调用顺序为D,B,C,A
self.n += 5
d = D()
d.add(2)
print(d.n)
out:
self is <__main__.D object at 0x10ce10e48> @D.add
self is <__main__.D object at 0x10ce10e48> @B.add
self is <__main__.D object at 0x10ce10e48> @C.add
self is <__main__.D object at 0x10ce10e48> @A.add
19
object类
(3条消息) Python - Object类_星小白的博客-优快云博客_python类object
所有类的父类,默认所有的类都继承至object父类,如果有父类才编写,如果没有父类可以省略
运算符重载
(3条消息) python之运算符重载_zsj.python之路的博客-优快云博客_python重载运算符
(3条消息) 浅析Python运算符重载_viclee108的博客-优快云博客_python 重载比较运算符
工厂模式
工厂模式依然是一种创建型设计模式,作为工厂,它所关心的是产品的产生,也就是对象的创建,我们利用工厂来创建对象,而不必我们亲自创建对象,我们无需去理解如何创建对象,只需要向工厂提出要求,让工厂去根据你的要求,给你生产你要的产品,给你相应的对象,这种模式便叫做工厂模式。
Python实现设计模式——工厂模式 - 骑鱼嘚猫 - 博客园 (cnblogs.com)
dataframe数据框操作
(5条消息) Python Pandas中dataframe常用操作(创建、读取写入、切片等)_Parzival_的博客-优快云博客_python 写入dataframe
数据框缺失值填充
(5条消息) python做数据分析时缺失值填补、缺失值填充方法汇总_theskylife的博客-优快云博客_python对某一列填充某个值
数据框缺失值位置
(5条消息) Python Pandas找到缺失值的位置_kevinorg123的博客-优快云博客_pandas查找缺失值
pandas和numpy联合使用:numpy使用的是np.where返回标签序号
各种包和模块。
math库
collections库
tkinter库
this库
jieba库
wordcloud库
pandas库
空值填充
(5条消息) python做数据分析时缺失值填补、缺失值填充方法汇总_theskylife的博客-优快云博客_python对某一列填充某个值
numpy库
csv库:内置
(5条消息) python中csv文件的创建、读取、修改等操作总结_m0_46483236的博客-优快云博客_python读csv文件并修改
PIL库(pillow)
Pillow - 教程 - 蝴蝶教程 (jc2182.com)
深度学习之gensim库
时间处理之datetime库
Python常用标准库之datetime模块 - 知乎 (zhihu.com)
社会网络分析与挖掘之networkx库
官网教程及例子:教程 — NetworkX 2.8 文档 (osgeo.cn)
csdn博客:[(社会网络分析与挖掘—Python之networkx介绍_Machanical-Thinking的博客-优快云博客_networkx计算网络指标](https://blog.youkuaiyun.com/qq_34302921/article/details/80726448?ops_request_misc=&request_id=&biz_id=102&utm_term=python networkx&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-1-80726448.nonecase&spm=1018.2226.3001.4187)
Python NetworkX_hxxjxw的博客-优快云博客
**图边等方法的汇总:【NetWorkX实例(3)】图、边、节点等相关方法_LotusQ的博客-优快云博客**
networkx是一个python包,用于创建、操作和研究复杂网络的结构、动态和功能。使用NetworkX,可以以标准和非标准数据格式加载和存储网络,生成多种类型的随机和经典网络,分析网络结构,构建网络模型,设计新的网络算法,绘制网络。
一般networkx会与matlplotlib包一起使用,用来做构建与可视化。
导入库
import networkx as nx
create graph
import networkx as nx
import matplotlib.pyplot as plt#注意matplotlib里有子目录pyplot
G=nx.Graph()#创建空白图
G.add_node(1)#增加一个节点,名字叫做1
G.add_node("A")#增加一个叫做A的节点
G.add_nodes_from([2,3])#增加节点组,2和3
nx.draw(G,with_labels=True)#绘制G的labels
plt.show()
create edge
G.add_edge(2,"A")#连接节点2和A
G.add_edges_from([(1,2),(1,3),(2,"A"),(2,3)])#添加多条边
为节点添加属性
sf
可视化:用networkx做网络关系可视化 - 简书 (jianshu.com)
networkx 画图布局_ACxz的博客-优快云博客_networkx画图
**关于图的一些知识:**😫
图的密度: d e n s i t y = e d g e s n o d e × ( n o d e − 1 ) density=\frac{edges}{node\times(node-1)} density=node×(node−1)edges
声音处理库
playsound
只有一个播放功能
from playsound import playsound
playsound('/path/to/a/sound/file/you/want/to/play.mp3')
os库 文件路径操作
正则表达式
正则表达式基本语法与常用表达
#积累为主
#####1
a="Fri Oct 11 23:31:07 +0800 2013"
match=re.sub(r"\+\d{4}","",a)##匹配了+0800,\+表示匹配+,\d{4}表示匹配任意数字,且长度为4
#####2
.*表示匹配0或多个非回车的任意字符
####
{}内表示匹配的次数,{1,4}表示匹配1到4次;{1,}表示匹配至少1次;{3}匹配3次
####
[xad]表示匹配含有xad内的字符的;[^xad]表示匹配不含有xad内的字符的
####123.123.123.223
()用于分组
常用于表示IP地址 形如: ((25[0-5]|2[0-4][0-9]|[0-1]\d\d)\.){3}(25[0-5]|2[0-4][0-9]|[0-1]\d\d)
首先分为了两部分,第一部分123.123.123. 第二部分为123;;;第一部分(){3}表示该分组重复匹配3次,表示从0到255,\.表示将.转义,\d表示任意数字,后一部分表示200到255,|表示或者,&表示与
菜鸟教程:https://www.runoob.com/python3/python3-dictionary.html
(3条消息) 正则表达式全解析+常用示例_墨遥的博客-优快云博客_正则表达式解析
match
解释:match对象
match对象的方法:
.group(0) : 获得匹配后的字符串
.start() : 匹配字符串在给定字符串的开始位置下标
.end() : 匹配字符串在给定字符串的结束位置下标
.span() : 返回一个元组类型,包含开始位置下标和结束位置下标
对于正则表达式,一般使用re库,re库有以下常用的函数
re.search(pattern,string,flags=0)
返回第一个匹配的位置,返回match对象
flags参数表示正则表达式使用使得控制标记:re.I 忽略正则表达式的大小写,匹配小写字符; re.M ;re.S匹配所有的字符串; 0为默认?
re.match(pattern,string,flag=0)
从字符串的开头开始匹配,如果第一个字符匹配不上,则无法匹配到
re.findall(pattern,string,flag=0)
以列表类型返回字符串里所有能够匹配的字串
re.split(pattern, string, maxsplit=0, flags=0)
maxsplit指的是最大分割数,剩余部分作为最后一个元素输出,指的是割一次,如为1时,则分成两块。
re.sub(pattern, repl, string, count=0, flags=0)
repl:替换匹配字符串的字符串
count: 匹配时的最大替换次数,默认为全部替换
match = re.sub(r'[1-9]\d{5}', ':sucode', 'shenzhen 518000 shenzhen123456')
# subApiDemo:shenzhen :sucode shenzhen:sucode
print("subApiDemo:" + match)
re.finditer(pattern, string, flags=0)
搜索字符串,返回皮欸结果的迭代类型,每个迭代元素是match对象
"""
re.finditer(pattern, string, flags=0)
搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
- pattern: 正则表达式的字符串或原生字符串表示
- string:待匹配字符串
- flags:正则表达式使用时的控制标记
"""
def finditerApiDemo():
# 返回的是一个列表
matchIter = re.finditer(r'[1-9]\d{5}', 'shenzhen 518000 shenzhen123456')
for m in matchIter:
if m:
# finditerApiDemo:518000
# finditerApiDemo:123456
print("finditerApiDemo:" + m.group(0))
re.compile(pattern,flags=0)
将正则表达式编译程正则表达式的对象
def compileApiDemo():
regex = re.compile(r'[1-9]\d{5}')
match = regex.search('shenzhen518000')
if match:
# compileApiDemo - search:518000
print('compileApiDemo - search:' + match.group(0))
match = regex.match('518000shenzhen')
if match:
# compileApiDemo - match:518000
print('compileApiDemo - match:' + match.group(0))
python&&Gephi
教程汇总:Gephi教程汇总 - 知乎 (zhihu.com)
可视化
格式调整
[(5条消息) Py-plt:Plot如何控制坐标轴,图例和注释画出精美的图_MyName_Guan的博客-优快云博客_pyplot 坐标轴](https://blog.youkuaiyun.com/MyName_Guan/article/details/109913864?ops_request_misc=%7B%22request%5Fid%22%3A%22166580286216782390540557%22%2C%22scm%22%3A%2220140713.130102334…%22%7D&request_id=166580286216782390540557&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-109913864-null-null.142v56pc_rank_34_queryrelevant25,201v3control_2&utm_term=python plot函数坐标轴设置&spm=1018.2226.3001.4187)
平时可以用的可视化图片:线图、饼图、热力图、地图、河流图、树形矩阵等。
matplotlib库
python可视化最常用的11个分布图:python可视化48|最常用11个分布(Distribution)关系图 - 知乎 (zhihu.com)
python曲线图可视化:[Python数据可视化:如何创建曲线图 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/166526796#:~:text=Python数据可视化:如何创建曲线图 1 1. 基础线图 使用matplotlib创建图形的四个基本步骤: 准备数据 … 2,4. 添加标题,坐标轴标签和图例 优秀的可视化要传递有效的信息,有一些图形元素必不可少,例如标题,坐标轴标签,如果有多条曲线,为每条曲线添加标签是合理的。 … 5 5. 同时调整多个样式 )
一般调用plt的语句为import matplotlib.pyplot as plt
subplot()函数
[plt: subplot()、subplots()详解及返回对象figure、axes的理解_涛涛ALG的博客-优快云博客_subplots返回值](https://blog.youkuaiyun.com/sunjintaoxxx/article/details/121098302?ops_request_misc=%7B%22request%5Fid%22%3A%22166402904516782427479642%22%2C%22scm%22%3A%2220140713.130102334…%22%7D&request_id=166402904516782427479642&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-121098302-null-null.142v50control,201v3control_2&utm_term=python subplot返回值&spm=1018.2226.3001.4187)
subplot主要用于绘制子图,subplot(nrow,ncol,plotNum) 分别表示生成的行数,列数,按行排第几个子图。
#关于subplot的返回值
fig,ax=plt.subplot(2,2)
figure()函数
figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
num:图像编号或名称,数字为编号 ,字符串为名称
figsize:指定figure的宽和高,单位为英寸;
dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80 1英寸等于2.5cm,A4纸是 21*30cm的纸张
facecolor:背景颜色
edgecolor:边框颜色
frameon:是否显示边框
plot()函数
[(3条消息) python plt.show_python plt.show 关闭_weixin_39625429的博客-优快云博客](https://blog.youkuaiyun.com/weixin_39625429/article/details/111731839?ops_request_misc=%7B%22request%5Fid%22%3A%22166516345816782428690292%22%2C%22scm%22%3A%2220140713.130102334.pc%5Fall.%22%7D&request_id=166516345816782428690292&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-1-111731839-null-null.142v51control,201v3control_2&utm_term=python plt.show自动关闭&spm=1018.2226.3001.4187)
savefig()函数
seaborn库
知乎:python绘图-seaborn绘图的基本使用 - 知乎 (zhihu.com)
箱型图绘制:(3条消息) Seaborn绘制箱型图_尤尔小屋的猫的博客-优快云博客_seaborn 箱线图
distplot建议不要用,貌似以后会弃用,这个函数真nm坑
官方网站:seaborn.displot — seaborn 0.12.0 documentation (pydata.org)
热力图
(5条消息) python画出热力图,热力图数值,修改字体,字体大小等_bai_bai123的博客-优快云博客
饼图
[(5条消息) 用python实现PyEcharts中的饼图_不太累的码农的博客-优快云博客](https://blog.youkuaiyun.com/weixin_52720197/article/details/114749080?ops_request_misc=&request_id=&biz_id=102&utm_term=python pychart绘制饼图&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-3-114749080.142v56pc_rank_34_queryrelevant25,201v3control_2&spm=1018.2226.3001.4187)
[(5条消息) pyecharts画饼形图,圆形图,环形图(含百分比显示)【python干货】_写python的鑫哥的博客-优快云博客_pyecharts圆饼图](https://blog.youkuaiyun.com/Leexin_love_Ling/article/details/109572049?ops_request_misc=&request_id=&biz_id=102&utm_term=python pyrchart 饼图显示比例&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-9-109572049.142v56pc_rank_34_queryrelevant25,201v3control_2&spm=1018.2226.3001.4187)
pychart
图表 API - pyecharts - A Python Echarts Plotting Library built with love.
Document (pyecharts.org)这个是最新的,里面的代码可以使用,上面那个貌似版本太老了,但是可以学习参数
配置设置
pyechart的属性都是通过options配置的,具体可查看下方连接的参数配置
(6条消息) 【宝藏级】PyEcharts 超详细的使用指南_普通网友的博客-优快云博客_pyecharts详细教程
from pyecharts import options as opts
#初始化图的主题
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
#全局配置
.set_global_opts(里面填写下方的参数)
title_opts=opts.TitleOpts(title=,subtitle)#标题配置项,
添加x,y轴数据
.add_xaxis(添加数据种类数n)
.add_yaxis(添加一个数据集名称,添加该数据集中的n个数据)#可add_yaxis多个
保存为html
.render()
地图
(5条消息) Python轻松实现地图可视化(附详细源码)_普通网友的博客-优快云博客_python 画自建房地图
柱形图
爬虫
爬虫基本流程:1.发起请求:
通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers、data等信息,然后等待服务器响应。这个请求的过程就像我们打开浏览器,在浏览器地址栏输入网址:www.baidu.com,然后点击回车。这个过程其实就相当于浏览器作为一个浏览的客户端,向服务器端发送了 一次请求。
2.获取响应内容:
如果服务器能正常响应,我们会得到一个Response,Response的内容便是所要获取的内容,类型可能有HTML、Json字符串,二进制数据(图片,视频等)等类型。这个过程就是服务器接收客户端的请求,进过解析发送给浏览器的网页HTML文件。
3.解析内容:
得到的内容可能是HTML,可以使用正则表达式,网页解析库进行解析。也可能是Json,可以直接转为Json对象解析。可能是二进制数据,可以做保存或者进一步处理。这一步相当于浏览器把服务器端的文件获取到本地,再进行解释并且展现出来。
4.保存数据:
保存的方式可以是把数据存为文本,也可以把数据保存到数据库,或者保存为特定的jpg,mp4 等格式的文件。这就相当于我们在浏览网页时,下载了网页上的图片或者视频。
urllib库获取网页数据
import urllib.request
#获取一个get请求
response=urllib.request.urlopen(path)#获取网页信息
response.read().decode("utf-8")#读取数据,并解码
#获取post请求
#测试网址httpbin.org
伪装成浏览器
from bs4 import BeautifulSoup
报错
UnboundLocalError: local variable ‘args’ referenced before assignment:变量未被正确引用,找不到,未赋值
迫切代办
1、学习pyechart orz
2、系统完整的学习装饰器的各类用法
这个是最新的,里面的代码可以使用,上面那个貌似版本太老了,但是可以学习参数*
配置设置
pyechart的属性都是通过options配置的,具体可查看下方连接的参数配置
(6条消息) 【宝藏级】PyEcharts 超详细的使用指南_普通网友的博客-优快云博客_pyecharts详细教程
from pyecharts import options as opts
#初始化图的主题
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
#全局配置
.set_global_opts(里面填写下方的参数)
title_opts=opts.TitleOpts(title=,subtitle)#标题配置项,
添加x,y轴数据
.add_xaxis(添加数据种类数n)
.add_yaxis(添加一个数据集名称,添加该数据集中的n个数据)#可add_yaxis多个
保存为html
.render()
地图
(5条消息) Python轻松实现地图可视化(附详细源码)_普通网友的博客-优快云博客_python 画自建房地图
柱形图
爬虫
爬虫基本流程:1.发起请求:
通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers、data等信息,然后等待服务器响应。这个请求的过程就像我们打开浏览器,在浏览器地址栏输入网址:www.baidu.com,然后点击回车。这个过程其实就相当于浏览器作为一个浏览的客户端,向服务器端发送了 一次请求。
2.获取响应内容:
如果服务器能正常响应,我们会得到一个Response,Response的内容便是所要获取的内容,类型可能有HTML、Json字符串,二进制数据(图片,视频等)等类型。这个过程就是服务器接收客户端的请求,进过解析发送给浏览器的网页HTML文件。
3.解析内容:
得到的内容可能是HTML,可以使用正则表达式,网页解析库进行解析。也可能是Json,可以直接转为Json对象解析。可能是二进制数据,可以做保存或者进一步处理。这一步相当于浏览器把服务器端的文件获取到本地,再进行解释并且展现出来。
4.保存数据:
保存的方式可以是把数据存为文本,也可以把数据保存到数据库,或者保存为特定的jpg,mp4 等格式的文件。这就相当于我们在浏览网页时,下载了网页上的图片或者视频。
urllib库获取网页数据
import urllib.request
#获取一个get请求
response=urllib.request.urlopen(path)#获取网页信息
response.read().decode("utf-8")#读取数据,并解码
#获取post请求
#测试网址httpbin.org
伪装成浏览器
from bs4 import BeautifulSoup
报错
UnboundLocalError: local variable ‘args’ referenced before assignment:变量未被正确引用,找不到,未赋值
迫切代办
1、学习pyechart orz
2、系统完整的学习装饰器的各类用法