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入门篇-解析式、生成器的更多相关文章

  1. Python入门篇-生成器函数

    Python入门篇-生成器函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.生成器概述 1>.生成器generator 生成器指的是生成器对象,可以由生成器表达式得到, ...

  2. Python入门篇-函数、参数及参数解构

    Python入门篇-函数.参数及参数解构 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数概述 1>.函数的作用即分类 函数 数学定义:y=f(x) ,y是x的函数,x ...

  3. Python入门篇-面向对象概述

    Python入门篇-面向对象概述 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.语言的分类 面向机器 抽象成机器指令,机器容易理解 代表:汇编语言 面向过程 做一件事情,排出个 ...

  4. Python入门篇-类型注解

    Python入门篇-类型注解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数定义的弊端 1>.动态语言很灵活,但是这种特性也是弊端 Python是动态语言,变量随时可 ...

  5. Python入门篇-内建函数

    Python入门篇-内建函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常见的内建函数案例  1>.标识id 返回对象的唯一标识,CPython返回内存地址. #!/ ...

  6. Python入门篇-封装与解构和高级数据类型集合(set)和字典(dict)

    Python入门篇-封装与解构和高级数据类型集合(set)和字典(dict) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.封装和结构 #!/usr/bin/env pytho ...

  7. Python入门篇-StringIO和BytesIO

    Python入门篇-StringIO和BytesIO 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.StringIO(用于文本处理) 1>.使用案例 #!/usr/bin ...

  8. Python入门篇-文件操作

    Python入门篇-文件操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.文件IO常用操作 open:打开 read:读取 write:写入 close:关闭 readlin ...

  9. Python入门篇-functools

    Python入门篇-functools 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.reduce方法 reduce方法,顾名思义就是减少 reduce(function,se ...

随机推荐

  1. STL源码之traits编程技法

    摘要 主要讨论如何获取迭代器相应型别.使用迭代器时,很可能用到其型别,若需要声明某个迭代器所指对象的型别的变量,该如何解决.方法如下: function template的参数推导机制 例如: tem ...

  2. SpringBoot系列教程web篇之过滤器Filter使用指南

    web三大组件之一Filter,可以说是很多小伙伴学习java web时最早接触的知识点了,然而学得早不代表就用得多.基本上,如果不是让你从0到1写一个web应用(或者说即便从0到1写一个web应用) ...

  3. phpstorm打开报错方法

    phpstorm打开报错方法 直接删掉默认文件夹里的idea文件夹 重新打开就可以了

  4. 基于面绘制的MC算法以及基于体绘制的 Ray-casting 实现Dicom图像的三维重建(python实现)

    加入实验室后,经过张老师的介绍,有幸与某公司合共共同完成某个项目,在此项目中我主要负责的是三维 pdf 报告生成.Dicom图像上亮度.对比度调整以及 Dicom图像三维重建.今天主要介绍一下完成Di ...

  5. 机器学习中什么是端到端的学习(end-to-end learning)?

    相对于深度学习,传统机器学习的流程往往由多个独立的模块组成,比如在一个典型的自然语言处理(Natural Language Processing)问题中,包括分词.词性标注.句法分析.语义分析等多个独 ...

  6. DRF框架(六)——三大认证组件之认证组件、权限组件

    drf认证组件 用户信息表 from django.db import models from django.contrib.auth.models import AbstractUser class ...

  7. golang(三)

    map(声明.初始化和 make) 1. 概念2.map 容量3. 用切片作为 map 的值 概念 map 是引用类型,可以使用如下声明: var map1 map[keytype]valuetype ...

  8. golang在linux下的安装操作

  9. golang 堆排序

    堆排序的思想  因为堆的形式是完全二叉树,跟数组的索引形成映射,可以使用数组保存.先构建最大(小)堆,根结点就是最大(小)值,删除根结点之后的节点重新构建堆,依此顺序,即可完成堆排序. 代码实现 pa ...

  10. golang 之 jwt-go

    主要针对jwt-go快速生成token.和如何取进行介绍,具体详情还请查看 github.com/dgrijalva/jwt-go 生成token package main import ( &quo ...