从 JavaScript 角度学 Python(7) - 条件与回圈

前言

接下来是聊条件与回圈的部分,毕竟写程序这两个东西非常常使用到。

条件控制

条件控制的语法又可以称之为判断式、决策(?)等等,反正就统称条件式,也就是你熟悉的 if...else 啦。

通常来讲我们在 JavaScript 是非常常使用 ifif/elseif/else if/else 语法来做条件式判断,当条件成立时,就会走特定的 { ... } 内容,所以这边简单举例一下例子好了。

举例来讲,如果现在天气晴朗的话,我要出现「天气好棒!」,如果天气不好的话,要出现「天气好差!」的字眼:

var now = true;

if(now) {
  console.log('天气好棒!');
} else {
  console.log('天气好差!');
}

上面是一个非常简单的 JavaScript if/else 条件式判断,若希望条件多一点的话,则是使用 if/else if/else

var myName = 'Ray';

if(myName === 'QQ') {
  console.log('哈罗 QQ');
} else if (myName === 'Ray') {
  console.log('哈罗 Ray');
} else if(myName === 'Hello') {
  console.log('哈罗');
} else {
  console.log('都不熟');
}

那麽 Python 呢?写法上会有差异吗?先让我们看看 if/else 部分:

now = True
if now:
  print('天气好棒!')
else:
  print('天气好差!')

看起来没什麽差别对吧?但是在 if/else if/else 撰写上 Python 就会有那麽一点点差异。

在 Python 中不是 if/else if/else 而是 if/elif/else

(注意 Python 中并没有三等号运算子,在 JavaScript 中会有这个功能主要原因是隐含转型导致,但在 Python 不会有这个状况,通常你必须自己转型。)

myName = 'Ray'

if myName == 'QQ':
  print('哈罗 QQ')
elif myName == 'Ray':
  print('哈罗 Ray')
elif myName == 'Hello':
  print('哈罗')
else:
  print('都不熟')

题外话一下 Python 中没有 Switch/Case 的写法,但是网路上依然查得到相当多的解决方案,所以这边就不特别拉出来讲了。

目前 Python 3.10 版本已经有推出类似 switch 的语法叫做 match,用法也与 switch 很像:

myName = 'Ray'

match myName:
  case 'QQ':
    print('哈罗 QQ')
  case 'Ray':
    print('哈罗 Ray')

剩下对於 match 有兴趣的话,可以阅读 官方 文件。

对了,Python 的 if/else 在做条件判断时,并不需要使用 () 包覆,但是如果你使用 () 也是可以:

now = True
if (now):
  print('天气好棒!')
else:
  print('天气好差!')

那麽为什麽不会出错呢?最主要是 if 的条件只接受表达式,刚好 () 会优先执行後回传里面的内容,因此才不会出现错误,并不是代表着两种写法都可以这一点可以稍微注意一下,你不信?你可以试着输入以下程序码,看它会出现 (1) 还是 1

print((1))

你尝试了吗?我觉得应该没有。

https://ithelp.ithome.com.tw/upload/images/20210907/20119486krJKuWI1Tl.png

所以我这边补充一下,如果上面的定论是一个错误的说法的话,那麽上方 print 正常来讲会直接输出 (1),但实际上是会出现 1,因此可以验证并不是 Python 可以接受 if (True) 的写法,而是 () 回传一个结果给了 if/else 条件式哩。

回圈

接下来聊聊回圈的部分,回圈在 JavaScript 中有满多种写法,像是 for loopfor...in 或者是 forEach 等等非常多,满多都是跟阵列操作有关系,所以这边也推荐我先前写的 关於 JavaScript 阵列20种操作的方法,这一篇要感谢偷米骑巴哥老师的整理,这边有兴趣的人可以直接观看那篇文章,这边就不再着墨了。

那麽让我们先看一段简单的 JavaScript for loop 范例:

for(var i = 0; i < 10; i+=1){
  console.log(i); // 0...1...2......9
}

上面程序码的预期结果会出现 0~9,那麽 Python 的回圈该如何撰写呢?主要写法 for...in 的写法,但是如果想要达到上方相同作法的话,这边就必须使用 Python 的内建方法 range() 来产生一个阵列范围,你可以把它想像成原本自己要手打 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],但是透过 range() 你可以快速生成一个阵列的概念:

for i in range(10):
  print(i)

这边简单聊一下关於 range() 这个函式有哪些功用,基本上依据你传入的参数量可以得到不同的结果

  • range(10) - 产生 0~9 的范围
  • range(2, 10) - 产生 2~9 的范围
  • range(2, 10, 4) - 产生递增范围 4,,以这个范例来讲起始值是 2,因此会 2 + 4 = 6,但是因为 6 + 4 超过 range() 范围,因此只会出现 2 跟 6。

当然你也可以直接传入一个阵列来跑回圈也是完全没有问题的:

for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]:
  print(i)

但我相信你不会想要这样写程序的,除非你真的很猛

https://ithelp.ithome.com.tw/upload/images/20210907/20119486blK4Im8v6I.png

对了,你也可以试着撰写面试常见的 9x9 考题,答案我就留到最後再公布吧。

这边也额外提一个好玩的地方,如果 for loop 所传入的是一个字串,回圈是将字串变成一个一个单字取出:

for i in 'Ray':
  print(i)

https://ithelp.ithome.com.tw/upload/images/20210907/20119486o7qwAbGnhZ.png

除此之外还有另一种回圈写法是 while loop,我先承认我自己在 JavaScript 中是比较少使用这种写法,之前写也常常写出死回圈(怕)

https://ithelp.ithome.com.tw/upload/images/20210907/20119486B0IvXTObOj.png

回归正题,那麽先聊聊 JavaScript 中 while loop 是怎麽写的:

var i = 0;
while(i < 5) {
  i += 1;
  console.log('Hello Ray' + i);
}

另一种 while 则是 do...while

var i = 0;
do {
  i += 1;
  console.log('Hello Ray' + i);
} while(i < 5) 

基本上这两者呈现的结果是非常相似,都是 Hello Ray 1...5,但是 do...while 中的 do 不管条件是否成立,必定会执行一次:

var i = 0;
do {
  i += 1;
  console.log('Hello Ray' + i);
} while(i < 0); // Hello Ray1

var i = 0;
// 条件不符合不执行
while(i < 0) {
  i += 1;
  console.log('Hello Ray' + i);
}

反观我们来看看 Python 中的 while loop 写法会不会有所不同呢?让我们继续看下去:

i = 0
while i < 5:
  i += 1
  print('Hello Ray' + str(i))

基本上感觉差异是不大,但是这边可以额外提一下 Python 是没有 do...while 语法的,可是我们可以模拟一个 do....while 类似的运作写法出来:

i = 0
status = True

while status:
  i += 1
  print('Hello Ray' + str(i))
  if i >= 0:
    status = False

透过上述写法我们就可以很简单的达到与原本 do...while 类似的写法,也就是不管条件语法必定会执行一次这件事情。

但是请务必要小心下面这种没有结束条件的写法,是很容易出现死回圈的:

i = 0
while True:
  print(i)
  i += 1

这种写法上要格外小心,在此建议不要当 7474 团(去死去死团)拿自己电脑冒险 QQ

九九乘法表 Python 答案

基本上就是用两个回圈就可以做到了:

for i in range(2, 10):
  for j in range(2, 10):
    print(str(i) + 'x' + str(j) + '=' + str(i*j))

而上方写法又称之为「Nested For Loop」,也就是巢状回圈,通常在初学时满容易混乱的。

这边也简单描述一下运作逻辑,第一层的 for loop 在执行时,第二层 for loop 会跑九次(0~9),第二层 for loop 跑完之後记忆体会被释放掉,然後再跑第一层 for loop,以此类推。

作者的话

稍微尝试了一下将鸡肉卷起来做花雕醉鸡,身边亲人与朋友吃完之後都说不输给外面卖的,看来我替自己的未来找到第二片春天了...

关於兔兔们

兔法无边


<<:  【Day 4】输出之後,BERT转换的Embedding怎麽用?

>>:  [iT铁人赛Day8]JAVA阵列(中篇)

[Day 20] 资料产品与 DataOps 价值

资料可以是资产、也可以是负债。 当组织积累了太多无用、甚至错误的资料时,资料不但不能提供价值,反而需...

[Day12]ISO 27001 标准:验证范围

其实 ISO 系统都是通用的,从 ISO 9001、 ISO 14001、 ISO 50001、IS...

[Day 27] 何谓趋势

N天後收盘价 若N天後收盘价 > 目前收盘价,趋势为正 若N天後收盘价 < 目前收盘价,...

Day 05 : 资料处理 Pandas (1)

excel 是很多人常用来处理报表与数据的工具,同样地在 python 也有一个套件常常在处理这件事...

#17-不用套件让网站Logo动起来~(SVG SMIL)

要让SVG 动起来,可以使用SMIL:SVG的原生动画规范, 虽然前几年Chrome放话不再支援,但...