47、生成器2
带有 yield 关键字的的函数在 Python 中被称之为 generator(生成器)。Python 解释器会将带有 yield 关键字的函数视为一个 generator 来处理。一个函数或者子程序都只能 return 一次,但是一个生成器能暂停执行并返回一个中间的结果 —— 这就是 yield 语句的功能 : 返回一个中间值给调用者并暂停执行。
生成器通过关键字 yield 不断的将迭代器返回到内存进行处理,而不会一次性的将对象全部放入内存,从而节省内存空间。从这点看来生成器和迭代器非常相似,但如果更深入的了解的话,其实两者仍存在区别。
生成器的另一个优点就是它不要求你事先准备好整个迭代过程中所有的元素,即无须将对象的所有元素都存入内存之后,才开始进行操作。生成器仅在迭代至某个元素时才会将该元素放入内存,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的类序列对象,EG. 大文件/大集合/大字典/斐波那契数列等。这个特点被称为 延迟计算 或 惰性求值(Lazy evaluation),可以有效的节省内存。惰性求值实际上是现实了协同程序 的思想。
综上所述:使用生成器最好的场景就是当你需要以迭代的方式去穿越一个巨大的数据集合。比如:一个巨大的文件/一个复杂的数据库查询等。
def read_file(fpath):
BLOCK_SIZE = 1024
with open(fpath, 'rb') as f:
while True:
block = f.read(BLOCK_SIZE)
if block:
yield block
else:
return
48、enumerate
enumerate用于处理可迭代对象,迭代里面的内容以及下标。默认下标从0开始,也可以设置起始值。
比如书写一个函数,输出一个字典的内容和它的下标。
dict1 = {1:"the",2:"this"}
for i, j in enumerate(dict1,10):
print(i,j)
// 10 1
11 2
49、获取函数的名称
funcname = sys._getFrame().f_code_name
获取类的名称,在方法累不使用:
Name = self.__class__.__name__
50、获取路径的几种方式
获取当前命名所在文件的路径(路径包含文件名):
os.path.realpath(__file__)
获取文件所在路径:
filepath = os.path.dirname(os.path.realpath(__file__))
filepath = os.path.realpath(os.path.dirname(__file__))
filepath = os.path.abspath(os.path.dirname(__file__))
这三种方式都可以,realpath和abspath用法一样
51、获取执行命令所在的路径
filepath = os.getcwd()
比如这些命令都在文件中: D:CodePracticeseleniumCodingFMProjectTestCode
执行调用的命令在路径:C:windowssystem32
52、获取文件父级路径
curPath5 = r”D:CodePracticepythonpracticepracticSys.py”
path1 = os.path.split(curPath5)
path2 = curPath5.split(“practicSys.py”)
path1 = (“D:CodePracticepythonpractice”,”practicSys.py”)
path2 = [“D:CodePracticepythonpractice”,””]
53、私有函数
在模块里面,以单下划线和双下划线开头的函数性质一样,from module import * 方式无法导入成功。Import module 然后module._private和module.__private都能引用成功;from module import _private、from module import __private也能引用。
在类里面,单下划线函数和普通函数函数一样,可以被引用,被子类继承。单双下划线开头的函数,不能被引用,不能被子类继承,只能在类内部使用。
双下划线函数能通过 实例名._类名__方法名 方式在类的外面引用。所以python里面都是伪私有函数。