2019年11月5日 星期二

夠Python,一行指令輸出大心

前一篇文章"夠Python,利用集合持性來開發新版的XAXB小遊戲"在Python Taiwan社群中廣受各方高手的討論,讓敏哥成長很多,還學會了List comprehension,維基百科上有解釋,大家可以參考,有了List comprehension觀念,讓敏哥想起,僅僅一行程式,就能輸出一個大心,或許以前有看沒懂,今天早上起來趁著頭腦還算清楚,可以試著來看看是否能把它看懂。

程式碼摘自:一行Python代碼畫心型
print('\n'.join([''.join([('Love'[(x-y) % len('Love')]if ((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3 <= 0 else ' ')for x in range(-30, 30)])for y in range(30, -30, -1)]))

程式輸出結果:

看到程式簡直讓人敬佩,但我相信許多人跟敏哥一樣,應該有看沒有懂!
首先我們先來研究join()函式,可以參考"詳解Python中的join()函數的用法"的文章。

1.利用空白字元來連接兩個字串。
print (' '.join(["Hello", "World"]))
輸出結果:
Hello World

2.改用換行字元來連接兩個字串。
print ('\n'.join(["Hello", "World"]))
輸出結果:
Hello
World
在輸出大心時一開始就是用換行字來連結每一行的字串。

3.利用%算符來取出'Love'字串中的循序字元,下例是以0到9,記住range()函式內的尾數要減1,意即頭算尾不算,採用''空字串來串接'Love'字串中的循序字元。
print([''.join([('Love'[x % len('Love')])for x in range(0, 10)])])
輸出結果:
['LoveLoveLo']

4.加入if判斷式,只有在符合這個範圍才會顯示Love其中一個字元。
print([''.join([('Love'[x % len('Love')] if 2 < x < 8 else ' ')for x in range(0, 10)])])
['   eLove  ']

5.加入y的變數,您就可以知道,印出大心中的if是心的方程式。
print('\n'.join([''.join([('Love'[(x-y) % len('Love')]if 2 < x < 8 else ' ')for x in range(0, 10)])for y in range(0, 10)]))
輸出結果:
   eLove  
   veLov  
   oveLo  
   LoveL  
   eLove  
   veLov  
   oveLo  
   LoveL  
   eLove  
   veLov  

以上5個小例子,應該有助於您看懂Python一行指令印出大心。

本篇文章引起Python Taiwan社群的熱情討論,大家討論情形,如下:
https://www.facebook.com/groups/pythontw/permalink/10159323245848438/

一位熱情Python Taiwan社群提供分段式一行指令,有助於瞭解程式的意涵。

沒有留言:

張貼留言