python知识点杂记2
1、 如果已经有一个list或者tuple,要调用一个可变参数怎么办?
2、 >>> nums = [1, 2, 3]
3、 >>> calc(*nums)
4、 14
*nums表示把nums这个list的所有元素作为可变参数传进去
5、 关键字参数:def person(name, age, **kw):
6、 >>> extra = {'city': 'Beijing', 'job': 'Engineer'}
7、 >>> person('Jack', 24, **extra)
**extra表示把extra这个dict的所有key-value用关键字参数传入到函数的**kw参数,kw将获得一个dict,注意kw获得的dict是extra的一份拷贝,对kw的改动不会影响到函数外的extra
8、 参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数
9、 *args是可变参数,args接收的是一个tuple;
**kw是关键字参数,kw接收的是一个dict。
对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的
因为上面这个结论,所有又有了下面的结论:
wrapper()函数的参数定义是(*args, **kw),因此,wrapper()函数可以接受任意参数的调用
10、 使用递归函数需要注意防止栈溢出。所以,递归调用的次数过多,会导致栈溢出。
11、 L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2
12、 要创建一个generator,第一种方法很简单,只要把一个列表生成式的[]改成(),
>>> L = [x * x for x in range(10)]
>>> g = (x * x for x in range(10))
创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator
13、定义generator的另一种方法:如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
14、凡是可作用于for循环的对象都是Iterable类型;
15、凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
16、List遍历删除:1、倒叙删除;2、列表生成是[x for x in tst if x !=4 ];3、filter(lambda x:x!=4,tst);4、干脆建一个新的list
17、 函数本身也可以赋值给变量,即:变量可以指向函数。
18、把函数作为参数传入,这样的函数称为高阶函数
19、 常用高阶函数:map,filter,reduce,sorted
20、>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
21、 ['Zoo', 'Credit', 'bob', 'about']
22、reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4) reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数
23、 匿名函数lambda x: x * x
冒号前面的x表示函数参数; 匿名函数有个限制,就是只能有一个表达式
24、偏函数:当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。
25、 在Python中,一个.py文件就称之为一个模块(Module)。
26、为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。__
27、abc.py在包mycompany下,则abc.py模块的名字就变成了mycompany.abc
28、 sys模块有一个argv变量,用list存储了命令行的所有参数。argv至少有一个元素,因为第一个参数永远是该.py文件的名称
运行python3 hello.py Michael获得的sys.argv就是['hello.py', 'Michael]。
29、if __name__=='__main__':
test()
当我们在命令行运行hello模块文件时,Python解释器把一个特殊变量__name__置为__main__,而如果在其他地方导入该hello模块时,if判断将失败
30、 在Python中,安装第三方模块,是通过包管理工具pip完成的
31、 一般来说,第三方库都会在Python官方的pypi.python.org网站注册,要安装一个第三方库,必须先知道该库的名称,可以在官网或者pypi上搜索
32、注意:特殊方法“init”前后有两个下划线!!!第一个参数永远是self
33、 和静态语言不同,Python允许对实例变量绑定任何数据,也就是说,对于两个实例变量,虽然它们都是同一个类的不同实例,但拥有的变量名称都可能不同
34、 在Python中,实例的变量名如果以__开头(两个下划线),就变成了一个私有变量(private),只有内部可以访问
35、 在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,
36、 【定制类】有时间可以看下
37、 def bar():
try:
foo('0')
except Exception as e:
print('ValueError!')
raise #抛异常给调用者
43、os.name # 操作系统类型
如果是posix,说明系统是Linux、Unix或Mac OS X,如果是nt,就是Windows系统。
44、在操作系统中定义的环境变量,全部保存在os.environ这个变量中
>>> os.environ.get('PATH')
45、json.dumps方法返回一个str
46、 JSON标准规定JSON编码是UTF-8
47、print(json.dumps(s, default=lambda obj: obj.__dict__))
48、使用装饰器@staticmethod定义静态方法
49、类方法使用@classmethod装饰器定义
50、Python的构造析构方法分别是__int__和__del__,__del__是在对象被Python垃圾回收时调用,因为垃圾回收是由Python控制,所以通常不会重写__del__方法
51、封装、继承、多态是面向对象的三个基本要素
所谓多态,可以简单理解为子类使用与父类相同的接口,但提供不同的功能。通过在子类中重写父类中定义的方法,可以实现多态
不以下划线开关的普通属性,双下划线__开头的属性,代表是私有属性
54、 Isinstance方法可以用来确定一个对象是不是一个类或它的子类的实例:
还可以使用type(obj) is Type进行判断,此方法对于obj是Type的子类的实例的情况将返回False。Issubclass用来判断一个类是否是另一个类的子类,包括直接子类或间接子类
55、 try:
try_suite #监控这里的异常
except Exception,e:
except_suite #异常处理代码
Exception是大部分异常类的基类,因此上述代码支持捕获大多异常
56、sys模块中的exc_info()函数,是另一种获取异常信息的途径,它提供了一个三元祖信息,比我们单纯用异常参数获取的信息多