- _:临时变量,_ 代表临时变量比如for _ in range(10): _ 代表临时变量,用来循环10次。或者接收不需要的函数返回值。
- 声明编码方式:
- python在文件头声明编码方式:具体格式参考官方文档:https://www.python.org/dev/peps/pep-0263/
- # -*- coding: utf-8 -*-
- # coding=utf-8
- python在文件头声明编码方式:具体格式参考官方文档:https://www.python.org/dev/peps/pep-0263/
- 字典取值:
- 最简单的是方括号,dict[‘key’],但是如果没有这个key,会抛出异常。
- 字典的成员函数dict.get(key, default):使用get()可以预防ValueError,可以设置默认值,在没有取到的时候则返回默认值。
- 字符串格式控制:
- u"“以 Unicode 格式进行编码; r”“去掉反斜杠的转移机制; b”“表示bytes类型数据; f”"支持大括号内的python表达式。
- 控制输出浮点数的位数:
- print(format(1.23456, ‘.2f’)) 或 print(’%.2f’ % f)
- 文件IO:
- open(filename, mode)
- mode: r读,w写,a追加;后面:’+'读写, 'b’二进制
- 使用open之后一定要执行close,为了避免忘记,可以使用:with open(‘in.dat’, ‘r’) as f,会自动调用close()
- with xxx as y:
- 有些对象可能事先需要设置,事后做清理工作。对于这种场景,Python的with语句提供了一种非常方便的处理方式。
- 比如打开文件,会自动调用y.close()。
- 如果是自定义的对象,你可以初始化类中的__enter__() 和 __exit__()函数,这样会在with进入和退出时自动调用。
- 重点在于如果在with内部的语句抛出了异常,exit()函数依然能够在抛出之前顺利执行。并且可以让exit函数接收错误的信息比如错误类型、错误内容,并做相应的处理。
- 修饰器@staticmethod:
- @staticmethod修饰的函数为静态方法,只是名义上归属类管理,但是不能使用类变量和实例变量,是类的工具包,类似C++的static成员函数。
- 静态方法函数里不传入self 或 cls,可以传入自定义参数。
- 静态方法调用时可以使用实例对象调用,也可以直接静态调用。myClass.method(),或者myClass().method()都可以。
- 修饰器@classmethod :
- @classmethod修饰符修饰的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用自身类的属性、方法等。
- 比如项目中会定义一个Tool类,Tool类中定义一些功能的tool函数,调用时直接Tool.getServerInfo()则可以直接调用。
-
异常处理try…except…else…finally:
try: Nomal execution block except A: Exception A handle except B: Exception B handle except: Other Exception handle else: if no exception, get here finally: print('finally')
- 完整的如上,try中的代码块抛出异常,被except语句捕获。
- 可以指定特定的Error类型,如果这一层没有捕捉到,会传到下一层except,如果except不带特定类型,那么则会捕捉所有的异常。
- 一般捕捉except Exception as e: ,Exception 是常见错误的基类。
- else会在没有异常抛出时进入这个代码区域,else必须在有except语句后出现。
- finally中的代码,无论是否有错误,都会运行。并且**前面如果调用了return,finally中的代码仍然会执行。**这个比较玄学,下面的例子测试:
-
def exceptTest(): try: may_throw_excptioin() return 0 except: return 1 else: print 'no exception' return 2 finally: print 'in finally' # return 3
- 如果没有抛出异常,try会执行,else紧接着try后执行,但是由于try中以及return了,所以不会进else。return 0之前会执行finally中的语句,如果有return 3,则会覆盖返回值, 最终会执行return 3,;如果没有return 3,则return 0。
- 如果抛出了异常,except会执行,但是return 1之前会调用finally中的语句,如果finally中执行了return 3,则会覆盖返回值,则最终会返回3。如果没有return 3,则会return 1。
- 可迭代对象:
- 迭代器是可迭代的对象,这意味着可以使用for遍历所有值。for 循环遍历的原理就是靠这个迭代器。
- 原理:
- 列表、元组、字典、集合以及字符串都是可迭代的对象。它们是可迭代的容器,可以从中获取迭代器(Iterator)。比如:
mytuple = ("apple", "banana", "cherry") myit = iter(mytuple) print(next(myit)) print(next(myit)) print(next(myit))
- for循环其实就是取了对象的迭代器,然后每次对迭代器调用next()。迭代完最后一个数据之后,再次调用next()函数会抛出StopIteration的异常,来告诉我们所有数据都已迭代完成,不用再执行next()函数了。
- 列表、元组、字典、集合以及字符串都是可迭代的对象。它们是可迭代的容器,可以从中获取迭代器(Iterator)。比如:
- 自定义迭代器
- 在使用next()函数的时候,调用的是迭代器对象的__next__方法。所以,我们要想构造一个迭代器,就要实现它的__next__方法。
- 同时,python要求迭代器本身也是可迭代的,所以我们还要为迭代器实现__iter__方法,而__iter__方法要返回一个迭代器,迭代器自身正是一个迭代器,所以迭代器的__iter__方法返回自身即可。
- 示例: 斐波那契数列
class FeiboIterator(object): def __init__(self, n): # 斐波那数列值的个数 self.n = n # 记录当前遍历的下标 self.index = 0 # 斐波那数列前面的两个值 self.num1 = 0 self.num2 = 1 def __next__(self): """被next()函数调用来获取下一个数""" if self.index < self.n: num = self.num1 self.num1, self.num2 = self.num2, self.num1 + self.num2 self.index += 1 return num else: raise StopIteration def __iter__(self): """迭代器的__iter__返回自身即可""" return self if __name__ == '__main__': fb = FeiboIterator(20) for num in fb: print(num, end=' ') ```