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 = "
".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']
"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
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秒
分别用生成器表达式和列表解析式生成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 = {'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}
{str(x):y for x in range(3) for y in range(4)}   等价于嵌套循环

五.解析式和生成器总结

Python2 引入列表解析式

Python2.
4 引入生成器表达式
Python3 引入集合、字典解析式,并迁移到了2.
7
一般来说,应该多应用解析式,简短、高效
如果一个解析式非常复杂,难以读懂,要考虑拆解成for循环
生成器和迭代器是不同的对象,但都是可迭代对象

 

原文地址:https://www.cnblogs.com/yinzhengjie/p/10952637.html