引和元素,你可以使用 enumerate() 函数来简化代码。
写条件与循环时,合理利用+continue+或者+break+来避免复杂的嵌套,是十分重要的。
要注意条件与循环的复用,简单功能往往可以用一行直接完成,极大地提高代码质量与效率。
异常处理
- 异常,通常是指程序运行的过程中遇到了错误,终止并退出。我们通常使用 try except 语句去处理异常,这样程序就不会被终止,仍能继续执行。
- 处理异常时,如果有必须执行的语句,比如文件打开后必须关闭等等,则可以放在 finally block 中。
- 异常处理,通常用在你不确定某段代码能否成功执行,也无法轻易判断的情况下,比如数据库的连接、读取等等。正常的 flow-control 逻辑,不要使用异常处理,直接用条件语句解决就可以了。
自定义函数
- Python 中函数的参数可以接受任意的数据类型,使用起来需要注意,必要时请在函数开头加入数据类型的检查;
- 和其他语言不同,Python 中函数的参数可以设定默认值;
- 嵌套函数的使用,能保证数据的隐私性,提高程序运行效率;
- 合理地使用闭包,则可以简化程序的复杂度,提高可读性;
匿名函数
优点:
map(function,iterable)
表示对 iterable 中的每个元素,都运用 function 这个函数,最后返回一个新的可遍历的集合。
def square(x):
return x**2
squared = map(square, [1, 2, 3, 4, 5]) # [2, 4, 6, 8, 10]
filter(function,iterable)
表示对 iterable 中的每个元素,都使用 function 判断,并返回 True 或者 False,最后将返回 True 的元素组成一个新的可遍历的集合。
l = [1, 2, 3, 4, 5]
new_list = filter(lambda x: x % 2 == 0, l) # [2, 4]
reduce(function,iterable)
规定它有两个参数,表示对 iterable 中的每个元素以及上一次调用后的结果,运用 function 进行计算,所以最后返回的是一个单独的数值。
l = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, l) # 1*2*3*4*5 = 120
面向对象
基本概念
- 类:一群有着相似性的事物的集合;
- 对象:集合中的一个事物;
- 属性:对象的某个静态特征;
- 函数:对象某个动态能力
三要素:
模块化编程
- 通过绝对路径和相对路径,我们可以 import 模块;
- 在大型工程中模块化非常重要,模块的索引要通过绝对路径来做,而绝对路径从程序的根目录开始;
- 记着巧用
if __name__ == "__main__"
来避开 import 时执行;
进阶篇
Python 对象的比较、拷贝
- 比较操作符
==
表示比较对象间的值是否相等,而 is
表示比较对象的标识是否相等,即它们是否指向同一个内存地址。
- 比较操作符
is
效率优于 ==
,因为 is
操作符无法被重载,执行 is
操作只是简单的获取对象的 ID,并进行比较;而 ==
操作符则会递归地遍历对象的所有值,并逐一比较。
- 浅拷贝中的元素,是原对象中子对象的引用,因此,如果原对象中的元素是可变的,改变其也会影响拷贝后的对象,存在一定的副作用。
- 深度拷贝则会递归地拷贝原对象中的每一个子对象,因此拷贝后的对象和原对象互不相关。另外,深度拷贝中会维护一个字典,记录已经拷贝的对象及其 ID,来提高效率并防止无限递归的发生。
值传递与引用传递
常见的参数传递有 2 种:
- 值传递:通常就是拷贝对象的值,然后传递给函数里的新变量,原变量和新变量之间相互独立,互不影响
- 引用传递:通常是指把参数的引用传给新的变量,这样,原变量和新变量就会指向同一块内存地址。
准确来说, python 的参数传递是 赋值传递 ,或者叫做对象的 引用传递 ,python 里所有的数据类型都是对象,所以参数传递时,只是让新变量与原变量指向相同的对象而已,并不存在值传递或引用传递一说。
需要注意的是,这里的赋值或对象的引用传递,不是指一个具体的内存地址,二十指一个具体的对象。
- 如果对象是可变的,当其改变时,所有指向这个对象的变量都会改变;
- 如果对象不可变,简单的赋值只能改变其中一个变量的值,其余变量则不受影响;
装饰器
函数也是对象
def func(message):
print('Got a message: {}'.format(message))
send_message = func
send_message('hello world')
# 输出
Got a message: hello world
函数可以作为函数参数
def get_message(message):
return 'Got a message: ' + message
def root_call(func, message):
print(func(message))
root_call(get_message, 'hello world')
# 输出
Got a message: hello world
函数可以嵌套函数
def func(message):
def get_message(message):
print('Got a message: {}'.format(message))
return get_message(message)
func('hello world')
# 输出
Got a message: hello world
函数的返回值也可以是函数对象(闭包)
def func_closure():
def get_message(message):
print('Got a message: {}'.format(message))
return get_message
send_message = func_closure()
send_message('hello world')
# 输出
Got a message: hello world
简单使用装饰器
def my_decorator(func):
def wrapper():
print('wrapper of decorator')
func()
return wrapper
def greet():
print('hello world')
greet = my_decorator(greet)
greet()
# 输出
wrapper of decorator
hello world
更优雅的写法
def my_decorator(func):
def wrapper():
print('wrapper of decorator')
func()
return wrapper
@my_decorator
def greet():
print('hello world')
greet()
带参数的装饰器
def my_decorator(func):
def wrapper(message):
print('wrapper of decorator')
func(message)
return wrapper
@my_decorator
def greet(message):