天天看點

30天Python入門到進階——第2天:資料類型(Ⅰ)

30天Python入門到進階——第2天:資料類型(Ⅰ)

前言

在深入研究程式設計語言甚至人類語言的基本細節之前,我們需要了解它的術語和基本原理,并開始建構一個基本的心理模型,我們可以在必要時用作參考。

任何程式設計語言的建構塊主要可以分為以下幾類:

  • 術語
  • 資料類型
  • 動作(函數)
  • 最佳實踐

今天我花了一些時間來講解一些基本的 Python 術語、文法、它的資料類型和它的一些操作,或者在程式設計術語中被稱為函數。

變量

變量存儲值。在 python 中,這些是變量命名約定:

  • 變量應以字母(最好是小寫)或下劃線開頭,後面可以跟數字或下劃線
  • Snake case是變量的正常寫法如​

    ​user_name​

    ​​,單詞間用下劃線隔開(Javascript推薦駝峰命名,比如:​

    ​userName​

    ​)
  • 它們區分大小寫
  • 不能直接命名關鍵詞變量(檢視官方文檔《Python 關鍵字》)
30天Python入門到進階——第2天:資料類型(Ⅰ)

那麼如果,真的犯了這個錯,會怎麼樣呢?舉個例子:

>>> if = 1
SyntaxError: invalid syntax
>>> print(and)
SyntaxError: invalid syntax
>>> def = "hi"
SyntaxError: invalid syntax      

看到沒有?直接提示文法錯誤。

除了不能使用關鍵字作為辨別符,前面我們也強調過了,也不能使用内置函數同名的辨別符。Python有很多内置函數,以sum為例,這是一個求和的函數,我們看一下錯誤的命名導緻的後果:

>>> sum([1,2,3,4])
10
>>> sum = "錯誤辨別符名"
>>> sum([1,2,3,4])
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    sum([1,2,3,4])
TypeError: 'str' object is not callable      

先不管sum([1,2,3,4])的意義,它的作用是把1/2/3/4加在一起得到10,然後錯誤的給一個變量也取了個sum的辨別符名稱,再後面又調用sum([1,2,3,4])的時候,程式抛出異常,錯誤原因是str不是可調用的類型。歸根到底就是sum這個名字重名了的原因。

資料類型

簡單來說,資料類型是一種表示值的方式。在我們的現實世界中,我們将字母、數字、符号作為不同類型的常用值。同樣,Python 包含以下基本資料類型:

  • int(整數)
  • float(浮點數)
  • str(字元串)
  • bool(布爾值)
  • list(清單)
  • tuple(元祖)
  • set(集合)
  • dict(字典)
  • complex(複數)
  • None(空值)

這些是 Python 中可用的标準資料類型。要建立我們自己的自定義類型,需要使用類。也可以通過導入外部庫或子產品來使用專門的資料類型。

相反,在 JavaScript 中,有以下可用的原始類型:

  • number (數字:整數和小數)
  • string(字元串)
  • boolean(布爾值)
  • symbol(符号:唯一、不可變)
  • bigInt(大整數)
  • null(空值)
  • undefined(對象也是非原始類型)

今天我隻是花時間整理 Python 的數字和字元串類型。

數字

有 3 種數字資料類型:

  • int(存儲無限大小的整數)
  • float(存儲浮點實數值)
  • complex(我現在隻是跳過它,因為我了解到它不常用,類似于 JavaScript 中的 bigInt)。

相比之下,JavaScript 有兩種數值資料類型,Number和BigInt。

​​

​type​

​​函數用于确定值或表達式的類型。(類似于 JavaScript中的​

​typeof​

​運算符)

num = 100 # variable assignement
    print(type(num)) # <class 'int'>

    num2 = 99.99
    print(type(num2)) # <class 'float>

    expression1 = num * 10
    print(type(expression1)) # <class 'int'>

    expression2 = num + num2
    print(type(expression2)) # <class 'float'>      
在 Python 中,變量指派是通過編寫名稱并使用​

​=​

​​運算符指派來實作的。

在 JavaScript 中,變量名需要以​​

​var​

​​,​

​const​

​​或​

​let​

​關鍵字開頭。

數學計算

對于數學計算,除了前面提到過的簡單的加減乘除等等,更多的科學計算需要導入​

​math​

​這個庫,它包含了絕大多數我們可能需要的科學計算函數,如下表。有一些内置的數學函數可以讓我們輕松計算各種數學運算。

函數 傳回值 ( 描述 )
abs(x) 傳回數字的絕對值,如abs(-10) 傳回 10
ceil(x) 傳回數字的上入整數,如math.ceil(4.1) 傳回 5
exp(x) 傳回e的x次幂(ex),如math.exp(1) 傳回2.718281828459045
fabs(x) 傳回數字的絕對值,如math.fabs(-10) 傳回10.0
floor(x) 傳回數字的下舍整數,如math.floor(4.9)傳回 4
log(x) 如math.log(math.e)傳回1.0,math.log(100,10)傳回2.0
log10(x) 傳回以10為基數的x的對數,如math.log10(100)傳回 2.0
max(x1, x2,...) 傳回給定參數的最大值,參數可以為序列。
min(x1, x2,...) 傳回給定參數的最小值,參數可以為序列。
modf(x) 傳回x的整數部分與小數部分,兩部分的數值符号與x相同,整數部分以浮點型表示。
pow(x, y) x**y 運算後的值。
round(x [,n]) 傳回浮點數x的四舍五入值,如給出n值,則代表舍入到小數點後的位數。
sqrt(x) 傳回數字x的平方根
acos(x) 傳回x的反餘弦弧度值。
asin(x) 傳回x的反正弦弧度值。
atan(x) 傳回x的反正切弧度值。
atan2(y, x) 傳回給定的 X 及 Y 坐标值的反正切值。
cos(x) 傳回x的弧度的餘弦值。
hypot(x, y) 傳回歐幾裡德範數 sqrt(xx + yy)
sin(x) 傳回的x弧度的正弦值。
tan(x) 傳回x弧度的正切值。
degrees(x) 将弧度轉換為角度,如degrees(math.pi/2) , 傳回90.0
radians(x) 将角度轉換為弧度
print(round(2.1)) # 2
    print(round(5.9)) # 6
    print(abs(-34)) # 34      

以及兩個數學常量:

常量 描述
pi 數學常量 pi(圓周率,一般以π來表示)
e 數學常量 e,e即自然常數(自然常數)。

下面是一些應用展示,注意最後的角度調用方式:

>>> math.log(2)
0.6931471805599453
>>> math.cos(30)
0.15425144988758405
>>> math.cos(60)
-0.9524129804151563
>>> math.sin(30)
-0.9880316240928618
>>> math.sin(math.degrees(30))
-0.4097717985741408
>>> math.sin(math.radians(30))
0.49999999999999994      

字元串

字元串是Python中最常用的資料類型之一,使用單引号或雙引号來建立字元串,使用三引号建立多行字元串。字元串要麼使用兩個單引号,要麼兩個雙引号,不能一單一雙!Python不支援單字元類型,單字元在Python中也是作為一個字元串使用。

字元串是不可變的序列資料類型,不能直接修改字元串本身,和數字類型一樣!Python3全面支援Unicode編碼,所有的字元串都是Unicode字元串,是以傳統Python2存在的編碼問題不再困擾我們,可以放心大膽的使用中文。

name = 'Python' # string assignment within single quotes
    name2 = "Python" # string assingment within double quotes
    name3 = '''This is a a very long string and supports 
            multiline statements as well''' # string assingment within 3 single quotes
    name4 = 'Hello! \"Rockstar Programmer\"' # string with escaped character sequence
    print(type(name)) # <class 'str'>
    print(type(name2)) # <class 'str'>
    print(type(name3)) # <class 'str'>
    print(type(name4)) # <class 'str'>      
>>> var1 = 'Hello World!'
>>> var2 = "Jack"
>>> var3 = ""                   # 空字元串
>>> var4 = "it's apple"         # 雙引号中可以嵌套單引号
>>> var5 = 'This is "PLANE"!'   # 單引号中可以嵌套雙引号
>>> var6 = 'what is 'your'name'
SyntaxError: invalid syntax      

但是單引号嵌套單引号或者雙引号嵌套雙引号就會出現歧義。

>>> a = "haha"
>>> b = a
>>> a = "xixi"
>>> a is b
False
>>> a[1] = "z"
Traceback (most recent call last):
  File "<pyshell#70>", line 1, in <module>
    a[1] = "z"
TypeError: 'str' object does not support item assignment      

雖然字元串本身不可變,但可以像清單序列一樣,通過方括号加下标的方式,通路或者擷取它的子串,當然也包括切片操作。這一切都不會修改字元串本身,當然也符合字元串不可變的原則。

>>> s = "hello world!"
>>> s[4]
'o'
>>> s[2:6]
'llo '
>>> s
'hello world!'      

字元串連接配接

與 Javascript 類似,可以使用​

​+​

​運算符連接配接字元串。它隻是連接配接或“連接配接”字元串。

first_name = 'Mike'
    last_name = 'Tyson'
    print(first_name + ' ' + last_name) # Mike Tyson      

類型轉換

與存在隐式類型轉換(又名強制類型轉換)的 Javascript 不同,如果使用不同類型執行操作,Python 将抛出錯誤:

user_name = 'John'
    age = 40
    print(user_name + age) # TypeError: can only concatenate str (not "int") to str
    # This would work in Javscript where it would convert the result to string type      
user_name = 'John'
    age = 40
    print(user_name + str(age)) # John40
    print(type str(age)) # <class 'str'>      
lucky_number = 7
    lucky_number_stringified = str(7)
    lucky_number_extracted = int(lucky_number_stringified)
    print(lucky_number_extracted) # 7