Python基础类型:
- Tuple元组,内容不可改变,但是允许元素内部存在list等类型的元素,并且允许改变列表的值,所谓内容不可变指的是在内存中指向的地址是不变的。
temp=(1,2,[3,4]) temp[-1].append(5). 此时的temp的值为(1,2,[3,4,5]).
在创建单元素的Tuple时,在初始化的时候一定要在元素的后面加上"," (temp=(1,)) 否则temp的类型为int 而不是tuple
Set集合,元素中不允许存在重复元素,通过Add方法添加重复元素也不会报错,元素中不允许存在list等类型的元素,集合内的元素不存在特定顺序,所以无法按照索引的方式读取。
Dict字典,字典的键-值对中键是不可以重复且无序,遍历字典存在方法items() 获取键-值对形成的元组list,keys() 获取由字典中所有的键组成的list,values() 获取由字典中的值组成的list,
iteritems()
字典对象本身提供的迭代方法,免去了转化为list的过程,更省内存。List列表,这里主要记录下列表的迭代方法,要是在一次迭代中既获取list的索引,还可以获取list的值,可以使用
enumerate()
先将list元素和索引转换为元组列表[(index,item)]。
Python函数
函数通过Def定义,函数的参数可以是函数的签名,变量也可以指向函数,接收函数为参数的函数称之为高阶函数。
内置函数map() 实现对可迭代对象进行进一步处理。filter()实现对可迭代对象按条件过滤结果,zip()函数实现对2个可迭代对象进行压缩为一个元组列表。以上方法在对于遍历元素时可以帮助简化代码及方便对可迭代对象的处理。
闭包是在内层函数引用了外层函数的变量并返回内部函数,实现对函数内部状态的封装,有点像类。
Python装饰器实际就是一个高级函数,以函数为参数返回一个新的函数。在某些场景下类似于AOP,需要在函数的上方指定装饰器。函数的参数必须和装饰器最内层函数个数一致或者使用可变参数(args,*kw)。
例如要实现对被调用函数的日志记载,就可以使用装饰器实现。对于要实现带参数的装饰器也很简单,在最外层再嵌套一次函数即可实现。
def log(type):
def returnFunc(func):
def internelFunc(a,b):
print type
func(a,b)
return internelFunc
return returnFunc
@log("INFO")
def testA(a,b):
print a + b
testA(1,2) # INFO \n 3
被装饰的函数,访问函数
__name__
和__doc__
属性返回的装饰器最内层函数对应的值,要想不被发现采用了装饰器,可以最内层函数签名的上方使用@functools.wraps(func)
实现对func函数的上述属性复制到最内层函数上。偏函数通过使用
@functools.partial
来实现把一个多参数函数,通过设置默认值转化为一个少参数的新函数. 个人认为用处不大,对于常用的函数直接封装为一个函数给定默认值即可。
testB=functools.partial(testA,a=2). testB(b=2)
Python模块
Python模块包实际就是文件夹,但是需要在文件夹的内部存在一个init.py文件,这是规定,否则不会认为是一个包,在引用多级包时通过“.”来分割(
包1.包2.包3
)-
在Python的旧版中要测试新版本的功能,可以在旧版中使用
from __future__ import division
例如在python2.7中 10/3 结果是 3,但是引入上述包之后,10/3 结果是 3.33333 这是在新版中才有的特性
某些模块存在C语言编译的版本(例如:cStingIO等),在进行包导入操作时,应该先检查是否存在对应的C语言编译版本,这样可以提升Python文件的执行速度。Python是动态语言,解释执行代码运行速度慢。
Python面向对象
类中定义私有方法在方法的前面加上
2个“_”
即可实现, 只在类内可以访问。类的静态方法和静态变量都是可以通过类的实例访问的,类方法需要在方法上方添加装饰器
@classmethod
,当类实例对类变量进行动态赋值时,对类变量并不会有任何影响,只不过是给实例本身添加一个同名的属性。对类实例中的某个属性赋值时需要进行检验有效性,在C#中常用的方法是定义一个私有字段,然后定义get和set属性,通过set属性进行有效性检验,在Python也可以这么实现,但是在Python内部提供可一个装饰器
@property
可以简化实现
class A:
def __init__(self):
self.__age=20
@property
def age(self):
return self.__age
@age.setter
def age(self,age):
#校验有效性
self.__age=age
a=A()
a.age=15
类继承优先级别为从右向左,子类调用父类的方法或者是给父类进行赋值操作,只需要使用
super(子类名,self). 方法或属性
即可。但是父类一定要继承object
,否则就会报错。类中还有一个默认的特殊方法或属性,我们在使用时默认调用,可以通过
dir()
方法查看,例如我们在实例化类的时候,类会自动调用__init__()
方法。在调用len()
方法时,会调用__len__()
方法。对动态属性的限制时会调用__slots__
属性等。如果有特殊需要可以使用这些方法来实现自定义操作。
对于要使用某些语法糖,需要实现某些特殊的方法,例如想使用 with
语法糖,就必须实现__enter__()
和__exit__()
方法。
以上是在学习Python中总结的一些和其他语言不大一样的地方,以C#为例。