Untitled Diagram.png

列表生成式

语法层面,可以看做 for循环 + 列表.append() 的简化形式; 运行层面,由于实现方式不同,速度明显高于for循环。

循环转为生成式:

  1. 准备赋值,最外层写好方括号,以便创建列表
  2. 将最终要填入列表的内容写到方括号里
  3. 将循环规则抄写到方括号里,且生成式内无冒号
  1. p_usd = [250, 175, 300, 247]
  2. print([i * 7 for i in p_usd])
  1. [1750, 1225, 2100, 1729]
  1. from math import sin
  2. a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  3. b = []
  4. for i in a:
  5. b.append(sin(i))
  6. print(b)
  1. [0.8414709848078965, 0.9092974268256817, 0.1411200080598672, -0.7568024953079282, -0.9589242746631385, -0.27941549819892586, 0.6569865987187891, 0.9893582466233818, 0.4121184852417566, -0.5440211108893698]
  1. from math import sin
  2. a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  3. b = [sin(i) for i in a]
  4. print(b)
  1. [0.8414709848078965, 0.9092974268256817, 0.1411200080598672, -0.7568024953079282, -0.9589242746631385, -0.27941549819892586, 0.6569865987187891, 0.9893582466233818, 0.4121184852417566, -0.5440211108893698]

解决range()不能生成小数的问题

  1. a = [i/10 for i in range(1, 100)]
  2. print(a)
  1. [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5.0, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6.0, 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7, 6.8, 6.9, 7.0, 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9.0, 9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9]
  1. b = [sin(i) for i in a]
  2. print(b)
  1. [0.09983341664682815, 0.19866933079506122, 0.29552020666133955, 0.3894183423086505, 0.479425538604203, 0.5646424733950354, 0.644217687237691, 0.7173560908995228, 0.7833269096274834, 0.8414709848078965, 0.8912073600614354, 0.9320390859672263, 0.963558185417193, 0.9854497299884601, 0.9974949866040544, 0.9995736030415051, 0.9916648104524686, 0.9738476308781951, 0.9463000876874145, 0.9092974268256817, 0.8632093666488737, 0.8084964038195901, 0.7457052121767203, 0.675463180551151, 0.5984721441039564, 0.5155013718214642, 0.4273798802338298, 0.3349881501559051, 0.23924932921398243, 0.1411200080598672, 0.04158066243329049, -0.058374143427580086, -0.1577456941432482, -0.2555411020268312, -0.35078322768961984, -0.44252044329485246, -0.5298361409084934, -0.6118578909427189, -0.6877661591839738, -0.7568024953079282, -0.8182771110644103, -0.8715757724135882, -0.9161659367494549, -0.9516020738895161, -0.977530117665097, -0.9936910036334644, -0.9999232575641008, -0.9961646088358407, -0.9824526126243325, -0.9589242746631385, -0.9258146823277325, -0.8834546557201531, -0.8322674422239013, -0.7727644875559871, -0.7055403255703919, -0.6312666378723216, -0.5506855425976376, -0.46460217941375737, -0.373876664830236, -0.27941549819892586, -0.18216250427209588, -0.0830894028174964, 0.016813900484349713, 0.11654920485049364, 0.21511998808781552, 0.31154136351337786, 0.4048499206165983, 0.49411335113860816, 0.5784397643882001, 0.6569865987187891, 0.7289690401258759, 0.7936678638491531, 0.8504366206285644, 0.8987080958116269, 0.9379999767747389, 0.9679196720314863, 0.9881682338770004, 0.998543345374605, 0.998941341839772, 0.9893582466233818, 0.9698898108450863, 0.9407305566797731, 0.9021718337562933, 0.8545989080882805, 0.7984871126234903, 0.7343970978741133, 0.6629692300821833, 0.5849171928917617, 0.5010208564578846, 0.4121184852417566, 0.3190983623493521, 0.22288991410024764, 0.1244544235070617, 0.024775425453357765, -0.0751511204618093, -0.17432678122297965, -0.27176062641094245, -0.3664791292519284, -0.45753589377532133]
  1. from matplotlib import pyplot as plt
  2. %matplotlib inline
  3. plt.plot(a, b);

output_37_0.png

列表生成式的生成列表的部分,不一定要使用循环变量

  1. a = [randint(1, 1000) for k in range(10)]
  2. print(a)
  1. [589, 213, 860, 832, 866, 905, 196, 43, 405, 45]

每次生成的元素与 k 无关

金融数据处理

对于从 eodata下载的证券数据文本文件,采用生成式创建为数据列表,以便各种统计分析。
odata是获取全球金融市场历史数据的常用站点。

任务1:将读入的文字列表重整为二维分栏列表 任务2:抽取其中3列数据构成新的二维列表 任务3:转换元素数据格式

  1. with open('NYSE_20191220.txt', 'r') as f:
  2. 原始文本列表 = f.readlines()
  3. 整理后列表 = [s.split(',') for s in 原始文本列表[1:]]
  4. 关键信息 = [[x[0], float(x[5]), int(x[6].strip())] for x in 整理后列表]
  5. print(关键信息[:10])
  1. [['AA', 21.23, 5139800], ['AAN', 58.86, 1010200], ['AAP', 158.12, 1269100], ['AAT', 44.95, 675800], ['AB', 29.98, 211400], ['ABB', 23.84, 2686400], ['ABBV', 89.29, 19135600], ['ABC', 85.67, 1666800], ['ABEV', 4.57, 8535000], ['ABG', 117.92, 246900]]

任务4:排序、统计等操作

  1. def 收盘价(i):
  2. return i[1]
  3. 关键信息.sort(key = 收盘价)
  4. print(关键信息[:10])
  1. [['CRR', 0.297, 945700], ['HOS', 0.2998, 288500], ['FGP', 0.4, 422500], ['GRA.W', 0.4, 100], ['LKSD', 0.4122, 487100], ['ROYT', 0.415, 732200], ['NSC.W', 0.45, 300], ['SPA.W', 0.48, 100], ['LGC.W', 0.49, 53200], ['CHKR', 0.5317, 81000]]
  1. 成交量 = [i[2] for i in 关键信息]
  2. print(f'平均成交:{sum(成交量)/len(成交量)}')
  1. 平均成交:2117092.5459317584

任务5:怎样指定筛选条件,选择部分数据创建列表 在生成式中,if语句应放在for语句后面

  1. 高成交股 = [i for i in 关键信息 if i[2] > 10000000]
  2. print(高成交股[:10])
  1. [['CHK', 0.9527, 179148500], ['JCP', 1.08, 10099900], ['MUX', 1.09, 30678900], ['MDR', 1.11, 25612300], ['NE', 1.2, 11151300], ['DNR', 1.35, 34391500], ['ACB', 2.25, 16238400], ['SWN', 2.3, 109854400], ['NIO', 2.69, 51014300], ['AR', 2.75, 17016100]]

任务6:生成式中多重循环

  1. a = ['赵', '钱', '孙']
  2. b = ['佳', '宝', '峰', '华']
  3. c = []
  4. for a_ in a:
  5. for b_ in b:
  6. c.append(a_ + b_)
  7. print(c)
  1. ['赵佳', '赵宝', '赵峰', '赵华', '钱佳', '钱宝', '钱峰', '钱华', '孙佳', '孙宝', '孙峰', '孙华']
  1. a = ['赵', '钱', '孙']
  2. b = ['佳', '宝', '峰', '华']
  3. c = [(a_ + b_) for b_ in b for a_ in a]
  4. print(c)
  1. ['赵佳', '钱佳', '孙佳', '赵宝', '钱宝', '孙宝', '赵峰', '钱峰', '孙峰', '赵华', '钱华', '孙华']
  1. 循环条件从内向外依次填写
  2. 不同于zip()函数,zip(a, b)是对位匹配
  1. a = ['赵', '钱', '孙']
  2. b = ['佳', '宝', '峰', '华']
  3. c = [x[0] + x[1] for x in zip(a, b)]
  4. print(c)
  1. ['赵佳', '钱宝', '孙峰']

生成式的效率更高

  1. from time import time
  2. a = range(1, 1000)
  3. b = range(1, 1000)
  4. t1 = time()
  5. c = [x * y for y in b for x in a]
  6. print('共计耗时', time() - t1, '秒')
  1. 共计耗时 0.11793160438537598
  1. from time import time
  2. a = range(1, 1000)
  3. b = range(1, 1000)
  4. c = []
  5. t1 = time()
  6. for x in a:
  7. for y in b:
  8. c.append(y * x)
  9. print('共计耗时', time() - t1, '秒')
  1. 共计耗时 0.20689177513122559

延迟计算

推迟计算、惰性计算、懒惰策略
先记好规则,但直到需要使用时才开始计算

特点:

优点:需要调用哪个元素,就临时计算该元素,而且算完即清理,始终不浪费内存空间 缺点:每次需要调用一个元素,都有临时重算,不像列表那样保存到内存里,随用随取,因而后续运行中可能浪费CPU计算时间

主要形式:

  1. range对象,与列表相似,可以使用方括号指定下标,并可用len()得到其元素个数
  1. zip对象,默认情况下不支持下标引用模式和len函数
  2. (i for i in a)圆括号,默认情况下不支持下标引用模式和len函数

以 (i for i in a)圆括号 为例

  1. a = range(1, 100000)
  2. b = range(1, 10000)
  3. c = [x * y for y in b for x in a]
  4. # 会卡死
  5. # a有10万元素,b有1万元素,所以生成含10亿元素的列表c
  6. # 列表会事先占好内存,这么大的列表导致内存不够用
  1. a = range(1, 100000)
  2. b = range(1, 10000)
  3. c = (x * y for y in b for x in a)
  4. # 不会卡死
  1. 如果是方括号,则是一个“生成式”,要求生成一个列表
  2. 如果是圆括号,则不再是生成式,也不会生成列表,而是把“生成列表的规则”记入内存
  1. (x * y for y in b for x in a)

代表的规则是:全匹配、然后算乘积。记下这个规则后,先不计算,直到程序要用到这个数据时才从头计算

  1. for i in c:
  2. print(i)

到了计算的时候,计算过程是:先算出第一个元素1,赋值给i;第二次循环算出第二个元素2,再赋值给ⅰ;同时尽快将第一个元素的地址从内存中清除,以便节省空间

以range()对象为例

  1. range(1000000000)

计算机先在内存中记住一个等差数列模型,直到调用时,再开始计算所需位置的元素数值。

内置标准函数 next()

zip对象 和 (i for i in a)圆括号 生成的对象,默认情况下不支持下标引用模式和len函数
若需访问指定下标的数据,使用内置标准函数 next()

  1. a = [1, 2, 3]
  2. x = (i * i for i in a)
  3. print(x[1])
  1. ---------------------------------------------------------------------------
  2. TypeError Traceback (most recent call last)
  3. <ipython-input-169-e0a72e6add26> in <module>
  4. 3 x = (i * i for i in a)
  5. 4
  6. ----> 5 print(x[1])
  7. TypeError: 'generator' object is not subscriptable
  1. x = [1, 2, 3]
  2. y = [2, 5, 7]
  3. z = zip(x, y)
  4. print(z[1])
  1. ---------------------------------------------------------------------------
  2. TypeError Traceback (most recent call last)
  3. <ipython-input-170-beaaafaa464e> in <module>
  4. 4 z = zip(x, y)
  5. 5
  6. ----> 6 print(z[1])
  7. TypeError: 'zip' object is not subscriptable
  1. a = [1, 2, 3]
  2. x = (i * i for i in a)
  3. print(next(x))
  1. 1
  1. print(next(x))
  1. 4
  1. print(next(x))
  1. 9
  1. print(next(x))
  1. ---------------------------------------------------------------------------
  2. StopIteration Traceback (most recent call last)
  3. <ipython-input-176-ff675a2ee99e> in <module>
  4. ----> 1 print(next(x))
  5. StopIteration:

对于zip这种类型的对象,next() 逐个访问其中的元素

比如将一个zip对象赋值给变量a,则第一次调用 next(a) 返回a中第一个元素;第二次调用 next(a) 返回a中第二个元素……

直到最后全部读完后,抛出异常。

迭代器

允许使用 next() 函数逐个访问的可迭代对象,统称为“选代器”
对于迭代器来说,最好使用for循环访问迭代器,因为next不仅写法繁琐,而且最后一次访问时会有异常

  1. x = [1, 2, 3]
  2. y = [2, 5, 7]
  3. z = (i * k for k in y for i in x)
  4. for i in range(4):
  5. next(z)
  6. print(next(z))
  1. 10

如果想读取第5个元素,可以先循环调用4次next(),然后下一次调用就是第5个。

【注意】
next() 和 for 都只能向后逐个读取不能回头读取前面元素,所以迭代器中的元素一旦被读取过,就再无法重新读取

练习

练习1:从循环到生成式

  1. 请在自己电脑上编码完成以下任务,将 for 循环创建列表的方式都改写成生成式形式,并同时理解该生成式的实际意义(即它能生成怎样一个列表、基于怎样的规则生成?):
  2. 1.
  3. a = []
  4. for i in range(10):
  5. a.append(i)
  6. 2.
  7. a = range(10)
  8. b = []
  9. for i in a:
  10. b.append(i)
  11. 3.
  12. a = range(10)
  13. b = []
  14. for i in a:
  15. b.append(i*i)
  16. 4.
  17. import math
  18. a = range(10)
  19. b = []
  20. for i in a:
  21. b.append( math.sqrt(i) )
  22. 5.
  23. import random
  24. a = range(10)
  25. b = []
  26. for i in a:
  27. b.append( random.randint(-5,5) )
  1. a = []
  2. for i in range(10):
  3. a.append(i)
  4. a
  1. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  1. a = [i for i in range(10)]
  2. a
  1. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  1. a = range(10)
  2. b = []
  3. for i in a:
  4. b.append(i)
  5. b
  1. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  1. a = range(10)
  2. b = [i for i in a]
  3. b
  1. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  1. a = range(10)
  2. b = []
  3. for i in a:
  4. b.append(i*i)
  5. b
  1. [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
  1. a = range(10)
  2. b = [i * i for i in a]
  3. b
  1. [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
  1. import math
  2. a = range(10)
  3. b = []
  4. for i in a:
  5. b.append( math.sqrt(i) )
  6. print(b)
  1. [0.0, 1.0, 1.4142135623730951, 1.7320508075688772, 2.0, 2.23606797749979, 2.449489742783178, 2.6457513110645907, 2.8284271247461903, 3.0]
  1. import math
  2. a = range(10)
  3. b = [math.sqrt(i) for i in a]
  4. print(b)
  1. [0.0, 1.0, 1.4142135623730951, 1.7320508075688772, 2.0, 2.23606797749979, 2.449489742783178, 2.6457513110645907, 2.8284271247461903, 3.0]
  1. import random
  2. a = range(10)
  3. b = []
  4. for i in a:
  5. b.append( random.randint(-5,5) )
  6. b
  1. [5, -5, 4, 4, -5, -1, 5, 4, -5, 5]
  1. import random
  2. a = range(10)
  3. b = [randint(-5, 5) for i in a]
  4. b
  1. [-1, 3, -3, -3, 5, 1, 0, -2, 4, 5]

练习2:生成式中的基本判断

  1. 请在自己电脑上编码完成以下任务,将 for 循环创建列表的方式都改写成生成式形式,并同时理解该生成式的实际意义(即它能生成怎样一个列表、基于怎样的规则生成?):
  2. 1.
  3. a = []
  4. for i in range(100):
  5. if i % 2 == 0 :
  6. a.append(i)
  7. 2.
  8. a = []
  9. for i in range(100):
  10. if i % 3 == 0 or i % 7 == 0:
  11. a.append(i)
  12. 3.
  13. a = [-3,2,5,-8,7,6,-2,-1,8,5,-3,4]
  14. b = []
  15. for i in a:
  16. if i < 0 :
  17. b.append(i)
  18. 4.
  19. a = ['adobe','microsoft','oracle','ibm','sap']
  20. b = []
  21. for i in a:
  22. if len(i)>4:
  23. b.append(i)
  24. 5.
  25. a = ['adobe','microsoft','oracle','ibm','sap']
  26. b = []
  27. for i in a:
  28. if i.find('a')>-1 :
  29. b.append(i)
  30. 6.
  31. a = ['adobe','microsoft','oracle','ibm','sap']
  32. b = []
  33. for i in a:
  34. if 'a' in i :
  35. b.append(i)
  1. a = []
  2. for i in range(100):
  3. if i % 2 == 0 :
  4. a.append(i)
  5. print(a)
  1. [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98]
  1. a = [i for i in range(100) if i % 2 == 0]
  2. print(a)
  1. [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98]
  1. a = []
  2. for i in range(100):
  3. if i % 3 == 0 or i % 7 == 0:
  4. a.append(i)
  5. print(a)
  1. [0, 3, 6, 7, 9, 12, 14, 15, 18, 21, 24, 27, 28, 30, 33, 35, 36, 39, 42, 45, 48, 49, 51, 54, 56, 57, 60, 63, 66, 69, 70, 72, 75, 77, 78, 81, 84, 87, 90, 91, 93, 96, 98, 99]
  1. a = [i for i in range(100) if i % 3 == 0 or i % 7 == 0]
  2. print(a)
  1. [0, 3, 6, 7, 9, 12, 14, 15, 18, 21, 24, 27, 28, 30, 33, 35, 36, 39, 42, 45, 48, 49, 51, 54, 56, 57, 60, 63, 66, 69, 70, 72, 75, 77, 78, 81, 84, 87, 90, 91, 93, 96, 98, 99]
  1. a = [-3,2,5,-8,7,6,-2,-1,8,5,-3,4]
  2. b = []
  3. for i in a:
  4. if i < 0 :
  5. b.append(i)
  6. b
  1. [-3, -8, -2, -1, -3]
  1. a = [-3,2,5,-8,7,6,-2,-1,8,5,-3,4]
  2. b = [i for i in a if i < 0]
  3. b
  1. [-3, -8, -2, -1, -3]
  1. a = ['adobe','microsoft','oracle','ibm','sap']
  2. b = []
  3. for i in a:
  4. if len(i)>4:
  5. b.append(i)
  6. b
  1. ['adobe', 'microsoft', 'oracle']
  1. a = ['adobe','microsoft','oracle','ibm','sap']
  2. b = [i for i in a if len(i) > 4]
  3. b
  1. ['adobe', 'microsoft', 'oracle']
  1. a = ['adobe','microsoft','oracle','ibm','sap']
  2. b = []
  3. for i in a:
  4. if i.find('a')>-1 :
  5. b.append(i)
  6. b
  1. ['adobe', 'oracle', 'sap']
  1. a = ['adobe','microsoft','oracle','ibm','sap']
  2. b = [i for i in a if i.find('a') > -1]
  3. b
  1. ['adobe', 'oracle', 'sap']
  1. a = ['adobe','microsoft','oracle','ibm','sap']
  2. b = []
  3. for i in a:
  4. if 'a' in i :
  5. b.append(i)
  6. b
  1. ['adobe', 'oracle', 'sap']
  1. a = ['adobe','microsoft','oracle','ibm','sap']
  2. b = [i for i in a if 'a' in i]
  3. b
  1. ['adobe', 'oracle', 'sap']

练习3:生成式与二维列表

  1. 请在自己电脑上编码完成以下任务,将 for 循环创建列表的方式都改写成生成式形式,并同时理解该生成式的实际意义(即它能生成怎样一个列表、基于怎样的规则生成?):
  2. 1.
  3. a = [ ['中国','CHN'], ['美国','USA'], ['英国','UK'], ['加拿大','CA'], ['法国','FRA'] ]
  4. b = []
  5. for i in a:
  6. a.append( i[0]+' 缩写:'+i[1] )
  7. 2.
  8. a = [ ['中国','CHN'], ['美国','USA'], ['英国','UK'], ['加拿大','CA'], ['法国','FRA'] ]
  9. b = []
  10. for i in a:
  11. if 'C' in i[1]:
  12. b.append( i )
  13. 3.
  14. a = [ ['中国','CHN'], ['美国','USA'], ['英国','UK'], ['加拿大','CA'], ['法国','FRA'] ]
  15. b = []
  16. for i in a:
  17. if 'C' in i[1]:
  18. b.append(i[0])
  19. 4.
  20. a = []
  21. for i in range(5):
  22. a.append( [ i, i*i ] )
  23. 5.
  24. a = [ '中国', '美国','英国','加拿大','法国' ]
  25. b = [ 'CHN', 'USA', 'UK', 'CA', 'FRA']
  26. c = []
  27. for i in zip(a,b):
  28. c.append(i)
  29. 6.
  30. from random import randint
  31. 角色名单 = [ '悟空', '小林','龟仙人','乐平']
  32. 战斗力表 = []
  33. for i in 角色名单:
  34. 战斗力表.append( [ i, randint(100,10000)] )
  1. a = [ ['中国','CHN'], ['美国','USA'], ['英国','UK'], ['加拿大','CA'], ['法国','FRA'] ]
  2. b = []
  3. for i in a:
  4. b.append( i[0]+' 缩写:'+i[1] )
  5. b
  1. ['中国 缩写:CHN', '美国 缩写:USA', '英国 缩写:UK', '加拿大 缩写:CA', '法国 缩写:FRA']
  1. a = [ ['中国','CHN'], ['美国','USA'], ['英国','UK'], ['加拿大','CA'], ['法国','FRA'] ]
  2. b = [i[0] + ' 缩写:' + i[1] for i in a]
  3. b
  1. ['中国 缩写:CHN', '美国 缩写:USA', '英国 缩写:UK', '加拿大 缩写:CA', '法国 缩写:FRA']
  1. a = [ ['中国','CHN'], ['美国','USA'], ['英国','UK'], ['加拿大','CA'], ['法国','FRA'] ]
  2. b = []
  3. for i in a:
  4. if 'C' in i[1]:
  5. b.append( i )
  6. b
  1. [['中国', 'CHN'], ['加拿大', 'CA']]
  1. a = [ ['中国','CHN'], ['美国','USA'], ['英国','UK'], ['加拿大','CA'], ['法国','FRA'] ]
  2. b = [i for i in a if 'C' in i[1]]
  3. b
  1. [['中国', 'CHN'], ['加拿大', 'CA']]
  1. a = [ ['中国','CHN'], ['美国','USA'], ['英国','UK'], ['加拿大','CA'], ['法国','FRA'] ]
  2. b = []
  3. for i in a:
  4. if 'C' in i[1]:
  5. b.append(i[0])
  6. b
  1. ['中国', '加拿大']
  1. a = [ ['中国','CHN'], ['美国','USA'], ['英国','UK'], ['加拿大','CA'], ['法国','FRA'] ]
  2. b = [i[0] for i in a if 'C' in i[1]]
  3. b
  1. ['中国', '加拿大']
  1. a = []
  2. for i in range(5):
  3. a.append( [ i, i*i ] )
  4. a
  1. [[0, 0], [1, 1], [2, 4], [3, 9], [4, 16]]
  1. a = [[i, i * i] for i in range(5)]
  2. a
  1. [[0, 0], [1, 1], [2, 4], [3, 9], [4, 16]]
  1. a = [ '中国', '美国','英国','加拿大','法国' ]
  2. b = [ 'CHN', 'USA', 'UK', 'CA', 'FRA']
  3. c = []
  4. for i in zip(a,b):
  5. c.append(i)
  6. c
  1. [('中国', 'CHN'), ('美国', 'USA'), ('英国', 'UK'), ('加拿大', 'CA'), ('法国', 'FRA')]
  1. a = [ '中国', '美国','英国','加拿大','法国' ]
  2. b = [ 'CHN', 'USA', 'UK', 'CA', 'FRA']
  3. c = [i for i in zip(a, b)]
  4. c
  1. [('中国', 'CHN'), ('美国', 'USA'), ('英国', 'UK'), ('加拿大', 'CA'), ('法国', 'FRA')]
  1. from random import randint
  2. 角色名单 = [ '悟空', '小林','龟仙人','乐平']
  3. 战斗力表 = []
  4. for i in 角色名单:
  5. 战斗力表.append( [ i, randint(100,10000)] )
  6. 战斗力表
  1. [['悟空', 1270], ['小林', 6764], ['龟仙人', 7295], ['乐平', 7877]]
  1. from random import randint
  2. 角色名单 = [ '悟空', '小林','龟仙人','乐平']
  3. 战斗力表 = [[i , randint(100, 10000)] for i in 角色名单]
  4. 战斗力表
  1. [['悟空', 513], ['小林', 9437], ['龟仙人', 811], ['乐平', 2311]]

练习4:双循环生成式

  1. 请在自己电脑上编码完成以下任务,将 for 循环创建列表的方式都改写成生成式形式,并同时理解该生成式的实际意义(即它能生成怎样一个列表、基于怎样的规则生成?):
  2. 1. 请先预测本循环的输出结果,然后编写生成式验证。最后将该结果与前一作业第5题进行比较,分析为什么使用zip()的输出结果与本例双循环的结果不同。
  3. a = [ '中国', '美国','英国','加拿大','法国' ]
  4. b = [ 'CHN', 'USA', 'UK', 'CA', 'FRA']
  5. c = []
  6. for i in a:
  7. for k in b:
  8. c.append(f'{i}的缩写是{k}')
  9. 2.
  10. a = [ '中国队', '美国队','英国队','加拿大队','法国队' ]
  11. b = [ '中国队', '美国队','英国队','加拿大队','法国队' ]
  12. c = []
  13. for i in a:
  14. for k in b:
  15. c.append(f'{i} 的对手是 {k}')
  16. 3. 分析上一题的结果中为什么会出现 “中国队 的对手是 中国队” ,然后思考为什么本题的循环可以解决此问题,最后编写生成式:
  17. a = [ '中国队', '美国队','英国队','加拿大队','法国队' ]
  18. b = [ '中国队', '美国队','英国队','加拿大队','法国队' ]
  19. c = []
  20. for i in a:
  21. for k in b:
  22. if i != k :
  23. c.append(f'{i} 的对手是 {k}')
  24. 4. 分析本题与上一题的异同,然后编写生成式:
  25. a = [ '中国队', '美国队','英国队','加拿大队','法国队' ]
  26. c = []
  27. for i in a:
  28. for k in a:
  29. if i != k :
  30. c.append(f'{i} 的对手是 {k}')
  1. a = [ '中国', '美国','英国','加拿大','法国' ]
  2. b = [ 'CHN', 'USA', 'UK', 'CA', 'FRA']
  3. c = []
  4. for i in a:
  5. for k in b:
  6. c.append(f'{i}的缩写是{k}')
  7. print(c)
  1. ['中国的缩写是CHN', '中国的缩写是USA', '中国的缩写是UK', '中国的缩写是CA', '中国的缩写是FRA', '美国的缩写是CHN', '美国的缩写是USA', '美国的缩写是UK', '美国的缩写是CA', '美国的缩写是FRA', '英国的缩写是CHN', '英国的缩写是USA', '英国的缩写是UK', '英国的缩写是CA', '英国的缩写是FRA', '加拿大的缩写是CHN', '加拿大的缩写是USA', '加拿大的缩写是UK', '加拿大的缩写是CA', '加拿大的缩写是FRA', '法国的缩写是CHN', '法国的缩写是USA', '法国的缩写是UK', '法国的缩写是CA', '法国的缩写是FRA']
  1. a = [ '中国', '美国','英国','加拿大','法国' ]
  2. b = [ 'CHN', 'USA', 'UK', 'CA', 'FRA']
  3. c = [a_ + '的缩写是' + b_ for a_ in a for b_ in b]
  4. print(c)
  1. ['中国的缩写是CHN', '中国的缩写是USA', '中国的缩写是UK', '中国的缩写是CA', '中国的缩写是FRA', '美国的缩写是CHN', '美国的缩写是USA', '美国的缩写是UK', '美国的缩写是CA', '美国的缩写是FRA', '英国的缩写是CHN', '英国的缩写是USA', '英国的缩写是UK', '英国的缩写是CA', '英国的缩写是FRA', '加拿大的缩写是CHN', '加拿大的缩写是USA', '加拿大的缩写是UK', '加拿大的缩写是CA', '加拿大的缩写是FRA', '法国的缩写是CHN', '法国的缩写是USA', '法国的缩写是UK', '法国的缩写是CA', '法国的缩写是FRA']
  1. a = [ '中国队', '美国队','英国队','加拿大队','法国队' ]
  2. b = [ '中国队', '美国队','英国队','加拿大队','法国队' ]
  3. c = []
  4. for i in a:
  5. for k in b:
  6. c.append(f'{i} 的对手是 {k}')
  7. print(c)
  1. ['中国队 的对手是 中国队', '中国队 的对手是 美国队', '中国队 的对手是 英国队', '中国队 的对手是 加拿大队', '中国队 的对手是 法国队', '美国队 的对手是 中国队', '美国队 的对手是 美国队', '美国队 的对手是 英国队', '美国队 的对手是 加拿大队', '美国队 的对手是 法国队', '英国队 的对手是 中国队', '英国队 的对手是 美国队', '英国队 的对手是 英国队', '英国队 的对手是 加拿大队', '英国队 的对手是 法国队', '加拿大队 的对手是 中国队', '加拿大队 的对手是 美国队', '加拿大队 的对手是 英国队', '加拿大队 的对手是 加拿大队', '加拿大队 的对手是 法国队', '法国队 的对手是 中国队', '法国队 的对手是 美国队', '法国队 的对手是 英国队', '法国队 的对手是 加拿大队', '法国队 的对手是 法国队']
  1. a = [ '中国队', '美国队','英国队','加拿大队','法国队' ]
  2. b = [ '中国队', '美国队','英国队','加拿大队','法国队' ]
  3. c = [i + ' 的对手是 ' + j for i in a for j in b]
  4. print(c)
  1. ['中国队 的对手是 中国队', '中国队 的对手是 美国队', '中国队 的对手是 英国队', '中国队 的对手是 加拿大队', '中国队 的对手是 法国队', '美国队 的对手是 中国队', '美国队 的对手是 美国队', '美国队 的对手是 英国队', '美国队 的对手是 加拿大队', '美国队 的对手是 法国队', '英国队 的对手是 中国队', '英国队 的对手是 美国队', '英国队 的对手是 英国队', '英国队 的对手是 加拿大队', '英国队 的对手是 法国队', '加拿大队 的对手是 中国队', '加拿大队 的对手是 美国队', '加拿大队 的对手是 英国队', '加拿大队 的对手是 加拿大队', '加拿大队 的对手是 法国队', '法国队 的对手是 中国队', '法国队 的对手是 美国队', '法国队 的对手是 英国队', '法国队 的对手是 加拿大队', '法国队 的对手是 法国队']
  1. a = [ '中国队', '美国队','英国队','加拿大队','法国队' ]
  2. b = [ '中国队', '美国队','英国队','加拿大队','法国队' ]
  3. c = []
  4. for i in a:
  5. for k in b:
  6. if i != k :
  7. c.append(f'{i} 的对手是 {k}')
  8. print(c)
  1. ['中国队 的对手是 美国队', '中国队 的对手是 英国队', '中国队 的对手是 加拿大队', '中国队 的对手是 法国队', '美国队 的对手是 中国队', '美国队 的对手是 英国队', '美国队 的对手是 加拿大队', '美国队 的对手是 法国队', '英国队 的对手是 中国队', '英国队 的对手是 美国队', '英国队 的对手是 加拿大队', '英国队 的对手是 法国队', '加拿大队 的对手是 中国队', '加拿大队 的对手是 美国队', '加拿大队 的对手是 英国队', '加拿大队 的对手是 法国队', '法国队 的对手是 中国队', '法国队 的对手是 美国队', '法国队 的对手是 英国队', '法国队 的对手是 加拿大队']
  1. a = [ '中国队', '美国队','英国队','加拿大队','法国队' ]
  2. b = [ '中国队', '美国队','英国队','加拿大队','法国队' ]
  3. c = [i + ' 的对手是 ' + j for i in a for j in b if i != j]
  4. print(c)
  1. ['中国队 的对手是 美国队', '中国队 的对手是 英国队', '中国队 的对手是 加拿大队', '中国队 的对手是 法国队', '美国队 的对手是 中国队', '美国队 的对手是 英国队', '美国队 的对手是 加拿大队', '美国队 的对手是 法国队', '英国队 的对手是 中国队', '英国队 的对手是 美国队', '英国队 的对手是 加拿大队', '英国队 的对手是 法国队', '加拿大队 的对手是 中国队', '加拿大队 的对手是 美国队', '加拿大队 的对手是 英国队', '加拿大队 的对手是 法国队', '法国队 的对手是 中国队', '法国队 的对手是 美国队', '法国队 的对手是 英国队', '法国队 的对手是 加拿大队']
  1. a = [ '中国队', '美国队','英国队','加拿大队','法国队' ]
  2. b = [ '中国队', '美国队','英国队','加拿大队','法国队' ]
  3. c = [i + ' 的对手是 ' + j for i in a for j in b if j != i]
  4. print(c)
  1. ['中国队 的对手是 美国队', '中国队 的对手是 英国队', '中国队 的对手是 加拿大队', '中国队 的对手是 法国队', '美国队 的对手是 中国队', '美国队 的对手是 英国队', '美国队 的对手是 加拿大队', '美国队 的对手是 法国队', '英国队 的对手是 中国队', '英国队 的对手是 美国队', '英国队 的对手是 加拿大队', '英国队 的对手是 法国队', '加拿大队 的对手是 中国队', '加拿大队 的对手是 美国队', '加拿大队 的对手是 英国队', '加拿大队 的对手是 法国队', '法国队 的对手是 中国队', '法国队 的对手是 美国队', '法国队 的对手是 英国队', '法国队 的对手是 加拿大队']
  1. a = [ '中国队', '美国队','英国队','加拿大队','法国队' ]
  2. c = []
  3. for i in a:
  4. for k in a:
  5. if i != k :
  6. c.append(f'{i} 的对手是 {k}')
  7. print(c)
  1. ['中国队 的对手是 美国队', '中国队 的对手是 英国队', '中国队 的对手是 加拿大队', '中国队 的对手是 法国队', '美国队 的对手是 中国队', '美国队 的对手是 英国队', '美国队 的对手是 加拿大队', '美国队 的对手是 法国队', '英国队 的对手是 中国队', '英国队 的对手是 美国队', '英国队 的对手是 加拿大队', '英国队 的对手是 法国队', '加拿大队 的对手是 中国队', '加拿大队 的对手是 美国队', '加拿大队 的对手是 英国队', '加拿大队 的对手是 法国队', '法国队 的对手是 中国队', '法国队 的对手是 美国队', '法国队 的对手是 英国队', '法国队 的对手是 加拿大队']
  1. a = [ '中国队', '美国队','英国队','加拿大队','法国队' ]
  2. c = [i + ' 的对手是 ' + j for i in a for j in a if i != j]
  3. print(c)
  1. ['中国队 的对手是 美国队', '中国队 的对手是 英国队', '中国队 的对手是 加拿大队', '中国队 的对手是 法国队', '美国队 的对手是 中国队', '美国队 的对手是 英国队', '美国队 的对手是 加拿大队', '美国队 的对手是 法国队', '英国队 的对手是 中国队', '英国队 的对手是 美国队', '英国队 的对手是 加拿大队', '英国队 的对手是 法国队', '加拿大队 的对手是 中国队', '加拿大队 的对手是 美国队', '加拿大队 的对手是 英国队', '加拿大队 的对手是 法国队', '法国队 的对手是 中国队', '法国队 的对手是 美国队', '法国队 的对手是 英国队', '法国队 的对手是 加拿大队']