有没有结合‍A‍I‍课‍程?学校开展课后课程。

最近。很多人都去看了《后来的我们》。可能有人看过会觉得他们败给贫穷,但其实打败他们的并不是贫穷,不是没有房子和户口,不是生活的压力。而是男生的幼稚、懦弱和逃避。很多男生根本不明白,女生想要的不是物质,而是你再爱我多一点。记得以前住的租房里,附近有对情侣也是吵吵闹闹。两个人最贫困的时候,住的是最便宜的城中村。见不到太阳的握手楼,一打开窗户就能看到对面飘飘荡荡的内衣。女生每天的工作到6点下班,每天的挤公交让她疲惫不堪。男的却还在为找工作而奔波,甚至有时开始迷上游戏。变得沉沦。她开始厌弃这种生活,生活里脾气也渐渐大了起来。没有打扫卫生的男生,回来又是一顿骂。三天一小吵,五天一大吵。最激烈的一次争吵,都摔起了玻璃杯。而女生最气的一次说到:你要是再这样,你就自己住!也许很多男生都没有替女生想过,女生最在乎的是什么?你有没有为ta而努力过?还有两个月就要离校出去实习了你有没有想要说的话?校园表白墙里大声说出你的爱一边听音乐一边看文章寻找一份属于你的缅怀TO:17计网2zwj 嗯 你或许也不懂
From:匿名TO:16未闻花名,但实花香,再遇花时,泪以千行。但愿兜兜转转 突破彼此
终为彼此伊人。
From:LiTO:那年晴天每一段被遗忘的时光都藏在旋律中,那是我们最骄傲,也是回不去的单纯美好。From:16TO:图书馆放歌唱歌的人表白你们每天都那么大声的放歌!唱歌!整得跟腾格尔一样!睡也没得睡!你们是没钱去对面唱吗??From:全体6栋TO:楼下怀念是好的,回去是不可能的了,介辈子都不可能的了,只能靠怀念回忆一下记己介样子From:大三的帅哥TO:客家渔粉小姐姐3 美食城客家渔粉兼职的那个小姐姐,你怎么那么不守时?每次专门去美食城就是为了望下你,而你却时不时的不在那。你给个兼职时间呗,我可不想白跑了。From:匿名TO:许琪彩虽然我们没聊什么,我也不了解你,但我始终相信确认过眼神From:匿名TO:lyp过分的关心,累人累己。何必呢,两个人从三观性格家庭方面都不合适。难道就不能好好当朋友么。From:仪式感的浪漫。TO:陈某人我想跟你重新认识,重新喜欢,重新开始,可以吗?你好,很高兴认识你
From:匿名TO:17室内1班邢贵凯那天与您擦身而过,被你帅气的侧脸所吸引,每一分每一秒,我的细胞都在沸腾,都在想你。我知道那是心动的感觉,我相信一见钟情的爱。From:某个美女TO:ta最后一次跟你告白,我喜欢你,喜欢的不得了,但只是以前的你,舍不得让我难过的你。愿你开心,别让我看到消息和影子。
From:woTO:16服装都快出去实习了都没有撩到小哥哥,我也想在外面喝奶茶打游戏出去玩,可是我好懒!懒得去撩,所以等人撩我From:奶子慧TO:美食城花甲粉晚上工作的小姐姐第一眼看见就超喜欢,看起来清纯又可爱,就是有点小高冷,不知道她能不能看见,表白小姐姐。From:匿名TO:曾伟浩好久没看见你来操场打球了?什么时候才能看到你打球?嘤嘤嘤From:匿名TO:PJL其实有段时间很喜欢你,那段时间语音特别频繁,get到我声控的点,然后又get到我手控了,讲真有冲动过,但是慢慢的淡了,你加油哦!我是胖胖From:胖胖TO:17某某某虽说这个月没有像以前一个月几千条聊天记录,但这三百零五条聊天记录,代表着三百零五个想你的瞬间,即使你不喜欢我,我还是默默喜欢着你。From:闷葫芦TO:cyl我又想你了 一直不敢看前任3 今晚还是没忍住看了 看完真的很难受 记得大话西游重新上演时我们一起去看了 还是特点跑的很远的影院 我真的不能像至尊宝一样放得下 我想找你一定会说我爱你 但我又知道是不可能的 因为你说过没有第三次了...From:cfjTO:欧尼也许频繁发微信找你聊天,你会觉得很烦,或许你一直都对我有戒备之心…就在1月14号那晚上微信聊天时,我不经大脑,无心手快打出:“我终于偷到你的个人照片了”。其实我也是为了哄你开心,根本就没有保存什么照片,我也不知道你是这么在意的,马上就把我拉黑了。如果还可以拉回来的话,我还想继续和你做朋友……From:一个常叫你欧尼的人TO:广现黄雅倩我爱你,别吃芒果了,跟我在一起From:匿名TO:梁大人今天是我们分开第100天,也恰巧是你的生日,我还是祝你生日快乐吧。From:小妞TO:罗德鸿之前看见你主持的时候,我觉得你超有魅力的 ,深深地吸引了我。我好喜欢你,不知道你看不看的到。From:默默关注你的人TO:HML我的强迫症很严重 睡觉的时候 总要整点才闭眼比如看到时间是23:35 就要等凑到十二点整睡昨晚凌晨三点睡着 现在一觉醒来已经天黑我的强迫症还在于我放弃爱你已经496次 但我也失败了496次你看我是不是很混蛋 放弃你这么多次你看我是不是很没用 放弃你这么多次也没成功我安慰自己说 等到第500次就是真的了我必须凑个整 整数多有形式感啊不在一起就不在一起吧反正你每次说爱我也没有多认真想到你不爱我 我就没有底气但是我爱你不管是每次坐车前最后一条短信上三个字的“我爱你”还是失眠的凌晨坐在台灯下八百字情书的“我爱你”但是我爱你不管是出远门长途漫游夹带嗡嗡杂音的“我爱你”还是临睡和早起亲你一口在你耳旁说的“我爱你”但是我爱你不管是喝醉了胡言乱语口齿不清的“我爱你”还是为了逗你开心用播音腔调说的“我爱你”而你哪怕是一座冰山我也还是会选择抱紧你用我微不足道的体温融化你因为只有第497/498/499/501/502/503……次因为它永远凑不成整 而我注定永远无法放弃爱你因为生活里的那些好与不好 我都只想跟你一起经历再或者说 我不管未来有多变幻莫测但你一定是我现在生活的 全部重心和全部意义。认识你 是我的运气 但爱上你 算我倒霉 甘愿倒霉一辈子From:CXYTO:一个叫鱼丸粗面姐姐的可爱女孩头发短短,眼睛大大,酒窝深深,笑容弯弯,爱写书法的那个妹子,嘴里总说着很自卑,明明人看着那么清澈舒服,可为什么总装着那么多心事呢?你这样会让人很心疼也很想保护……From:LTO:yh嗯!yh,在你跟我说分手的那一刻,我居然没有作出任何挽留,可能是我不够爱你吧!你说我变了,其实我自己也感觉到了,前段时间我有想过跟你从新开始,可失去了就是失去了,但愿以后我们都能珍惜那个她(他),一切安好……From:格林TO:过往认识你5年了,也爱了你5年,为你放弃了事业、家人,独自来到这里,成了你的师弟,只是想好好的说一声再见,此生缘尽,今生不见From:匿名}
从【for】说起在 Python 中,我们学过的数据类型有可以使用 for 循环的,例如:str,list,tuple,dict,set 等; 也有不可以使用 for 循环的,例如:bool, int 等。我们将一个 int 类型的数据放入 for 循环中:for i in 123:
print(i)
会得到这样一行报错:翻译成中文就是int对象是不可以迭代的。那么是不是 for 循环只能用于可迭代对象呢?是的!可迭代从 for 循环我们谈到了 可迭代 的概念。因为 123 是不可迭代的,所以它不能被 for 循环遍历。 而 字符串,列表,元祖,字典,集合 都是可以被遍历的,那么这些数据类型都是可迭代的。我们可以借助 isinstance() 函数来验证我们的猜想。isinstance(object, classinfo)· object ——实例对象。· classinfo —— 可以是直接或间接类名、基本类型或者由它们组成的元组。如果参数object是classinfo的实例,或者object是classinfo类的子类的一个实例, 返回True。如果object不是一个给定类型的的对象, 则返回结果总是False。from collections import Iterable
print(isinstance(True, Iterable))
# False
print(isinstance(123, Iterable))
# False
print(isinstance('123', Iterable))
# True
print(isinstance([1, 2, 3], Iterable))
# True
print(isinstance((1, 2, 3), Iterable))
# True
print(isinstance({1: 'A', 2: 'B', 3: 'C'}, Iterable))
# True
print(isinstance({1, 2, 3}, Iterable))
# True
结合上面 for 循环的取值现象,我们可以认定,可迭代就是可以将数据集中的元素一个挨一个的取出来。可迭代协议从上面知道能被 for 循环的数据类型是 “可迭代的”,那么 for 循环是怎么判定数据类型是否是可迭代的呢?在创造一个数据类型的时候,要想这个数据类型能被 for 一个一个的取值,那么就需要满足使用 for 的某种要求。这种要求我们可以看做一种 “协议”。 可以满足被迭代要求的协议称作 “可迭代协议”。可迭代协议 即数据对象内部实现了一个__iter__的方法下面我们来验证上面的说法。 Python 中的 dir() 函数返回一个包含 参数对象的属性、方法的列表。num_dir = dir(123)
str_dir = dir('123')
list_dir = dir([1, 2, 3])
tuple_dir = dir((1, 2, 3))
dict_dir = dir({1: 'A', 2: 'B', 3: 'C'})
set_dir = dir({1, 2, 3})
print('Yes') if '__iter__' in num_dir else print('No')
# No
print('Yes') if '__iter__' in str_dir else print('No')
# Yes
print('Yes') if '__iter__' in list_dir else print('No')
# Yes
print('Yes') if '__iter__' in tuple_dir else print('No')
# Yes
print('Yes') if '__iter__' in dict_dir else print('No')
# Yes
print('Yes') if '__iter__' in set_dir else print('No')
# Yes
在上面我们可以看到: 所有能被 for 循环的数据类型内部都有一个__iter__方法。那么我们来调用这个双下iter方法,看看会出现什么结果。list_obj = [1, 2, 3]
print(list_obj.__iter__())
# <list_iterator object at 0x00000140F0CB4978>
对于 list 类型的对象执行了__iter__方法后, 产生了一个 list_iterator。 iterator : 迭代器。迭代器协议刚刚我们得到了一个 list_iterator,就是列表迭代器。 那么是什么是迭代器呢? 列表迭代器又和列表有什么区别呢?print(dir([1, 2, 3]))
print(dir([1, 2, 3].__iter__()))
分别打印 列表 和 列表迭代器 中包含的方法。 为了更好地看出其中的区别,可以:print(set(dir([1, 2, 3].__iter__())) - set(dir([1, 2, 3])))
得到: {'__next__', '__setstate__', '__length_hint__'}list_iter = [1, 2, 3, 6324, '国机二院徐嘉浩', 'gkd'].__iter__()
# 获取迭代器的长度
print(list_iter.__length_hint__())
# 6
# 指定开始迭代的位置
print(list_iter.__setstate__(3))
# None
# 按照索引顺序从迭代器中取值,一次取一个
print(list_iter.__next__())
# 6324
print(list_iter.__next__())
# 国机二院徐嘉浩
print(list_iter.__next__())
# gkd
print(list_iter.__next__())
# StopIteration 抛出异常
迭代器中的三个方法就实现了 for 循环的效果。__ next __ 一个一个取值的过程就是 for 的取值过程,但是不同与 for 的是,在无法从迭代器中取到值的时候,__ next __()方法会抛出一个异常StopIteration。迭代器遵循迭代器协议:必须拥有__iter__和__next__方法。好,下面我们用异常处理机制和 while 来模拟 for 的功能。list_iter = [1, 2, 3, 6324, '国机二院徐嘉浩', 'gkd'].__iter__()
while True:
try:
item = list_iter.__next__()
print(item)
except StopIteration:
break
range()究竟是什么借用上面的知识,一起来判定一下 range() 究竟是可迭代对象还是迭代器?from collections import Iterable
print(isinstance(range(10), Iterable))
# True
print('__iter__' in dir(range(10)))
# True
print('__next__' in dir(range(10)))
# False
所以 range() 是一个可迭代对象,并不是迭代器【for】存在的意义从上面的讨论中我们知道 for 是基于迭代器协议,调用__iter__()方法将数据容器转化为迭代器,并用__next__()一个接着一个的取出数据来实现对数据容器的循环遍历的。但是我们好像使用 while 就可以轻松实现 for 的功能。例如对于一个列表:li = [1, 2, 3, 6324, '国机二院徐嘉浩', 'gkd']
index = 0
while index < len(li):
print(li[index])
index += 1
是不是很轻松? 那 for 还有存在的意义吗?我们在 while 中实现的循环遍历是基于列表的下标的。 对于序列类型的数据容器我们都可以用 while 去实现遍历。 那么 像 字典,集合, 文件对象这类非序列类型数据容器呢?for 存在的意义就是对于非序列类型的数据容器也可以实现遍历。认识生成器为什么要使用迭代器呢? 除了可以实现对非序列类型的数据容器的取值,还有什么好处呢?迭代器是一个接一个取值的,可以做到需要多少就取多少。好处就是可以节省内存。在实际开发过程中,内存问题是我们必须要考虑的问题。 很多时候为了节省内存,我们需要自己写能实现迭代器功能的东西,这种东西就叫做生成器。
生成器Generator:  本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)  特点:惰性运算,开发者自定义
Python 中提供的两种生成器:生成器函数:常规函数定义。但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行。生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表。生成器函数初次见面,生成器函数你好!包含关键字 yield 的函数就是生成器函数。yield 也可以像 return 一样为我们从函数中返回值。 但不同于 return 的是, 函数执行到 yield 这一步时不会终止程序,而是将程序挂起,在下一次调用时会紧接着上次断开的位置继续执行。 所以一个 生成器函数中可以存在多次 yield 函数。 直接调用生成器函数不会返回一个具体的值,而是得到一个迭代器。 正是这个迭代器一次一次的获取值,才推动生成器函数的执行。import time
from collections import Iterable
def generator_fuc():
a = 1
print('here is a')
yield a
print('o'*30)
# 停顿3秒后才执行这句输出,说明第一次调用g1时,在yield a执行结束后,程序就挂起了
b = 2
print('here is b')
yield b
g1 = generator_fuc()
# 调用生成器函数
print(g1)
# 打印g1,得到<generator object generator_fuc at 0x000001F8076351A8>,说明g1是一个生成器
# 验证生成器g1就是个迭代器
print(isinstance(g1, Iterable))
print('__iter__' in dir(g1))
print('__next__' in dir(g1))
print('\n' + '-'*30 + '\n')
# 我是分割线
print(next(g1))
time.sleep(3)
print(next(g1))
那么生成器有什么好处呢? 这样的取值方式比一次性取完保存到内存中有哪些优点呢?显而易见,生成器可以避免一次性在内存中产生太多的数据。 基于生成器的这种特性,可以做到即用即取。例如,公司需要生产一批零部件用于组装产品。 计划组装产品10万个,那么也就需要10万个零部件。 在实际的生产过程中,不可能说公司一次性生产完10万个零部件,才开始组装产品。 这样做可能早就错过了产品的抢占市场的时机或者是最佳销售期。 所以要按照批次生产零部件,组装产品。假设一个批次生产1000个零部件:def produce():
"""生产零部件"""
for i in range(100000):
yield '这是生产的第%s件零部件' % i
# 检测是否能顺利生产
product_g = produce()
print(product_g.__next__())
print(product_g.__next__())
print(product_g.__next__())
# 生产第一个批次
product_g1 = produce()
num = 0
for item in product_g1:
print(item)
num += 1
if num == 1000:
break
生成器监听文件输入def detector(filename):
f = open(filename, mode='r', encoding='utf-8')
f.seek(0, 2)
# 将光标移动到文件末尾
while True:
content = f.readline()
if content.strip():
yield content.strip()
detector_g = detector('A.txt')
for line in detector_g:
print(line)
利用生成器监测文件中的输入内容。运行生成器程序时,在文件中输入的内容会输出到Python输出的控制台中。注意: 因为不同电脑本地运行的区别,监测不一定是及时的,可能会出现较长时间的停滞反应。send的用法关于 send 怎么用,我们直接来看一段代码def generator():
print('冲冲冲')
content = yield 4396
# 注意这里!! yield 4396 不仅是一个表达式,也变成了一个值,并赋给了content
print('content =', content)
# content == 7777777
print('冲冲冲')
yield 2800
g = generator()
ret1 = g.__next__()
print('ret1 =', ret1)
ret2 = g.send(7777777)
print('ret2 =', ret2)
运行一下,我们发现 content 的值是 7777777。仔细阅读这段代码,我们发现了和前面写的生成器函数不同的地方。 yield 不仅仅是用来为生成器返回值了,它也可以为生成器函数中的变量赋值。send() 和__next__()在接收生成器中的值的作用上并没有什么差别,不同的是 send() 在接收当前 yield 返回的值之外,还可以从外部往上一个 yield 的位置传递一个值。所以在使用 send() 的时候,我们需要注意:1. 第一次调用生成器的时候,必须使用__next__(),或者是send(None)2. 生成器函数中的最后一个 yield 是不能接收到外部的值的。程序实例: 实时计算平均数。 计算当前从键盘输入的所有数字的平均值。def average_num():
total = 0.0
cnt = 0
avg = None
while True:
term = yield avg
total += term
cnt += 1
avg = total/cnt
g_avg = average_num()
next(g_avg)
while True:
A = input()
if A.isdigit():
# 如果A是数字组成的
print(g_avg.send(int(A)))
if A == 'Break':
break
带预激协程的生成器预激协程就是用来预先激活生成器的协助程序。在一些场景中,使用生成器的时候侧重 send() 的功能,那么第一次的yield返回值就不重要了。我们每一次碰到这样的场景都需要先写一个 next( g ) 来激活生成器。 为了更方便,更规范(代码尽量模块化);我们借助装饰器来帮我们完成这个步骤。以上面的 “实时计算平均数” 的程序为例:from functools import wraps
def wrapper(fun):
@wraps(fun)
def inner(*args, **kwargs):
g = fun(*args, **kwargs)
next(g)
return g
return inner
@wrapper
def average_num():
total = 0.0
cnt = 0
avg = None
while True:
term = yield avg
total += term
cnt += 1
avg = total/cnt
g_avg = average_num()
# next(g_avg)
装饰器函数已经提前完成了这一步
while True:
A = input()
if A.isdigit():
# 如果A是数字组成的
print(g_avg.send(int(A)))
if A == 'Break':
break
yield fromyield from 后面接可迭代对象。 可以是普通的可迭代对象,迭代器;也可以是一个生成器。yield from可以把可迭代对象里的每个元素一个一个的 yield 出来,对比 yield 来说代码更加简洁,结构更加清晰。def gen1():
for s in 'abc':
yield s
for i in range(3):
yield i
print(list(gen1()))
def gen2():
yield from 'abc'
yield from range(3)
print(list(gen2()))
生成器表达式前面我们学过了 列表推导式, 可以用一句话表示出列表的构造。 生成器表达式也具有这个功能。也可以用一句话表示出生成器。而且它与列表推导式的区别仅仅是将 [] 换成了 () 。但是生成器表达式更加的节省内存。例如:list_even_num = [i for i in range(20) if i % 2 == 0]
print(list_even_num)
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
gen_even_num = (i for i in range(20) if i % 2 == 0)
print(gen_even_num)
# <generator object <genexpr> at 0x0000025F37E61D00>
print(next(gen_even_num))
# 0
for i in gen_even_num:
print(i, ' ', end='')
# 2
4
6
8
10
12
14
16
18
Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。例如,sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议.。
所以,我们可以直接这样计算一系列值的和:sum(i for i in range(20) if i % 2 == 0)
而不用多此一举地构造一个列表:sum([i for i in range(20) if i % 2 == 0])
文章参考于:http://www.cnblogs.com/Eva-J/articles/7213953.html}

我要回帖

更多关于 现代课程网 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信