01 - 常見物件與輸入輸出

  • 第一支Python程式
  • 字串與數值型別操作
  • 物件命名與型別查看
  • 型別轉換
  • 輸入與輸出
  • 字串好用的方法
  • 布林型別、比較&邏輯運算

第一支Python程式

print("Hello PyLadies")
  • print(想印的東西)print 叫做函式,Python 有內建需多好用的函式
  • Hello PyLadies 前後都有 雙引號包著,這種型別我們叫做「字串」

字串與數值型別操作

字串(string)

  • 可以直接給定詞句
  • 也可以給空白句
  • 可以相+、相*
In [1]:
print("Hi")
print("" + "Py" + 'Ladies')
print("Hello"*4)
Hi
PyLadies
HelloHelloHelloHello

!注意

  • 用「成對的」雙引號"或是單引號',將字串包住

而電腦 Computer 其實另外一種翻譯方式叫做「計算機」,
所以想當然「數值」也是字串之外常用的型別。

數值

  • 整數 integer:int
  • 浮點數 float:float
  • 運算元+ - * / // % **
  • 在Python裡面整數interger可以儲存的位數,取決於電腦記憶體有多大
In [2]:
print(10+3)  # 加法
print(10-3)  # 減法
print(10*3)  # 乘法
print(10/3)  # 除法
print(10//3) # 除法(取整數,無條件捨去)
print(10%3)  # 取餘數
print(10**3) # 次方
13
7
30
3.3333333333333335
3
1
1000

[練習]

在學校的時候,調成績很常喜歡開根號後再*10
我們就來練習看看 70 分調分之後是多少

Hint:

  • 開根號 = 0.5 次方

[進階練習]

鉛筆 1 支 5 元,一打(12支) 50 元。
要買 42 支請問最少要花多少錢?

Hint:

  • 打數 = 42 除以 12 的整數
  • 打數*50 + 剩下的支數*5
print(10+3)  # 加法
print(10-3)  # 減法
print(10*3)  # 乘法
print(10/3)  # 除法
print(10//3) # 除法(取整數,無條件捨去)
print(10%3)  # 取餘數
print(10**3) # 次方

現在的舉例是10跟3的各種運算, 那如果我想換成55跟5呢?

物件命名與型別查看

物件命名

In [3]:
a=10
b=3
print(a+b)  # 加法
print(a-b)  # 減法
print(a*b)  # 乘法
13
7
30
  • 在Python程式中「=」可以想像成是「貼標籤」的意思
  • 在右邊的「物件」(資料內容)存放位置貼上左邊「名稱」的標籤,亦即名稱指向物件。
  • 可以讓物件(資料內容)重複利用,程式碼可以更為簡潔
    • Python有垃圾收集(garbage collection)機制,沒有名稱指向的物件會被回收
a=10
url = "http://blog.marsw.tw"
  • a、url 都是自行命名的物件
  • 可以命名的字元:_、0~9、a~Z (中文也行,但不建議)

特別注意!!!

  • 不能以數字開頭
  • 不能與保留字相同
  • 好的命名方式會讓程式碼容易閱讀
    • xyz = "http://blog.marsw.tw" vs.
      url = "http://blog.marsw.tw"

保留字

andasassertbreakclass
continuedefdelelifelse
exceptfinallyforfromglobal
ifimportinislambda
nonlocalnotorpassraise
returntrywhilewithyield
NoneFalseTrueexecprint

In [4]:
a=3
b=a
print(id(a),id(b))
a=4
print(id(a),id(b))
4512700528 4512700528
4512700560 4512700528

內建函數-型別查看

  • type(物件):印出此物件的型別
In [5]:
my_score = 96
pi = 3.14159
url = "http://blog.marsw.tw"

print(type(my_score))
print(type(pi))
print(type(url))
print(type(print))
<class 'int'>
<class 'float'>
<class 'str'>
<class 'builtin_function_or_method'>

在 Python 中,所有東西都是物件!!!

Python 是一個動態性的語言

  • 標籤可以隨時貼到不同型別的物件上
In [6]:
my_score = 96
print(type(my_score))

my_score = 96.0
print(type(my_score))

my_score = "96"
print(type(my_score))
<class 'int'>
<class 'float'>
<class 'str'>

型別轉換

!注意

  • 字串與數值不可一同運算
In [7]:
my_string = "123"
my_int_number = 456
print(my_string+my_int_number)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-fd442dc9fc85> in <module>()
      1 my_string = "123"
      2 my_int_number = 456
----> 3 print(my_string+my_int_number)

TypeError: must be str, not int

內建函式-型別轉換

  • int(物件):將物件轉成整數(integer)型別
  • float(物件):將物件轉成浮點數(float)型別
  • str(物件):將物件轉成字串(string)型別

!注意

  • 字串轉數字,需要符合整數、浮點數的格式
In [8]:
input1 = 123
input2 = "456"
input3 = "5566.123"
print(str(input1)+input2)
print(input1+int(input2))
print(float(input3)+input1)
print(int(input3))
123456
579
5689.123
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-8-496e0602659a> in <module>()
      5 print(input1+int(input2))
      6 print(float(input3)+input1)
----> 7 print(int(input3))

ValueError: invalid literal for int() with base 10: '5566.123'

[練習]

請修正以下程式碼,讓字串相加變成是數值相加,也就是結果會是 120

a = "70"
b = "50"
print(a+b)

這對已經會寫程式的你,這或許不是難事,
但假設你希望把你寫的好用程式也讓其他人能使用呢?

如果有個跟我們平常在用的計算機一樣,
可以有個介面輸入數字、想要運算的方式,
程式就能產生我想要的結果,好像很不錯~

輸入與輸出

  • 物件 = input(提示字):從鍵盤輸入值
    • 輸入的值會儲存為字串型別
    • 貼上「物件名稱」的標籤才能知道輸入的資料在哪
  • print(物件):輸出物件到螢幕上
    • 可以用,印出多個物件(印出後,會以空格分隔物件)
In [9]:
a = input("請輸入a~")  # "請輸入a~" 是提示字,讓我們知道電腦在等我們輸入
b = input("請輸入b~")
print(a+b)            # input進來是字串
請輸入a~2
請輸入b~5
25
In [10]:
a = input("請輸入a~")  # "請輸入a~" 是提示字,讓我們知道電腦在等我們輸入
b = input("請輸入b~")
print(a+b)            # input進來是字串
請輸入a~Hello
請輸入b~PyLadies
HelloPyLadies

[練習]

請修正以下程式碼,讓他是計算機的功能
eg. 我分別輸入 5 (按下Enter) 10 (按下Enter) 結果會是 15

a = input("請輸入a~")
b = input("請輸入b~")
print(a+b)

input()可以讓我們跟電腦互動
而不單單只是讓電腦print()東西出來而已

互動的計算機

In [11]:
a = input("請輸入a~") # "請輸入a~" 是提示字,讓我們知道電腦在等我們輸入
a = int(a)          # input進來是字串,要做數值運算要用int()轉換   
# 以上也可以簡寫為 a = int(input("請輸入a~"))
print("a*2=",a*2)
print("a^2=",a**2)
請輸入a~3
a*2= 6
a^2= 9

問候機器人

In [12]:
a = input("請問你的名字是? ") 
print("你好",a)      # 用,分隔會印出空格
# print("你好"+a)     # 可以用字串相加,就不會有空格
請問你的名字是? Mars
你好 Mars

字串好用的方法

取代 replace

原字串.replace(舊字串,新字串,取代次數)

  • 將「原字串」中「舊字串」都取代為「新字串」,
    產生一個新的「處理後字串」,並不會改變原來字串
  • 取代次數預設是無限次
In [13]:
my_string = "PyLadies Taiwan"
print(my_string.replace("a","A"))
print(my_string.replace("a","A",2))
print(my_string)
PyLAdies TAiwAn
PyLAdies TAiwan
PyLadies Taiwan
In [14]:
my_string = "PyLadies Taiwan"
my_string = my_string.replace("a","A") # 讓原來命名的標籤,貼到新的字串
print(my_string)
my_string = my_string.replace("T","L")
print(my_string)
my_string = my_string.replace("LA","")
print(my_string)
PyLAdies TAiwAn
PyLAdies LAiwAn
Pydies iwAn

replace 應用情境

景點改名

In [15]:
article="""
中正紀念堂,位於臺北市中正區,全區250,000平方公尺,主樓高76公尺。
中正紀念堂全區面積達250,000平方公尺,除了高76公尺的主建築外,還有國家戲劇院、國家音樂廳(合稱「兩廳院」),以及....等。
"""
# 字串太長,或有換行,可以用三個 雙引號" 或是 單引號' 包起來
article=article.replace("中正紀念堂","臺灣民主紀念園區")
print(article)
臺灣民主紀念園區,位於臺北市中正區,全區250,000平方公尺,主樓高76公尺。
臺灣民主紀念園區全區面積達250,000平方公尺,除了高76公尺的主建築外,還有國家戲劇院、國家音樂廳(合稱「兩廳院」),以及....等。

資料正規化

In [16]:
brand = "APPLE"
brand = brand.replace("A","A").replace("P","P").replace("L","L").replace("E","E")
print(brand)
APPLE

[練習]

試著把以下這篇演講逐字稿

  • 把前面出現的三個「女孩」取代成「女生」
  • 然後印出
article = """2012年我創立了一間公司 來教女孩寫程式 我發現到,透過教程式編寫 其實我是在培養她們變得勇敢 
程式編寫是一個「不斷檢測 與發現錯誤」的無止境過程 
要設法在對的地方,輸入正確的指令 有時候只是差一個分號 就足以決定成敗 
程式碼錯了,就全盤皆錯 時常要嘗試很多很多次 奇蹟才會出現 
你試著建構的東西總算活了起來 這項工作需要毅力 需要不完美

我們馬上就發現 參與學程的女孩都害怕犯錯 害怕不完美 「寫程式的女孩」計畫的每個老師 都告訴我一樣的故事 
第一週,女孩們還在學 怎麼編寫程式碼時 學生會請她過去跟她說 「我不知道要寫什麼程式碼」 
老師看了看她的螢幕 只會看到一片空白 
假如她不夠瞭解,她會覺得她的學生 花了20分鐘,只是盯著螢幕發呆 
但如果她多按幾下復原鍵 她會看見學生其實 寫下程式碼又刪除了 
她試過,她逼近了 可是還沒做到完全正確 
她不呈現編寫的進展 卻寧願給人看一片空白 寧缺勿濫"""

進階挑戰

  • 如果我希望把前面三個出現「女孩」的地方保留,而其他地方的「女孩」都取代成「女生」呢?

格式化-format

包含{}的字串.format(將{}取代的值)

format裡可以放數值、字串,不用特別再將數值轉換成字串型別

產生各股票網址(股票代號是在網址中,不是在尾端)

In [17]:
# 使用字串相加
url = "http://www.wantgoo.com/stock/"+str(2330)+"?searchType=stocks"
print(url)
url = "http://www.wantgoo.com/stock/"+str(2371)+"?searchType=stocks"
print(url)
http://www.wantgoo.com/stock/2330?searchType=stocks
http://www.wantgoo.com/stock/2371?searchType=stocks
In [18]:
# 使用格式化方法
url = "http://www.wantgoo.com/stock/{}?searchType=stocks".format(2330)
print(url)
url = "http://www.wantgoo.com/stock/{}?searchType=stocks".format(2371)
print(url)
http://www.wantgoo.com/stock/2330?searchType=stocks
http://www.wantgoo.com/stock/2371?searchType=stocks

可以傳遞很多參數

  • 按照順序取用參數
In [19]:
word1 = "颱風"
word2 = "泛舟"
my_sentence = "{}就是要{}呀,不然要幹嘛?".format(word1,word2)
my_sentence = word1+"就是要"+word2+"呀,不然要幹嘛?"           # 用字串相加,程式碼會比較凌亂
print(my_sentence)

word1 = "夏天"
word2 = "吃冰"
my_sentence = "{}就是要{}呀,不然要幹嘛?".format(word1,word2)
print(my_sentence)
颱風就是要泛舟呀,不然要幹嘛?
夏天就是要吃冰呀,不然要幹嘛?

[練習]

第一次會輸入<姓名>,
第二次會輸入<喜好>,
利用字串的format方法,
讓程式印出「我是PyLadies的<姓名>,我喜歡<喜好>,很高興認識大家!」

Hint:

  • input():輸入,要記得要用個命名物件去接,儲存的型別為字串
  • 字串前後記得要有雙引號或單引號
name = input()
hobby = _____
print("我是PyLadies的___,我喜歡___,很高興認識大家!"_______)

布林型別、比較&邏輯運算

布林型別

  • True
  • False

比較運算

  • 產生的結果為bool布林型別
  • <, <=, >, >=, ==, !=
In [20]:
print(10>3)
print(10==3) #<左邊的物件>「是否等於」<右邊的物件>  
print(10!=3) #不等於
print(10<=3)
print("Hi"=="hi")
True
False
True
False
False

邏輯運算

  • 產生的結果為bool布林型別
  • and:左右物件都為True=>True
  • or:左右物件其一為True=>True
  • not:反轉True/False
In [21]:
print(10>3 and 10==3)
print(10>3 or 10==3)
print(not 10==3)
False
True
True

內建函數-型別判定

  • isinstance(物件,型別):產生的結果為bool布林型別
In [22]:
print(isinstance(222,int))
print(isinstance(3.14,int))
print(isinstance(3.14,float))
print(isinstance('3.14',str))
True
False
True
True

布林型別轉換

可以用來判斷常見的型別是否有資料

  • 數值是否不等於0
  • 字串是否有值
  • ...
In [23]:
print(bool(""), bool(0))
print(bool(-1), bool(0.01), bool(1), bool("Hi"))
False False
True True True True

[進階練習]

輸入一個數字,如果是奇數,印出 True; 否則印出 False(也就是偶數的意思)

Hint:

  • input():輸入,要記得要用個命名物件去接,儲存的型別為字串
  • bool(數值不等於0) = True
  • 奇數:除以二的餘數不等於0
a = input()
print(___(___(a)__2))

[進階練習]

忘了些東西在公司,但末班的公車快來了,不知道是否來得及~
分別輸入五個數字,分別是

  • 現在的時間-小時部分
  • 現在的時間-分鐘部分
  • 末班車時間-小時部分
  • 末班車時間-分鐘部分
  • 公車站往返公司所需的分鐘

請寫一隻程式判斷是否來得及(剛好到達也算): 來得及就印 True,否則印 False!

eg. 21 00 21 15 13 => True
現在時間是 21:00,末班車發車時間是 21:15,往返時間需要 13 分鐘 => 來得及

Hint:

我們還不知道怎麼寫程式讓分鐘超過60就進位,小時也有0~23的限制

  • 可以全部都換算成分鐘 eg. 00:01 => 1 , 01:02 => 62
  • input():輸入,要記得要用個命名物件去接,儲存的型別為字串
  • 小於等於是<=符號、大於是>符號