Python入门篇-解析式、生成器
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.列表解析式(List Comprehension)
1>.列表解析式语法
语法
[ 返回值 for 元素 in 可迭代对象 if 条件]
使用中括号[],内部是for循环,if条件语句可选
返回一个新的列表
列表解析式是一种语法糖
编译器会优化,不会因为简写而影响效率,反而因优化提高了效率
减少程序员工作量,减少出错
简化了代码,但可读性增强
2>.列表解析式案例
#!/usr/bin/env python #_*_coding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ #EMAIL:y1053419035@qq.com """ 生成一个列表,元素0~9,对每一个元素自增1后求平方返回新列表 """ list_1 = list(range(10)) list_2 = [] for i in list_1: list_2.append((i+1)**2) print(list_2) print(type(list_2)) list_1 = list(range(10)) list_2 = [(i+1)**2 for i in list_1] print(list_2) print(type(list_2)) #以上代码执行结果如下 [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] <class 'list'> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] <class 'list'>
3>.小试牛刀
#!/usr/bin/env python #_*_coding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ #EMAIL:y1053419035@qq.com list_1 = [ x * x for x in range(1,11)] print(list_1) #以上代码执行结果如下: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
#!/usr/bin/env python #_*_coding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ #EMAIL:y1053419035@qq.com """ 有一个列表list_1 = [1,4,9,16,2,5,10,15],生成一个新列表,要求新列表元素是lst相邻2项的和 """ list_1 = [1,4,9,16,2,5,10,15] list_2 = [list_1[i] + list_1[i+1] for i in range(len(list_1) -1)] print(list_2) #以上代码执行结果如下: [5, 13, 25, 18, 7, 15, 25]
#!/usr/bin/env python #_*_coding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ #EMAIL:y1053419035@qq.com """ 打印九九乘法表 """ res = " ".join(["".join(["%s x %s = %-5s" % (x,y,y * x) for x in range(1,y+1)]) for y in range(1,10)]) print(res) #以上代码执行结果如下: 1 x 1 = 1 1 x 2 = 2 2 x 2 = 4 1 x 3 = 3 2 x 3 = 6 3 x 3 = 9 1 x 4 = 4 2 x 4 = 8 3 x 4 = 12 4 x 4 = 16 1 x 5 = 5 2 x 5 = 10 3 x 5 = 15 4 x 5 = 20 5 x 5 = 25 1 x 6 = 6 2 x 6 = 12 3 x 6 = 18 4 x 6 = 24 5 x 6 = 30 6 x 6 = 36 1 x 7 = 7 2 x 7 = 14 3 x 7 = 21 4 x 7 = 28 5 x 7 = 35 6 x 7 = 42 7 x 7 = 49 1 x 8 = 8 2 x 8 = 16 3 x 8 = 24 4 x 8 = 32 5 x 8 = 40 6 x 8 = 48 7 x 8 = 56 8 x 8 = 64 1 x 9 = 9 2 x 9 = 18 3 x 9 = 27 4 x 9 = 36 5 x 9 = 45 6 x 9 = 54 7 x 9 = 63 8 x 9 = 72 9 x 9 = 81
#!/usr/bin/env python #_*_coding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ #EMAIL:y1053419035@qq.com """ 打印九九乘法表 """ [print("{} * {} ={:<3}{}".format(j,i,i*j," " if i ==j else ""),end="") for i in range(1,10) for j in range(1,i+1)] #以上代码执行结果如下: 1 * 1 =1 1 * 2 =2 2 * 2 =4 1 * 3 =3 2 * 3 =6 3 * 3 =9 1 * 4 =4 2 * 4 =8 3 * 4 =12 4 * 4 =16 1 * 5 =5 2 * 5 =10 3 * 5 =15 4 * 5 =20 5 * 5 =25 1 * 6 =6 2 * 6 =12 3 * 6 =18 4 * 6 =24 5 * 6 =30 6 * 6 =36 1 * 7 =7 2 * 7 =14 3 * 7 =21 4 * 7 =28 5 * 7 =35 6 * 7 =42 7 * 7 =49 1 * 8 =8 2 * 8 =16 3 * 8 =24 4 * 8 =32 5 * 8 =40 6 * 8 =48 7 * 8 =56 8 * 8 =64 1 * 9 =9 2 * 9 =18 3 * 9 =27 4 * 9 =36 5 * 9 =45 6 * 9 =54 7 * 9 =63 8 * 9 =72 9 * 9 =81
#!/usr/bin/env python #_*_coding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ #EMAIL:y1053419035@qq.com """ "0001.abadicddws" 是ID格式,要求ID格式是以点号分割,左边是4位从1开始的整数,右边是10位随机小写英文字母。请依次生成前100个ID的列表 """ import random,string res1 = ["{:04}.{}".format(i,"".join([chr(random.randint(97,122)) for j in range(10)])) for i in range(1,101)] res2 = ["{:04}.{}".format(n,"".join([random.choice(bytes(range(97,123)).decode()) for _ in range(10)])) for n in range(1,101)] res3 = ["{:>04}.{}".format(i,"".join(random.choice(string.ascii_lowercase) for _ in range(0,10))) for i in range(1,101)] print(res1) print(res2) print(res3) #以上代码执行结果如下: ['0001.quudtiewpp', '0002.ihwsbrghug', '0003.ichxnawosw', '0004.csvzmevqif', '0005.gheosomtpn', '0006.kyxxvhpqea', '0007.lnpfhjzrke', '0008.ucyglsojfg', '0009.rdfupmjulm', '0010.yrerwavqyn', '0011.chutmgknkw', '0012.lfdafymeqf', '0013.ztxrbrhwqc', '0014.uqmxlraebb', '0015.vvaxjnqbfu', '0016.basucfaxex', '0017.wmpkgsfgcm', '0018.sijizstrya', '0019.cwvroppplj', '0020.ihfnsqixfx', '0021.ezztavnddc', '0022.eilltcnlfj', '0023.obrkfodaxb', '0024.gqhlafdglj', '0025.rlvkrgxwpx', '0026.hufplygyyu', '0027.qurywrnkmz', '0028.sphhasflom', '0029.gpsalndboq', '0030.jidwtpsbop', '0031.zjrrlvtqfd', '0032.qbxaicaoif', '0033.voleqxnkra', '0034.obvrnzrswj', '0035.zslocvxoqk', '0036.wonlmolebk', '0037.cnmsfpknwy', '0038.xshjgexqvk', '0039.xiwqjpnojz', '0040.gxrrwalfqn', '0041.zlzesvrzbd', '0042.xyluplwimo', '0043.zzdzpkwsed', '0044.iznretewhb', '0045.kykeccerdx', '0046.jadcvtrquu', '0047.jzhdqsmxpr', '0048.ibziaqutwk', '0049.webxsymmji', '0050.qywfxgixyu', '0051.hoffobqhni', '0052.pgjxehzcro', '0053.vttmvgnfan', '0054.gsxvcccqeo', '0055.hjmumxgbny', '0056.vgzzxkoibg', '0057.zoihdtdpni', '0058.dnygdzocuo', '0059.crdctjxqqx', '0060.gqknctdage', '0061.cfpdiuuikz', '0062.mjesblrdur', '0063.egmemntnsa', '0064.uktovqfgwa', '0065.dyjqlvimkf', '0066.emwkozxiza', '0067.zeiinkerov', '0068.psrrdynpie', '0069.vhmfoiflej', '0070.bisbvnnern', '0071.xduenlwsyw', '0072.xtvzudtlvm', '0073.wwxifqzrfp', '0074.yxzivfzfeb', '0075.hfxnmtemmy', '0076.jlmaprxbik', '0077.wckutjwcuy', '0078.ipiaifiwtk', '0079.kegunlisnm', '0080.xxlbafetra', '0081.bvstasclwv', '0082.xerylawywe', '0083.dsndzdxgfy', '0084.vjpwpxffqw', '0085.lnyqolmysv', '0086.frexwtyyol', '0087.sgeikduvha', '0088.zjuktiszyt', '0089.vhecjvqcne', '0090.dhqghvfzix', '0091.jevryneose', '0092.cfhgfwthyw', '0093.ohaaxfrsoc', '0094.vwfujwvypi', '0095.savgxuqqcl', '0096.cwildgsfev', '0097.ufmsickvgh', '0098.wcztmzuyzk', '0099.ixtzayuqtn', '0100.pvubjozypj'] ['0001.yoszcnfvyo', '0002.rctsnyhbtc', '0003.xgpnwstilw', '0004.saukenphng', '0005.sbvaibqtsk', '0006.nstixljhyf', '0007.dkhbrkknox', '0008.wqkkcbvqwe', '0009.wnreevlgoo', '0010.wpajtxghpl', '0011.erdwlmqyqv', '0012.fgcvfolwln', '0013.iqaeczjxil', '0014.ndkwuwiwhv', '0015.qnakhwvrqx', '0016.tdtbbvsiog', '0017.lhbdvgbgzy', '0018.cpcikaoeyc', '0019.jznhdnaacj', '0020.xrpxsitxdw', '0021.agsafuapzh', '0022.xfmtxygdbs', '0023.ryvmhwsxco', '0024.atymwcbmbq', '0025.hayyciamwb', '0026.tlekkidwcv', '0027.begqfonuvf', '0028.nkyaouexal', '0029.szqpcfxjzs', '0030.bywnuovxaw', '0031.ggtdnvbuev', '0032.wvvtpzlquh', '0033.ieamafydhi', '0034.qpykkalcdx', '0035.bhikiwmgrc', '0036.tutygyfsvx', '0037.tjkbryztwm', '0038.tfggsoqdld', '0039.lgthzpxghb', '0040.ifdfztqlym', '0041.lcfonwpgvr', '0042.iquqizhtnz', '0043.gthghnqjjk', '0044.mvxaxwqptu', '0045.zhxdiftibn', '0046.jxecnyatgw', '0047.nydlkewzrw', '0048.riqgrollof', '0049.wvslbkpntx', '0050.axxefigbgj', '0051.ayibjrpfza', '0052.fispckntxq', '0053.lzcsbuhqsy', '0054.uhigxvabml', '0055.gxjrfescub', '0056.sbeugjhnom', '0057.qkahmccbxc', '0058.fmwecubwqz', '0059.bewmoemrjy', '0060.leepctfanu', '0061.vctmvvjbgz', '0062.wuhgafoytj', '0063.nlenxzmmlm', '0064.ynxxynovzh', '0065.uxbbpbqohr', '0066.ydycbshxoh', '0067.duinjuodtf', '0068.gbbhcddjxe', '0069.nyvwrforwx', '0070.mrurprpruf', '0071.obdxjjsdgs', '0072.vetwnnbrrw', '0073.mxpseksqmj', '0074.vclgvikgwz', '0075.hlrpyglgxp', '0076.syfcfascii', '0077.fslkvteijy', '0078.drrfojksyj', '0079.drurarrrfx', '0080.waqkmyyaon', '0081.fuabocvqnm', '0082.rsqtporbgt', '0083.dldxzujryp', '0084.xtkmjdzjza', '0085.qppkaeysbi', '0086.jjjvcqybdw', '0087.dlsiajdnjj', '0088.xsnejcumui', '0089.yjpekctcvk', '0090.kxklxoqoka', '0091.tbgiwquawp', '0092.pmrnczangp', '0093.vmdzjarahu', '0094.pqubbextdm', '0095.ytxluuukcf', '0096.lfomlgbakr', '0097.hibjuuparc', '0098.ugtbxlnjzp', '0099.cxccvbeyxs', '0100.cbzxrvcepy'] ['0001.svavbfyehc', '0002.gxpxjmyhbh', '0003.kvdvfvsppl', '0004.jfugrffecz', '0005.zlazktnfzz', '0006.rcchvixqyl', '0007.yxxbcacwpa', '0008.bbkauxbbaf', '0009.gtkuuemcgd', '0010.eaniubxzqo', '0011.pskjwgowqf', '0012.wfkpbjcfrg', '0013.kjgqiiotho', '0014.akrkueomrt', '0015.kslbixqbcf', '0016.gvufpfhjrc', '0017.nyhtxrelih', '0018.axuyqvgdtx', '0019.jflqqndygt', '0020.flkrqcacrr', '0021.zyyamvtyjn', '0022.gycoxyzagj', '0023.jnxqohjfsa', '0024.tqwxsolidv', '0025.zixqiflxmz', '0026.emndbwppyy', '0027.skyuvzjbiy', '0028.voptrceiqy', '0029.qvydvlrysx', '0030.yxdreaqjml', '0031.brzxeeqebi', '0032.rkbyzngign', '0033.nfpstgzhwl', '0034.cinnzqnelm', '0035.rhcxswrbld', '0036.oktgufiiwt', '0037.umpslulojk', '0038.peljphemxh', '0039.srhiksuxfc', '0040.nybkdthjey', '0041.cqwcxcrira', '0042.wtgonfxvfm', '0043.jqovnvxaup', '0044.nidoyvneli', '0045.wjhlnljmxh', '0046.aydvqkcoll', '0047.tlrdpzvprh', '0048.oltfgrrzbq', '0049.gfjnoietsn', '0050.xdnltdmtoa', '0051.nzdralfgxg', '0052.vbcowarzly', '0053.bdehqlyuiw', '0054.cjgefhsnms', '0055.vfjryjcbln', '0056.jmejpmstjl', '0057.dhvbvyipyr', '0058.klbhbmtpmt', '0059.yumsriltky', '0060.ooemdcrhzn', '0061.tyosqtmlbw', '0062.kwrzitjwwn', '0063.erbgahzppe', '0064.cdasrmmbcn', '0065.lfxoterlqb', '0066.soqgudgzvj', '0067.nfwbpljjyf', '0068.rialhytzua', '0069.jqeoydgfej', '0070.lhciciflre', '0071.tpedoeloqg', '0072.elxubieplo', '0073.xnqdhpfcoe', '0074.gvtwxzqgvq', '0075.ytpuxdoxyc', '0076.zhagmtxjgg', '0077.uccdihjwzs', '0078.jnbaahsfkz', '0079.npewslstph', '0080.sqxwvbvnrm', '0081.ckxtsdnxjg', '0082.exounfzgid', '0083.etowehfreh', '0084.jxgywziuvl', '0085.vcyfyzdyva', '0086.lzuspzmdni', '0087.fmmrgbzxdp', '0088.vyddurhjca', '0089.isqbxhqvqe', '0090.oucxfqmswx', '0091.rccqgasxvm', '0092.gsprjpowhg', '0093.yekkrjeoro', '0094.blluyezkai', '0095.fgllzqfeny', '0096.icdgugilcu', '0097.rnflaqoefc', '0098.qhzkodebcp', '0099.wfejbxtzwk', '0100.zrbucekwvs']
二.生成器表达式(Generator expression)
1>.生成器表达式语法
语法
(返回值for 元素in 可迭代对象if 条件)
列表解析式的中括号换成小括号就行了
返回一个生成器
和列表解析式的区别
生成器表达式是按需计算(或称惰性求值、延迟计算),需要的时候才计算值
列表解析式是立即返回值
生成器
可迭代对象
迭代器
2>.生成器对比列表生成器
#!/usr/bin/env python #_*_coding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ #EMAIL:y1053419035@qq.com """ 列表解析式总结: 立即计算 返回的不是迭代器,返回可迭代对象列表 从前到后走完一遍后,可以重新回头迭代 """ g = ["{:04}".format(i) for i in range(1,11)] #列表生成式的类型依旧是list print(type(g)) #第一次迭代列表生成器 for x in g: print(x) print("*" * 20 + "我是分隔符" + "*" * 20) #第二次依旧是可以迭代列表生成器 for x in g: print(x) #以上代码执行结果如下: <class 'list'> 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 ********************我是分隔符******************** 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010
#!/usr/bin/env python #_*_coding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ #EMAIL:y1053419035@qq.com """ 生成器表达式总结 延迟计算 返回迭代器,可以迭代 从前到后走完一遍后,不能回头 """ g = ("{:04}".format(i) for i in range(1,11)) #从生成器拿来一个数字(0001),这个数字就不能被从重复拿 next(g) #查看生成器的类型,class 'generator' print(type(g)) #接着上一次取的位置(0002),将剩下的所有的值都迭代了 for x in g: print(x) print("*" * 20 + "我是分隔符" + "*" * 20) #由于之前2次取值已经将生成器的数据都拿走了,因此再一次迭代我们就拿不到任何数据啦~ for x in g: print(x) #以上代码执行结果如下: <class 'generator'> 0002 0003 0004 0005 0006 0007 0008 0009 0010 ********************我是分隔符********************
3>.生成器表达式和列表解析式的对比
#!/usr/bin/env python #_*_coding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ #EMAIL:y1053419035@qq.com it = (print("{}".format(i+1)) for i in range(2)) first = next(it) second = next(it) print(type(first)) #在这一步就会抛出异常,TypeError: unsupported operand type(s) for +: 'NoneType' and 'NoneType' val = first + second #由于在上面一行就会抛出异常,因此该行以及下一行代码是不会被执行的 print(val) #我们如果注释掉上面两行代码,发现依旧会得到一个StopIteration异常,因为生成器本身就2个元素已经被取走了, #此时我们再次用next方法取就会遇到错误!因此我们推荐使用for循环去取生成器数据(for循环并不会产生异常)。 next(it)
#!/usr/bin/env python #_*_coding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ #EMAIL:y1053419035@qq.com it = (x for x in range(10) if x % 2) first = next(it) second = next(it) val = first + second print(first) print(second) print(val) #以上代码输出结果如下: 1 3 4
#!/usr/bin/env python #_*_coding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ #EMAIL:y1053419035@qq.com import datetime t1 = datetime.datetime.now() l = [x for x in range(100000000)] t2 = datetime.datetime.now() g = (x for x in range(100000000)) t3 = datetime.datetime.now() print("列表解析式构建100000000个数字需要耗时为:{}秒".format(t2 - t1)) print("生成器表达式构建100000000个数字需要耗时为:{}秒".format(t3 - t2)) #以上代码输出结果如下: 列表解析式构建100000000个数字需要耗时为:0:00:07.111407秒 生成器表达式构建100000000个数字需要耗时为:0:00:00秒
计算方式
生成器表达式延迟计算,列表解析式立即计算
内存占用
单从返回值本身来说,生成器表达式省内存,列表解析式返回新的列表
生成器没有数据,内存占用极少,但是使用的时候,虽然一个个返回数据,但是合起来占用的内存也差不多
列表解析式构造新的列表需要占用内存
计算速度
单看计算时间看,生成器表达式耗时非常短,列表解析式耗时长
但是生成器本身并没有返回任何值,只返回了一个生成器对象
列表解析式构造并返回了一个新的列表
三.集合解析式
#!/usr/bin/env python #_*_coding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ #EMAIL:y1053419035@qq.com """ 集合解析式语法 {返回值for 元素in 可迭代对象if 条件} 列表解析式的中括号换成大括号{}就行了 立即返回一个集合 """ res1 = {(x,x+1) for x in range(10)} res2 = {(x) for x in range(10)} print(res1) print(res2) #以上代码执行结果如下: {(0, 1), (1, 2), (7, 8), (6, 7), (4, 5), (5, 6), (8, 9), (9, 10), (2, 3), (3, 4)} {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
四.字典解析式
#!/usr/bin/env python #_*_coding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ #EMAIL:y1053419035@qq.com """ 字典解析式语法 {返回值for 元素in 可迭代对象if 条件} 列表解析式的中括号换成大括号{}就行了 使用key:value形式 立即返回一个字典 """ res1 = {x:(x,x+1) for x in range(10)} res2 = {x:[x,x+1] for x in range(10)} res3 = {(x,):[x,x+1] for x in range(10)} res4 = {chr(0x41+x):x**2 for x in range(10)} res5 = {str(x):y for x in range(3) for y in range(4)} #这种写法最终初始化的值都为3,这种写法不推荐使用! print("res1 = {}".format(res1)) print("res2 = {}".format(res2)) print("res3 = {}".format(res3)) print("res4 = {}".format(res4)) print("res5 = {}".format(res5)) #以上代码执行结果如下: res1 = {0: (0, 1), 1: (1, 2), 2: (2, 3), 3: (3, 4), 4: (4, 5), 5: (5, 6), 6: (6, 7), 7: (7, 8), 8: (8, 9), 9: (9, 10)} res2 = {0: [0, 1], 1: [1, 2], 2: [2, 3], 3: [3, 4], 4: [4, 5], 5: [5, 6], 6: [6, 7], 7: [7, 8], 8: [8, 9], 9: [9, 10]} res3 = {(0,): [0, 1], (1,): [1, 2], (2,): [2, 3], (3,): [3, 4], (4,): [4, 5], (5,): [5, 6], (6,): [6, 7], (7,): [7, 8], (8,): [8, 9], (9,): [9, 10]} res4 = {'A': 0, 'B': 1, 'C': 4, 'D': 9, 'E': 16, 'F': 25, 'G': 36, 'H': 49, 'I': 64, 'J': 81} res5 = {'0': 3, '1': 3, '2': 3}
#!/usr/bin/env python #_*_coding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ #EMAIL:y1053419035@qq.com res1 = {str(x):y for x in range(3) for y in range(4)} print("res1 = {}".format(res1)) #上面的2行代码等价于下面5行代码,因此我们鼓励大家使用上面的写法 res2 = {} for x in range(3): for y in range(4): res2[str(x)] = y print("res2 = {}".format(res2)) #以上代码执行结果如下: res1 = {'0': 3, '1': 3, '2': 3} res2 = {'0': 3, '1': 3, '2': 3}
五.解析式和生成器总结
Python2 引入列表解析式
Python2.4 引入生成器表达式
Python3 引入集合、字典解析式,并迁移到了2.7
一般来说,应该多应用解析式,简短、高效
如果一个解析式非常复杂,难以读懂,要考虑拆解成for循环
生成器和迭代器是不同的对象,但都是可迭代对象