Chapter 1 Python基本使用

1.1 物件設定

Python: 只有=, 相當於R的<-

1.2 函數使用查詢

打函數名稱,游標點此名稱按F1。

查詢range()的使用

1.3 模組安裝

  • 開啟Anaconda navigator安裝

  • 在R使用以下指令安裝

有些modules只無法使用conda安裝,只能使用pip,例如Google API client

Conda與Pip是兩個不同的module管理下載系統,差異可見:https://www.anaconda.com/understanding-conda-and-pip/

1.4 conda維護

Tools > Terminal > New Terminal 接著輸入:

conda update conda
conda update conda-build

更新全部modules

conda update -n myEnvironment --update-all

1.5 基本元素類別

1.5.2 多維:向量

主要有三種情境類別:

  • list: [.,.,...]來定義,內容「事後」可以改變(稱之mutable)。

  • tuple: (.,.,...)來定義,內容「事後」不可以改變(即immutable)。

  • set: {.,.,…}來定義,代表集合,故元素先後位置不重要。(mutable)
    • set底下有dictionary特例,dictionary每個元素有名稱(key)

PPython基本元素:

atomic type: float, int, boolean, string

non-atomic: list, tuple, set, dictionary

atomic type及單純的tuple是immutable/hashable,無法直接修改內容。

set

原則上元素只能是:

  • 一維值

  • hashable tuple

Hashing is the process of converting some large amount of data into a much smaller amount (typically a single integer) in a repeatable way so that it can be looked up in a table in constant-time (O(1)), which is important for high-performance algorithms and data structures.

Immutability is the idea that an object will not change in some important way after it has been created, especially in any way that might change the hash value of that object.

集合set為數學上可能出象的列表,所以每個出象只需要列一次即可。


使用set來刪除list中重覆的元素

list,tuple,set差異

Lists are a basic and highly useful data structure built into the Python language. In addition to demonstrating fairly standard array-like behavior, lists possess additional functionality, such as automatic resizing, the ability to use slice notation, and a good set of convenience functions, methods, and operators. Note that there are a few more list methods than were covered in this chapter. You’ll find details on these in the Python documentation.

Tuples are similar to lists but can’t be modified. They take up slightly less memory and are faster to access. They aren’t as flexible but are more efficient than lists. Their normal use (from the point of view of a Python coder) is to serve as dictionary keys, which is discussed in chapter 7.

Sets are also sequence structures but with two differences from lists and tuples. Although sets do have an order, that order is arbitrary and not under the programmer’s control. The second difference is that the elements in a set must be unique.

1.6 元素粹取

在程式語言中取出元素值可以從兩個面向:

  • 依元素「數值」位置,稱為index。

  • 依元素「名稱」,稱為dictionary key(字典索引)。

前面所提到的list及tuple,其元素無法命名,都「只能」使用index來取元素。

  • Python只使用[.]來取元素:
    • 單一元素:[元素index]
    • 規則多個元素: [start:end_before:step]
    • 不規則多個元素: list comprehension

1.6.2 取規則多個

使用:

start_from:end_before:difference

  • 注意end_before: 只切到end_before的前一個停止,「不包含end_before」。

  • 0:5:1: 從0開始切到5前結束,每一份相差1單位,即切出indices: 0,1,2,3,4
    若difference為1,可只寫0:5

  • 0:5:2: 0,2,4

  • -2:5:-1: 從「倒數第2」index,切到5前結束,每一份相差-1單位, 即:-2,-3,-4,…,6;也就是「倒數第2,倒數第3,倒數第4,….,第6個」

  • -5:-2:1: 從「倒數第5」index,切到「倒數第2」前結束,每一份相差1單位,即-5,-4,-3

listA:

  • 從第2個(index=1)一直取到底

  • 從第1個(index=0)取到到數第2個

Python使用start_number:end_number選取元素時, 若end_number有指定,則取到end_number-1,即不包含end_number

1.6.3 不規則選取

一個個取

一個一個取

使用generator comprehension

(<expression> for <var> in <iterable>)

list comprehension

  • for index in [0,2]: index會在list [0,2]一一取出其值。

  • expression為listA[index]: index每拿到一個新的值就會放到listA[index]中index的位置——即取出listA對應元素值的意思。

由於list comprehension很常使用,故Python允許以下寫法

取出它的第1,7,8元素

1.7 dictionary

1.7.1 key-value pair

元素以key: value成對定義的集合(set):

tuple也可以用來當key。

有5個人的
* 學號為172,214,322,425,517
* 姓名為“小明”,“大雄”,“胖虎”,“小新”,“大白”
* 成績為80,60,90,70,50

1.創造名為grade的dictionary物件存下這些資訊。

  1. 取出成績的value

  2. 使用dictionary comprehension創造一個dictionary物件,其key-value pair為姓名-成績。

1.7.2 元素粹取

  • dictionary是set的延伸,故無法用「元素位置index」取元素;只能用元素「名稱」(稱為dictionary key(字典索引))來取。

取出sparseMatrix裡key為(1,1)的元素。

取多個只能使用generator comprehension方式:

並沒有dictionary()函數,所以不能寫:

1.8 (im)mutable, hashable

Table 7.2. Python values eligible to be used as dictionary keys

Python type

Immutable?

Hashable?

Dictionary key?

int Yes Yes Yes
float Yes Yes Yes
boolean Yes Yes Yes
complex Yes Yes Yes
str Yes Yes Yes
bytes Yes Yes Yes
bytearray No No No
list No No No
tuple Yes Sometimes Sometimes
set No No No
frozenset Yes Yes Yes
dictionary No No No

將: * 第1元素值改成0
* 第2元素值改成tuple (“a”,“b”)

1.9 List copy

1.9.1 定義複製與切割複製

list的「直接」複製主要有兩類:

  • 定義式的: 如以下的definitionCopy

  • 切出來再複製: 如以下的sliceCopy
    • ...[:]稱為slicing,或透過list.copy(a list)dict.copy(a dictionary)

定義式的複製下,definitionCopy與originalList的共同體,改一個就會變換另一個的值。

切割式複製則不會完全相依。

會有複製需要時多是為了做更動而不想改變源頭內容,所以多數情況應使用slice方式複製。

運算後的另存也不會完全相依

1.9.2 元素儲存邏輯

Python對list物件值在記憶體的存法是想成一棵樹:

以「非list」的值形成根部list:

  • 根部list:[1,2,3,,]

非atomic types的部份則放記憶對應位置,對應到應該放的元素分枝,這裡有兩枝:

  • [4,5]
  • [6,7]

一直分到每個尾端的葉都是單純「unnested」的list為止儲存。

list元素值:
* 若為atomic type則會放在同一塊記憶體位置;
* 若為list則在該元素會抽出來放另一塊記憶體位置,原元素改成放對應指標。

Figure 1.1: 樹狀記憶

Figure 1.2: 淺複製

Python是以樹狀結構在記憶list元素,然而在複製時(這裡我們不再談定義複製)Python內定是很“懒”的淺複製(shallow copy)—— 只有複製根部位,其他還是連著一起分享的。

淺複製下的lists,

  • 除「根」部位外,
  • 其餘部位的更動都會產生連動。

1.9.3 Deep copy

  • 避免使用=listObject來複製。

  • listObject不是nested list,使用=listObject.copy()來複製。

  • listObject是nested list,使用=copy.deepcopy(listObject)來複製。