[Day_20]回圈与生成式 - (6)

生成式(comprehension)

生成式可以依照规模产生资料,接着将资料储存在串列、字典与集合内。

串列生成式

若要生产一个串列有5个数字,而5个数字分别是「1、2、3、4与5」,我们可以使用以下方式产生这个串列。

a = []
a.append(1)
a.append(2)
a.append(3)
a.append(4)
a.append(5)

或者使用for回圈也可以产生此串列。

a = []
for i in range(1,6):
    a.append(i)

Python提供另一种产生的方式为生成式(comprehension),比较符合Python的风格,串列生成式的语法为「[运算式 for 元素 in 可迭代的物件]」,使用「[]」表示为串列,可迭代的物件式tuple、串列、字串、字典与函式range等,刚才范例使用生成式改写後如下。

[x for x in range(1,6)]

前後使用「[]」代表是串列,这行程是可以产生一个串列,串列有5个数字,5个数字分别是「1、2、3、4与5」。

生成式也可以加上条件判断,加上条件判断的串列生成式格式为「[运算式 for 元素 in 可迭代的物件 if 条件判断]」。
产生一个串列,该串列元素为1到10的所有奇数数字,使用生成式可以写成以下程序。

[x for x in range(1,11)if x%2 == 1]

生成式也可以包含另一个生成式,前面生成式执行一次,後面接的生成式要执行完毕,形成巢状生成式,巢状生成式的格式为「运算式 for 元素1 in 可迭代的物件1 for 元素2 in 可迭代的物件2」。
以下程序会执行九九乘法表,串ㄎ列每一个元素都式tuple,纪录九九乘法表的被乘、乘数与积的结果。

[(i,j,i*j) for i in range(1,10) for j in range(1,10)]

产生器(generator)

python中没有tuple的生成式,可以使用「(运算式 for 元素 in 可迭代的物件)」制作产生器(generator),这不是tuple生成式,使用「()」表示为产生器。例如:制作1到10的奇数产生器,产生器为「(num for num in range(1,10)if(nu,%2) == 1」,产生器只能执行一次,执行第二次产生任何值,以下来看个范例

#input
odd = (num for num in range(1,10) if (num%2)==1)
print(odd)
for num in odd:
    print(num)
for num in odd:
    print(num)
    
#output
<generator object <genexpr> at 0x00000273811DA8C8>
1
3
5
7
9
#第二次的「for num in odd:
#             print(num)不会输出任何资料,因为产生器只能使用一次

以上是今天回圈与生成式的介绍,
明天会给大家更多例题练习喔!!
/images/emoticon/emoticon05.gif


<<:  Day 20 | 3D蛇走迷宫AR游戏开发Part1 场景放置、平面侦测

>>:  网页表格-30天学会HTML+CSS,制作精美网站

[Day30] 完结洒花❀ 看完赛心得顺便用Python画 3D 渐层花朵!

谢谢看到这里的各位,若没有你们来看我的文章我可能早就弃赛了XD 其实我报名完後就後悔了,结果竟然没有...

Day13-React 表单验证篇-使用第三方函式库 Formik 进行表单的验证

Formik 介绍 在进行实作之前,先来认识一下 Formik 吧~ 如标题所说,Formik 是一...

[Angular] Day26. Reactive forms (二)

上一篇中介绍了如何使用 FormControl 建立单个表单控制元件,也介绍了如何使用 FormGr...

[Day 18] 来看看v-pre、v-cloak、v-once呗

嗨嗨大家今天过得好吗?我今天成功煎了一颗蛋。今天的篇幅虽然看似有点短,但是里面的内容却是崭新且重要的...

[Day18] CH10:排序大家族——合并排序法

今天要介绍的是我们学的最後一个排序法——合并排序法(Merge Sort)。 合并排序法 分成切割与...