PYTHON笔记

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()#打印状态结果
闭包

返回函数不宜引用任何循环变量,或者后续会发生变化的变量

python中闭包详解 - 知乎 (zhihu.com)

添加进度条

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

Python 抽象类 (zditect.com)

生成器

Python生成器详解 (biancheng.net)

获取返回值需要捕获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×(node1)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}表示匹配14次;{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次,表示从0255,\.表示将.转义,\d表示任意数字,后一部分表示200255|表示或者,&表示与

菜鸟教程: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、系统完整的学习装饰器的各类用法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值