課時5:閒聊之Python的資料型別

那是個好男孩發表於2018-07-25

目錄:

一、引言

二、資料型別

  >整型

  >浮點型

  >布林型別

三、型別轉換

四、獲得關於型別的資訊

五、課時05課後習題及答案

 

***********

一、引言

***********

大家還記得‘520’和520的區別嗎?

沒錯,帶了引號的,無論是單引號還是雙引號或者是三引號,都是字串;但不帶引號的,就是數字。字串相加叫作拼接。

>>> "520"+'1314'
'5201314'
>>> 520+1314
1834

今天來介紹一些Python的資料型別,包括整型、浮點型、布林型別、複數型別等。

 

****************

二、資料型別

****************

1、整型

整型說白了,就是平時所見的整數,Python3的整數已經與長整型進行了無縫的結合,現在的Python3的整型類似於Java的BigInteger型別,它的長度不受限制。                                                        如果說非要有個限制,那隻限於計算機的虛擬記憶體總數。所以用Python3很容易進行大數的計算。

2、浮點型

浮點型就是平時所說的小數。Python區分整型和浮點型的唯一方式,就是看有沒有小數點。

談到浮點型,不得不提E記法,E記法就是平常所說的科學記數法,用於表示特別大和特別小的數。

>>> a=0.000000000000000000025
>>> a
2.5e-20
>>> 150000000000
150000000000
>>> 1.5e11
150000000000.0

這個E的意思是指數,指底數為10,E後邊的數字是10的多少次冪。

3、布林型別

布林型別事實上是特殊的整型,True相當於整數值1,False相當於整數值0.

>>> True + False
1
>>> True + True
2
>>> True/False
Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    True/False
ZeroDivisionError: division by zero

當然把True和False當成1和0來參與這種運算的這種做法是不妥的。

 

***************

三、型別轉換

***************

接下來介紹幾個跟資料型別緊密相關的函式:int()、float()、str().

1、int()的作用就是將一個字串或浮點數轉換為一個整數

>>> a = '520'
>>> b = int(a)
>>> a,b
('520', 520)
>>> c = 5.99
>>> d = int(c)
>>> c,d
(5.99, 5)

注意了,如果是浮點數轉換為整數,那麼Python會採取”截斷“處理,就是把小數點後的資料直接砍掉,注意不是四捨五入哦。

補充:

>>> a = int("小甲魚")
Traceback (most recent call last):
  File "<pyshell#21>", line 1, in <module>
    a = int("小甲魚")
ValueError: invalid literal for int() with base 10: '小甲魚'

”小甲魚“是一個字串,但不是一個表示數字的字串,它是一個編碼,編碼跟數字沒有關係。所以會報錯。

2、float()的作用是將一個字串或整型轉換成一個浮點數(就是小數)

>>> a = "520"
>>> b = float(a)
>>> a,b
('520', 520.0)
>>> c = 520
>>> d = float(c)
>>> c,d
(520, 520.0)

3、str()的作用是將一個數或任意其他型別轉換成一個字串

>>> a = 5.99
>>> b = str(a)
>>> a,b
(5.99, '5.99')
>>> c = str(5e15)
>>> c
'5000000000000000.0'
>>> d = str(15)
>>> d
'15'
>>> c = str(5e19)
>>> c
'5e+19'

 

****************************

四、獲得關於型別的資訊

****************************

Python提供了一個函式,可以明確的告訴我們變數的型別,這就是type函式:

>>> type("520")
<class 'str'>
>>> type(5.20)
<class 'float'>
>>> type(520)
<class 'int'>
>>> type(true)
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    type(true)
NameError: name 'true' is not defined
>>> type(True)
<class 'bool'>

我們更建議使用isinstance()這個BIF來確定變數的型別。這個BIF有兩個引數:第一個是待確定型別的資料;第二個是指定一個資料型別。

>>> type(True)
<class 'bool'>
>>> a = "小甲魚"
>>> isinstance(a,str)
True
>>> isinstance(520,float)
False
>>> isinstance(520,int)
True

 

*******************************

五、課時05課後習題及答案

*******************************

測試題:

0. 在 Python 中,int 表示整型,那你還記得 bool、float 和 str 分別表示什麼嗎?
1. 你知道為什麼布林型別(bool)的 True 和 False 分別用 1 和 0 來代替嗎?
2. 使用 int() 將小數轉換為整數,結果是向上取整還是向下取整呢?
3. 我們人類思維是習慣於“四捨五入”法,你有什麼辦法使得 int() 按照“四捨五入”的方式取整嗎?
4. 取得一個變數的型別,視訊中介紹可以使用 type() 和 isinstance(),你更傾向於使用哪個?
5. Python3 可以給變數命名中文名,知道為什麼嗎?

動動手:

0. 針對視訊中小甲魚提到的小漏洞,再次改進我們的小遊戲:當使用者輸入錯誤型別的時候,及時提醒使用者重新輸入,防止程式崩潰。
如果你嘗試過以下做法,請舉下小手:
temp = input("不妨猜一下小甲魚現在心裡想的是哪個數字:")
# 這種想法是因為type(1)會返回<class 'int'>,如果type(temp)返回結果一致說明輸入是整數。
while type(temp) != type(1):
  print("抱歉,輸入不合法,", end='')
   temp = input("請輸入一個整數:")

或者可能這樣:

temp = input("不妨猜一下小甲魚現在心裡想的是哪個數字:")
# not操作符的作用是將布林型別的結果翻轉:即取反的意思,not True == Flase
while not isinstance(temp, int):
    print("抱歉,輸入不合法,", end='')
    temp = input("請輸入一個整數:")

以上方法的思路是正確的,不過似乎忽略了一點兒:就是input()的返回值始終是字串,所以type(temp)永遠是<class 'str'>!  
其實有蠻多的做法可以實現的,不過就目前我們學習過的內容來看,還不足夠。
所以,在讓大家動手完成這道題之前,小甲魚介紹一點新東西給大家!

s為字串

s.isalnum()  所有字元都是數字或者字母,為真返回 Ture,否則返回 False。

s.isalpha()  所有字元都是字母,為真返回 Ture,否則返回 False。

s.isdigit()  所有字元都是數字,為真返回 Ture,否則返回 False。

s.islower()  所有字元都是小寫,為真返回 Ture,否則返回 False。

s.isupper()  所有字元都是大寫,為真返回 Ture,否則返回 False。

s.istitle()  所有單詞都是首字母大寫,為真返回 Ture,否則返回 False。

s.isspace()  所有字元都是空白字元,為真返回 Ture,否則返回 False。
         
例如:

>>> s = 'I LOVE FISHC'
>>> s.isupper()
>>> True

好了,文字教程就到這裡,大家趕緊趁熱打鐵,改造我們的小遊戲吧!

1. 寫一個程式,判斷給定年份是否為閏年。(注意:請使用已學過的 BIF 進行靈活運用)
這樣定義閏年的:能被4整除但不能被100整除,或者能被400整除都是閏年。

 

答案:

測試題答案:

0. 在 Python 中,int 表示整型,那你還記得 bool、float 和 str 分別表示什麼嗎?

bool 表示布林型別
float 表示浮點型
str 表示字串

1. 你知道為什麼布林型別(bool)的 True 和 False 分別用 1 和 0 來代替嗎?

你可能聽說過計算機是很“笨”的,究其根本是因為它只認識二進位制數,所以所有的程式語言最終都會轉換成簡單的二進位制序列給CPU按照一定的規則解析。
由於二進位制只有兩個數:0 和 1,因此用 0 和 1 來表示 False 和 True 再適合不過了,因為不用浪費資源在轉換的過程上!

2. 使用 int() 將小數轉換為整數,結果是向上取整還是向下取整呢?

我們可愛的小甲魚說了,小數取整會採用比較暴力的截斷方式,即向下取整。(注:5.5向上取整為6,向下取整為5)

3. 我們人類思維是習慣於“四捨五入”法,你有什麼辦法使得 int() 按照“四捨五入”的方式取整嗎?

int() 固然沒那麼“聰明”,但機器是死的,魚油是活的!
5.4 “四捨五入”結果為:5,int(5.4+0.5) == 5
5.6 “四捨五入”結果為:6,int(5.6+0.5) == 6
大家看明白了嗎?

4. 取得一個變數的型別,視訊中介紹可以使用 type() 和 isinstance(),你更傾向於使用哪個?

建議使用 isinstance(),因為它的返回結果比較直接,另外 type() 其實並沒有你想象的那麼簡單,我們後邊會講到。

5. Python3 可以給變數命名中文名,知道為什麼嗎?

Pyhton3 原始碼檔案預設使用utf-8編碼(支援中文),這就使得以下程式碼是合法的: 
>>> 小甲魚 = '我愛你'  
>>> print(小甲魚)
>>> 我愛你

 

動動手答案:

0. 針對視訊中小甲魚提到的小漏洞,再次改進我們的小遊戲:當使用者輸入錯誤型別的時候,及時提醒使用者重新輸入,防止程式崩潰。
需要注意的地方在程式碼中已經註釋!

 1 import random
 2 times = 3
 3 secret = random.randint(1,10)
 4 print('------------------我愛魚C工作室------------------')
 5 guess = 0
 6 print("不妨猜一下小甲魚現在心裡想的是哪個數字:", end=" ")
 7 while (guess != secret) and (times > 0):
 8     temp = input()
 9     while not temp.isdigit():
10         temp = input("抱歉,您的輸入有誤,請輸入一個整數:")
11     guess = int(temp)
12     times = times - 1 # 使用者每輸入一次,可用機會就-1
13     if guess == secret:
14         print("我草,你是小甲魚心裡的蛔蟲嗎?!")
15         print("哼,猜中了也沒有獎勵!")
16     else:
17         if guess > secret:
18             print("哥,大了大了~~~")
19         else:
20             print("嘿,小了,小了~~~")
21         if times > 0:
22             print("再試一次吧:", end=" ")
23         else:
24             print("機會用光咯T_T")
25 print("遊戲結束,不玩啦^_^")

1. 寫一個程式,判斷給定年份是否為閏年。

 1 temp = input('請輸入一個年份:')
 2 while not temp.isdigit():
 3     temp = input("抱歉,您的輸入有誤,請輸入一個整數:")
 4 
 5 year = int(temp)
 6 if year/400 == int(year/400):
 7     print(temp + ' 是閏年!')
 8 else:
 9     if (year/4 == int(year/4)) and (year/100 != int(year/100)):
10         print(temp + ' 是閏年!')
11     else:
12         print(temp + ' 不是閏年!')

 

相關文章