这是目录
1 Typing
模块作用:
- 类型检查,防止运行时出现参数和返回值类型不符合。
- 作为开发文档附加说明,方便使用者调用时传入和返回参数类型。
- 该模块加入后并不会影响程序的运行,不会报正式的错误,只有提醒。
使用说明
- 在传入参数时通过“参数名:类型”的形式声明参数的类型;
- 返回结果通过"-> 结果类型"的形式声明结果的类型。
- 在调用的时候如果参数的类型不正确pycharm会有提醒,但不会影响程序的运行。
- 对于如list列表等,还可以规定得更加具体一些,如:“-> List[str]”,规定返回的是列表,并且元素是字符串。
typing常用的类型:
- int,long,float: 整型,长整形,浮点型;
- bool,str: 布尔型,字符串类型;
- List, Tuple, Dict, Set:列表,元组,字典, 集合;
- Iterable,Iterator:可迭代类型,迭代器类型;
- Generator:生成器类型
2 元组
- Python的元组与列表类似,不同之处在于元组的元素不能修改(增删改)。
- 元组创建在括号中添加元素,并使用逗号隔开。元组中只包含一个元素时,元素后面逗号不可省略
- 元组与字符串类似,下标索引从0开始,可以进行截取,组合等。
- 元组可以使用下标索引来访问元组中的值。
- 元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组
- 元组中的元素值是不允许修改的,但我们可以对元组进行连接组合
- 与字符串一样,元组之间可以使用 + 号和 * 号进行运算。这就意味着他们可以组合和复制,运算后会生成一个新的元组。
3 集合
- 集合(set)是一个无序的不重复元素序列。不支持索引
- 集合元素不可为可变类型
- 可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
- 无序性,互异性,确定性
- 集合本身可变,可以添加或删除其中元素
- 添加方法:
s.add( x )添加单个,如果元素已存在,则不进行任何操作。
s.update( x )x 可以有多个,用逗号分开。且参数可以是列表,元组,字典等 - 移除元素:
s.remove( x )将元素 x 从集合 s 中移除,如果元素不存在,则会发生错误。
s.discard( x )且如果元素不存在,不会发生错误。保持不变
s.pop() 对集合进行无序的排列,然后将这个无序排列集合的左面第一个元素进行删除。
s.clear()清空集合 s。 - 其他方法见菜鸟教程链接
- frozenset() 返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。
- class frozenset([iterable]) iterable – 可迭代的对象,比如列表、字典、元组等等。
4 字典
菜鸟教程
字典是另一种可变容器模型,且可存储任意类型对象。
- 值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。
- 字典值可以是任何的 python 对象,既可以是标准的对象,也可以是用户定义的,但键不行。
- 不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住,
- 键必须不可变,所以可以用数字,字符串或元组充当,而用列表就不行
- 访问字典里的值:把相应的键放入到方括号中
- 如果用字典里没有的键访问数据,会输出错误
- Python3 字典有序,所以可以按照键/值排序
- 删除:
del dict[‘Name’] # 删除键 ‘Name’
dict.clear() # 清空字典
del dict # 删除字典 - 方法:具体看菜鸟教程
len(dict);str(dict)输出字典,以可打印的字符串表示;radiansdict.copy()返回一个字典的浅复制
radiansdict.fromkeys()创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值。他会把整个字典给覆盖,所以不能用作修改。
radiansdict.get(key, default=None)返回指定键的值,如果值不在字典中返回default值
radiansdict.values()返回一个迭代器,可以使用 list() 来转换为列表
radiansdict.keys()返回一个迭代器,可以使用 list() 来转换为列表
radiansdict.items()以列表返回可遍历的(键, 值) 元组数组
5 ZIP()函数
- zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
- 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
- Python3 zip() 返回的是一个对象,需手动list
6 Map()函数
- map() 会根据提供的函数对指定序列做映射。
- 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
- map(function, iterable, …)
- Python 3.x 返回迭代器。
7 List sort()函数
- sort() 函数用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数。
- list.sort( key=None, reverse=False)
- key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
- reverse – 排序规则,reverse = True 降序, reverse = False 升序(默认)。
- 该方法没有返回值,但是会对列表的对象进行排序。
8 sorted()
- sorted(iterable[, cmp[, key[, reverse]]])
- sorted():该函数第一个参数iterable为任意可以迭代的对象,cmp是比较函数,通常为lambda函数,key是用于比较的关键字,reverse表示排序结果是否反转。
- sorted()可以应用于任意的可以迭代的对象,所以应用范围比L.sort() 广泛的多,可以应用于字符串,元组,列表,字典等可迭代对象。
- 该函数会返回一个排序后的列表,原有可迭代对象保持不变,这与 L.sort() 函数不同。
- 有的排序可能需要根据两个关键字,设置 key 时指定多个属性即可:
- 两个函数通过定义 key 和 cmp 都可以完成排序,但是 key 的效率要远远高于 cmp,所以要优先使用 key 。
9 ""和’'在表示字符串是没有区别
10 Counter
- Counter 集成于 dict 类,因此也可以使用字典的方法,此类返回一个以元素为 key 、元素个数为 value 的 Counter 对象集合。
- from collections import Counter
- 方法:
elements()返回一个迭代器
most_common(n)返回数量最多的前 n 个元素
subtract([iterable-or-mapping])相当于减法,调用这个方法的 Counter 会被覆盖掉 - 当需要对 list 中的大量数据进行计数时,可以直接使用 Counter ,而不用新建字典来计数
Counter间数学操作
- c.values()
- sum(c.values()) 返回value列表 再求和
- c.keys()
- c.clear() 清空
- list© 返回key值
- set© 返回key值
- dict©
- c.items() 转换为(元素,值)组成的列表
- c += Counter() 可以将负数和0的值对应的key项去掉
- c + d : Counter相加,相同key的value相加
- c - d : Counter相减,相同key的value相减,只保留正值
- c & d :交,取两者都有的key value中最小的
- c | d:并,汇集所有的key value ,key相同取大value
11 collections.defaultdict
- defaultdict是Python内建dict类的一个子类,第一个参数为default_factory属性提供初始值,默认为None。
- 它的其他功能与dict相同,但会为一个不存在的键提供默认值,从而避免KeyError异常。
- 类型名称作为初始化函数参数,list:[] str:"" set:set() int:0
- 可调用函数作为初始化函数参数
12 直接赋值,深浅拷贝
- 直接赋值:其实就是对象的引用(别名)。
b = a: 赋值引用,a 和 b 都指向同一个对象。 - 浅拷贝(copy):
拷贝父对象,不会拷贝对象的内部的子对象。
b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。 - 深拷贝(deepcopy):
copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。
13 format函数
- str.format()
- 基本语法是通过 {} 和 : 来代替以前的 % 。"{0} {1}".format(“hello”, “world”)
- format 函数可以接受不限个参数,位置可以不按顺序。
- 可以设置参数:print(“网站名:{name}, 地址 {url}”.format(name=“菜鸟教程”, url=“www.runoob.com”))
- 可以向 str.format() 传入对象:
- 数字格式化
14 bisect模块
- import bisect
- 二分查找或插入
- 使用这个模块的函数前先确保操作的列表是已排序的
- 待插入的数据必须是int类型
- 不要将数据插入列表,只需要返回数据在有序列表中的位置
bisect.bisect(a, x, lo=0, hi=len(a)) # bisect是bisect_right的别名
bisect.bisect_right(a, x, lo=0, hi=len(a)) 若有相同元素插入相同元素右边index
bisect.bisect_left(a, x, lo=0, hi=len(a)) 若有相同元素插入相同元素左边index - 将数据插入有序列表并保持列表有序性
bisect.insort_left(a, x, lo=0, hi=len(a)) 将x插入到a中,并保持a的有序性。如果遇到x与a中元素相等的情况,将x插入到相等元素的左侧。
bisect.insort_right(a, x, lo=0, hi=len(a)) 唯一的区别在于如果遇到x与a中元素相等的情况,将x插入到相等元素的右侧
bisect.insort(a, x, lo=0, hi=len(a))
15 字典序
- 字典序,就是按照字典中出现的先后顺序进行排序。
- ‘0’ < ‘1’ < ‘2’ < … < ‘9’ < ‘a’ < ‘b’ < … < ‘z’
- 在计算机中,两个字符串比较大小,是按照从左到右的顺序进行比较,如果第1位相等,就比较第2位,直至有一位可以比较出大小来,则不再继续比较
16 List
- python有6个序列的内置类型,即列表,元组,字符串,Unicode字符串,buffer对象,xrange对象
- 序列都可以进行的操作包括索引,切片,加,乘,检查成员。
- Python已经内置确定序列的长度以及确定最大和最小的元素的方法。len(list) max(list) min(list)
- 列表的数据项不需要具有相同的类型
- 与字符串的索引一样,列表索引从0开始。列表可以进行截取、组合等。
- 列表对 + 和 * 的操作符与字符串相似。+ 号用于组合列表,* 号用于重复列表。
- cmp(list1, list2) python3.0,没有了
- list.append(obj) 在列表末尾添加新的对象
- list.count(obj) 统计某个元素在列表中出现的次数
- list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
- list.index(obj) 从列表中找出某个值第一个匹配项的索引位置
- list.insert(index, obj) 将对象插入列表
- list.pop([index=-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
- list.remove(obj) 移除列表中某个值的第一个匹配项
- list.reverse() 反向列表中元素
- list.sort(cmp=None, key=None, reverse=False) 对原列表进行排序
17 Python pass 语句
Python pass 是空语句,是为了保持程序结构的完整性。
pass 不做任何事情,一般用做占位语句
18 Python 面向对象
面向对象的一些基本特征:
- 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
- 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。他的值在这个类的所有实例之间共享,可以在内部类或者外部类访问。
- 数据成员:类变量或者实例变量, 用于处理类及其实例对象的相关的数据。
- 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
- 局部变量:定义在方法中的变量,只作用于当前实例的类。
- 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
- 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
- 实例化:创建一个类的实例,类的具体对象。
- 方法:类中定义的函数。
- 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
- 使用 class 语句来创建一个新类,class 之后为类的名称并以冒号结尾:
- _init_()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法
- self
- 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。
- self代表类的实例,而非类。类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。
- self 代表的是类的实例,代表当前对象的地址,而 self._class_ 则指向类。
- self 不是 python 关键字,换成什么都可以
- 实例化:通过类的名称 来实例化,并通过 _init_ 方法接收参数。
- 类属性:
- 可以使用点号 . 来访问对象的属性。
- 添加,删除,修改类的属性
- getattr(obj, name[, default]) : 访问对象的属性。
- hasattr(obj,name) : 检查是否存在一个属性。
- setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性。
- delattr(obj, name) : 删除属性。
- 内置类属性
- _dict_ : 类的属性(包含一个字典,由类的数据属性组成)
- _doc_ :类的文档字符串
- _name_: 类名
- _module_: 类定义所在的模块(类的全名是’_main_.className’,如果类位于一个导入模块mymod中,那么className._module_ 等于 mymod)
- _bases_ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)
- python对象销毁(垃圾回收)
- Python 使用了引用计数这一简单技术来跟踪和回收垃圾。一个内部跟踪变量,称为一个引用计数器。
- 回收不是"立即"的, 由解释器在适当的时机,将垃圾对象占用的内存空间回收。
- 垃圾回收机制不仅针对引用计数为0的对象,同样也可以处理循环引用的情况。循环引用指的是,两个对象相互引用,但是没有其他变量引用他们。
- 垃圾收集器也会留心被分配的总量很大(及未通过引用计数销毁的那些)的对象。 在这种情况下, 解释器会暂停下来, 试图清理所有未引用的循环。
- 析构函数 _del_ ,__del__在对象销毁的时候被调用,当对象不再被使用时,__del__方法运行
- 通常你需要在单独的文件中定义一个类,
- 类的继承:
- 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。
- 通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类。
- _init_:
- 如果在子类中需要父类的构造方法就需要显式的调用父类的构造方法,或者不重写父类的构造方法
- 子类不重写 _init_,实例化子类时,会自动调用父类定义的 _init_。
- 如果重写了__init__ 时,要继承父类的构造方法,可以使用 super 关键字:
- super(子类,self).init(参数1,参数2,…)
- 父类名称.init(self,参数1,参数2,…)
- 在调用基类的方法时,需要加上基类的类名前缀,且需要带上 self 参数变量。区别在于类中调用普通函数时并不需要带上 self 参数
- Python 总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。
- 如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。
- issubclass() - 布尔函数判断一个类是另一个类的子类或者子孙类,语法:issubclass(sub,sup)
- isinstance(obj, Class) 布尔函数如果obj是Class类的实例对象或者是一个Class子类的实例对象则返回true。
- 方法重写:如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法
- 基础重载方法:
- _init_ ( self [,args…] ) 构造函数 obj = className(args)
- _del_( self ) 析构方法, 删除一个对象 调用方法 : del obj
- _repr_( self ) 转化为供解释器读取的形式 调用方法 : repr(obj)
- _str_( self ) 用于将值转化为适于人阅读的形式 调用方法 : str(obj)
- _cmp_ ( self, x ) 对象比较 调用方法 : cmp(obj, x)
- Python同样支持运算符重载
- 类属性与方法
- 类的私有属性__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
- 类的方法:在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数
- __private_method:两个下划线开头,声明该方法为私有方法,不能在类的外部调用。在类的内部调用 self.__private_methods
- Python不允许实例化的类访问私有数据,但你可以使用 object._className__attrName( 对象名._类名__私有属性名 )访问属性
- 当使用print输出对象的时候,只要自己定义了_str_(self)方法,那么就会打印从这个方法中return的数据。
单下划线、双下划线、头尾双下划线说明:
- _foo_: 定义的是特殊方法,一般是系统定义名字 ,类似 _init_() 之类的。
- _foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
- __foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。
19 python object
- object是python的默认类,有很多的方法,python种默认的list,str,dict等等都是继承了object类的方法
- 在python3种默认都是新式类,也即是所有的自定义类,基类都会继承object类
- 所以对于一些内置的方法会写在object类中,如果子类不定义,在调用的时候最终会调用object类中的方法
- 如果多个父类中有相同的方法名,默认调用括号最前边的类
多态
多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。
好处:
- 增加了程序的灵活性
以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal) - 增加了程序额可扩展性
通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用
20 input print
print 更详细连接 菜鸟教程
- print 在 Python3.x 是一个函数,但在 Python2.x 版本不是一个函数,只是一个关键字。
- print(*objects, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False)
- objects – 复数,表示可以一次输出多个对象。输出多个对象时,需要用 , 分隔。
sep – 用来间隔多个对象,默认值是一个空格。
end – 用来设定以什么结尾。默认值是换行符 \n,我们可以换成其他字符串。
file – 要写入的文件对象。
flush – 输出是否被缓存通常决定于 file,但如果 flush 关键字参数为 True,流会被强制刷新。
input
- Python3.x 中 input() 函数接受一个标准输入数据,返回为 string 类型。
- input([prompt]) prompt: 提示信息