Python入门篇-解析式、生成器
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]
返回1-10平方的列表
#!/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]
有一个列表lst = [1,4,9,16,2,5,10,15],生成一个新列表,要求新列表元素是lst相邻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 """
打印九九乘法表
""" res = "\n".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,"\n" 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']
"0001.abadicddws" 是ID格式,要求ID格式是以点号分割,左边是4位从1开始的整数,右边是10位随机小写英文字母。请依次生成前100个ID的列表
二.生成器表达式(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
000789
0010
********************我是分隔符********************
0001
0002
0003
0004
0005
0006
000789
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
000789
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秒
分别用生成器表达式和列表解析式生成100000000个数字耗时对比
计算方式
生成器表达式延迟计算,列表解析式立即计算 内存占用
单从返回值本身来说,生成器表达式省内存,列表解析式返回新的列表
生成器没有数据,内存占用极少,但是使用的时候,虽然一个个返回数据,但是合起来占用的内存也差不多
列表解析式构造新的列表需要占用内存 计算速度
单看计算时间看,生成器表达式耗时非常短,列表解析式耗时长
但是生成器本身并没有返回任何值,只返回了一个生成器对象
列表解析式构造并返回了一个新的列表
三.集合解析式
#!/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 = {'': 3, '': 3, '': 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 = {'': 3, '': 3, '': 3}
res2 = {'': 3, '': 3, '': 3}
{str(x):y for x in range(3) for y in range(4)} 等价于嵌套循环
五.解析式和生成器总结
Python2 引入列表解析式
Python2.4 引入生成器表达式
Python3 引入集合、字典解析式,并迁移到了2.7
一般来说,应该多应用解析式,简短、高效
如果一个解析式非常复杂,难以读懂,要考虑拆解成for循环
生成器和迭代器是不同的对象,但都是可迭代对象
Python入门篇-解析式、生成器的更多相关文章
- Python入门篇-生成器函数
Python入门篇-生成器函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.生成器概述 1>.生成器generator 生成器指的是生成器对象,可以由生成器表达式得到, ...
- Python入门篇-函数、参数及参数解构
Python入门篇-函数.参数及参数解构 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数概述 1>.函数的作用即分类 函数 数学定义:y=f(x) ,y是x的函数,x ...
- Python入门篇-面向对象概述
Python入门篇-面向对象概述 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.语言的分类 面向机器 抽象成机器指令,机器容易理解 代表:汇编语言 面向过程 做一件事情,排出个 ...
- Python入门篇-类型注解
Python入门篇-类型注解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数定义的弊端 1>.动态语言很灵活,但是这种特性也是弊端 Python是动态语言,变量随时可 ...
- Python入门篇-内建函数
Python入门篇-内建函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常见的内建函数案例 1>.标识id 返回对象的唯一标识,CPython返回内存地址. #!/ ...
- Python入门篇-封装与解构和高级数据类型集合(set)和字典(dict)
Python入门篇-封装与解构和高级数据类型集合(set)和字典(dict) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.封装和结构 #!/usr/bin/env pytho ...
- Python入门篇-StringIO和BytesIO
Python入门篇-StringIO和BytesIO 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.StringIO(用于文本处理) 1>.使用案例 #!/usr/bin ...
- Python入门篇-文件操作
Python入门篇-文件操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.文件IO常用操作 open:打开 read:读取 write:写入 close:关闭 readlin ...
- Python入门篇-functools
Python入门篇-functools 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.reduce方法 reduce方法,顾名思义就是减少 reduce(function,se ...
随机推荐
- Python模块学习filecmp文件比较
Python模块学习filecmp文件比较 filecmp模块用于比较文件及文件夹的内容,它是一个轻量级的工具,使用非常简单.python标准库还提供了difflib模块用于比较文件的内容.关于dif ...
- Docker容器部署Mysql数据库服务器
本节会用到的Docker命令如下: docker images 查看mysql镜像id docker run -d -p xxxxxxxxxxxxxxx/zhufc/mysql:v2 通过镜像生成 启 ...
- centos7如何将docker容器配置成开机自启动
docker 服务器开机自启动: 1.systemctl is-enabled docker.service 检查服务是否开机启动 2.systemctl enable docker.service ...
- [EXP]CVE-2019-9621 Zimbra<8.8.11 GetShell Exploit(配合Cscan可批量)
发现时间 2019年03月18日 威胁目标 采用Zimbra邮件系统的企业 主要风险 远程代码执行 攻击入口 localconfig.xml 配置文件 使用漏洞 CVE-2019-9621 受影响应 ...
- 接口和抽象类的区别,注意JDK8的接口可以有实现。
Java中,抽象类和接口有相似的地方.下面我们就来细说说接口和抽象类的异同. 首先是相同的地方: 1. 接口和抽象类都能定义方法和属性. 2. 接口和抽象类都是看作是一种特殊的类.大部分的时候,定义的 ...
- springboot底层原理简述
1.maven 子父依赖关系,快速整合第三方框架 2.无配置文件 省略了web.xml,spring.xml,springmvc.xml.mybatis.xml. spring3.0以上提供注解,sp ...
- AtCoder-arc060 (题解)
A - 高橋君とカード / Tak and Cards (DP) 题目链接 题目大意: 有 \(n\) 个数字,要求取出一些数字,使得它们的平均数恰好为 \(x\) ,问有几种取法. 大致思路: 只要 ...
- zbar android sdk源码编译
zbar,解析条码和二维码的又一利器,zbar代码是用c语言编写的,如果想在Android下使用zbar类库,就需要使用NDK将zbar编译成.so加载使用,zbar编译好的Android SDK可以 ...
- 牛客CSP-S提高组赛前集训营2 T2沙漠点列
原题链接 算法不难,比赛的时候就和cyc大佬一起yy了正解,不过因为交的时候比较急(要回寝室惹),我有两数组开错大小直接爆到50,cyc大佬则只把文件输入关了一半,直接爆零(╯ ̄Д ̄)╯┻━┻ 要尽量 ...
- LOJ #3103. 「JSOI2019」节日庆典
题意 给定字符串 \(S\) ,对于 \(S\) 的每个前缀 \(T\) 求 \(T\) 所有循环同构串的字典序最小的串,输出其起始下标.(如有多个输出最靠前的) \(|S| \le 3 \times ...