Python之生成器和一些重要的推导式

生成器

生成器的实质就是迭代器。

在Python中有三种方式来获取生成器:

1. 通过函数生成;

2. 通过各种推导公式来实现;

3. 通过数据转换获取。

接下来看这个实例:

def func():
    print("111")
    return 222


ret = func()
print(ret)

结果:

111
222

Process finished with exit code 0

这是一个很简单的函数,在这里不多赘述。在这里我们将return换为yield就是生成器:

def func():
    print("111")
    yield 222


ret = func()
print(ret

结果:

<generator object func at 0x0000000000D6D3B8>

Process finished with exit code 0

明显看出运结果与上面的不一样,这是由于函数中存在yield,那么这个函数就是一个生成器。

在执行函数的时候就不再是函数的执行了,而是获取这个生成器,故而显示生成器的地址。

再Python中,生成器的本质就是迭代器,我们可以通过执行__next__()来执行获取结果:

def func():
    print("111")
    yield 222


gener = func()  # 这个时候函数不会执行,而是获取到生成器
ret = gener.__next__()  # 这个时候函数才会执行. yield的作用和return一样. 也是返回数据
print(ret)

结果:

111
222

Process finished with exit code 0

从上面的执行结果我们可以看出,yield的执行效果和return一样的。在本质上它们是不一样的:

return是直接结束函数的执行,yield是分段来执行函数。

def func():
    print("111")
    yield 222
    print("333")
    yield 444


gener = func()
ret = gener.__next__()
print(ret)
ret2 = gener.__next__()
print(ret2)
ret3 = gener.__next__()  # 最后一个yield执行完毕. 再次__next__()程序报错, 也就是说. 和return无关
print(ret3)

结果:

111
Traceback (most recent call last):
222
333
  File "D:/AiBentao/Python/DayThirteen/Basic.py", line 182, in <module>
444
    ret3 = gener.__next__()  # 最后一个yield执行完毕,再次__next__()程序报错, 也就是说,和return无关了.
StopIteration

Process finished with exit code 1

当程序运行完最后一个yield,那么后面继续运行__next__()会报错,就像迭代器迭代次数变多了一样出现StopInteraction错误。

生成器的作用:

假如某学校要采购1000套衣服,我们或许会这样写。

def cloth():
    lst = []
    for i in range(0, 1000):
        lst.append("学校衣服" + str(i))
    return lst


cl = cloth()
print(cl)

结果:

['学校衣服0', '学校衣服1', '学校衣服2', '学校衣服3', '学校衣服4', '学校衣服5', '学校衣服6', '学校衣服7', '学校衣服8', '学校衣服9', '学校衣服10', '学校衣服11', '学校衣服12', '学校衣服13', '学校衣服14', '学校衣服15', '学校衣服16', '学校衣服17', '学校衣服18', '学校衣服19', '学校衣服20', '学校衣服21', '学校衣服22', '学校衣服23', '学校衣服24', '学校衣服25', '学校衣服26', '学校衣服27', '学校衣服28', '学校衣服29', '学校衣服30', '学校衣服31', '学校衣服32', '学校衣服33', '学校衣服34', '学校衣服35', '学校衣服36', '学校衣服37', '学校衣服38', '学校衣服39', '学校衣服40', '学校衣服41', '学校衣服42', '学校衣服43', '学校衣服44', '学校衣服45', '学校衣服46', '学校衣服47', '学校衣服48', '学校衣服49', '学校衣服50', '学校衣服51', '学校衣服52', '学校衣服53', '学校衣服54', '学校衣服55', '学校衣服56', '学校衣服57', '学校衣服58', '学校衣服59', '学校衣服60', '学校衣服61', '学校衣服62', '学校衣服63', '学校衣服64', '学校衣服65', '学校衣服66', '学校衣服67', '学校衣服68', '学校衣服69', '学校衣服70', '学校衣服71', '学校衣服72', '学校衣服73', '学校衣服74', '学校衣服75', '学校衣服76', '学校衣服77', '学校衣服78', '学校衣服79', '学校衣服80', '学校衣服81', '学校衣服82', '学校衣服83', '学校衣服84', '学校衣服85', '学校衣服86', '学校衣服87', '学校衣服88', '学校衣服89', '学校衣服90', '学校衣服91', '学校衣服92', '学校衣服93', '学校衣服94', '学校衣服95', '学校衣服96', '学校衣服97', '学校衣服98', '学校衣服99', '学校衣服100', '学校衣服101', '学校衣服102', '学校衣服103', '学校衣服104', '学校衣服105', '学校衣服106', '学校衣服107', '学校衣服108', '学校衣服109', '学校衣服110', '学校衣服111', '学校衣服112', '学校衣服113', '学校衣服114', '学校衣服115', '学校衣服116', '学校衣服117', '学校衣服118', '学校衣服119', '学校衣服120', '学校衣服121', '学校衣服122', '学校衣服123', '学校衣服124', '学校衣服125', '学校衣服126', '学校衣服127', '学校衣服128', '学校衣服129', '学校衣服130', '学校衣服131', '学校衣服132', '学校衣服133', '学校衣服134', '学校衣服135', '学校衣服136', '学校衣服137', '学校衣服138', '学校衣服139', '学校衣服140', '学校衣服141', '学校衣服142', '学校衣服143', '学校衣服144', '学校衣服145', '学校衣服146', '学校衣服147', '学校衣服148', '学校衣服149', '学校衣服150', '学校衣服151', '学校衣服152', '学校衣服153', '学校衣服154', '学校衣服155', '学校衣服156', '学校衣服157', '学校衣服158', '学校衣服159', '学校衣服160', '学校衣服161', '学校衣服162', '学校衣服163', '学校衣服164', '学校衣服165', '学校衣服166', '学校衣服167', '学校衣服168', '学校衣服169', '学校衣服170', '学校衣服171', '学校衣服172', '学校衣服173', '学校衣服174', '学校衣服175', '学校衣服176', '学校衣服177', '学校衣服178', '学校衣服179', '学校衣服180', '学校衣服181', '学校衣服182', '学校衣服183', '学校衣服184', '学校衣服185', '学校衣服186', '学校衣服187', '学校衣服188', '学校衣服189', '学校衣服190', '学校衣服191', '学校衣服192', '学校衣服193', '学校衣服194', '学校衣服195', '学校衣服196', '学校衣服197', '学校衣服198', '学校衣服199', '学校衣服200', '学校衣服201', '学校衣服202', '学校衣服203', '学校衣服204', '学校衣服205', '学校衣服206', '学校衣服207', '学校衣服208', '学校衣服209', '学校衣服210', '学校衣服211', '学校衣服212', '学校衣服213', '学校衣服214', '学校衣服215', '学校衣服216', '学校衣服217', '学校衣服218', '学校衣服219', '学校衣服220', '学校衣服221', '学校衣服222', '学校衣服223', '学校衣服224', '学校衣服225', '学校衣服226', '学校衣服227', '学校衣服228', '学校衣服229', '学校衣服230', '学校衣服231', '学校衣服232', '学校衣服233', '学校衣服234', '学校衣服235', '学校衣服236', '学校衣服237', '学校衣服238', '学校衣服239', '学校衣服240', '学校衣服241', '学校衣服242', '学校衣服243', '学校衣服244', '学校衣服245', '学校衣服246', '学校衣服247', '学校衣服248', '学校衣服249', '学校衣服250', '学校衣服251', '学校衣服252', '学校衣服253', '学校衣服254', '学校衣服255', '学校衣服256', '学校衣服257', '学校衣服258', '学校衣服259', '学校衣服260', '学校衣服261', '学校衣服262', '学校衣服263', '学校衣服264', '学校衣服265', '学校衣服266', '学校衣服267', '学校衣服268', '学校衣服269', '学校衣服270', '学校衣服271', '学校衣服272', '学校衣服273', '学校衣服274', '学校衣服275', '学校衣服276', '学校衣服277', '学校衣服278', '学校衣服279', '学校衣服280', '学校衣服281', '学校衣服282', '学校衣服283', '学校衣服284', '学校衣服285', '学校衣服286', '学校衣服287', '学校衣服288', '学校衣服289', '学校衣服290', '学校衣服291', '学校衣服292', '学校衣服293', '学校衣服294', '学校衣服295', '学校衣服296', '学校衣服297', '学校衣服298', '学校衣服299', '学校衣服300', '学校衣服301', '学校衣服302', '学校衣服303', '学校衣服304', '学校衣服305', '学校衣服306', '学校衣服307', '学校衣服308', '学校衣服309', '学校衣服310', '学校衣服311', '学校衣服312', '学校衣服313', '学校衣服314', '学校衣服315', '学校衣服316', '学校衣服317', '学校衣服318', '学校衣服319', '学校衣服320', '学校衣服321', '学校衣服322', '学校衣服323', '学校衣服324', '学校衣服325', '学校衣服326', '学校衣服327', '学校衣服328', '学校衣服329', '学校衣服330', '学校衣服331', '学校衣服332', '学校衣服333', '学校衣服334', '学校衣服335', '学校衣服336', '学校衣服337', '学校衣服338', '学校衣服339', '学校衣服340', '学校衣服341', '学校衣服342', '学校衣服343', '学校衣服344', '学校衣服345', '学校衣服346', '学校衣服347', '学校衣服348', '学校衣服349', '学校衣服350', '学校衣服351', '学校衣服352', '学校衣服353', '学校衣服354', '学校衣服355', '学校衣服356', '学校衣服357', '学校衣服358', '学校衣服359', '学校衣服360', '学校衣服361', '学校衣服362', '学校衣服363', '学校衣服364', '学校衣服365', '学校衣服366', '学校衣服367', '学校衣服368', '学校衣服369', '学校衣服370', '学校衣服371', '学校衣服372', '学校衣服373', '学校衣服374', '学校衣服375', '学校衣服376', '学校衣服377', '学校衣服378', '学校衣服379', '学校衣服380', '学校衣服381', '学校衣服382', '学校衣服383', '学校衣服384', '学校衣服385', '学校衣服386', '学校衣服387', '学校衣服388', '学校衣服389', '学校衣服390', '学校衣服391', '学校衣服392', '学校衣服393', '学校衣服394', '学校衣服395', '学校衣服396', '学校衣服397', '学校衣服398', '学校衣服399', '学校衣服400', '学校衣服401', '学校衣服402', '学校衣服403', '学校衣服404', '学校衣服405', '学校衣服406', '学校衣服407', '学校衣服408', '学校衣服409', '学校衣服410', '学校衣服411', '学校衣服412', '学校衣服413', '学校衣服414', '学校衣服415', '学校衣服416', '学校衣服417', '学校衣服418', '学校衣服419', '学校衣服420', '学校衣服421', '学校衣服422', '学校衣服423', '学校衣服424', '学校衣服425', '学校衣服426', '学校衣服427', '学校衣服428', '学校衣服429', '学校衣服430', '学校衣服431', '学校衣服432', '学校衣服433', '学校衣服434', '学校衣服435', '学校衣服436', '学校衣服437', '学校衣服438', '学校衣服439', '学校衣服440', '学校衣服441', '学校衣服442', '学校衣服443', '学校衣服444', '学校衣服445', '学校衣服446', '学校衣服447', '学校衣服448', '学校衣服449', '学校衣服450', '学校衣服451', '学校衣服452', '学校衣服453', '学校衣服454', '学校衣服455', '学校衣服456', '学校衣服457', '学校衣服458', '学校衣服459', '学校衣服460', '学校衣服461', '学校衣服462', '学校衣服463', '学校衣服464', '学校衣服465', '学校衣服466', '学校衣服467', '学校衣服468', '学校衣服469', '学校衣服470', '学校衣服471', '学校衣服472', '学校衣服473', '学校衣服474', '学校衣服475', '学校衣服476', '学校衣服477', '学校衣服478', '学校衣服479', '学校衣服480', '学校衣服481', '学校衣服482', '学校衣服483', '学校衣服484', '学校衣服485', '学校衣服486', '学校衣服487', '学校衣服488', '学校衣服489', '学校衣服490', '学校衣服491', '学校衣服492', '学校衣服493', '学校衣服494', '学校衣服495', '学校衣服496', '学校衣服497', '学校衣服498', '学校衣服499', '学校衣服500', '学校衣服501', '学校衣服502', '学校衣服503', '学校衣服504', '学校衣服505', '学校衣服506', '学校衣服507', '学校衣服508', '学校衣服509', '学校衣服510', '学校衣服511', '学校衣服512', '学校衣服513', '学校衣服514', '学校衣服515', '学校衣服516', '学校衣服517', '学校衣服518', '学校衣服519', '学校衣服520', '学校衣服521', '学校衣服522', '学校衣服523', '学校衣服524', '学校衣服525', '学校衣服526', '学校衣服527', '学校衣服528', '学校衣服529', '学校衣服530', '学校衣服531', '学校衣服532', '学校衣服533', '学校衣服534', '学校衣服535', '学校衣服536', '学校衣服537', '学校衣服538', '学校衣服539', '学校衣服540', '学校衣服541', '学校衣服542', '学校衣服543', '学校衣服544', '学校衣服545', '学校衣服546', '学校衣服547', '学校衣服548', '学校衣服549', '学校衣服550', '学校衣服551', '学校衣服552', '学校衣服553', '学校衣服554', '学校衣服555', '学校衣服556', '学校衣服557', '学校衣服558', '学校衣服559', '学校衣服560', '学校衣服561', '学校衣服562', '学校衣服563', '学校衣服564', '学校衣服565', '学校衣服566', '学校衣服567', '学校衣服568', '学校衣服569', '学校衣服570', '学校衣服571', '学校衣服572', '学校衣服573', '学校衣服574', '学校衣服575', '学校衣服576', '学校衣服577', '学校衣服578', '学校衣服579', '学校衣服580', '学校衣服581', '学校衣服582', '学校衣服583', '学校衣服584', '学校衣服585', '学校衣服586', '学校衣服587', '学校衣服588', '学校衣服589', '学校衣服590', '学校衣服591', '学校衣服592', '学校衣服593', '学校衣服594', '学校衣服595', '学校衣服596', '学校衣服597', '学校衣服598', '学校衣服599', '学校衣服600', '学校衣服601', '学校衣服602', '学校衣服603', '学校衣服604', '学校衣服605', '学校衣服606', '学校衣服607', '学校衣服608', '学校衣服609', '学校衣服610', '学校衣服611', '学校衣服612', '学校衣服613', '学校衣服614', '学校衣服615', '学校衣服616', '学校衣服617', '学校衣服618', '学校衣服619', '学校衣服620', '学校衣服621', '学校衣服622', '学校衣服623', '学校衣服624', '学校衣服625', '学校衣服626', '学校衣服627', '学校衣服628', '学校衣服629', '学校衣服630', '学校衣服631', '学校衣服632', '学校衣服633', '学校衣服634', '学校衣服635', '学校衣服636', '学校衣服637', '学校衣服638', '学校衣服639', '学校衣服640', '学校衣服641', '学校衣服642', '学校衣服643', '学校衣服644', '学校衣服645', '学校衣服646', '学校衣服647', '学校衣服648', '学校衣服649', '学校衣服650', '学校衣服651', '学校衣服652', '学校衣服653', '学校衣服654', '学校衣服655', '学校衣服656', '学校衣服657', '学校衣服658', '学校衣服659', '学校衣服660', '学校衣服661', '学校衣服662', '学校衣服663', '学校衣服664', '学校衣服665', '学校衣服666', '学校衣服667', '学校衣服668', '学校衣服669', '学校衣服670', '学校衣服671', '学校衣服672', '学校衣服673', '学校衣服674', '学校衣服675', '学校衣服676', '学校衣服677', '学校衣服678', '学校衣服679', '学校衣服680', '学校衣服681', '学校衣服682', '学校衣服683', '学校衣服684', '学校衣服685', '学校衣服686', '学校衣服687', '学校衣服688', '学校衣服689', '学校衣服690', '学校衣服691', '学校衣服692', '学校衣服693', '学校衣服694', '学校衣服695', '学校衣服696', '学校衣服697', '学校衣服698', '学校衣服699', '学校衣服700', '学校衣服701', '学校衣服702', '学校衣服703', '学校衣服704', '学校衣服705', '学校衣服706', '学校衣服707', '学校衣服708', '学校衣服709', '学校衣服710', '学校衣服711', '学校衣服712', '学校衣服713', '学校衣服714', '学校衣服715', '学校衣服716', '学校衣服717', '学校衣服718', '学校衣服719', '学校衣服720', '学校衣服721', '学校衣服722', '学校衣服723', '学校衣服724', '学校衣服725', '学校衣服726', '学校衣服727', '学校衣服728', '学校衣服729', '学校衣服730', '学校衣服731', '学校衣服732', '学校衣服733', '学校衣服734', '学校衣服735', '学校衣服736', '学校衣服737', '学校衣服738', '学校衣服739', '学校衣服740', '学校衣服741', '学校衣服742', '学校衣服743', '学校衣服744', '学校衣服745', '学校衣服746', '学校衣服747', '学校衣服748', '学校衣服749', '学校衣服750', '学校衣服751', '学校衣服752', '学校衣服753', '学校衣服754', '学校衣服755', '学校衣服756', '学校衣服757', '学校衣服758', '学校衣服759', '学校衣服760', '学校衣服761', '学校衣服762', '学校衣服763', '学校衣服764', '学校衣服765', '学校衣服766', '学校衣服767', '学校衣服768', '学校衣服769', '学校衣服770', '学校衣服771', '学校衣服772', '学校衣服773', '学校衣服774', '学校衣服775', '学校衣服776', '学校衣服777', '学校衣服778', '学校衣服779', '学校衣服780', '学校衣服781', '学校衣服782', '学校衣服783', '学校衣服784', '学校衣服785', '学校衣服786', '学校衣服787', '学校衣服788', '学校衣服789', '学校衣服790', '学校衣服791', '学校衣服792', '学校衣服793', '学校衣服794', '学校衣服795', '学校衣服796', '学校衣服797', '学校衣服798', '学校衣服799', '学校衣服800', '学校衣服801', '学校衣服802', '学校衣服803', '学校衣服804', '学校衣服805', '学校衣服806', '学校衣服807', '学校衣服808', '学校衣服809', '学校衣服810', '学校衣服811', '学校衣服812', '学校衣服813', '学校衣服814', '学校衣服815', '学校衣服816', '学校衣服817', '学校衣服818', '学校衣服819', '学校衣服820', '学校衣服821', '学校衣服822', '学校衣服823', '学校衣服824', '学校衣服825', '学校衣服826', '学校衣服827', '学校衣服828', '学校衣服829', '学校衣服830', '学校衣服831', '学校衣服832', '学校衣服833', '学校衣服834', '学校衣服835', '学校衣服836', '学校衣服837', '学校衣服838', '学校衣服839', '学校衣服840', '学校衣服841', '学校衣服842', '学校衣服843', '学校衣服844', '学校衣服845', '学校衣服846', '学校衣服847', '学校衣服848', '学校衣服849', '学校衣服850', '学校衣服851', '学校衣服852', '学校衣服853', '学校衣服854', '学校衣服855', '学校衣服856', '学校衣服857', '学校衣服858', '学校衣服859', '学校衣服860', '学校衣服861', '学校衣服862', '学校衣服863', '学校衣服864', '学校衣服865', '学校衣服866', '学校衣服867', '学校衣服868', '学校衣服869', '学校衣服870', '学校衣服871', '学校衣服872', '学校衣服873', '学校衣服874', '学校衣服875', '学校衣服876', '学校衣服877', '学校衣服878', '学校衣服879', '学校衣服880', '学校衣服881', '学校衣服882', '学校衣服883', '学校衣服884', '学校衣服885', '学校衣服886', '学校衣服887', '学校衣服888', '学校衣服889', '学校衣服890', '学校衣服891', '学校衣服892', '学校衣服893', '学校衣服894', '学校衣服895', '学校衣服896', '学校衣服897', '学校衣服898', '学校衣服899', '学校衣服900', '学校衣服901', '学校衣服902', '学校衣服903', '学校衣服904', '学校衣服905', '学校衣服906', '学校衣服907', '学校衣服908', '学校衣服909', '学校衣服910', '学校衣服911', '学校衣服912', '学校衣服913', '学校衣服914', '学校衣服915', '学校衣服916', '学校衣服917', '学校衣服918', '学校衣服919', '学校衣服920', '学校衣服921', '学校衣服922', '学校衣服923', '学校衣服924', '学校衣服925', '学校衣服926', '学校衣服927', '学校衣服928', '学校衣服929', '学校衣服930', '学校衣服931', '学校衣服932', '学校衣服933', '学校衣服934', '学校衣服935', '学校衣服936', '学校衣服937', '学校衣服938', '学校衣服939', '学校衣服940', '学校衣服941', '学校衣服942', '学校衣服943', '学校衣服944', '学校衣服945', '学校衣服946', '学校衣服947', '学校衣服948', '学校衣服949', '学校衣服950', '学校衣服951', '学校衣服952', '学校衣服953', '学校衣服954', '学校衣服955', '学校衣服956', '学校衣服957', '学校衣服958', '学校衣服959', '学校衣服960', '学校衣服961', '学校衣服962', '学校衣服963', '学校衣服964', '学校衣服965', '学校衣服966', '学校衣服967', '学校衣服968', '学校衣服969', '学校衣服970', '学校衣服971', '学校衣服972', '学校衣服973', '学校衣服974', '学校衣服975', '学校衣服976', '学校衣服977', '学校衣服978', '学校衣服979', '学校衣服980', '学校衣服981', '学校衣服982', '学校衣服983', '学校衣服984', '学校衣服985', '学校衣服986', '学校衣服987', '学校衣服988', '学校衣服989', '学校衣服990', '学校衣服991', '学校衣服992', '学校衣服993', '学校衣服994', '学校衣服995', '学校衣服996', '学校衣服997', '学校衣服998', '学校衣服999']

Process finished with exit code 0

怎么样,是不是感觉很多?可是我只打印了1000套,要是10000、或者100万呢,或者说该学校没法一次招收1000人,那么问题来了,我这1000套衣服一次性拿到手还得占内存空间,造成了很多浪费。最好的方法就是我需要多少就是多少,直接根据需求来,这时,我们就需要一个迭代器,来帮助我们解决相关问题:

def cloth():
    for i in range(0, 10000):
        yield "学校衣服" + str(i)


cl = cloth()
print(cl.__next__())
print(cl.__next__())
print(cl.__next__())
print(cl.__next__())

结果:

学校衣服0
学校衣服1
学校衣服2
学校衣服3

Process finished with exit code 0

现在我可以根据需求来取值,在总数不变的情况下,本地调用是不是节约内存空间了。

send()和__next__()

1. send()和__next__()都是让生成器向下走一次。

2. send()可以给上一个yield的位置传递,不能给最后一个yield发送信息,在第一次执行生成代码时候不能用send()。

生成器可以使用for循环来获取内部元素:

def func():
    print(111)
    yield 222
    print(333)
    yield 444
    print(555)
    yield 666


gen = func()
for i in gen:
    print(i)

结果:

111
222
333
444
555
666

Process finished with exit code 0

下面是使用send()的案例:

def eat():
    print("我吃什么啊?")
    a = yield "馒头"
    print("a = ", a)
    b = yield "包子"
    print("b = ", b)
    c = yield "米饭"
    print("c = ", c)
    yield "GAME OVER"


g = eat()
ret1 = g.__next__()  # 第一次执行时候不能使用send()
print(ret1)
print("------------Split Line-----------")
ret2 = g.send("饺子")
print(ret2)
print("------------Split Line-----------")
ret3 = g.send("面食")
print(ret3)
print("------------Split Line-----------")
ret4 = g.__next__()  # 运行结束后,yield返回None
print(ret4)

结果:

我吃什么啊?
馒头
------------Split Line-----------
a =  饺子
包子
------------Split Line-----------
b =  面食
米饭
------------Split Line-----------
c =  None
GAME OVER

Process finished with exit code 0

分析:g = eat()获取函数生成器,调用__next__()时,函数打印我吃什么,然后打印馒头,此时理论上不给a赋值的话,将返回None,但是我们可以使用send()通过生成器对a赋值,使之获得“饺子”字符串,所以打印a = “饺子”,程序往下执行亦是如此。

列表推导式,生成器表达式和其它推导式

列表推导式

如果我们要向列表中中添加1-15,我们或许可以这样做:

lst = []
for i in range(1, 16):
    lst.append(i)
print(lst)

结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

Process finished with exit code 0

看上起还不错,但是你知道吗?我们可以利用一行代码直接把list表示出来:

lst = [i for i in range(1, 16)]
print(lst)

结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

Process finished with exit code 0

这样看上去是不是很简单,这就是列表推导式,其值返回为一个列表,其一般用法如下:

[结果 for 变量 in 可迭代对象]

例如我要打印1到9年级,我可以这样做:

lst = ['%s年级' % i for i in range(1, 10)]
print(lst)

结果:

['1年级', '2年级', '3年级', '4年级', '5年级', '6年级', '7年级', '8年级', '9年级']

Process finished with exit code 0

我们也可以对数据操作进行筛选:

[结果 for 变量 in 可迭代对象 if 条件]

获取100以内的偶数:

lst = [i for i in range(1, 101) if i % 2 == 0]
print(lst)

结果:

[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100]

Process finished with exit code 0

练习1:寻找名字中带有两个e的人名

names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'], ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]

当我们不用列表推导式:

names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
         ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]

result = []
for first in names:
    for name in first:
        if name.count("e") >= 2:
            result.append(name)
print(result)

结果:

['Jefferson', 'Wesley', 'Steven', 'Jennifer']

Process finished with exit code 0

当我们使用列表推导式:

names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
         ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]

lst = [e for i in names for e in i if e.count('e') == 2]
print(lst)

结果:

['Jefferson', 'Wesley', 'Steven', 'Jennifer']

Process finished with exit code 0

生成器表达式

生成器表达式和列表表达式差不多,只是把[]换为()即可:

gen = (i for i in range(10))
print(gen)

结果:

<generator object <genexpr> at 0x000000000081D3B8>

Process finished with exit code 0

打印的结果为生成器,我们可以使用for循环来遍历生成器:

gen = ("麻花藤我第%s次爱你" % i for i in range(10))
for i in gen:
    print(i)

结果:

麻花藤我第0次爱你
麻花藤我第1次爱你
麻花藤我第2次爱你
麻花藤我第3次爱你
麻花藤我第4次爱你
麻花藤我第5次爱你
麻花藤我第6次爱你
麻花藤我第7次爱你
麻花藤我第8次爱你
麻花藤我第9次爱你

Process finished with exit code 0

生成器表达式也可以进行筛选:

(结果 for 变量 in 可迭代对象 if 条件)

练习2: 获取1到50内可以被3整除的整数:

gen = (i for i in range(1, 50) if i % 3 == 0)
for num in gen:
    print(num)

结果:

3
6
9
12
15
18
21
24
27
30
33
36
39
42
45
48

Process finished with exit code 0

请记住生成器表达式和列表表达式在输出的时候区别,列表输出为列表,生成器则不是。

练习3: 获取1到50以内能被3整除的数的平方:

gen = (i * i for i in range(1, 50) if i % 3 == 0)
for num in gen:
    print(num)

结果:

9
36
81
144
225
324
441
576
729
900
1089
1296
1521
1764
2025
2304

Process finished with exit code 0

练习4:寻找名字中带有两个e的人名

names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'], ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]

利用推导式我们也可以做这道题:

names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
         ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]

gen = (name for first in names for name in first if name.count("e") >= 2)
for name in gen:
    print(name)

结果:

Jefferson
Wesley
Steven
Jennifer

Process finished with exit code 0

只不过输出不是列表而已。

生成器表达式和列表推导式的区别:

1. 列表推导式比较耗内存,一次性加载。生成器表达式几乎不占用内存,使用的时候才分配和使用内存。

2. 得到的值不一样,列表推导式得到的是一个列表,生成器表达式获取的是一个生成器,但是你可以遍历输出。

总结:生成器具有惰性机制,生成器只有在访问时候才取值(面试专用)。

字典推导式

互换key和value值

dic = {'a': 1, 'b': '2'}
new_dic = {dic[key]: key for key in dic}
print(new_dic)

结果:

{1: 'a', '2': 'b'}

Process finished with exit code 0

将两个list中对应的数据组成字典:

lst1 = ['jay', 'jj', 'Andy']
lst2 = ['周杰伦', '林俊杰', '刘德华']
dic = {lst1[i]: lst2[i] for i in range(len(lst1))}
print(dic)

结果:

{'jj': '林俊杰', 'Andy': '刘德华', 'jay': '周杰伦'}

Process finished with exit code 0

集合推导式

在高中必修一我们学了集合,集合就是一类元素的总称,集合中的元素必须满足三大性质:

1. 确定性

2. 互异性

3. 无序性

下面我们研究将一个列表中数字绝对值化后去重:

lst = [1, -1, 8, -8, 12, -1, 8, -7, -4, 5, 6, 1, -9, -3, 4]
s = {abs(i) for i in lst}
print(s)

结果:

{1, 3, 4, 5, 6, 7, 8, 9, 12}

Process finished with exit code 0

总结:推导式有,列表推导式,字典推导式和集合推导式(没有元组推导式,因为元组固定,加上元组推导式与生成器表达式冲突)。

试题5:判断下列代码输出结果(难度系数5星):

def add(a, b):
    return a + b


def test():
    for r_i in range(4):
        yield r_i


g = test()
for n in [2, 10]:
    g = (add(n, i) for i in g)
print(list(g))

结果:

(友情提示:利用生成器的惰性机制,答案下一期。)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值