符合中小企业对网站设计、功能常规化式的企业展示型网站建设
本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...
商城网站建设因基本功能的需求不同费用上面也有很大的差别...
手机微信网站开发、微信官网、微信商城网站...
你是不是少了什么东西
创新互联建站主要从事网站设计制作、成都网站制作、网页设计、企业做网站、公司建网站等业务。立足成都服务大通,十余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220
def die():
sys.exit()
这样还比较正常一点
只是吧sys.exit()封装成一个函数而已
die()要比
sys.exit()少打不少字符呢,对吧
我要纠正推荐答案中的说法!
del并不是用来“删除引用指向的内存空间”,python中的del和c++中的delete是完全两个概念,不要误人子弟。。
一般来讲,del是用来删除变量的引用的,例如a = 1; del a,这里a是对1这个值的引用(python中所有的变量都可视作引用),而del a就是删除这一引用关系,也就是说,1不再被a这个变量引用了,同时a这个变量名也从变量表中剔除了。
如果还是不太清楚,我举这个例子你就明白了:
a = object()
b = a
del a
print b
print a # 该句会报a未定义的异常
这段代码中,a引用了一个新对象object(),而b=a使得b也引用了这个对象,a和b虽然是两个变量,但它们引用的是同一个对象,有点类似于c++中的两个指针指向同一个对象。
而后面del a仅仅只是把a这个变量对object()的引用删掉了,同时a的变量名也失效了,但并不表示object()这个对象被删除了,它还在,并且b还引用着它呢。从后面print b能正常输出就可以看出这一点。
python的内存释放采用的是引用计数机制,也就是当一个对象没有任何引用它的变量了,那么它就会自动被释放,无需人工干预。
此外,del对于不同的对象也会有不同的功能,这取决于对象本身对__del__系统方法的实现。例如一个列表a = [1,2,3],del a[0]表示将列表的首项删除,此时a就变成[2,3]了。如果是自定义的对象,那del的功能更是可以定义成你想要的任何样子,详情请参考python帮助中的__del__词条。
python中def意思是声明函数。
Python 使用def 开始函数定义,紧接着是函数名,括号内部为函数的参数,内部为函数的 具体功能实现代码,如果想要函数有返回值, 在 expressions 中的逻辑代码中用 return 返回。
expressions
实例def function():
print('This is a function')
a = 1+2
print(a)
相关内容:
function 的函数,函数没有不接受参数,所以括号内部为空,紧接着就是 函数的功能代码。如果执行该脚本,发现并没有输出任何输出,因为我们只定义了函数,而并没有执行函数。 这时我们在 Python 命令提示符中输入函数调用 function(), 注意这里调用函数的括号不能省略。
那么函数内部的功能代码将会执行,输出结果:This is a function。
迭代器模式:一种惰性获取数据项的方式,即按需一次获取一个数据项。
所有序列都是可以迭代的。我们接下来要实现一个 Sentence(句子)类,我们向这个类的构造方法传入包含一些文本的字符串,然后可以逐个单词迭代。
接下来测试 Sentence 实例能否迭代
序列可以迭代的原因:
iter()
解释器需要迭代对象 x 时,会自动调用iter(x)。
内置的 iter 函数有以下作用:
由于序列都实现了 __getitem__ 方法,所以都可以迭代。
可迭代对象:使用内置函数 iter() 可以获取迭代器的对象。
与迭代器的关系:Python 从可迭代对象中获取迭代器。
下面用for循环迭代一个字符串,这里字符串 'abc' 是可迭代的对象,用 for 循环迭代时是有生成器,只是 Python 隐藏了。
如果没有 for 语句,使用 while 循环模拟,要写成下面这样:
Python 内部会处理 for 循环和其他迭代上下文(如列表推导,元组拆包等等)中的 StopIteration 异常。
标准的迭代器接口有两个方法:
__next__ :返回下一个可用的元素,如果没有元素了,抛出 StopIteration 异常。
__iter__ :返回 self,以便在需要使用可迭代对象的地方使用迭代器,如 for 循环中。
迭代器:实现了无参数的 __next__ 方法,返回序列中的下一个元素;如果没有元素了,那么抛出 StopIteration 异常。Python 中的迭代器还实现了 __iter__ 方法,因此迭代器也可以迭代。
接下来使用迭代器模式实现 Sentence 类:
注意, 不要 在 Sentence 类中实现 __next__ 方法,让 Sentence 实例既是可迭代对象,也是自身的迭代器。
为了“支持多种遍历”,必须能从同一个可迭代的实例中获取多个独立的迭代器,而且各个迭代器要能维护自身的内部状态,因此这一模式正确的实现方式是,每次调用 iter(my_iterable) 都新建一个独立的迭代器。
所以总结下来就是:
实现相同功能,但却符合 Python 习惯的方式是,用生成器函数代替 SentenceIteror 类。
只要 Python 函数的定义体中有 yield 关键字,该函数就是生成器函数。调用生成器函数,就会返回一个生成器对象。
生成器函数会创建一个生成器对象,包装生成器函数的定义体,把生成器传给 next(...) 函数时,生成器函数会向前,执行函数定义体中的下一个 yield 语句,返回产出的值,并在函数定义体的当前位置暂停,。最终,函数的定义体返回时,外层的生成器对象会抛出 StopIteration 异常,这一点与迭代器协议一致。
如今这一版 Sentence 类相较之前简短多了,但是还不够慵懒。 惰性 ,是如今人们认为最好的特质。惰性实现是指尽可能延后生成值,这样做能节省内存,或许还能避免做无用的处理。
目前实现的几版 Sentence 类都不具有惰性,因为 __init__ 方法急迫的构建好了文本中的单词列表,然后将其绑定到 self.words 属性上。这样就得处理整个文本,列表使用的内存量可能与文本本身一样多(或许更多,取决于文本中有多少非单词字符)。
re.finditer 函数是 re.findall 函数的惰性版本,返回的是一个生成器,按需生成 re.MatchObject 实例。我们可以使用这个函数来让 Sentence 类变得懒惰,即只在需要时才生成下一个单词。
标准库提供了很多生成器函数,有用于逐行迭代纯文本文件的对象,还有出色的 os.walk 函数等等。本节专注于通用的函数:参数为任意的可迭代对象,返回值是生成器,用于生成选中的、计算出的和重新排列的元素。
第一组是用于 过滤 的生成器函数:从输入的可迭代对象中产出元素的子集,而且不修改元素本身。这种函数大多数都接受一个断言参数(predicate),这个参数是个 布尔函数 ,有一个参数,会应用到输入中的每个元素上,用于判断元素是否包含在输出中。
以下为这些函数的演示:
第二组是用于映射的生成器函数:在输入的单个/多个可迭代对象中的各个元素上做计算,然后返回结果。
以下为这些函数的用法:
第三组是用于合并的生成器函数,这些函数都可以从输入的多个可迭代对象中产出元素。
以下为演示:
第四组是从一个元素中产出多个值,扩展输入的可迭代对象。
以下为演示:
第五组生成器函数用于产出输入的可迭代对象中的全部元素,不过会以某种方式重新排列。
下面的函数都接受一个可迭代的对象,然后返回单个结果,这种函数叫“归约函数”,“合拢函数”或“累加函数”,其实,这些内置函数都可以用 functools.reduce 函数实现,但内置更加方便,而且还有一些优点。
参考教程:
《流畅的python》 P330 - 363