1. 程式人生 > >從Docker零基礎到懂一點實踐教程(八)

從Docker零基礎到懂一點實踐教程(八)

Docker容器的資料管理

Docker容器的資料卷

Docker的設計理念是提供應用程式之間的隔離,因此Docker容器的生存週期通常與應用程式是一致的,但我們對資料的生存週期卻有著不一樣的需求。此外,我們也需要一個在容器之間共享資料的機制。這些因素催生了Docker資料卷的產生。

Docker資料卷是經過特殊設計的目錄,可以繞過聯合檔案系統(UFS),為一個或多個容器提供訪問。資料卷設計的目的在於對資料的持久化,它完全獨立於容器的生命週期,因此Docker不會在刪除容器時刪除其掛載的資料卷,也不會存在類似垃圾收集的機制。

┌────────────────────────────────────────┐
│             Docker Host                │
│                                        │
│┌────────────────┐┌────────────────────┐│
││    Docker      ││ Local File
System ││ ││ ││ ││ ││ ┌──────────┐ ││ ││ ││ │Container1│------------- ││ ││ └──────────┘ ││ | ││ ││ ┌──────────┐ ││ ┌──────────────┐ ││ ││ │Container2│--------│Directory/File│ ││ ││ └──────────┘ ││ └──────────────┘ ││ ││ ┌──────────┐ ││ | ││ ││ │Container3│------------- ││
││ └──────────┘ ││ ││ │└────────────────┘└────────────────────┘│ └────────────────────────────────────────┘

Docker資料卷的特點:
1. 資料卷是存在於Docker宿主機作業系統中的目錄或檔案;
2. 資料卷可以實現容器與宿主機之間的資料共享;
3. 資料卷在容器啟動時初始化,如果容器使用的映象在掛載點包含資料,這些資料會被拷貝到資料卷中;
4. 資料卷可以在多個容器之間共享和重用;
5. 資料卷裡的內容可以被容器直接且實時地修改;
6. 資料卷的變化不會影響到映象的更新;
7. 資料卷會一直存在,即便掛載資料卷的容器已經被刪除;

通過命令掛載資料卷

我們可以使用docker run命令的-v選項,指定資料卷在宿主機中的位置,容器中的掛載點,以及掛載時的許可權(預設是可讀可寫的):$ sudo docker run -it -v ~/container_data:/data:ro ubuntu /bin/bash

下面我們就來建立兩個容器,它們都將宿主機中的“~/container_data”目錄作為資料卷,並掛載到了自己的“/data”上,唯一的不同是它們的許可權是否可寫:

[email protected]:~$ mkdir ~/container_data
[email protected]:~$ 
[email protected]:~$ docker run -it -v ~/container_data:/data --name dv_test1 ubuntu /bin/bash
[email protected]4f2393e92f0a:/# 
[email protected]4f2393e92f0a:/# ls /data
[email protected]4f2393e92f0a:/# 
[email protected]4f2393e92f0a:/# echo "I'm in container dv_test1!" > /data/dv1
[email protected]4f2393e92f0a:/# 
[email protected]4f2393e92f0a:/# ls /data
dv1
[email protected]4f2393e92f0a:/# 
[email protected]4f2393e92f0a:/# [email protected]:~$ 
[email protected]:~$ 
[email protected]:~$ docker run -it -v ~/container_data:/data:ro --name dv_test2 ubuntu /bin/bash
[email protected]880aa5bac52c:/# 
[email protected]880aa5bac52c:/# ls /data
dv1
[email protected]880aa5bac52c:/# 
[email protected]880aa5bac52c:/# cat /data/dv1 
I'm in container dv_test1!
[email protected]880aa5bac52c:/# 
[email protected]880aa5bac52c:/# echo "I'm in container dv_test2!" > /data/dv2
bash: /data/dv2: Read-only file system
[email protected]880aa5bac52c:/# 
[email protected]880aa5bac52c:/# ls /data/
dv1
[email protected]880aa5bac52c:/# 
[email protected]880aa5bac52c:/# [email protected]:~$ 
[email protected]:~$ 
[email protected]:~$ docker inspect dv_test1
......
        "Mounts": [
            {
                "Source": "/home/schen/container_data",
                "Destination": "/data",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
......
[email protected]:~$ 
[email protected]:~$ docker inspect dv_test2
......
        "Mounts": [
            {
                "Source": "/home/schen/container_data",
                "Destination": "/data",
                "Mode": "ro",
                "RW": false,
                "Propagation": "rprivate"
            }
        ],
......
[email protected]:~$ 

通過構建映象使用資料卷

我們也可以通過Dockerfile的VOLUME指令構建帶有資料卷的映象,與使用docker run命令掛載資料卷不同的是,VOLUME指令所建立的資料卷是不能對映到已經存在的本地檔案或目錄中的,在映象構建時指定的資料卷會在容器啟動時建立對應的資料卷,並且相同映象所啟動的不同容器,會建立不同的資料卷。

為了演示,我們建立一個Dockerfile,它包含有一條VOLUME指令,並且指定建立兩個資料卷:

schen@scvmu01:~/dockerfile/dv_test1$ cat Dockerfile 
# Data volume test
FROM ubuntu:16.04
VOLUME ["/datavolume1", "/datavolume2"]
CMD /bin/bash
schen@scvmu01:~/dockerfile/dv_test1$ 

下面我們通過這個Dockerfile構建映象,並啟動兩個容器:

schen@scvmu01:~/dockerfile/dv_test1$ docker build -t shichen/dvt .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM ubuntu:16.04
 ---> bd3d4369aebc
Step 2 : VOLUME /datavolume1 /datavolume2
 ---> Running in d9145d832e91
 ---> 7e241dced923
Removing intermediate container d9145d832e91
Step 3 : CMD /bin/bash
 ---> Running in 5a8c39fb2f70
 ---> 4be45feabc99
Removing intermediate container 5a8c39fb2f70
Successfully built 4be45feabc99
schen@scvmu01:~/dockerfile/dv_test1$ 
schen@scvmu01:~/dockerfile/dv_test1$ docker run -it --name dv_test3 shichen/dvt
root@c7daa2b38455:/# ls -la /datavolume*
/datavolume1:
total 8
drwxr-xr-x  2 root root 4096 Nov  6 05:48 .
drwxr-xr-x 36 root root 4096 Nov  6 05:48 ..

/datavolume2:
total 8
drwxr-xr-x  2 root root 4096 Nov  6 05:48 .
drwxr-xr-x 36 root root 4096 Nov  6 05:48 ..
root@c7daa2b38455:/# 
root@c7daa2b38455:/# schen@scvmu01:~/dockerfile/dv_test1$
schen@scvmu01:~/dockerfile/dv_test1$ 
schen@scvmu01:~/dockerfile/dv_test1$ docker run -it --name dv_test4 shichen/dvt
root@0bfb674ae6b3:/# 
root@0bfb674ae6b3:/# ls -la /datavolume*
/datavolume1:
total 8
drwxr-xr-x  2 root root 4096 Nov  6 05:49 .
drwxr-xr-x 36 root root 4096 Nov  6 05:49 ..

/datavolume2:
total 8
drwxr-xr-x  2 root root 4096 Nov  6 05:49 .
drwxr-xr-x 36 root root 4096 Nov  6 05:49 ..
root@0bfb674ae6b3:/# 
root@0bfb674ae6b3:/# schen@scvmu01:~/dockerfile/dv_test1$ 
schen@scvmu01:~/dockerfile/dv_test1$ 

我們看到,這兩個容器各有兩個資料卷,雖然掛載點的名字相同,但實際它們是不能互相訪問的。我們可以通過docker inspect命令清楚地看到它們在本地對映的並不是相同的資料卷:

schen@scvmu01:~$ docker inspect --format='{{range $i := .Mounts}}{{$i.Destination}} -> {{$i.Source}}
{{end}}' dv_test3
/datavolume1 -> /var/lib/docker/volumes/aaf345c38ea3d92bc71fcd5392cad0318f1c38af0ac2c5301e816ce9c30f0311/_data
/datavolume2 -> /var/lib/docker/volumes/922d5a4f29d9e02123d780017b3e2415215b9eaf3b7ac76e9605e15716f3163b/_data

schen@scvmu01:~$ 
schen@scvmu01:~$ docker inspect --format='{{range $i := .Mounts}}{{$i.Destination}} -> {{$i.Source}}
{{end}}' dv_test4
/datavolume1 -> /var/lib/docker/volumes/e7fa53efde00770ee77dd3045e02fa2e9b9181934ba3610ddb921d5cf80ea90f/_data
/datavolume2 -> /var/lib/docker/volumes/9f1e70acd2a046207325981f7a299d4cb16be29f6d7bd01f221688400ea46e59/_data

schen@scvmu01:~$ 

那麼,當我們不能訪問到本地目錄時,如何在容器之間共享資料呢?這就涉及到我們下一章節所講到的“資料卷容器”的概念。

Docker的資料卷容器

資料卷容器

命名的容器掛載資料卷,其他容器通過掛載這個容器實現資料共享,掛載資料卷的容器,就叫做資料卷容器。

┌────────────────────────────────────────────────────────────┐
                        Docker Host                         
                                                            
│┌───────────────────────────────────┐┌─────────────────────┐│
││              Docker               ││  Local File System  ││
││                                   ││                     ││
││ ┌──────────┐                      ││                     ││
││ │Container1│----------            ││                     ││
││ └──────────┘          |           ││                     ││
││ ┌──────────┐    ┌──────────────┐  ││   ┌──────────────┐  ││
││ │Container2│----│Data Container│-------│Directory/File│  ││
││ └──────────┘    └──────────────┘  ││   └──────────────┘  ││
││ ┌──────────┐          |           ││                     ││
││ │Container3│----------            ││                     ││
││ └──────────┘                      ││                     ││
│└───────────────────────────────────┘└─────────────────────┘│
└────────────────────────────────────────────────────────────┘

使用資料卷容器

我們可以通過使用docker run命令的--volumes-from選項掛載資料卷容器。該命令的完整格式為:$ docker run --volumes-from [CONTAINER_NAME],這裡的“CONTAINER_NAME”就是包含有資料卷的容器的名字。

首先,我們來建立一個數據卷容器,並在其中寫入一個檔案:

schen@scvmu01:~$ docker run -it --name dv_test5 shichen/dvt
root@0268b9e7c96a:/# 
root@0268b9e7c96a:/# touch /datavolume1/dvt5_1
root@0268b9e7c96a:/# 
root@0268b9e7c96a:/# ls /datavolume1
dvt5_1
root@0268b9e7c96a:/# 
root@0268b9e7c96a:/# exit   
exit
schen@scvmu01:~$ 

然後我們將這個容器“dv_test5”作為資料卷容器,執行兩個新的容器“dv_test6”和“dv_test7”,並在其中各寫入一個檔案:

schen@scvmu01:~$ docker run -it --name dv_test6 --volumes-from dv_test5 ubuntu
root@e6cdc884e449:/# 
root@e6cdc884e449:/# touch /datavolume1/dvt6_1 
root@e6cdc884e449:/# 
root@e6cdc884e449:/# ls /datavolume1
dvt5_1  dvt6_1
root@e6cdc884e449:/#  
root@e6cdc884e449:/# exit
exit
schen@scvmu01:~$ 
schen@scvmu01:~$ docker run -it --name dv_test7 --volumes-from dv_test5 ubuntu
root@0286d712eb0a:/# 
root@0286d712eb0a:/# touch /datavolume1/dvt7_1      
root@0286d712eb0a:/# 
root@0286d712eb0a:/# ls /datavolume1          
dvt5_1  dvt6_1  dvt7_1
root@0286d712eb0a:/# 
root@0286d712eb0a:/# exit
exit
schen@scvmu01:~$ 

我們發現容器“dv_test6”和“dv_test7”都使用了“dv_test5”的資料卷,通過docker inspect命令我們可以更直觀地看到這個資訊:

schen@scvmu01:~$ docker inspect --format='{{range $i := .Mounts}}{{$i.Destination}} -> {{$i.Source}}
{{end}}' dv_test5
/datavolume1 -> /var/lib/docker/volumes/3c72e900d0ba4a5bc78d262356cd547efeef2994b8603269d2c5f8355b35c134/_data
/datavolume2 -> /var/lib/docker/volumes/1dd96105a517f850af8530b6d2e3177545f8f7854c6239285bea26cfe180dc3c/_data

schen@scvmu01:~$ 
schen@scvmu01:~$ docker inspect --format='{{range $i := .Mounts}}{{$i.Destination}} -> {{$i.Source}}
{{end}}' dv_test6
/datavolume1 -> /var/lib/docker/volumes/3c72e900d0ba4a5bc78d262356cd547efeef2994b8603269d2c5f8355b35c134/_data
/datavolume2 -> /var/lib/docker/volumes/1dd96105a517f850af8530b6d2e3177545f8f7854c6239285bea26cfe180dc3c/_data

schen@scvmu01:~$ 
schen@scvmu01:~$ docker inspect --format='{{range $i := .Mounts}}{{$i.Destination}} -> {{$i.Source}}
{{end}}' dv_test7
/datavolume1 -> /var/lib/docker/volumes/3c72e900d0ba4a5bc78d262356cd547efeef2994b8603269d2c5f8355b35c134/_data
/datavolume2 -> /var/lib/docker/volumes/1dd96105a517f850af8530b6d2e3177545f8f7854c6239285bea26cfe180dc3c/_data

schen@scvmu01:~$ 

由此可見,使用--volumes-from選項,會將資料卷容器中有關資料卷的資訊拷貝到新啟動的容器中。

現在我們來做一個試驗,在容器全部停止的狀態下,使用docker rm -v命令來刪除容器“dv_test5”,指定-v選項是為了告訴Docker在刪除容器的同時,也刪除掉與容器相關聯的資料卷:

schen@scvmu01:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
schen@scvmu01:~$ 
schen@scvmu01:~$ docker rm -v dv_test5
dv_test5
schen@scvmu01:~$ 
schen@scvmu01:~$ docker restart dv_test6
dv_test6
schen@scvmu01:~$ 
schen@scvmu01:~$ docker attach dv_test6
root@e6cdc884e449:/# 
root@e6cdc884e449:/# touch /datavolume1/dvt6_2
root@e6cdc884e449:/# 
root@e6cdc884e449:/# ls /datavolume1
dvt5_1  dvt6_1  dvt6_2  dvt7_1
root@e6cdc884e449:/# 
root@e6cdc884e449:/# exit
exit
schen@scvmu01:~$ 

試驗的結果是Docker並沒有刪除容器“dv_test5”所關聯的資料卷,這是因為該資料卷仍被其他容器所關聯,在這種情況下Docker並不會刪除這些資料卷。

小結

使用資料卷容器,可以很方便地在容器之間共享資料,同時我們並不需要使用者確切地連線到一個已知的Docker宿主機上的檔案或目錄,這一點在多租戶環境中十分重要,因為在這種情況下我們並不想暴露伺服器過多的實際資訊。

Docker資料卷的備份和還原

既然使用資料卷是為了儲存資料,那麼就不可避免地涉及到資料的備份、還原以及遷移等操作。在這些情況下,我們可以通過使用資料卷技術,完成對資料進行操作的各種任務。

資料備份

我們可以使用如下的命令備份資料卷中的資料:
- docker run --volumes-from [CONTAINER_NAME] -v $(pwd)/backup:/backup ubuntu tar -cvf /backup/data_volume_name.tar [DATA_VOLUME_IN_CONTAINER]

為了方便理解,請看下面的圖示:

┌───────────────────────────────────────┐
│             Docker Host               │
│                                       │
│┌────────────────┐┌───────────────────┐│
││    Docker      ││ Local File System ││
││                ││                   ││
││ ┌──────────┐   ││   ┌─────────────┐ ││
││ │Container1│<-------│ DATA_VOLUME │ ││
││ └──────────┘   ││   └─────────────┘ ││
││    |    ..................:         ││
││    v    v      ││                   ││
││ ┌──────────┐   ││   ┌─────────────┐ ││
││ │Container2│<-------│$(pwd)/backup│ ││
││ └──────────┘   ││   └─────────────┘ ││
│└────────────────┘└───────────────────┘│
└───────────────────────────────────────┘

執行該備份命令的容器就是圖中的“Container2”,首先它會通過--volumes-from選項從要備份的容器“Container1”處引入其資料卷,這步完成後就建立了圖中“DATA_VOLUME”到“Container2”的對映關係,然後它會通過-v選項掛載用於備份的資料卷,也就是圖中“$(pwd)/backup”到“Container2”的對映關係。同時映射了這些資料卷後,不論是通過複製還是打包,都能輕易地將資料備份出來。這裡我們正是通過tar命令完成備份操作的。

我們以備份容器“dv_test6”上的資料卷為例進行演示:

schen@scvmu01:~$ ls
container_data  dockerfile
schen@scvmu01:~$ 
schen@scvmu01:~$ docker run --volumes-from dv_test6 -v $(pwd)/backup:/backup ubuntu tar -cvf /backup/datavolumes.tar /datavolume1 /datavolume2
tar: Removing leading `/' from member names
/datavolume1/
/datavolume1/dvt5_1
/datavolume1/dvt7_1
/datavolume1/dvt6_2
/datavolume1/dvt6_1
/datavolume2/
[email protected]:~$ 
[email protected]:~$ ls
backup  container_data  dockerfile
[email protected]:~$ 
[email protected]:~$ tar -tvf ./backup/datavolumes.tar 
drwxr-xr-x root/root         0 2016-11-06 17:34 datavolume1/
-rw-r--r-- root/root         0 2016-11-06 16:55 datavolume1/dvt5_1
-rw-r--r-- root/root         0 2016-11-06 17:10 datavolume1/dvt7_1
-rw-r--r-- root/root         0 2016-11-06 17:34 datavolume1/dvt6_2
-rw-r--r-- root/root         0 2016-11-06 16:59 datavolume1/dvt6_1
drwxr-xr-x root/root         0 2016-11-06 16:55 datavolume2/
[email protected]:~$ 

還原資料

同樣,我們也可以使用如下的命令還原資料卷中的資料:
- docker run --volumes-from [CONTAINER_NAME] -v $(pwd)/backup:/backup ubuntu tar -xvf /backup/data_volume_name.tar -C [ROOT_PATH_FOR_DATA_VOLUME_IN_CONTAINER]

schen@scvmu01:~$ docker restart dv_test6
dv_test6
schen@scvmu01:~$ 
schen@scvmu01:~$ docker attach dv_test6
root@e6cdc884e449:/# 
root@e6cdc884e449:/# rm /datavolume*/*
root@e6cdc884e449:/# 
root@e6cdc884e449:/# ls -la /datavolume*
/datavolume1:
total 8
drwxr-xr-x  2 root root 4096 Nov  6 11:33 .
drwxr-xr-x 37 root root 4096 Nov  6 11:32 ..

/datavolume2:
total 8
drwxr-xr-x  2 root root 4096 Nov  6 08:55 .
drwxr-xr-x 37 root root 4096 Nov  6 11:32 ..
root@e6cdc884e449:/# 
root@e6cdc884e449:/# schen@scvmu01:~$ 
schen@scvmu01:~$ 
schen@scvmu01:~$ docker run --volumes-from dv_test6 -v $(pwd)/backup:/backup ubuntu tar -xvf /backup/datavolumes.tar -C /
datavolume1/
datavolume1/dvt5_1
datavolume1/dvt7_1
datavolume1/dvt6_2
datavolume1/dvt6_1
datavolume2/
schen@scvmu01:~$ 
schen@scvmu01:~$ docker attach dv_test6
root@e6cdc884e449:/# 
root@e6cdc884e449:/# ls -la /datavolume*
/datavolume1:
total 8
drwxr-xr-x  2 root root 4096 Nov  6 09:34 .
drwxr-xr-x 37 root root 4096 Nov  6 11:32 ..
-rw-r--r--  1 root root    0 Nov  6 08:55 dvt5_1
-rw-r--r--  1 root root    0 Nov  6 08:59 dvt6_1
-rw-r--r--  1 root root    0 Nov  6 09:34 dvt6_2
-rw-r--r--  1 root root    0 Nov  6 09:10 dvt7_1

/datavolume2:
total 8
drwxr-xr-x  2 root root 4096 Nov  6 08:55 .
drwxr-xr-x 37 root root 4096 Nov  6 11:32 ..
root@e6cdc884e449:/# 

相關推薦

Docker基礎一點實踐教程

Docker容器的資料管理 Docker容器的資料卷 Docker的設計理念是提供應用程式之間的隔離,因此Docker容器的生存週期通常與應用程式是一致的,但我們對資料的生存週期卻有著不一樣的需求。此外,我們也需要一個在容器之間共享資料的機制。這些因素催

Docker基礎一點實踐教程

Docker映象與倉庫(一) 檢視和刪除映象 Docker映象是一種使用聯合載入技術實現的層疊的只讀檔案系統,它是容器構建的基石。Docker的映象儲存在/var/lib/docker目錄下。通過docker info命令可以檢視到Docker使用的儲存

Docker基礎一點實踐教程

Docker容器的網路連線 Docker容器的網路基礎 docker0 通過ifconfig命令我們可以檢視到一個名為“docker0”的虛擬網橋,Docker就是通過這個網路裝置為容器提供各種網路服務的。 schen@scvmu01:~/d

Docker基礎一點實踐教程

Docker客戶端和守護程序 Docker的CS模式 在Docker的實現機制中,有兩個重要的概念,“Docker客戶端”和“Docker守護程序”。“Docker守護程序”執行在宿主計算機上,在CS模式中充當Server的角色,它為“Docker客戶端

Swift教程_基礎學習Swift完整例項_swift完整例項新增View的動畫效果、新增View的陰影

6.新增View的動畫效果 本章節主要來做明細頁面點選後翻轉的動畫效果,該效果可以進行多種改變,以達到想要的效果。 1.首先我們需要進行翻轉的正反兩個view,前面我們已經做好了,分別是PKOElementDetailImageView和PKOElementDetailIm

基礎APP自動化測試教程

APP自動化框架選擇 目前較火的自動化工具特點對比: Appium(適用於Android&iOS;支援多語言;不需要應用原始碼)Uiautomator(適用於Android;僅Java語言;不需要應用原始碼)Robotium(適用於Android;僅Java語言;不需要應用原始碼)Calabash(

Python基礎入門到高階教程附安裝指南、安裝包、程式碼

你想要進入一個全新的領域時,首先要弄清楚的就是它的體系。那麼在Python領域,應該掌握哪些知識點呢? Python基礎與高階程式設計   1、Linux環境搭建與python安裝 2、Python語法基礎 3、Python字串解析 4、Python時間和日曆

Swift教程_基礎學習Swift完整例項_swift基礎簡單值、控制流、方法和閉包

三、Swift基礎介紹 本章將對Swift做一個簡單說明,內容取自《The Swift Programming Language》,並加之自己的理解。首先swift全域性作用域中的程式碼會被自動當做程

Swift教程_基礎學習Swift完整例項_swift例項簡介

一、文章簡介 本人最近開始學習有關Swift這個新東東,由於沒有專案支撐,只能通過官方文件進行自學,精簡的看了Swift官方文件,感覺理解起來還是比較簡單,於是突發奇想,想把官方object-c的sa

Swift教程_基礎學習Swift完整例項_swift完整例項構建展示層

本章節主要來完善前前面已經建立好的storyboard中的頁面,包括自定義的view等。 1.PKOElementTableViewCell 該自定義view作為列表的行view,包含左側的圖片以及中間的文字描述。這裡要注意需要通過setNeedsDisplay告訴系統進行繪製。 程式碼如下。 import

Swift教程_基礎學習Swift完整例項_總結

五、總結 加上寫博文的時間,用了前前後後一週左右的時間,每晚2小時左右,完成了這個改造,由於我是第一次碰swift,有些東西還用不順手,用時比較長。期間還簡單學習了一下swift基本語法和部分用法。

python基礎教程

處理 true spa 查看 對象 信息 世界 基礎教程 設計 創建自已的對象(類)是python非常核心的概念,事實上,python被稱為面向對象語言,本章會介紹如何創建對象。以及面向對象的概念:繼承、封裝、多態。 多態: 可對不同類的對象使用同樣的操作。 封裝:對

基礎快速入門SpringBoot2.0

acc href 項目文件 apache tro maven打包 相關 utf tps 零基礎快速入門SpringBoot2.0 (一) 一、SpringBoot2.x依賴環境和版本新特性說明 簡介:講解新版本依賴環境和springboot2新特性概述

基礎入門學習Python》10--列表:一個打了激素的陣列

  前言 有時候我們需要把一些東西暫時儲存起來,因為他們有著一些直接或間接的聯絡,我們需要把它們放在某個組或者集合中,未來可能用得上。 很多接觸過程式設計的朋友都知道,都接觸過陣列這個概念,那麼陣列這個概念事實上很簡單,把一大堆同總型別資料挨個擺在一塊,然後通過陣列的下標進行索

基礎入門學習Python》12--列表:一個打了激素的陣列(三)

前言 這節課我們繼續談一下Python列表一些知識(其中包括比較操作符,邏輯操作符,連線操作符,重複操作符,成員關係操作符,還有一些其他關於列表的方法) 視訊中的0知識點 Python常用操作符 比較操作符 ​ >>> list1 = [123] >&g

基礎入門學習Python》19--函式:我的地盤聽我的

前言 接下來仔細講講函式與過程和區域性變數和全域性變數的作用範圍 知識點 函式與過程 在許多程式語言中,函式(function)是有返回值的,過程(procedure)是簡單、特殊並且沒有返回值的。而在Python中,嚴格來說只有函式沒有過程。  例如:

基礎入門學習Python》18--函式:靈活即強大

前言 上一節課我們基本介紹Python函式的用法,這一節課我們主要針對函式的引數進行進一步的深入學習。 知識點 形參(parameter)和實參(argument) >>> def MyFirstFunction(name): '函式定義過程中的n

基礎入門學習Python》17--函式:Python的樂高積木

前言 小甲魚的話——相信大家小時候都玩過神奇的樂高積木, 只要通過想象力和創造力我們可以拼湊很多神奇的東西,那麼隨著我們學習的深入,我們編寫的Python程式碼也將日益增加,並且也越來越複雜,  所以呢,我們需要找尋一種方法,對這些複雜的方法進行重新的組織,目的就是為了使程式碼的邏輯更

基礎入門學習》Python16--序列!序列!

前言 你可能發現了,元組,字串放在一起講是有道理的,它們有許多共同點。(當然前面沒有看也能看這章) 都可以通過索引得到每一個元素 預設索引值總是從0開始 可以通過分片的方法得到一個範圍內的元素的集合 有很多共同的操作符(* 重複操作符、+ 拼接操

基礎入門學習Python》22--函式:遞迴是神馬

前言 普通程式設計師用迭代,天才程式設計師用遞迴 知識點 遞迴是神馬?  遞迴是屬於演算法的範疇。  遞迴就是函式呼叫自身的一種行為。 >>> def g(): return g() >>> g()