Python学习笔记——进阶

Python中self用法详解 Python中类、实例以及self的详解 阅读详情

文章目录

1 知识前提

知识前提

2 进阶

2.1 浅拷贝和深拷贝

浅拷贝
使用[:]对列表进行拷贝

L1 = [1,2,3,[1,2]]
L2 = L1[:}
id(L1) == id(L2) #False
id(L1[0]) == id(L2[0]) #True

此时为浅拷贝,即:
规则一:对于不可变对象且内部没有嵌套子对象,浅拷贝就是原对象,不拷贝。
规则二:对于不可变对象且内部嵌套可变对象,也是不拷贝。
规则三:不符合规则一的对象进行浅拷贝会创建了一个新的对象(地址不同),但是该对象内部的子对象指向的是同一个对象,只拷贝了外部。此时有两种情况:
A 改变子对象,且该子对象为不可变对象,不会影响到浅拷贝对象
B 改变子对象,且该子对象为可变对象,会影响到浅拷贝对象

浅拷贝:

  1. L1[:]
  2. L1.copy()
  3. list(L1)
  4. import copy;copy.copy(L1); #调用标准库模块copy也是浅拷贝

注意:由于内部拷贝的是引用地址,当改变内部不可变对象时,改变不会影响到其他浅拷贝对象,当改变内部可变对象时会导致其他浅拷贝对象变化!

深拷贝
copy模块有一个深拷贝的方法:deepcopy(),和上述规则一样:
规则一:对于不可变对象且内部无嵌套子对象的深拷贝结果就是原对象,不拷贝。
规则二:对于不可变对象内部嵌套可变对象的深拷贝结果是不同的对象,且内部可变子对象也不同
规则三:对于可变对象,会创建一个新的(内存地址不同)对象,改变一个不影响其他。

2.2 面向对象

OOP:面向对象
定义一个类:class 类名(object):,类名首字母要大写其余驼峰,其中object表示继承
def __init__(self):,构造第一个参数总是self,是一个特殊方法,创建实例后,该方法被自动调用
类方法def xxx(self):,第一个参数总是self
self表示调用该方法的那个对象

特殊的:对于方法体或类体可以使用pass避开语法检查

class SomeA(object):
	pass
# 定义类
class Dog(object):
	def __init__(self,breed,name,age,health):
		self.breed = breed
		self.name = name
		self.age = age
		self.health = health
	def run(self):
		print("run")

# 实例化
Dog("黄狗","小黄",5,"good") # 执行了两步:1创建Dog实例,2调用__init__方法
print(Dog.name)
Dog.run()

2.2.1 实例属性

绑定实例属性值:(对于存在属性的为修改,不存在的为绑定)
类内部:self.属性名 = 属性值
类外部:实例.属性名=属性值

注意:python为动态语言,可以动态添加实例属性!

访问实例属性:
内部:self.属性名
外部:实例.属性名

注意:每个实例对象都有一个类对象的指针

实例.__dict__:特殊属性,返回当前实例对象的所有方法和属性
dir(类):返回当前类所有的属性和方法

2.2.2 类属性

类属性和实例属性最大的区别是:没有self前缀!!类属性是绑定在类上的,可以通过类或者实例进行访问,只能通过类进行修改。
设置
内部:属性名=属性值
外部:类.属性名 = 属性值
访问
内部:类.属性名
外部:类.属性名或实例.属性值
实例对象也可以访问类属性!!访问属性的顺序:先查找实例,再查找类,即,同名的实例属性会屏蔽类属性

class MyDemo(object):
	name = "pp"
	def run(self):
		print(MyDemo.name)

del MyDemo.age # 删除实例属性

2.2.3 实例方法

绑定在实例上的方法,类对象不可调用
调用格式:
类内部:self.方法(参数)
类外部:实例.方法(参数)
绑定:
类内部:def 方法(self,参数),该方式会给所有实例绑定
类外部:
使用MethodType方法,称为动态绑定实例方法,只会绑定到当前实例
使用实例.方法(self,参数),会绑定所有实例对象(相当于在类中定义了实例方法)

# 动态绑定实例方法
from types import MethodType
def fun1(self):
	pass
abc.f = MethodType(fun1,abc) # MethodType(方法名,类名),给某个类绑定实例方法

2.2.4 类方法

定义类方法必须使用:@classmethod,第一个形参表示类对象,由系统自动传入

类方法可以被实例或类调用。调用格式:类.方法(参数),实例.方法(参数)

class My(object):
	@classmethod
	def a(cls,p1,p2):
		print(p1,p2)
	@classmethod
	def b(cls): 
		My.a(1,2) # 在类方法中调用类方法
		cls.a(1,2) # 在类方法中调用类方法

	def c(self): 
		self.a(1,2) # 在实例方法中调用类方法

My.a(1,2) # 类外部直接调用
My().a(1,2) # 类外部创建实例调用

2.2.5 静态方法

和定义类方法定义和使用没有区别,除了第一个参数不需要传递了,且需要用:@staticmethod外。

class My(object):
	@staticmethod
	def a(x,y):
		print(x,y)
	@classmethod
	def b(cls): 
		My.a(1,2) # 在类方法中调用静态方法
		cls.a(1,2) # 在类方法中调用静态方法

	def c(self): 
		self.a(1,2) # 在实例方法中调用静态方法
My.a(1,2)
My().a(1,2)

2.2.6 访问控制

__:添加在类或属性名前,则无法在类对象外部访问了
原因:名字被改掉了:原来:__a,改成了_类__a

class My(object):
	def __init__(self):
		self.__a = 19
	def __b(self):
		print("abc")
	def c(self):
		self.__b()
		
My().__a # 无法访问
My().__b # 无法访问

特别注意:由于在类中定义的该方法会被改名,所以可以在外部定义相同名字的方法或属性,不会出现冲突
一般而言:以下划线开头的实例属性和方法不建议在外部直接访问,约定

2.2.7 封装

隔离复杂度,权限控制

class My(object):
	def __init__(self):
		self.__a = 19
	def get_a(self):
		return self.__a
	def set_a(self,a):
		if a > 0:
			self.__a = a
		else:
			raise ValueError("必须大于0")

注意:raise用于抛出异常

2.2.8 继承

提取共同点,抽象出来,便于复用

class Animal(object):
	def eat(self):
		print("eat")
class Dog(Animal):
	pass

Dog().eat()

子类可以直接调用从父类继承过来的方法和属性,object是所有类的父类或基类

注意:支持多继承,子类会继承所有直接和间接父类的属性和方法

class A(B,C,D):
	pass

2.2.9 多态

程序动态决定在运行时调用对象的方法

def run(x):
	x.show()
class a(object):
	def show():
		print("a")
class b(object):
	def show():
		print("b")
class c(a):
	pass

run(a())
run(b())
run(c())

此时传递abc的实力给run方法,则会输出不同的结果,注意:当当前类中无此方法会往父对象中寻找

注意:python是动态语言,调用函数时不会检测类型!!静态语言多态实现:继承、重写、父类引用指向子类对象。

2.3 MRO

方法解释顺序:Method resolution order
如:对于直接继承的多个对象,如果含有相同的方法,则调用时需要根据py解释器顺序来确定调用哪个类中的方法,super()同样符合该规则。
类.mro():返回对象继承树的一个有序列表,调用方法或访问属性时按照这个顺序进行访问,格式为列表
类.__mro__:返回内容同上,格式为元组

如果想调用指定的父类方法,需要使用:super(类,实例),含义为:调用指定类后的类,类顺序是MRO

class D(B,C):
	def run(self):
		super(B,self).run()

D().run() # B后的类是C,所以这里会调用C中的run方法

2.4 内置函数

2.4.1 issubclass()和isinstance()内置函数

issubclass(类1,类2):类关系判断,判断类1是否是类2的子类,类2可以支持元组,表示满足其一即可,返回值为True|False
isinstance(实例,类):类和实例关系判断,判断实例是否是 类的实例 或 该类的子类 的实例,同样,类参数支持元组,返回值True|False

2.4.2 type内置函数

格式:type(对象)
如果是实例对象,返回类对象的类型
如果是类对象,返回<class 'type'>,即类对象是type的实例对象
如果是函数对象,返回<class 'function'>,内置函数对象类型是内置函数类型

type(19) # print后为<class 'int'>
type(19) == int # True
type('abc') == str # True
type(func1) == function # False,因为除了基本数据类型,其他的不可以使用==判断

当对象为非基本数据类型,则需要使用types模块来处理:

import types
type(func1) == types.FunctionType # True
type(内置函数) == types.BuildinFunctionType # True

2.4.3 dir内置函数

获取制定对象中的所有属性和方法包括继承的,格式:dir(对象)
注意:类对象返回的不包括实例属性!!

2.5 特殊属性方法

object中所有属性和方法都是以双下划线开头和结尾,双下划线包围的是特殊属性和特殊方法,属于预定义的,自定义的不要这样写!

在自定义类时,经常会重写特殊方法,该种方法会在特定场合下调用

2.5.1 特殊属性:__dict__

类.__dict__:返回结果为字典:key为所有绑定的属性或方法名,含有很多内置继承的属性
实例.__dict__:返回结果为字典,只包括手动定义的属性

默认情况下:访问实例的属性是通过访问该对象的__dict__来实现的:obj.x相当于obj.__dict__['x']

2.5.2 反射

以字符串形式操作对象属性和方法:增删改查

  1. hasattr(object,name):判断指定对象中是否有指定属性和方法
  2. getattr(object,name[,default]):获取制定对象中都某个属性或方法,如果不存在使用default代替,不存在且无default报错
  3. setattr(object,name,value):添加或修改制定对象中的某个属性或方法
  4. delattr(object,name):删除制定对象中的某个属性或方法

2.5.3 特殊方法:__len__()

类对象有个内置方法:len(内置类对象的实例对象),返回对象的长度

len([1,2,3]) # 3
len('abc') # 3
len({'a':1,'b':2}) # 2

对于非内置类型的自定义类,必须重写__len__()才可以使用len()

class My(object):
	def __len__(self):
		return 18
len(My()) # 18

2.5.4 特殊方法:__iter__()和__next__()

对于可迭代对象list,可以使用for in进行迭代

L = [1,2,3]
for item in L:
	print(item)

对于自定义类,需要实现两个特殊方法才可以迭代:__iter__()和__next__()

class My(object):
	def __iter__(self):
		return self
	def __next__(self):
		if 条件:
			raise StopIteration() # 如果满足退出条件,则抛出停止迭代对象
		else:
			return 值 # 如果不满足退出迭代条件,则返回一个迭代后的值

for item in My():
	逻辑

for in语句会首先调用__iter__()返回一个可迭代的对象,然后不断调用__next__()返回下一次迭代值。直到遇到StopIteration退出

只实现了__iter__()的对象称为可迭代对象
__iter__()和__next__()都实现了,则为迭代器对象

2.5.5 特殊方法:__add__()和__radd__()

对自定义类实现四则运算:
加:__add__()和__radd__()
减:__sub__()和__rsub__()
乘:__mul__()和__rmul__()
除:__truediv__()和__rtruediv__()
双除:__floordiv__()和__rfloordiv__()

列表也实现了+和*运算对应的特殊方法

对于运算符右侧的特殊方法前面有个r开头。在运算中

  1. 会依次从左侧开始判断是否实现了相应运算(左侧调用非r方法,右侧带r)
  2. 如果左侧实现方法且结果不为NotImplemented则返回运算结果,否则判断右侧
  3. 如果左右都没实现,直接抛出TypeError异常
# obj1 + obj2,
class obj1(object):
	def __add__():
		return "xxx"
class obj2(object):
	def __radd()__:
		return "yyy"
obj1 + obj2 # xxx

2.5.6 特殊方法:__str__()和__repr__()

内置函数str(对象):调用的是内置函数__str__()
内置函数repr(对象):调用的是内置函数__repr__()

两种特殊方法都没有实现:无论是print还是命令行直接输入该类都会直接打印出类类型和地址
当只实现__str__(),调用print或str()会返回函数结果
当只实现__repr__(),命令行直接输入或str(),会返回函数结果
str()优先使用__str__()结果
repr()只会使用__repr__()结果

一般而言:str返回的是用户理解的,repr返回的是程序员理解的(比如转义或单引号

class obj(object):
	def __str__(self):
		return "xxx"
	__repr__ = __str__

2.5.7 特殊方法:__new__()

创建实例对象分两步:1 调用__new__() 2 调用__init__()

__new__()返回一个对象,该对象会传递给__init__()作为参数

class P(object):
	def __new__(cls,*args,**kwargs):
		obj = super().__new__(cls)
		return obj
class C(object):
	def __init__(self,name):
		pass
C() # 先在C中查找new特殊方法,没有的话会去父中查找,new的cls参数为C的类对象,返回结果为创建完的C类实例对象,会将该对象给C中的init方法的self参数值

2.5.8 特殊方法:__getattr__()

当访问实例对象的属性或方法时,如果该属性不存在,则会调用该__getattr__()特殊方法!!

class My(object):
	def __getattr__(self,name):
		if name == 'd':
			return "ddd"
		else name == 'do_sth': # 如果是函数,可以返回一个函数
			return print
		raise AttributeError("属性不存在!")
My().d
My().do_sth(123) # 会打印出123
My().a

2.5.9 特殊方法:__getitem__()、__setitem__()和__delitem__()

实现了该方法的自定义类可以使用[]来访问数据

__getitem__():触发方式:对象[key]
__setitem__():触发方式:对象[key]=value
__delitem__():触发方式:del 对象[key]

2.5.10 特殊方法:__call__()

实现了该方法的类的实例,可以直接加()来调用call方法

class My(object):
	def __call__(self,*args,**kwargs): # args是元组格式 kwargs是字典格式
		print(args,kwargs)
My()() # () {}
My()(1,2,x=3,y=4) # (1,2) {'x':3,'y':4}

callable(对象):判断一个对象是否是可调用的,True|False
实现了__call__()的类,其实例也是可调用的

2.5.10 特殊属性:__doc__

与函数的文档字符串相似,位于类对象的第一行的字符串被称为文档字符串,通常用三个引号标识,用语简要描述功能,可以用工具自动生成文档

class My(object):
	"""这是文档字符串"""
	pass

访问文档字符串:

  1. 对象.__doc__
  2. help(对象)

2.5.11 特殊属性:__slots__

python动态语言可以动态绑定属性和方法,如果想限定属性方法名可以重写该方法并给定范围

class My(object):
	__slots__ = ("a","b","run") # 可以是列表或者元组

obj1 = My()
obj1.a = 1
obj2.b = 2
obj3.run = def abc: pass

注意:如果在类对象中定义类__slots__,则不会创建__dict__,而是为每个属性创建一个描述器,调用描述器快于访问__dict__,由于不再创建__dict__,不用创建hash表了,占用内存会减小
注意:该slot只对当前类实例对象起作用,其子类等无关。如果子类也定义了slot,则子类限定范围会加上父类的(范围更广)

2.6 对象引用计数

py在对象创建时会存在一个该对象的引用,只有当该对象的引用为0时,才会被销毁,释放内存。

引用+1的情况:

  1. 对象赋值给变量
  2. 变量赋值给变量
  3. 对象作为容器中一员
  4. 对象作为函数实参(函数结束自动-1)
import sys
sys.getrefcount(对象) # 获取对象的引用计数值,注意:该函数在执行过程中,传入的对象的引用计数会+1,结束后会-1

引用计数-1情况:

  1. 对象离开其作用域
  2. 引用被显式销毁
  3. 引用指向变更
  4. 引用在容器中删除

2.6.1 销毁对象或引用:__del__()

一般而言系统会自动清理内存和引用,但有时候需要在内存清理时或某些对象销毁时执行一些关闭前的清理工作:__del__(),该方法在对象被销毁前会自动调用该方法。
del 对象:手动删除销毁某个对象的引用,如果此时该引用指向的对象引用计数为0,在某些时刻会被垃圾回收,会在回收前调用__del__()方法

3 模块

模块:就是一个py文件,定义在模块中的变量函数和类统称为模块的属性
优点:代码重用+避免属性名冲突

包:在某个目录下添加__init__.py文件后,该目录就变成了包。即包含特定模块的特殊目录,该文件用于初始化模块,可以为空。包可以嵌套。
在这里插入图片描述

3.1 标准库

使用标准库必须用:import进行导入,分为:整个模块导入和模块中属性导入

  1. 导入整个模块import [包名.]模块名
    访问模块中的属性:[包名.]模块名.属性名
    起别名:import xxx as yyy
import os
print(os.environ) # 打印操作系统中的所有环境变量
print(os.getenv('PYTHON_HOME'))
  1. 导入模块中的属性from [包名.]模块名 import 属性名[,属性名[,属性名]]
    导入该属性后可以直接访问,无需再写包名模块前缀,可以一次导入多个属性,也可以给每个模块起别名
from os import environ
print(environ)
from os import environ,getenv
from os import environ as abc1,getenv as abc2
  1. 导入模块中的所有属性:from [包名.]模块名 import *
    不建议这样使用,效率低,可读性差,容易重名

3.2 第三方库

PyPI:Python Package Index,官方基于web的集中管理的第三方软件仓库。www.pypi.org
常用pip3工具从PyPI上下载第三方库。
pip:Package Installer for Python,该工具随Python一起安装,pip3

查看pip工具的安装路径:which pip3 or where pip3

安装第三方库:pip install 包名
第三方库安装目录:python安装目录下的\Lib\site-packages
使用第三方库:和标准库使用方式相同

3.2.1 pip使用

# 查看帮助信息
pip3
# 列出已安装库
pip3 list
# 模糊搜索在线库
pip3 search xxx
# 安装指定第三方库,不指定版本号默认最新版本
pip3 install xxx==版本号
# 升级第三方库
pip3 install --upgrade xxx
# 卸载第三方库,不指定版本号默认最新版本
pip3 uninstall xxx==版本号
# 查看某个命令帮助
pip3 命令 --help

3.2.2 发布自己的库

  1. 创建配置文件:setup.py
from setuptools import setup

setup(
	# 发布的包名
	name = 'xiaopi_demo',
	# 版本
	version = '0.1',
	# 描述
	description = 'xxx'
	# 如果当前项目包含子包,可以手动指定要包含的包或自动查询,如果不包含则可以不指定packages参数
	packages = find_packages()
	# 如果当前项目只有模块,则指定该关键字
	py_modules = ['xiaopi3_demo_module']
)

关于如何使用setuptools可以参考官方文档
在这里插入图片描述

  1. 可选,创建其他文件
  2. 打包自己开发的库
    将setup.py和其他文件和自己的库放在同一个目录中,在该目录下执行:python3 setup.py sdist,会在当前目录下生成一个dist目录和其他目录,dist目录下有一个包名-版本.tar.gz包
  3. 将自己的库发布到PyPI或共享给别人
    发布的话参考官方文档
    安装本地离线库:在库文件所在目录下执行:pip3 install 库文件名

3.3 Anaconda

直接下载安装,并自动添加安装目录下的bin目录到系统path中

注意:安装完anaconda后使用python命令调用的是:anaconda目录/bin下的python,pip3同理会安装到anaconda/lib/python3.x/site-packages

3.3.1 conda管理第三方工具

anaconda使用conda管理其第三方包,类似于pip3

# 查看帮助
conda
# 列出anaconda安装的所有第三方库
conda list
# 模糊搜索第三方库
conda search xxx
# 安装指定库,可以指定版本
conda install xxx=版本
# 升级指定库
conda update xxx
# 卸载指定库,可以指定版本
conda remove xxx
# 查看命令帮助
conda 命令 --help

3.4 模块导入

注意:直接运行某个模块时,该模块视为主模块,在最顶层,无法与项目其他模块形成相对关系,不能在当前运行的模块中使用相对导入。

问题: 导入的不同模块中存在相同属性
结论:后倒入的属性会覆盖前面导入的同名属性,建议使用as进行重命名

3.4.1 import语句执行流程

使用import导入时,解释器会根据sys模块的modules属性值来查找模块是否已被导入

import pprint,sys
pprint.pprint(sys.modules) # pprint可以格式化打印字典

情况:

  1. 模块已被导入,什么也不做
  2. 模块没有导入:搜索模块–>将模块编译成pyc字节码(如果需要)–>执行字节码运行模块

3.4.2 模块搜索路径

搜索路径分成三个部分:

  1. 当前目录下
  2. 标准库目录
  3. 第三方库安装的目录

修改路径:

  1. 直接修改sys.path,其为一个列表,只是临时修改,运行环境结束就失效
import sys
sys.path.insert(0,'/xxx/xxx')  # 修改导入模块搜索路径,在首位插入自定义的路径
import abc # 此时再导入时,第一搜索路径是自定义的路径
abc.run()
  1. 设置环境变量PYTHONPATH,该路径会被自动添加到搜索路径中,永久有效

3.4.3 编译模块成pyc

当搜索到的模块第一次被导入,会被编译成pyc文件,存放在模块同目录下的__pycache__/模块名.cpython-版本号.pyc,如果该模块无变化,下次导入时会直接读取缓存的pyc,无需再次编译。

3.4.4 运行字节码文件

导入包中的模块会先运行包中的__init__.py文件,且从最顶层的包开始运行,知道被导入模块那个包为止,导入模块就会立即运行模块!

3.4.5 查看模块的所有属性

dir(模块):可以查看该模块的所有属性,如果不带参数,则返回当前作用域下的所有属性(由于是解释性语言,所以当前作用域中包含的属性多少与调用顺序有关)

3.4.6 重新加载

使用import语句导入后,如果在这期间该模块做了修改,再次导入是无法获取最新修改值的,需要使用标准库importlib中的:importlib.reload(模块)来重新加载模块

3.4.7 __doc__

模块的文档字符串:用于描述和解释模块功能的字符串,使用"""来包裹,位于模块的第一行,可以使用工具自动生成文档

print(__doc__) # 打印当前文档的文档字符串
import base64
print(base64.__doc__)
print(help(base64))

3.4.8 __name__

模块的__name__:对于被导入的模块,该属性为模块名,对于被直接运行的模块,该属性为__main__

可以根据__name__的值来判断是否执行模块测试代码
直接运行模块时执行测试代码,如果是被导入的,则不需要执行

print("运行a模块")
def add(x,y):
	return x+y
if __name__ == '__main__':
	print("1+2="+add(1,2))

3.4.9 模块内数据访问控制:_属性、__all__

_属性:如果模块内的属性前添加了但下划线,则无法使用from 模块 import *进行属性导入,但使用import 模块这种方式可以
__all__:作用是限制使用from 模块 import *进行属性导入时只能导入__all__中定义的

__all__ = ['v1', 'v2']

v1 = 12
def v2():
	pass
v3 = 14

注意:如果两种都使用了,则__all__优先级高于_属性

4 生成器和迭代器

4.1 生成器

生成器是一个推算元素的一组代码,它不保存整个序列,而是在迭代中推算出下一个对象,如果需要创建一个大容量序列,为了节省空间可以考虑使用生成器!

列表、字典、集合生成式,无元组生成式(不可变)

创建一个生成器:

[i*i for i in range(1,7)] # [1, 4, 9, 16, 25, 36]

生成器如:(i*i for i in range(1,7)),返回的就是一个生成器,该生成器对象每次调用next()都会返回下一个可访问对象

ge = (i*i for i in range(1,7))
next(ge) # 1
next(ge) # 4

当调用next(生成器)时无下一个对象,会抛出异常:StopIteration

也可以使用for in语句来迭代生成器:

ge = (i*i for i in range(1,7))
for item in ge:
	print(item)

4.1.1 生成器表达式

使用类似生成式语法:(i*i for i in range(1,7))称为生成器表达式,如果推算方法比较复杂时,推荐使用生成器函数

4.1.2 生成器函数

对于普通函数来说:

def fib(n):
    i=0
    a=1
    b=1
    while i<n:
        print(a)
        tmp = a
        a = b
        b = tmp + a
        i+=1

# 另一种写法
def fib2(n):
	i = 0
	a,b = 1,1
	while i<n:
		print(a)
		a,b = b,a+b
		i+=1

fib(6)

将这个普通函数改成生成器函数,即print改成yield即可,当调用next()或者for in迭代时,每次代码执行到该处时会挂起函数,下次从挂起处继续执行。

def fib2(n):
	i = 0
	a,b = 1,1
	while i<n:
		yield a
		a,b = b,a+b
		i+=1

f = fib2(3)
next(f) # 1
next(f) # 1
next(f) # 2
next(f) # StopIteration

4.2 迭代器

【可迭代对象】:可以使用for in进行迭代的,如:range、列表、元组、字符串、字典、集合、生成器
isinstance(对象,可迭代类型)可以判断一个对象是否是可迭代对象。(Iterable)

from collections import Iterable
isinstance([1,2],Iterable) # True

【迭代器对象】:可迭代对象能作为next()的实参,那么称为迭代器对象(Iterator)
isinstance(对象,迭代器类型)可以判断一个对象是否是可迭代对象。

from collections import Iterator
isinstance([1,2],Iterable) # False

可迭代转换成迭代器:iter(可迭代对象)

特殊的:如果一个对象同时实现了:__iter__()和__next__(),那么该对象是一个迭代器对象,用于for in 语句时,会首先调用前者,然后不断调用后者来返回下一次值

class MyIter(object):
	def __init__(self):
		self.data = 0
	def __iter__(self):
		return self
	def __next__(self):
		if self.data > 5:
			raise StopIteration()
		else:
			self.data += 1
			return self.data

for item in MyIter():
	print(item)

5 异常

无语法错误的程序在运行期间产生的特定错误,每个特定错误都对应一个异常类,当抛出时抛出的是异常类对应的异常对象
如果对抛出的异常对象不进行捕获处理,则程序会停止运行,并打印堆栈跟踪和错误详情

所有异常对象的基类:Exception

5.1 异常捕获

格式:

try:
	可能存在异常的代码
except 异常类1:
	捕获到对应异常时的处理
except 异常类2 as err:
	print(err)
	print(type(err))
	捕获到对应异常时的处理
except (异常类3,异常类4,异常类5):
	捕获到对应异常时的处理
except :
	捕获到对应异常时的处理
...

当有异常且被exception捕获时,会进入异常处理流程,否则有异常会直接终止程序,没有异常在执行完代码后不会执行异常处理。

注意:except匹配是按顺序的,匹配到后其他的except不会再去匹配了。建议在except中将所有异常尽量覆盖到,如:最后一个excep匹配Exception或不指定缺省。

5.2 异常从句else

在while和for in语句后的else从句执行流程:先执行循环,如果循环出现break,则直接结束跳到else语句后执行,否则执行完循环在执行else语句。
异常语句也可以加else

try:
	...
except xxx:
	...
else:
	...

执行流程:先执行try,如果try出现异常:执行except,否则执行else,二选一

5.3 异常从句finally

finally从句无论何时都会被执行,常用来执行释放资源动作关闭连接池等。也可以同时添加else和finally
格式:

try:
	...
except xxx:
	...
else:
	...
finally:
	...

注意:else必须要在finally从句之前

5.4 手动抛出异常

格式:raise 异常类(参数)
如果没有参数,可以省略括号

可以原样抛出异常:

try:
	...
except xxx:
	raise # 此处会再次抛出这个异常
except xxx:
	raise yyy # 此处抛出另外一个异常

5.5 自定义异常

继承任何一个异常类即可

class MyError(Exception):
	def __init__(self,msg1,msg2):
		self.msg1 = msg1
		self.msg2 = msg2

raise MyError("abc","eee")

5.6 异常信息

异常调用堆栈
异常发生后,会打印异常调用信息,异常调用堆栈顺序为:最上层的为最外层的调用,最底层为异常产生处

异常处如果没有捕获异常,则会往上一层抛异常,知道最顶层python解析器捕获到

sys.exc_info()
对于sys模块的exc_info()方法,可以返回当前异常的三种信息:

  1. 第一位:ex_type,异常类型
  2. 第二位:ex_value,异常错误信息
  3. 第三位:ex_traceback,异常跟踪信息
import sys
import traceback
try:
	raise ZeroDivisionError:
except Exception:
	ex_type, ex_value, ex_traceback = sys.exc_info() # 返回值是一个元组,可以用这种方式接收
	tb = traceback.extract_tb(ex_traceback)
	print(tb)
	for filename, linenum, funcname, source in tb: # 每一项是一个元组,可以这样取值
		print(filename, linenum, funcname, source)

5.7 with语句

上下文管理器:如果类实现了:__enter__()和__exit__(),该类实体为上下文管理器
with语句会让上下文管理器创建一个运行时上下文,进入时调用enter,离开时调用exit
规则为:

  1. 如果执行语句体时无异常,则执行顺序为:enter、语句体、exit
  2. 如果执行语句体有异常,则顺序为:enter、语句体执行到异常处终止、exit,此时看exit返回如果为True则程序继续执行,否则程序终止执行(可以try except进行捕获)

在exit特殊方法中会自动传入异常相关信息:异常类型,错误信息,堆栈信息

格式:

with 上下文表达式 [as 变量]:
	语句体
# 正常执行时
class MyContext(object):
	def __enter__(self):
		print("enter")
		return self
	def __exit__(self,e_type,e_val,e_tb):
		print("exit")
	def do(self):
		print("do")

with MyContext() as mm:
	mm.do()

# enter
# do
# exit

# 异常执行时
class MyContext(object):
    def __enter__(self):
        print("enter")
        return self

    def __exit__(self, e_type, e_val, e_tb):  # 此处为异常的信息:异常类型,错误信息,堆栈信息,会自动被赋值
        print("exit")

    def do(self):
        print("do1")
        print(1 / 0)
        print("do2")

# enter
# do1
# exit
# Traceback 。。。。

# 异常时,且exit返回True
class MyContext(object):
    def __enter__(self):
        print("enter")
        return self

    def __exit__(self, e_type, e_val, e_tb):  # 此处为异常的信息:异常类型,错误信息,堆栈信息,会自动被赋值
        print("exit")
        return True

    def do(self):
        print("do1")
        print(1 / 0)
        print("do2")


with MyContext() as mm:
    mm.do()

# enter
# do1
# exit

6 文件

内置函数打开文件:open(),返回值是文件对象,该对象用于操作文件

open(path,mode)
# path:路径,绝对或相对
# mode:打开方式,默认r只读,不存在抛出FileNotFount异常。
# w只写,存在就清空,不存在就创建。
# a追加,存在则末尾追加,不存则在创建。
# x只写,存在抛出FileExistsError,不存在则创建。
# +读写。
# t文本(所有都是默认文本方式)。不可单独使用
# b二进制。不可单独使用

注意:在 Python 中,不同的字符所占的字节数不同,数字、英文字母、小数点、下划线以及空格,各占一个字节,而一个汉字可能占 2~4 个字节,具体占多少个,取决于采用的编码方式。例如,汉字在 GBK/GB2312 编码中占用 2 个字节,而在 UTF-8 编码中一般占用 3 个字节。
read中size按照字符计算,seek中按照字节计算

6.1 读文件

格式:read()
注意:每次读取读取指针会从上一次继续往后走,文件使用完必须关闭

read() # 一口气读到末尾
read(size) # 读取指定长度字符数,大于文件字符数或者小于0则直接读完(内存占用过大)

注意:不要一次将文件读完,这样内存有可能爆掉,建议一次读取小于默认缓冲区大小

# 默认缓冲区大小
import io
io.DEFAULT_BUFFER_SIZE # 8192

格式:readline()
读取一行数据

readline() # 读取一行
readline(size) # 读取一行中的指定字符数,大于改行长度或者小于0则直接读完该行

格式:readlines()
读取多行数据

readlines() # 读取到文件末尾,返回值为[]
readlines(size) # 从当前读取到指定字符数的行的行尾,大于剩余长度或小于0直接读完文件

6.2 写文件

格式:write(内容)
注意:会先将指定字符串写入缓存,调用flush或关闭文件或超过缓存上限才会真的写入文件

格式:writelines([内容,内容])
将一个内容序列写入文件

6.3 关闭文件

文件对象会占用操作系统资源,且操作系统某一时刻打开的文件上线是有限的

一般用try或者with来保证close文件方法总能被调用

file = open('a.txt','w')
try:
	file.write('hello')
finally:
	file.close()

with open('a.txt','a') as file:
	file.write('pp')

6.4 文件指针

读写文件时文件指针会随之移动,追加方式打开,文件指针指向结尾位置,其他方式打开是起始位置。

获取文件指针的当前位置:tell()

with open('a.txt','a') as file:
	print(file.tell()) # 19
with open('a.txt','w') as file:
	print(file.tell()) # 0

手动移动文件指针:seek(offset[,whence]),offset为偏移量,可为负数,whence为相对偏移位置:os.SEEK_SET:起始位置,值0,默认
os.SEEK_CUR:当前位置,值1
os.SEEK_END:结尾位置,值2
只有以二进制方式打开才支持三种,否则仅支持第一种

7 函数和lambda表达式

函数也是对象,可以被赋值给其他对象

def add(x,y):
	return x+y
a = add
a(1,2)

作为参数传递

def run(add_func,y)
	return add_func(1,y)
def add(x,y):
	return x+y
run(add,2)

作为返回值传递

def run(num):
	a = num
	def add(x,y):
		return x+y+a
	return add

run(3)(1,2)

7.1 lambda

格式:lambda [参数]: 表达式

def add(x,y):
	return x+y

func = lambda x, y: x + y
func(1,2)

7.2 偏函数

用于简化函数调用,转换后的函数称为转换前函数的偏函数,简单来说,偏函数相当于将原来的函数在调用前传参时包了一层

格式:partial(函数,参数1,参数2,...),partial(func,*args,**kwargs)

def add(x, y=1, z=0):
    print("x =",x,", y =",y,", z =",z)

# 手动包一层
def add2(a):
    return add(2, a)
add2(3)

# 自动包一层
from functools import partial
add3 = partial(add, 87)  # 第一个参数为需要转换的函数,第二个参数:入参(从开头算起)
add3(z=3)
add3(3)
add3(y=3)

#### 结果
# x = 2 , y = 3 , z = 0
# x = 87 , y = 1 , z = 3
# x = 87 , y = 3 , z = 0
# x = 87 , y = 3 , z = 0

注意:在函数传参时,指定的参数必须位于不指定的参数后:(1,2,z=3),不能:(x=1,2,3)

def run(*args):
	s=0
	for n in args:
		s+=n
	return s
run2=partial(run,1,2)
print(run2(3,4,5))

注意:长度可变的形参定义方式:*args,长度可变的关键字参数定义方式:**args

7.3 可变参数和关键字参数一起使用

偏函数转换时:指定的参数是前面若干位置参数,调用转换后的函数传递参数是剩余的参数和关键字参数
情景1:
在这里插入图片描述
在这里插入图片描述
情景2:
在这里插入图片描述
在这里插入图片描述

7.4 闭包

函数返回值为一个定义在该函数中的函数,且这个内部函数引用了外部函数中的变量,这样就构成了一个闭包。

通常而言,函数调用结束,函数内的变量就自动弹栈不再可用,而对于闭包,被内函数引用的变量依然会继续保持在内存中,保存在内函数的特殊属性中:__closure__

def a():
    b=23
    bbb=[11]
    def c():
        # nonlocal bbb
        bbb[0] = bbb[0]+1
        return b,bbb,10
    return c
x=a()
print(x.__closure__[0].cell_contents) # 23
print(x.__closure__[1].cell_contents) # [11]

print(x()) # (23, [12], 10)

print(x.__closure__[0].cell_contents) # 23
print(x.__closure__[1].cell_contents) # [12]

注意:内函数无法对外函数中的变量做修改,但是变量是可变对象时可以改变(如列表中的值),否则任何的关于外部函数变量的赋值都是重新创建一个局部变量。如果在内部函数使用:nonlocal声明外部函数变量后,表示当前作用域使用的不是局部变量,则可以对外部函数变量修改,且该修改在下次调用同一个内部函数对象时是有效的!

8 变量作用域

作用域有4种:

  1. Local局部作用域:每次创建函数会创建一个局部作用域,变量作用范围限制在该函数范围中定义处到函数结束,结束时局部作用域中的变量被销毁
  2. Enclosing嵌套作用域:调用外函数时会创建一个嵌套作用域,在外函数中的变量作用范围同局部作用域一样,只不过被内函数引用形成闭包的那部分变量在外函数调用结束也不会被销毁
  3. Global全局作用域:每次运行模块时都会创建全局作用域,其中定义的变量为全局变量,作用范围为定义变量处到模块结束,程序结束,全局变量会被销毁。
  4. Built-in内置作用域:加载python解释器会自动加载内置模块创建内置作用域

在python中搜索作用域为当前作用域范围以及更大的范围,没搜索到抛出NameError,作用域搜索遵循就近原则

特别注意:在更小的作用于范围内使用更大范围的变量时,可以直接使用,但是如果涉及到赋值给更大范围变量时默认是创建局部同名变量(如果是可变对象,可以改变可变对象的值),如果需要赋值给更大范围变量需要使用global 变量进行声明

x=1
def a():
    global x
    x+=1
    print(x)

a()

注意:对于流程控制语句和异常处理语句不会创建作用域,其中创建的变量,在之后依然是可用的

8.1 locals && globals 内置函数

命名空间:不仅是变量也包括类和函数
locals():返回其所在局部作用域的命名空间
globals():返回其所在全局作用域的命名空间

注意:locals()返回的是值的拷贝,修改该值不会影响命名空间,而globals返回的是实际命名空间

8.2 vars([object])

如果不传参数相当于:locals()
传参数相当于:object.__dict__

9 函数装饰器

函数装饰器也是一个函数,格式:

def 装饰器(函数):
	def 内函数(*args, **kwargs):
		一系列的附加操作
		return xxx
	return 内函数

# 使用时:在函数上加@装饰器即可,此处相当于:add = 装饰器(add)
@装饰器
def add(x,y):
	return x+y

add(1,2) # 此时调用的是内函数,传入参数为1,2

示例:

def myDecorator(func):
    def wrapper(*args,**kwargs):
        print("函数%s被调用了" % func.__name__)
        print("入参为:%s %s" % args,kwargs)
        return func(*args,**kwargs)
    return wrapper
    
@myDecorator
def add(x,y):
    return x+y

print(add(1,2))

# 函数add被调用了
# 入参为:1 2 {}
# 3

问题:如果调用被装饰了的函数的__name__属性,返回的会是装饰器内函数,为了让其返回被装饰函数自己的函数名需要处理一下

# 在内函数上加装饰器:@functools.wraps(函数)

import functools
def 装饰器(函数):
	@functools.wraps(函数)
	def 内函数(*args, **kwargs):
		一系列的附加操作
		return xxx
	return 内函数

9.1 装饰器传参

如需传参需要在原无参装饰器外再套一层装饰器:

import functools
def 外装饰器(参数1,参数2):
	def 装饰器(函数):
		@functools.wraps(函数)
		def 内函数(*args, **kwargs):
			一系列的附加操作
			return xxx
		return 内函数
	return 装饰器

#对于被装饰函数myFunc来说:
@外装饰器(1,2)
def myFunc(x,y):
	pass

# 相当于:myFunc = 外装饰器(1,2)(myFunc(x,y))

# 调用
myFunc(1,2) # 相当于:myFunc = 外装饰器(1,2)(myFunc(1,2))
Python 进阶学习笔记之十二:数据压缩与归档 python 本身对场景的数据压缩算法提供支持,包括 zip、bz2等,也对文件压缩算法 tar 提供了单独的模块实现。 阅读详情

相关推荐

Python 进阶学习笔记

Python 进阶学习笔记 当年学了点Python2 ,那时候听说什么Python3 失去了Python的灵魂,就没管Python3 。 最近因为项目需要使用Python3,又把当年的那份热血花在了Python3的学习上。 本以为Python3只是Python2 的升级会很好上手,没想到Python3相对于Python2而言有太多的新语法、新概念。 从小养成学习记笔记的好习惯,把学习遇到的重点写下来,第一日后复习用,其次如果有其他同学看到我的笔记,并感觉有用,也是算是我劳动成果的附加收益吧 文章目录函数式编

weixin_54707168的博客 607

Python -- 关于self理解

如果不是编写程序的练习,如果不是一遍一遍的反复琢磨和查找资料,一个人根本不可能成长。 就像self,这个都说是孤独的小伙子。他的存在你说重要吗?重要把。你说不重要,也确实看着就烦。 为什么烦,因为他自身没有意义,就像写了个函数, def xxx(self): 不写self就报错,但是他放在那里又不明意义,是一个很奇奇怪怪的单词?? 要不是有这篇文章,我到现在都还是迷在self,这玩意有什...

Lkong一的资料军需库 763

libnice和coturn这两个库有交叉实现的地方,具体有啥区别?

TurnAdmin:是一个TURN的管理工具,此工具能被用来管理用户账号的增删改查。 TurnServer:是TURN和STUN的服务器实现。 Turnutils_uclient: 模拟多个UDP、TCP、TLS或DTLS客户端 Turnutils_peer: 一个简单的无状态UDP-ECHO服务器,用作中继模式中的最终服务器 Turnutils_stunclient: 一个简单的STUN客户端例子 Turnutils_rfc5769check: 检查STUN/TURN协议实现的正确性。 我们..

Langeldep的专栏 1318

python新手入门笔记(八)—— 面向对象

python新手入门笔记(九)—— 面向对象概念类和对象的概念及定义实例方法和属性 概念 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无须重复编写,仅调用函数即可。 面向对象:将数据与函数绑定到一起,进行封装,这样能更快地开发程序,减少重复代码的重写过程。 注:以上论述非定义,仅描述概念作用。 类和对象的概念及定义 类就是一个模板,可包含多个函数,函数里实现功能。 对象则是根据模板创建的实例,通过实例对象可以执行类中的函数。 object:基类 class Person:

weixin_43940444的博客 412

blender中合并的模型,在threejs中显示多个mesh;blender多材质烘培成一个材质

5、优化项(省略此步骤,直接进行步骤6),进入到视图着色方式(此时没有灯光,整体偏暗,如果不调整灯光,烘培出来的材质也偏暗,因此此步骤为优化项,通畅建议调整)。在右边栏进入世界环境,调整颜色。7、烘焙成功之后,新建一个材质,将第三步创建的纹理图像作为材质的纹理,连接到基础色,并把模型的材质改为此材质,其他的材质全部删除。2、处理uv,在侧边栏选择数据-uv贴图,选中使用的uv,进入编辑模式,全选,键盘u,选择智能uv投射。3、处理材质,在侧边栏选择材质,进入着色,在着色器编辑器新建一个图像纹理,新建图像。

AllBluefm的专栏 2529

【SerDes】美信GMSL2-CSI调试心得

美信GMSL2加解串器芯片家族广泛应用于车载和工业视觉系统。文章介绍了MAX96717/MAX96717F加串器和MAX96724/MAX96724R解串器的关键特性,包括支持MIPI CSI-2接口、6Gbps传输速率等功能。提供了基于高通平台的demo系统配置和调试步骤,重点阐述了Link Lock、PCLK检测和Video Lock等关键调试环节,并详细说明了像素模式,隧道模式的工作原理及寄存器配置示例。文中还包含通过I2C读写寄存器的具体操作指令,取流freeze可能原因和解决方法。

qq_38089448的博客 2488

python class 为啥一定要 self_Python为什么要self

接触Python以来,看到类里的函数要带个self参数,一直搞不懂啥麻子原因。晚上特别针对Python的self查了一下,理理。Python要self的理由Python的类的方法和普通的函数有一个很明显的区别,在类的方法必须有个额外的第一个参数 (self ),但在调用这个方法的时候不必为这个参数赋值 (显胜于隐 的引发)。Python的类的方法的这个特别的参数指代的是对象本身,而按照Python...

weixin_39907939的博客 1295

FDTD仿真实战:从材料导入到反射率曲线分析

本文提供了一份完整的FDTD仿真实战指南,详细讲解了从自定义材料(如WO3)数据导入、结构建模、仿真区域与网格设置,到光源与监视器配置、运行仿真并提取反射率数据的全流程。重点解决了材料库缺失、网格优化、边界条件设置等常见难题,旨在帮助研究人员高效、准确地通过FDTD仿真获取材料的关键光学特性——反射率曲线。

elastic6hunter的博客 341

读懂python中的self

神奇的self: 在Python类中规定,函数的第一个参数是实例对象本身,并且约定俗成,把其名字写为self。其作用相当于java中的this,表示当前类的对象,可以调用当前类中的属性和方法。 class是面向对象的设计思想,instance(也即是 object,对象)是根据 class 创建的 一个类(class)应该包含 数据 和 操作数据的方法,通俗来讲就是 属性 和 函数(即...

xrinosvip的博客 15万+

ue4 角色奔跑/冲刺/蹲下 /蹲走 动作切换蓝图

序列:文章分为4部分: 一、准备工作+简单的蓝图连线 二、编写“行走” 混合空间 三、编写“蹲下”混合空间 四、合成2个动画,设置动画蓝图 —————————————— 一、准备工作 下载“动画初学者包”,添加到项目! 主要文件: 打开BP_playerCharacter,组价——添加组件,找到“摄像机”,“机臂” 没有找到就去其他项目复制过来 ———————————— 手写人物的移动,也可以在...

凉城古梦猫扑街的博客 4862

48、住宅抵押贷款支持证券的定价、风险评估与结构化设计

本文深入探讨了住宅抵押贷款支持证券(RMBS)的定价、风险评估与结构化设计。内容涵盖提高定价准确性的方差缩减方法,如准蒙特卡罗序列的应用;分析RMBS面临的利率风险、信用风险和模型风险,并提出相应的度量与应对策略;介绍利用动态规划优化CMO分层结构以最大化发行利润的方法。同时总结了RMBS的基本类型、定价流程及市场发展趋势,为投资者和发行人提供全面的决策支持。

quiet的专栏 154

《Python进阶》学习笔记之Golang

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33725239的博客 74

TripoSR: Fast 3D Object Reconstruction from a Single Image 论文阅读

模型的主要参数,如变换器的层数、三平面的维度、NeRF模型的具体细节和主要训练配置,在表1中详细说明。TripoSR的算法流程结合了先进的数据处理、模型设计和训练技术,使其能够在不到0.5秒的时间内从单张图像中快速生成详细的3D网格。总体而言,TripoSR是一个强大的3D重建工具,它在速度和质量上都表现出色,但也需要考虑到其对计算资源的需求和在处理极端复杂场景时可能遇到的挑战。:通过精心策划的训练数据集和多样化的数据渲染技术,TripoSR提高了模型的泛化能力和对真实世界图像的适应性。

Christo的博客 1946

Python 进阶学习笔记之四:高效迭代器工具

Python 内置数学模块 Math 和 快捷迭代器工具模块 itertools

zombres的博客 479

uniapp [全端兼容] - 实现接入使用天地图及卫星视图切换功能,在国家天地图上自由切换地图显示类型(卫星视图/地形视图/卫星混合/地形混合/普通视图)天地图切换视图显示改成卫星风格,切换地图图层

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,天地图,视图,卫星,地图类型切换,uniAPP天地图,改成卫星视角,在线地图切换,来回切换卫星图,天地图如何实现来回切换卫星图,地形图,卫星视图,VUE3引入天地图卫星版,详细教程示例源码代码,天地图切换卫星用什么api,卫星视角API方法,vue3卫星天地图,能改地图的显示方式,vue3中使用天地图自定义样式切换地图图层,切换报错,加载出错,卫星图太卡,地图图层更换,vue3安装集成天地图详细示例源

🏆 前端领域优质创作者 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

python进阶之学习笔记_【原】Python学习笔记——进阶篇

python的高阶函数一个函数作为另外一个函数的参数、map()、reduce()、filter()、自定义排序函数、一个函数返回另外一个函数作为返回值闭包匿名函数装饰器 类似于java的aop1.利用Python的 *args 和 **kw,保证任意个数的参数总是能正常调用2.如果要让调用者看不出一个函数经过了@decorator的“改造”,就需要把原函数的一些属性复制到新函数中,Python内...

weixin_34450092的博客 221

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Python 进阶学习笔记之一:内置常用类型及方法

进阶学习 Python 内置常用功能函数、类以及模块

zombres的博客 566

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Python进阶学习笔记(一)

Python进阶学习笔记(一)一、函数式编程 函数式编程是一种抽象计算的编程模式。 1. 函数式编程的特点 1.1 把计算视为函数,而非指令; 1.2 纯函数式编程:不需要变量,没有副作用,测试简单; 1.3 支持高阶函数,代码简洁。 2. Python支持的函数式编程 2.1 不是纯函数式编程:允许有变量; 2.2 支持高阶函数:函数可作为变量传入; 2.3 支

KevinLxy的博客 1053

python进阶之学习笔记_Python学习笔记_进阶篇

之前总结了Python的基本元素,容器,控制流,接下来总结Python的盒子。一、函数1. 函数的格式:def 函数名(参数): #参数可有可无函数体解决之前心中的疑惑:为何函数中的参数可以不赋值,就是一个单独的变量名。因为函数在调用的时候会有一个调用语句,这个时候才会传递一个数值给函数中的变量。def greet_user(username):'''显示简单的问候语''' #文档字符串:描述函数...

weixin_39856607的博客 177

Python学习笔记 (从入门到进阶)

这是我自己学习Python时所记录的一些学习笔记。之前也看过不少的书,课坚持下去的那本是趣味编程100例,一个老外写的,真心的很棒。之后我要把从入门到实践啃了一遍,算是把知识点好好的整理了一下吧 Python学习笔记第一部分:基础知识一、基础数据类型二、Python的I/O(输入输出)以及强制类型转换三、变量与运算符四、选择判断结构五、数据结构(1)—元组六、数据结构(2)—列表七、数据结构(...

欢迎来到Gorit的博客 4954

Python 进阶学习笔记之八:面向对象高级编程

Python 支持的面向对象有其独有的一些特点,除了常规的继承和多态特性外,其支持动态绑定属性的特性也很有用处。

zombres的博客 517

python进阶之学习笔记_Python进阶学习笔记

第1章课程介绍Python入门中我们学习了:如何安装Python环境变量和数据类型:Python内置的基本类型List列表和Tuple元组:顺序的集合类型条件判断和循环:控制程序流程函数:定义和调用函数切片:如何对list进行切片迭代:如何用for循环迭代集合类型列表生成式:如何快速生成列表Python进阶课程我们讲要学习:函数式编程:不是函数编程哦,是函数式编程模块:如何使用模块面向对象编程:面...

weixin_28787725的博客 294

python进阶学习笔记

      本文主要介绍了在python的进阶学习过程中一些主要需要掌握的知识。所谓语言都是相通的,python中的很多思想,java语言中也同样支持。相比于java这种静态语言,python是一种动态语言,它的编码速度快,并且更容易适应不同的运行环境。动态语言和静态语言的区别之后再做讨论,这里先继续学习python的相关知识。    Python支持的函数式编程:        不是纯函数式编程...

Messi-Q Blog 888

Python 进阶学习笔记之三:常用数据类型(下)

Python 进阶系列文章,展示常用数据类型的用法

zombres的博客 488

Python进阶篇(下) 学习笔记

创建模块( myCustomUtils.py )# 自定义模块 myCustomUtils.py# 定义变量# 定义函数"""两数相加"""# 定义类导入模块并且使用#导入整个模块(同目录下)# 使用print(myCustomUtils.VERSION) # 调用属性,输出:1.0print(myCustomUtils.add(1,2)) # 调用函数,输出:3cal = myCustomUtils.Calculator() #实例化对象。

qq_64851111的博客 733

python开发学习笔记(二)——python语言进阶知识总览

想开个学习笔记系列,就是拉一遍python开发知识,希望可以涵盖编程基础、python基础、数据分析、web框架等。 本笔记系列由视频跟学目录1.函数及变量(1).传参可变与不可变的区别(2)fun(*args,**kwargs)(3)变量作用域(4)全局变量2.lambda表达式3.内置函数4.类与变量(1)类变量与成员变量(2)类的继承(3)多重继承(4)类中属性和方法的权限(5)魔术方法(6)类属性描述符(属性描述器)5.装饰器(1)装饰器四种应用场景应用示例A.函数装饰器装饰函数B.函数装饰器装饰类

Alannah的个人学习记录 982
上一篇: Python学习笔记——基础
下一篇: React之Component和PureComponent区别
天落枫
博客等级 码龄10年 91粉丝 92原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值