- Python global 语句的作用
- lambda 匿名函数好处
- Python 错误处理
- Python 内置错误类型
- 简述 any() 和 all() 方法
- Python 中什么元素为假?
- 提高 Python 运行效率的方法
- Python 单例模式
- 为什么 Python 不提供函数重载
- 实例方法/静态方法/类方法
- __new__和 __init __方法的区别
- Python 的函数参数传递
- Python 实现对函参做类型检查
- 为什么说 Python 是动态语言
- Python 装饰器理解
- map 与 reduce 函数用法解释
- Python 深拷贝、浅拷贝区别
- Python 继承多态理解
- Python 面向对象的原则
- 参考资料
Python global 语句的作用
在编写程序的时候,如果想要改变(重新赋值)函数外部的变量,并且这个变量会作用于许多函数中,就需要告诉 Python 程序这个变量的作用域是全局变量,global
语句可以实现定义全局变量的作用。
lambda 匿名函数好处
精简代码,lambda
省去了定义函数,map
省去了写 for
循环过程:
str_1 = ["中国", "美国", "法国", "", "", "英国"]
res = list(map(lambda x: "填充值" if x=="" else x, str_1))
print(res) # ['中国', '美国', '法国', '填充值', '填充值', '英国']
Python 错误处理
和其他高级语言一样,Python
也内置了一套try...except...finally...
的错误处理机制。
当我们认为某些代码可能会出错时,就可以用 try
来运行这段代码,如果执行出错,则后续代码不会继续执行,而是直接跳转至跳转至错误处理代码,即 except
语句块,执行完 except
后,如果有 finally
语句块,则执行。至此,执行完毕。跳转至错误处理代码,
Python 内置错误类型
IOError
:输入输出异常AttributeError
:试图访问一个对象没有的属性ImportError
:无法引入模块或包,基本是路径问题IndentationError
:语法错误,代码没有正确的对齐IndexError
:下标索引超出序列边界KeyError
: 试图访问你字典里不存在的键SyntaxError
: Python 代码逻辑语法出错,不能执行NameError
: 使用一个还未赋予对象的变量
简述 any() 和 all() 方法
any()
: 只要迭代器中有一个元素为真就为真;all()
: 迭代器中所有的判断项返回都是真,结果才为真.
Python 中什么元素为假?
答案:(0,空字符串,空列表、空字典、空元组、None, False)
提高 Python 运行效率的方法
- 使用生成器,因为可以节约大量内存;
- 循环代码优化,避免过多重复代码的执行;
- 核心模块用
Cython PyPy
等,提高效率; - 多进程、多线程、协程;
- 多个
if elif
条件判断,可以把最有可能先发生的条件放到前面写,这样可以减少程序判断的次数,提高效率。
Python 单例模式
为什么 Python 不提供函数重载
我们知道 函数重载
主要是为了解决两个问题。
- 可变参数类型。
- 可变参数个数。
另外,一个函数重载基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函数的功能其实不同,那么不应当使用重载,而应当使用一个名字不同的函数。
- 对于情况 1 ,函数功能相同,但是参数类型不同,Python 如何处理?答案是根本不需要处理,因为
Python
可以接受任何类型的参数,如果函数的功能相同,那么不同的参数类型在 Python 中很可能是相同的代码,没有必要做成两个不同函数。 - 对于情况 2 ,函数功能相同,但参数个数不同,Python 如何处理?大家知道,答案就是缺省参数(默认参数)。对那些缺少的参数设定为缺省参数(默认参数)即可解决问题。因为你假设函数功能相同,那么那些缺少的参数终归是需要用的。所以,鉴于情况 1 跟 情况 2 都有了解决方案,Python 自然就不需要函数重载了。
实例方法/静态方法/类方法
Python
类语法中有三种方法,实例方法,静态方法,类方法,它们的区别如下:
- 实例方法只能被实例对象调用,静态方法(由
@staticmethod
装饰器来声明)、类方法(由@classmethod
装饰器来声明),可以被类或类的实例对象调用; 实例方法
,第一个参数必须要默认传实例对象,一般习惯用self。静态方法
,参数没有要求。类方法
,第一个参数必须要默认传类,一般习惯用cls
.
实例代码如下:
class Foo(object):
"""类三种方法语法形式
"""
def instance_method(self):
print("是类{}的实例方法,只能被实例对象调用".format(Foo))
@staticmethod
def static_method():
print("是静态方法")
@classmethod
def class_method(cls):
print("是类方法")
foo = Foo()
foo.instance_method()
foo.static_method()
foo.class_method()
print('##############')
Foo.static_method()
Foo.class_method()
程序执行后输出如下:
是类 <class 'main.Foo'> 的实例方法,只能被实例对象调用
是静态方法
是类方法
##############
是静态方法
是类方法
__new__和 __init __方法的区别
__init__
方法并不是真正意义上的构造函数,__new__
方法才是(类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行);__new__
方法用于创建对象并返回对象,当返回对象时会自动调用__init__
方法进行初始化,__new__
方法比__init__
方法更早执行;__new__
方法是静态方法,而__init__
是实例方法。
Python 的函数参数传递
参考这两个链接,stackoverflow的最高赞那个讲得很详细
How do I pass a variable by reference?
Python 面试题
个人总结(有点不好):
- 将可变对象:列表list、字典dict、NumPy数组ndarray和用户定义的类型(类),作为参数传递给函数,函数内部将其改变后,函数外部这个变量也会改变(对变量进行重新赋值除外
rebind the reference in the method
) - 将不可变对象:字符串string、元组tuple、数值numbers,作为参数传递给函数,函数内部将其改变后,函数外部这个变量不会改变