• 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循环
    生成器和迭代器是不同的对象,但都是可迭代对象

     

  • 相关阅读:
    Clang AST到IR的转换
    Clang教程之实现源源变化(4)
    Clang AST介绍
    Clang教程之实现源源变化(3)
    Clang教程之实现源源变化(2)
    JavaScript函数constructor的作用,意义
    如何用正确的姿势编写jQuery插件
    半成品博客皮肤(不知有没有继续下去的必要)
    【解决方法】ModuleNotFoundError: No module named 'flask._compat'
    【课程章节更新】微信小程序 getUserProfile 新接口使用
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/10952637.html
Copyright © 2020-2023  润新知