python相关遗漏知识点补充
python中的相关帮助命令
假设s是一个字符串,
那么dir(s)可以列出字符串对象的所有属性(方法也是函数属性),其中有下划线的部分与类重 载有关,用来表示python实现细节,没有下划线的属性是对象可以调用的方法。查询具体的函数用法可以使用help(s.replace)的方式
文档字符串:module.class.method._doc__可以查看模块的文档注释,自己敲代码的时候也可以如此编写可查看的注释文档。当然也可以使用help方法。
字符串相关:
1,python中字符串可以进行逆向索引,相乘表示重复
2,可作用于多种类型的通用型操作都是以内置函数或表达式的形式出现的【例如,len(x),x【0】】;但是类型特定的操作是以方法调用的形式出现的。如s.upper()
3,python中字符串可以用单引号或者双引号包括,也允许在三个引号中包括多行字符串常量,采用这种方式的时候,所有行合并在一起,并在每一行的末尾加上换行符。
三个引号还可以用来构成python的文档字符串。
4,空白行在模块中被忽略,然而在交互模式下是结束标志。
4,字符串的模式匹配大多在re库中,可以进行正则匹配,查找等。
5,r用来路径中取消转义。
6,将列表转换为字符串的方法:''.join(l)
python比较
“==”测试值的相等性,
is 测试对象的一致性
python中真和假的比较
python中将0是做为假,并且也把任意的空数据结构视为假,任何非空数据结构视为真
python中的集合类型(set)
和元祖一样,集合是唯一的、不可变的对象的一个无序集合,集合从外观上看起来就像是无值的字典,集合的项是无序的,唯一的,不可变的,因此,它们的行为和字典的键很像。
1,字典可以视作键值的列表进行迭代 2,表达式可以用括号括起来(4),如果想建立单元素的元祖使用(4,) 3,文件最好的读取方法是使用迭代器,这种方式容易编写,并且对内存使用很好,而且较快。 4,文件读取的内容是字符串,而不是对象。 6,交互方式的回显能够显示给胡正确的字节内容,然而print语句则会解释内嵌行终止符来给予用户满意的结果。(一个使用repr实现,一个使用str实现) 7,eval能把字符串当作可执行代码进行处理 8,pickle模块能够直接在文件中存储几乎任何python对象的高级工具,不要求把字符串转换来转换去。
shelve则可以实现键值:对象的存储。 9,赋值生成的是引用,而不是拷贝,此时考虑使用分片
10,map()能将对应函数作用于参数
11,不要指望在远处修改对象的函数会返回结果
list.sort();list().append()返回的对象都是None
python中实现循环迭代:
在python中实现循环迭代的方法从优到劣依次是:
列表解析>for(c实现)>while(python字节码实现)
可迭代对象:一代实现迭代协议,具有__next__方法的都可以认为是可迭代的,并且通过捕捉stopIteration异常来确定何时离开。
文件本身就是自己的迭代器,而列表以及其他的内置对象,则需要启用iter来启动迭代。迭代对象可通过next()来读取下一个值。
列表解析和for循环不同之处在于,前者产生一个新的列表对象。
sorted返回一个新的排序后的列表,而sort则是进行原地排序。
1,range返回一系列连续增加(当然也可以减少的数)
x='adjsdojfoeoi' for i in range(0,len(x),2): print(x[i],end=' ') print() 等价于 for c in x[::2]: print(c,end=' ')
2,zip用于实现并行遍历
keys=['key1','key2','key3'] values=['val1','val2','val3'] l=list(zip(keys,values)) print(l) dic=dict(zip(keys,values)) print(dic) 等价于: dic={} for (k,v) in zip(keys,values): dic[k]=v print(dic)
3,enumerate产生偏移和元素
s=[0,1,2,3] s='sdfkweoo' for (offset,item) in enumerate(s): print('offset:'+str(offset)+',item:'+str(item))
4,map把一个函数调用应用到传入的可迭代对象的每一项:list(map(str.upper,open('script.py')))
在python3.0中,zip,map,filter,reduce,字典的keys,values等返回可迭代的对象,而不是内存中的一个结果列表(在for循环中可以直接使用),如果需要这么一个列表,需要使用list(range(。。。))来产生一个真正的列表对象。
range对象可以支持多个迭代器,每一个迭代器能够记住自己的位置,而其他的zip,file类型,map,filter不支持多个活跃的迭代器。
python中变量的作用域问题
和其他语言的作用域类似
LEGB原则:首先是本地,之后是函数内(如果有的话),之后全局,最后的python的内置变量。
全局变量:
(1)位于模块内部的顶层的文件名
(2)global:全局变量如果是在函数内部被赋值的话,必须通过声明。
(3)nonlocal:只能应用于一个嵌套的函数的作用域中的一个名称,而不是def之外的全局模块作用域。
函数参数
函数可以返回多个值,如果封装为元组,那么圆括号是可选的。、
*/**在函数定义的头部意味着收集任意数量的参数,**允许将关键字参数转换为字典。然而作为函数调用时,代表解包任意数量的参数。
关键字参数:出现在参数*args之后,所有这些参数都必须在调用中使用关键字语法来传递。
yield
生成器函数;生成器yields一个值,而不是返回一个值,yield语句挂起该函数并向调用者发送回一个值,但是,保留足够的状态以使得函数能够从它离开的地方继续。
生成器表达式,就像一般的列表解析一样,但是它们是括在圆括号而不是方括号里面的。
python模块儿相关话题
1,和导入相关的语句有:
import、import...from...、reload
2,_x在变量名前面加下划线,可以防止客户端使用from * 语句导入模块儿名时,将其中的变量名复制出去。有时候程序员对于不想用作其他用途的方法也添加一个下划线来减少命名冲突的可能性。
也可以在模块顶层将变量名的字符串变量赋给变量__all__
两种管理恰好相反,__all__是指出要复制的变量名,_x是指出不被复制的变量名。python模块会先寻找模块中的__all__列表,如果没有定义的话,from * 就会复制开头没有下划线的那些变量。
__name__每个模块都有一个__name__属性,如果文件是以顶层程序文件启动时,__name__就会设置为字符串“__name__“,如果仅是文件被导入,__name__就会改为客户端所了解的模块名。
这一点在测试的时候很有用。
python的类:
python中的类中__()__的属性和运算符重载有关,因为python的运算符重载是提供特殊命名的方法来拦截运算,python语言提每种运算和特殊命名的方法之间,定义了固定的映射方法。
例如+对应__add__;打印对应__str__;几乎每个实际的类都会重载的方法是:__init__
对于python中的方法:
客户端调用的instance.method(args...)会被系统自动转换为如下的等价形式:class.method(instance,args...)
和类自省相关的方法:
instance.__class__提供了一个从实例到创建它的类的链接
反过来__name__,以及__bases__提供了超类的访问
内置的object.__dict__提供了一个字典能够呈现类的所有属性
@abstractmethod用于声明一个抽象方法(元类声明)。带有抽象方法的类是不能够继承的。
__dict__属性详细解释
模块的命名空间实际上是通过字典的形式实现的,并且可以通过内置属性__dict__显示这一点,属性点号运算实际上就是字典的索引运算,属性继承实际上就是搜索链接的字典而已。
>>> class super: def hello(self): self.data='spam' >>> class sub(super): def hola(self): self.data2='eggs'
x.__class__ <class '__main__.sub'> >>> x.__base__ Traceback (most recent call last): File "<pyshell#17>", line 1, in <module> x.__base__ AttributeError: 'sub' object has no attribute '__base__' >>> sub.__bases__ (<class '__main__.super'>,) >>> super.__class__ <class 'type'>
>>> y=sub() >>> x.hello() >>> x.__dict__ {'data': 'spam'} >>> x.__dict__['data'] 'spam' >>> x.hola() >>> x.__dict__ {'data': 'spam', 'data2': 'eggs'} >>> sub.__dict__.keys() dict_keys(['__module__', 'hola', '__doc__'])
可见,每一个实例都有独立的命名空间字典,一开始是空的,随着调用和复制而进行增添。
属性其实是python的字典键,所有其实有两种方法可以进读取,通过点号运算和键的索引运算。
dir(className)将显示所有类的方法和系统属性
dir(object)将显示所有实例的方法,属性和系统属性
object__dict__.keys()显示对象的属性(无方法、以及系统属性)
其他属性:
__name__用来显示当前运行的类的名称,如果是顶层文件调用,那么显示main
__bases__用来显示超类的名称
__doc__是注释功能,可视化的文档字符串