【#codeforgender性別駭客工作坊】

Line Bot 教學工作坊 - part 1

Pyladies Taiwan x 女人迷

Speaker : Mars

2017/08/06

Roadmap

  • 基礎應用 08/06
    • 第一個Python程式
    • 字串與物件
    • 判斷式
    • 串列
    • 隨機
    • Line Bot Message Type
  • API的使用 08/13
    • 字典與json
    • Google Maps API
    • api.ai

基礎語法

第一個Python程式

練習環境:https://repl.it/languages/python3

In [1]:
print("Hello")
Hello

print(物件) 是將物件印出到螢幕上的內建「函式」
"Hello" 是一個物件,型別是「字串(str)」

函式稍後會再細講,我們先來看看物件

字串與物件

字串型別

字串要用成對的雙引號或是單引號,可利用相加來串連

In [2]:
print("Hello")
print('Hello')
print("Hello" + " " + "World")
Hello
Hello
Hello World

如果沒用引號,程式可能會認為是

  • 數值型別的物件
  • 命名物件
In [3]:
print("111"+"222")
print(111+222)
111222
333
In [4]:
print("3.14"+"1.59")
print(3.14+1.59)
3.141.59
4.73
In [5]:
print("Hello")
print(Hello)   # 一個名稱叫做Hello的物件(但因為從來沒有出現過,程式不知道是什麼)
Hello
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-5-f853250e53bd> in <module>()
      1 print("Hello")
----> 2 print(Hello)   # 一個名稱叫做Hello的物件(但因為從來沒有出現過,程式不知道是什麼)

NameError: name 'Hello' is not defined

數值型別

運算元:+ - * / % **

  • 整數 integer:int
  • 小數 float:float
In [6]:
print (10*3)  # 乘法
print (10/3)  # 除法
print (10%3)  # 取餘數
print (10**3) # 次方
30
3.3333333333333335
1
1000

命名物件

名稱 = 資料內容

  • 可以命名的字元:_、0~9、a~Z
  • 不能以數字開頭
  • 不能與保留字相同(ex: print ...)
  • 大小寫有別
  • 好的命名方式會讓程式碼容易閱讀
    • xyz = "http://blog.marsw.tw" vs.
      url = "http://blog.marsw.tw"
In [7]:
Hello = "Hi"
print(Hello)
Hi

名稱 = 資料內容

上面的語法,在Python中代表的意義是,
我們在右邊的「資料內容」存放位置貼上左邊「名稱」的標籤。
更改資料內容,就會是把這張標籤撕下來,黏到另外一個位置去。

  • 與其他語言,是直接把這個位置的內容物換掉的概念不太一樣
  • 沒有命名的物件,會馬上被丟棄
In [8]:
# 用id(物件)可看到這個物件的存放位置
a=3 
print(id(a))

a=4
print(id(a))
10105888
10105920

為什麼要用命名物件?

  • 資料可以重複利用
  • 需要知道存放資料的位置

資料可以重複利用

In [9]:
print("Hello")
print("Hello World")
print("Hello PyLadies")
Hello
Hello World
Hello PyLadies
In [10]:
greeting_word = "Hello"
print(greeting_word)
print(greeting_word+" World")
print(greeting_word+" PyLadies")
Hello
Hello World
Hello PyLadies

需要知道存放資料的位置

In [11]:
first_word=input("first_word=")
second_word=input("second_word=")
print(first_word+second_word)
first_word=Hello
second_word=PyLadies
HelloPyLadies

input(提示字)是輸入函式,
從程式執行畫面由鍵盤中輸入,輸入的資料會被儲存成字串型態。
而在 Line Bot 中,因為會與 Line 背後的系統串接,會是用另外的輸入方式。

判斷式:if/elif/else

  • 如果判斷條件為True,就執行縮排內的程式碼;為False就不執行。
  • if是判斷式必備的,每一個新的if就是一組新的判斷式
    • if:一種選項,滿足條件,才執行某動作
    • if + else:兩種選項,滿足條件與其他狀況(不滿足條件),各執行某動作
    • if + elif:兩種選項,滿足各條件,各執行某動作
    • if + elif + (elif)... + (else):多種選項,滿足各條件,各執行某動作
  • 邏輯運算元:and、or、not
In [12]:
print(11>8)
print(11%2==0)
True
False
In [13]:
a = 11
b = 8
# 第1組判斷式
if (a>b) and (a%2==0):
    print ("a>b , a is even")
elif (a>b):
    print ("a>b , a is odd")
else:
    print ("a<=b")
print ("這是判斷式外的區塊")
a>b , a is odd
這是判斷式外的區塊

=,代表的是將某個資料內容(右)貼上標籤(左),
a=3代表的是將儲存3的地方貼上標籤a,即標籤a的資料內容是3。

==,則是代表判斷左右兩邊的資料內容是否相等,
a==3代表的是標籤a的內容是否與3相等。

「縮排」(四個空白)是Python非常重要的一個觀念,
程式是用縮排,來斷定程式碼屬於那一個區塊,同時也兼顧了易讀性。

In [14]:
cost = 1000
gift = ""
# 第1組判斷式
if cost>=500:   # 滿500,送購物袋
    gift = gift+"購物袋"
# 第2組判斷式
if cost>=1000:  # 滿1000折100
    cost = cost-100
print(cost)
print(gift)
900
購物袋

想想看聊天機器人、Siri...,
這些是要用幾組判斷式呢?

Coding Time

先在repl.it上練習,之後再整合到Line機器人

  • 如果輸入「我想問」,會印出「建議你可以??」,
    否則就印出「我聽不懂你在說什麼!」
  • 接續前面,輸入「我想問」、「我有問題」、「求救」,
    都會印出「建議你可以??」
  • 接續前面,如果輸入「我很滿意你的服務」,
    印出「希望你有愉快的一天」

大概有抓到機器人回話的方式了吧~
我們還剩產生回覆的程式碼。

另外,會不會覺得
「我想問」、「我有問題」、「求救」用or串接,程式碼很長呢?

串列

串列名稱 = [ 第一個物件, 第二個物件, 第三個物件.....]

  • 可以同時存很多個元素的物件型態,每個元素用,來串接
  • 串列中每個元素可以不一定都要同一個型態
  • 可利用串列名稱.append(物件),在串列最後方增加物件
  • 串列[索引(index)],可拿到該索引位置的物件:Python中是從0開始正向數的;或者可從最後面-1,開始倒著數
In [15]:
my_list = ["Womany",2016,"PyLadies",2017]
print("The 2nd element is",my_list[1])
my_list.append(2016.0) # my_list = ["Womany",2016,"PyLadies",2017,2016.0]
print("The 2nd-last element is",my_list[-2])
The 2nd element is 2016
The 2nd-last element is 2017

「字串」 其實是 "每個元素都是一個字母" 的 「串列」

In [16]:
my_string = "PyLadies Taiwan"
print("The 1st  element of my_string = ",my_string[0])
print("The 8th  element of my_string = ",my_string[7])
print("The last element of my_string = ",my_string[-1]) 
The 1st  element of my_string =  P
The 8th  element of my_string =  s
The last element of my_string =  n

字串&串列,可通用的功能

  • len(字串/串列):計算長度
  • (字串/串列).count:計算某個物件出現過幾次
  • in:判斷某個物件是否存在字串/串列中
In [17]:
my_string = "PyLadies Taiwan"
print("Length of my_string = ",len(my_string))
print("The time 'a' appears in my_string = ",my_string.count('a'))
print("Py" in my_string)
Length of my_string =  15
The time 'a' appears in my_string =  3
True
In [18]:
my_list = ["Womany",2016,"PyLadies",2017,2016.0]
print("Length of my_list = ",len(my_list))
print("The time '2016' appears in my_string = ",my_list.count(2016))
print(2018 in my_list)
Length of my_list =  5
The time '2016' appears in my_string =  2
False

產生隨機值

  • 裝備random工具箱
  • 使用工具箱中的randint工具:產生一隨機數字(起始值<=隨機數<=結束值)
    • randint(起始值,結束值)
In [19]:
import random
my_list = ["Womany",2016,"PyLadies",2017,2016.0]
index = random.randint(0,len(my_list)-1)
print(my_list[index])
PyLadies

串列的長度是len(串列),上面的程式碼中串列長度為4,
我們要隨機產生串列中的可能,而索引是從0開始數,最後一個物件的索引是3,
所以結束值就是「串列長度-1」

Coding Time

先在repl.it上練習,之後再整合到Line機器人

  • 「我想問」、「我有問題」、「求救」改用串列的方式寫
  • 可以給個有各種鼓勵話語(心靈雞湯)的清單,再輸入特定關鍵字的時候,隨機產生

One More Thing

可以傳貼圖給機器人,你會發覺機器人已讀不回QQ
這是因為我們沒有建立機器人「處理貼圖的機制」,只有處理文字的!

回到 echo機器人範例
我們來看看文件

  • 有哪些接收訊息的種類?
  • 這些訊息帶有什麼樣的內容?
  • 哪些訊息可以做成echo機器人呢?
  • 程式碼是分別宣告在哪些地方?

Coding Time

可以試試看 接收/回傳
Image、Sticker、Location Message

! 注意:

  • ImageMessage
    • original_content_url:最大 1024 x 1024、1MB
    • preview_image_url:最大 240 x 240、1MB
  • Sticker:只能傳限定的貼圖