1、以文件对象的方式读取
def read_file_object(f): for line in f: print(line)f = open('a.txt', 'r', encoding='utf8')read_file_object(f)
结果为:
我是蔡徐坤
2、以文件名的方式读取
def read_file_name(file_name): if isinstance(file_name, str): with open(file_name, 'r', encoding='utf8') as f: for line in f: print(line)read_file_name('a.txt')
结果为:
我是蔡徐坤
这种方式显然不好,不同的读取方式需要调用不同的函数,并且读取文件的代码重复了,显得冗余啰嗦,来看看嵌套函数怎么优雅的实现这个功能吧:
def read_file(file): def inner(file_): for line in file_: print(line, end='') if isinstance(file, str): with open(file, 'r', encoding='utf8') as f: inner(f) else: inner(file)read_file("a.txt")
看吧,一个嵌套函数实现了所有功能,是不是很pythonic,代码不仅优雅,并且简单,适用行强,也符合了DRY原则
在python中,一个py文件称之为一个模块,在模块最外层定义的变量称之为全局变量,作用域是整个模块,定义在函数内部的变量称之为菊部变量,不对,是局部变量(别想歪了,好好听课),它的作用域是整个函数。
num = 1 # 全局作用域变量def a(): print(num)
这里的num是全局变量,函数外部是能访问到的
def b(): num = 2print(num)
这里的num是局部变量,函数外部是不能访问的,如果你运行程序,会报错:
NameError: name 'num' is not defined
其实所有的函数,都有一个__closure__属性,如果这个函数是一个闭包的话,那么它返回的是一个由 cell 对象 组成的元组对象。cell 对象的cell_contents 属性就是闭包中的自由变量。
>>>test.__closure__(<cell at 0x000001C388850A68: int object at 0x0000000074E96C40>,)>>>test.__closure__[0].cell_contents1
这下看明白了吧,其实也就是python把这个变量存起来了。