PYTHON DÀNH CHO NETWORKERS

76
PYTHON DÀNH CHO NETWORKERS Bùi QuLc Hoàn [email protected] 27, tháng 8 - 2016 HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 1 / 76

Transcript of PYTHON DÀNH CHO NETWORKERS

Page 1: PYTHON DÀNH CHO NETWORKERS

PYTHON DÀNH CHO NETWORKERS

Bùi Quốc Hoàn

[email protected]

27, tháng 8 - 2016

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 1 / 76

Page 2: PYTHON DÀNH CHO NETWORKERS

Giới thiệu

X Quản trị mạng tại Ngân hàng Quân Đội (MB Bank)

X Thích tìm hòi, học hỏi những kiến thức mới

X Quản trị trên 200 routers và switches

X Muốn tự động hoá các công việc của mình...

Đó là lý do tôi biết đến Python.

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 2 / 76

Page 3: PYTHON DÀNH CHO NETWORKERS
Page 4: PYTHON DÀNH CHO NETWORKERS

Làm quản trị mạngcó cần biết lập trình

hay không?

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 4 / 76

Page 5: PYTHON DÀNH CHO NETWORKERS

Có gì đó sai sai?

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 5 / 76

Page 6: PYTHON DÀNH CHO NETWORKERS

Mạng có thể lập trình được và tự động hoáXu thế của thế giới

Trong vài năm vừa qua,sự phát triển của SDN(Software DefinedNetworking) ngày càngrõ rệt. Các hãng đều đưara các bộ API hỗ trợ tươngtác với thiết bị của mìnhthông qua lập trình. Ciscocó onePK, Juniper có PyEZ,Arista có eAPI...Điều này làmcho việc lập trình tương tácvới các thiết bị trở nên dễdàng hơn bao giờ hết.

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 6 / 76

Page 7: PYTHON DÀNH CHO NETWORKERS

Làm quản trị mạng có cần biết lập trình hay không?

Ngoài ra, việc biết một ngôn ngữ lập trình cũng giúp chúng ta:

◦ Tự động hoá các công việc, tiết kiệm thời gian

◦ Tăng giá trị trong mắt đồng nghiệp, sếp...

◦ Có khả năng thăng tiến

◦ Rèn luyện tư duy, khả năng linh hoạt trong xử lý vấn đề

◦ ...

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 7 / 76

Page 8: PYTHON DÀNH CHO NETWORKERS

Tại sao lại chọn Python? (1)

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 8 / 76

Page 9: PYTHON DÀNH CHO NETWORKERS

Tại sao lại chọn Python? (2)

Nguồn: http://www.tiobe.com/tiobe_index

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 9 / 76

Page 10: PYTHON DÀNH CHO NETWORKERS

Tại sao lại chọn Python? (3)

? Java là ngôn ngữ phổ biến nhất đến thời điểm hiện tại

? Điều này không có nghĩa rằng Java là ngôn ngữ "tốt" hay "đúng"nhất. Chỉ có ngôn ngữ lập trình "phù hợp" nhất cho một mục đíchnào đó.

? Luôn có những người "cuồng tín" cho rằng ngôn ngữ lập trình mà họsử dụng là tốt hơn vì các lý do x, y, và z...

? Mọi người đều phải bắt đầu từ một điểm nào đó; và ngôn ngữ lậptrình bạn chọn để học đầu tiên không quan trọng

? Điều quan trọng là những nỗ lực bạn bỏ ra để học ngôn ngữ đó, vàviết code bằng ngôn ngữ đó

? Khi bạn đã thành thạo với một ngôn ngữ lập trình, việc học thêmmột ngôn ngữ khác

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 10 / 76

Page 11: PYTHON DÀNH CHO NETWORKERS

Tại sao lại chọn Python? (4)

? Python là một ngôn ngữ đa năng. Bạn có thể viết các đoạn scriptđể tương tác thiết bị, thao tác với dữ liệu, tạo ra các gói tin, viếtgame...bất cứ thứ gì mà bạn muốn.

? Có thể chạy được trên nhiều hệ điều hành và nhiều kiến trúcphần cứng mà không phải thay đổi mã nguồn (Write once, runanywhere)

? Python rất dễ học. Dù cho bạn chưa có kinh nghiệm về lập trình,bạn vẫn có thể tiếp cận nhanh chóng. Có nhiều nguồn tài liệu miễnphí rất tốt trên mạng.

? Python rất tiện lợi. Python là một ngôn ngữ dạng thông dịch. Cácđoạn mà nguồn mẫu có thể dễ dàng copy/paste để thử nghiệm.

? Python được hỗ trợ rất rộng rãi. Với lịch sử ra đời đã 25 năm(1991), Python hiện có rất nhiều các gói mở rộng, bổ sung tính nănglàm Python trở thành một trong những ngôn ngữ lập trình phổ biếnnhất.

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 11 / 76

Page 12: PYTHON DÀNH CHO NETWORKERS

Giới thiệu về Python

◦ Được thiết kế và tạo ra bởi Guido van Rossum. Đây là cách màRossum dùng để "giết thời gian" trong kỳ nghỉ đông của mình.

◦ Phiên bản đầu tiên (v0.9.0) ra đời vào tháng 2, 1991.

◦ Khi bắt đầu thiết kế Python, Guido van Rossum cũng đang đọc mộtkịch bản của Monty Python’s Flying Circus, một series hài kịch củađài BBC vào những năm 1970. Rossum nghĩ rằng mình cần một cáitên ngắn, duy nhất, và hơi bí ẩn, nên ông đặt tên cho ngôn ngữ củamình là Python. 1

1https://docs.python.org/3/faq/general.html#id18HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 12 / 76

Page 13: PYTHON DÀNH CHO NETWORKERS

Các phiên bản Python

Python 1.0 - tháng 1, 1994

Python 2.0 - tháng 10, 2000

Python 2.7 - tháng 7, 2010

Python 3.0 - tháng 12, 2008

Python 3.5 - tháng 9, 2015

Phiên bản Python mới nhất đến hiện tại: 2.7.12 (Python 2) và 3.5.2(Python 3)

Python 2 sẽ không có thêm phiên bản mới sau 2.7 mà chỉ có các bảncập nhật bảo mật cho đến 2020

Python 3 không tương thích ngược với Python 2

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 13 / 76

Page 14: PYTHON DÀNH CHO NETWORKERS

Python 2 hay 3?

Đối với người mới bắt đầu thì không có sự khác biệt thật sự nào giữaPython 2 & 3. Các khái niệm cơ bản là như nhau (ngoại trừ lệnh print)

Nếu không có lý do gì đặc biệt để chọn Python 2, hãy sử dụng Python 3.

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 14 / 76

Page 15: PYTHON DÀNH CHO NETWORKERS

Cài đặt Python

Tải Python tại trang chủ https://www.python.org/downloads/

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 15 / 76

Page 16: PYTHON DÀNH CHO NETWORKERS

py launcher - Chạy song song nhiều phiên bản Python

Tạo file py.ini, lưu vào folder C:\Windows, nội dung:

[defaults]python=2

Lựa chọn phiên bản để chạy:

X py - phiên bản mặc định trong py.ini

X py -2 - chạy Python 2

X py -3 - chạy Python 3

X py -3.5 - chạy Python 3 phiên bản 3.5

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 16 / 76

Page 17: PYTHON DÀNH CHO NETWORKERS

virtual environtment

virtual environment cung cấp một môi trường Python độc lập. Các góimở rộng chỉ tác động vào virtual environment mà nó được cài đặt. Điềunày giúp chúng ta có thể cài đặt được nhiều phiên bản của cùng một góimở rộng mà không sợ bị xung đột.

Tạo virtual environment trên Python 2

pip install virtualenvvirtualenv <path/to/env/folder>

Tạo virtual environment trên Python 3

python -m venv <path/to/env/folder>

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 17 / 76

Page 18: PYTHON DÀNH CHO NETWORKERS

Tương tác với virtual env

Kích hoạt virtual env

cd /path/to/env/folder/Scriptsactivate.bat

Ngừng kích hoạt virtual env

cd /path/to/env/folder/Scriptsdeactivate.bat

Kích hoạt virtual env sử dụng file .bat

cmd /K path\to\env\folder\Scripts\activate.bat

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 18 / 76

Page 19: PYTHON DÀNH CHO NETWORKERS

IDE hỗ trợ lập trình Python

� IDLE: IDE đi kèm theo bộ cài Python

� Kích hoạt VirtualEnv� Gõ lệnh python -m idlelib

� PyDev: Plugin dành cho Eclipse

� Tải Eclipse (classic version) tại http://www.eclipse.org/downloads/packages/eclipse-classic-422/junosr2

� Cài đặt PyDev: Chạy Eclipse, mở menu Help –> Install New Software,nhập vào http://pydev.org/updates. Làm theo các bước trên màn hình.

� Vào menu Window –> Preferences –> PyDev –> Interpreters –>Python Interpreters, bấm New... để tạo mới 1 interpreter. Chọn đườngdẫn đến file python.exe của VitualEnv mình cần sử dụng.

� PyCharm - Commnunity version: tải tại https://www.jetbrains.com/pycharm/download/#section=windows.� Vào menu File –> New Project. Tại dòng interpreter chọn đến file

python.exe của VirtualEnv cần sử dụng hoặc có thể tạo mới VirtualEnvnếu cần.

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 19 / 76

Page 20: PYTHON DÀNH CHO NETWORKERS

Hello World

print "Hello World!"Python 2

print("Hello World!")

Python 3

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 20 / 76

Page 21: PYTHON DÀNH CHO NETWORKERS

Chạy từ Python shell

C:\Users\hoanbq>python>>> print("Hello World") #read, eval

Hello World #print

>>> #loop

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 21 / 76

Page 22: PYTHON DÀNH CHO NETWORKERS

Chạy từ command line

Tạo file hello.py với nội dung

print("Hello World")

Chạy file hello.py:python hello.py

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 22 / 76

Page 23: PYTHON DÀNH CHO NETWORKERS

Objects

Page 24: PYTHON DÀNH CHO NETWORKERS

Đối tượng

Tất cả mọi thứ trong Python đều là các đối tượng (object) và có:

◦ Một định danh (identity -id)

◦ Một giá trị (có thể thay đổi được - mutable hoặc không thay đổiđược - immutable)

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 24 / 76

Page 25: PYTHON DÀNH CHO NETWORKERS

id

>>> a = 4>>> id(a)1661351744>>>

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 25 / 76

Page 26: PYTHON DÀNH CHO NETWORKERS

Giá trị

• Mutable: Khi thay đổi giá trị, id vẫn được giữ nguyên. VD:Dictionary, List, Set

• Immutable: Khi thay đổi giá trị, id cũng bị thay đổi theo. VD:String, Integer, Tuple

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 26 / 76

Page 27: PYTHON DÀNH CHO NETWORKERS

MUTABLE

>>> b = []>>> id(b)17571592>>> b.append(3)>>> b[3]>>> id(b)17571592 #GIỐNG NHAU

>>>

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 27 / 76

Page 28: PYTHON DÀNH CHO NETWORKERS

IMMUTABLE

>>> a = 4>>> id(a)1661351744>>> a = a + 1>>> id(a)1661351760 #KHÁC NHAU

>>>

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 28 / 76

Page 29: PYTHON DÀNH CHO NETWORKERS

Biến số (1)

Biến số trong PythonMột biến số là một vị trí trong bộ nhớ dùng để lưu trữ dữ liệu. Chúng đượcgán cho những cái tên khác nhau để phân biệt các vùng nhớ khác nhau.Chúng ta không cần phải khai báo biến trước khi sử dụng. Trong Python,chỉ cần gán giá trị vào một biến và nó sẽ được tạo ra. Chúng ta cũng khôngcần khai báo kiểu dữ liệu của biến số đó. Python sẽ tự quản lý theo kiểu dữliệu của giá trị mà biến số đó được gán.

Gán biếnChúng ta dùng toán tử gán (=) để gán giá trị vào biến số. Bất kỳ giá trị

nào có cũng có thể gán vào biến số nếu tên biến số đó hợp lệ. Tên biến bêntay trái dấu =, giá trị được gán bên tay phải dấu =.

>>> a = 5

>>> b = 3.2

>>> c = "Hello"

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 29 / 76

Page 30: PYTHON DÀNH CHO NETWORKERS

Biến số (2)

Gán nhiều biến cùng lúc>>> a, b, c = 5, 3.2, "Hello"

>>> x = y = z = "same"

Các quy tắc đặt tên biến số1 Tên biến có thể được kết hợp từ các chữ cái in thường (a-z) hoặc in

hoa (A-Z) hoặc số (0-9) hoặc dấu gạch dưới (_). Các tên như

myClass, var_1, và _My_var, là các tên biến hợp lệ.

2 Tên biến không được bắt đầu bằng 1 số.

3 Không được trùng với từ khoá của Python. VD: global, def,...

4 Không được sử dụng các ký tự đặc biệt như !, @, #, $, %...trong tênbiến

5 Tên biến phân biệt chữ hoa và chữ thường. myvar và MyVar là 2 tênbiến khác nhau.

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 30 / 76

Page 31: PYTHON DÀNH CHO NETWORKERS

Kiểu dữ liệu số

Dữ liệu kiểu số - NumbersBao gồm kiểu số nguyên, số thực và số phức; tương ứng với các lớp int,float và complex trong Python.Sử dụng hàm type() để biết kiểu dữ liệu mà một biến đang lưu trữ, hàm

isinstance() để kiểm tra một đối tượng có thuộc về một lớp nào đó haykhông.

>>> a = 5

>>> type(a)

<class ’int’>

>>> type(2.0)

<class ’float’>

>>> isinstance(1+2j,complex)

True

Các phép toán trển kiểu dữ liệu số+, -, *, /, ** (mũ), % (lấy phần dư), // (lấy phần nguyên)2

2Ngược lại trong Python2: / là phép chia lấy phần nguyên.HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 31 / 76

Page 32: PYTHON DÀNH CHO NETWORKERS

Kiểu dữ liệu (2)

Danh sách - ListList là một danh sách có thứ tự gồm nhiều phần tử. Các phần tử trongmột list không nhất thiết phải có kiểu dữ liệu giống nhau. Một phần tử củalist cũng có thể là một list. Các phần tử trong list phân cách nhau bởi dấuphảy (,) và nằm trong một cặp ngoặc vuông ([]).

>>> a = [1, 2.2, ’python’]

>>> type(a)

<class ’list’>

List là kiểu mutable, nghĩa là, giá trị của các phần tử có thể thay đổi đượcmà không làm thay đổi id của list.

>>> a = [1, 2, 3]

>>> id(a)

15106976

>>> a[2] = 4

>>> id(a)

15106976 # GIỐNG NHAU

>>>HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 32 / 76

Page 33: PYTHON DÀNH CHO NETWORKERS

Kiểu dữ liệu (3)

Lưu ý khi thao tác với List

Cắt một danh sách - slicing a listTa có thể cắt một list thành 1 list con sử dụng cú phápa_list[start:stop:step]

>>> s = ’Monty Python’

>>> s[6:10]

’Pyth’

>>> s[-12:-7]

’Monty’

>>> s[::2]

’MnyPto’

>>>

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 33 / 76

Page 34: PYTHON DÀNH CHO NETWORKERS

Kiểu dữ liệu (4)

List comprehension List comprehension là một cách rất hay để

tạo ra 1 list thoả điều kiện nào đó. List comprehension bao gồm 1 biểuthức theo sau bằng một mệnh đề for. List comprehension có thể cónhiều mệnh đề for và điều kiện if.

#Tạo ra 1 list bao gồm các số từ 1 đến 30 hoặc chia hết cho 3 hoặc chia hết cho 5

>>> [i for i in range(1, 31) if (i%3 ==0) or (i%5 == 0)]

[3, 5, 6, 9, 10, 12, 15, 18, 20, 21, 24, 25, 27, 30]

>>>

#Sử dụng 2 vòng lặp for

>>> [x+y for x in [’Python ’,’C ’] for y in [’Language’,’Programming’]]

[’Python Language’, ’Python Programming’, ’C Language’, ’C Programming’]

>>>

#Tìm các cặp số Pythagore

>>> [(x,y,z) for x in range(1,30) for y in range(x,30) for z in range(y,30) if x**2 + y**2 == z**2]

[(3, 4, 5), (5, 12, 13), (6, 8, 10), (7, 24, 25), (8, 15, 17), (9, 12, 15), (10, 24, 26), (12, 16, 20),

(15, 20, 25), (20, 21, 29)]

>>>

Mã nguồn

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 34 / 76

Page 35: PYTHON DÀNH CHO NETWORKERS

Kiểu dữ liệu (5)

TupleTuple cũng là một danh sách có thứ tự của các phần tử giống như List.Điểm khác biệt duy nhất là tuple là kiểu immutable. Tuple một khi đượctạo ra thì không thể thay đổi. Thao tác trên Tuple nhanh hơn List. Tuple

được định nghĩa bằng cách sử dụng cặp ngoặc tròn (), các phần tử ngăn

cách nhau bằng dấu phảy (,).>>> t = (5,’program’, 1+3j)

>>> type(t)

<class ’tuple’>

Chúng ta cũng có thể sử dụng toán tử [ ] để truy xuất dữ liệu trong Tuple

nhưng không thể thay đổi giá trị của nó.>>> t[1]

’program’

>>> t[0:3]

(5, ’program’, (1+3j))

>>> t[0] = 10

Traceback (most recent call last):

File "<string>", line 301, in runcode

File "<interactive input>", line 1, in <module>

TypeError: ’tuple’ object does not support item assignment

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 35 / 76

Page 36: PYTHON DÀNH CHO NETWORKERS

Kiểu dữ liệu (6)

Kiểu dữ liệu chuỗi - StringKiểu string và bytes trong Python 2 là giống nhau.Kiểu string trong Python 3 là một chuỗi các ký tự Unicode. Các ký tự nàylà trừu tượng.Một chuỗi immutable các ký tự Unicode gọi là 1 string. Một chuỗiimmutable các số từ 0 đến 255 gọi là bytes.Để chuyển từ kiểu string sang bytes, sử dụng hàm encode(). Để chuyển

từ kiểu bytes sang kiểu string sử dụng hàm decode().Có thể dùng dấu nháy đơn (’) hoặc nháy kép(") hoặc 3 dấu nháy đơn (” ’)

cho chuỗi có nhiều dòng để khai báo chuỗi.s = ’Bùi Quốc Hoàn’

t = s.encode(’utf-8’)

print(t, type(t))

m = t.decode(’utf-8’)

print(m, type(m))

b’B\xc3\xb9i Qu\xe1\xbb\x91c Ho\xc3\xa0n’ <class ’bytes’>

Bùi Quốc Hoàn <class ’str’>

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 36 / 76

Page 37: PYTHON DÀNH CHO NETWORKERS

Kiểu dữ liệu (7)

Các phương thức thường dùng với kiểu chuỗi3>>> string = ’trung tam dao tao mang quoc te vnpro’

>>> string.count(’n’)

3

>>> string.upper()

’TRUNG TAM DAO TAO MANG QUOC TE VNPRO’

>>> string

’trung tam dao tao mang quoc te vnpro’

>>> string.lower()

’trung tam dao tao mang quoc te vnpro’

>>> string.find(’mbbank’) #find trả về -1 nếu chuỗi tìm kiếm không có trong chuỗi cha

-1

>>> string.index(’mbbank’) #index sinh ngoại lệ nếu không tìm thấy

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

ValueError: substring not found

>>> string.find(’vnpro’)

31

>>> string.endswith(’pro’)

True

>>> string.split(’ ’)

[’trung’, ’tam’, ’dao’, ’tao’, ’mang’, ’quoc’, ’te’, ’vnpro’]

>>> ’*’.join(string.split(’ ’))

’trung*tam*dao*tao*mang*quoc*te*vnpro’

>>> string.replace(’vnpro’,’VNPRO’)

’trung tam dao tao mang quoc te VNPRO’

>>>

Kiểu chuỗi cũng hỗ trợphương thức slice [ ]

3https://docs.python.org/3/library/stdtypes.html#string-methodsHoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 37 / 76

Page 38: PYTHON DÀNH CHO NETWORKERS

Kiểu dữ liệu (8)

Kiểu tập hợp - SetKiểu Set là một nhóm các phần tử không trùng nhau và không có thứ tự.Set được khai báo bên trong một cặp ngoặc nhọn { }, các phần tử ngăn

với nhau bằng dấu phảy (,).

>>> a = {5,2,3,1,4}

>>> a

{1, 2, 3, 4, 5}

>>> type(a)

<class ’set’>

Vì không có thứ tự nên Set cũng không hỗ trợ toán tử slice [ ]

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 38 / 76

Page 39: PYTHON DÀNH CHO NETWORKERS

Kiểu dữ liệu (9)

Các thao tác trên Set>>> a_set = {1, 2}

>>> a_set.add(4)

>>> a_set

{1, 2, 4}

>>> len(a_set)

3

>>> a_set.update({2, 3, 6})

>>> a_set

{1, 2, 3, 4, 6}

>>> a_set.discard(6) #discard nếu phần tử không có cũng không báo lỗi gì

>>> a_set

{1, 2, 3, 4}

>>> a_set.remove(7) #remove có exception KeyError nếu phần tử đó không có trong set

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

KeyError: 7

>>> a_set = {2, 4, 5, 9, 12, 21, 30, 51, 76, 127, 195}

>>> b_set = {1, 2, 3, 5, 6, 8, 9, 12, 15, 17, 18, 21}

>>> a_set.union(b_set)

{1, 2, 195, 4, 5, 6, 8, 12, 76, 15, 17, 18, 3, 21, 30, 51, 9, 127}

>>> a_set.intersection(b_set)

{9, 2, 12, 5, 21}

>>> a_set.difference(b_set)

{195, 4, 76, 51, 30, 127}

>>> a_set.symmetric_difference(b_set)

{1, 3, 4, 6, 8, 76, 15, 17, 18, 195, 127, 30, 51}

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 39 / 76

Page 40: PYTHON DÀNH CHO NETWORKERS

Kiểu dữ liệu (10)

Kiểu dữ liệu từ điển - dictMột từ điển là tập hợp các cặp khoá-giá trị (key-value) không có thứ tự.

Khi thêm một khoá vào từ điển, bạn bắt buộc phải thêm giá trị cho khoáđó. Một từ điển được định nghĩa trong một cặp ngoặc nhọn { }, trong đó

mỗi phần tử có dạng key:value.>>> d = {1:’value’,’key’:2}

>>> type(d)

<class ’dict’>

>>> d[1]

’value’

>>> d[’key’]

2

>>> d[2] #Chỉ có thể truy xuất value từ key, không thể truy xuất key từ value

Traceback (most recent call last):

File "<string>", line 301, in runcode

File "<interactive input>", line 1, in <module>

KeyError: 2

>>> d[’user’] = ’hoanbq’ #Thêm 1 cặp key-value cho từ điển

>>> d

{1: ’value’, ’key’: 2, ’user’: ’hoanbq’}

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 40 / 76

Page 41: PYTHON DÀNH CHO NETWORKERS

Kiểu dữ liệu (11)

Kiểu Boolean

a = True

b = False

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 41 / 76

Page 42: PYTHON DÀNH CHO NETWORKERS

Các thao tác với kiểu Bool (1)

Toán tử so sánh>, >=, <, <=, ==, !=>>> 5 > 9

False

>>> ’matt’ != ’fred’

True

>>> isinstance(’matt’, basestring)

True

>>> bool([]) #List, set, dict rỗng đều là False.

False

>>> bool(0) #Số 0 cũng là False

False

>>> bool(’’) #Chuỗi rỗng là False

False

>>> bool({1, 2})

True

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 42 / 76

Page 43: PYTHON DÀNH CHO NETWORKERS

Các thao tác với kiểu Bool (2)

Các toán tử Booleans

and, or, not (logical), &, |, và ˆ (bitwise)

>>> x = 5

>>> x < -4 or x > 4

True

>>> x%5 ==0 and x > 6

False

>>> x%5 ==0 and x > 4

True

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 43 / 76

Page 44: PYTHON DÀNH CHO NETWORKERS

Cấu trúc

điều khiển

Page 45: PYTHON DÀNH CHO NETWORKERS

if...elif...else (1)

# In this program, user inputs a number.

# If the number is positive, we print an appropriate message

num = float(input("Enter a number: "))

if num > 0:

print("Positive number")

print("This is always printed")

# In this program, user input a number

# Program check if the number is positive or negative and display an appropriate message

num = float(input("Enter a number: "))

if num >= 0:

print("Positive or Zero")

else:

print("Negative number")

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 45 / 76

Page 46: PYTHON DÀNH CHO NETWORKERS

if...elif...else (2)

# In this program, we input a number

# check if the number is positive or

# negative or zero and display

# an appropriate message

num = float(input("Enter a number: "))

if num > 0:

print("Positive number")

elif num == 0:

print("Zero")

else:

print("Negative number")

# In this program, we input a number

# check if the number is positive or

# negative or zero and display

# an appropriate message

# This time we use nested if

num = float(input("Enter a number: "))

if num >= 0:

if num == 0:

print("Zero")

else:

print("Positive number")

else:

print("Negative number")

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 46 / 76

Page 47: PYTHON DÀNH CHO NETWORKERS

for Loop

Cấu trúc

for val in sequence:

Body of for

# Program to find

# the sum of all numbers

# stored in a list

# List of numbers

numbers = [6,5,3,8,4,2,5,4,11]

# variable to store the sum

sum = 0

# iterate over the list

for val in numbers:

sum = sum+val

# print the sum

print("The sum is",sum)

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 47 / 76

Page 48: PYTHON DÀNH CHO NETWORKERS

while Loop

Cấu trúc

while test_expression:

Body of while

# Program to add natural

# numbers upto n where

# n is provided by the user

# sum = 1+2+3+...+n

# take input from the user

n = int(input("Enter n: "))

# initialize sum and counter

sum = 0

i = 1

while i <= n:

sum = sum + i

i = i+1 # update counter

# print the sum

print("The sum is",sum)

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 48 / 76

Page 49: PYTHON DÀNH CHO NETWORKERS

Mệnh đề break

Mệnh đề break ngắt vòng lặp chứa nó. Chương trình sẽ nhảy đến lệnh sauvòng loop để thực thi. Nếu đang ở trong một vòng loop lồng nhau, breaksẽ ngắt vòng lặp trong cùng.

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 49 / 76

Page 50: PYTHON DÀNH CHO NETWORKERS

Mệnh đề contiune

Mệnh đề continue sẽ bỏ qua toàn bộ phần mã bên trong vòng lặp tronglần lặp hiện hành. Vòng lặp không bị ngắt mà chỉ chuyển đến lần lặp kếtiếp.

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 50 / 76

Page 51: PYTHON DÀNH CHO NETWORKERS

Hàm

Page 52: PYTHON DÀNH CHO NETWORKERS

Hàm - Function (1)

Trong một chương trình, nếu có một đoạn mã cần sử dụng lặp lại nhiềulần, ta nên tổ chức thành một Hàm. Để sử dụng Hàm, chỉ cần gọi tênhàm và truyền đối số tương ứng.

def add_2(num):""" return 2

more than num

"""

return num + 2five = add_2(3)

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 52 / 76

Page 53: PYTHON DÀNH CHO NETWORKERS

Hàm - Function (2)

• def

• function name

• (parameters)

• : + indent

• optional documentation

• body

• return

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 53 / 76

Page 54: PYTHON DÀNH CHO NETWORKERS

Hàm - Function (3)

Tham số mặc định

def add_n(num, n=3):

"""default to

adding 3"""

return num + n

five = add_n(2)

ten = add_n(15, -5)

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 54 / 76

Page 55: PYTHON DÀNH CHO NETWORKERS

Hàm - Đệ quy (Recursion)

Một hàm gọi là đệ quy nếu hàm đó gọi chính nó trong thân hàm.

VD: Dãy số Fibonacci là 1 dãy số mà số đứng sau bằng tổng 2 số đứngliền trước nó1 1 2 3 5 8 13 21 34

def fib(n):if n < 2:

return nreturn fib(n-2) + fib(n-1)

for i in range(1, 10):print(fib(i), end = ’ ’)

Mã nguồn

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 55 / 76

Page 56: PYTHON DÀNH CHO NETWORKERS

Không gian tên và phạm vi (1)

Không gian tên - Namespace:

Không gian tên (namespace) tà một tập hợp các tên hàm vàbiến. Có nhiều không gian tên có thể tồn tại đồng thời nhưngchúng hoàn toàn độc lập với nhau.

built-in namespace Tập hợp tất cả các tên được tạo khi takhởi động trình thông dịch Python vàtồn tại trong suốt thời gian trình thôngdịch chạy. Điều này giải thích vì sao cáchàm như id(), print() luôn sẵn sàngkhi ta gọi chúng.

global namespace Mỗi module tạo cho mình riêng 1 khônggian tên toàn cục. Các namespace nàyđộc lập với nhau, do đó, các tên giốngnhau có thể tồn tại trong các modulekhác nhau mà không sợ xung đột.

local namespace Một không gian tên cục bộ được tạo khimột hàm được gọi, với tất cả các tênbiến, hàm...được định nghĩa bên tronghàm đó. Không gian tên này chỉ tồn tạicho đến khi hàm đó được thực thi xong.

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 56 / 76

Page 57: PYTHON DÀNH CHO NETWORKERS

Không gian tên và phạm vi (2)

Phạm vi - Scope:Mặc dù có nhiều namespace cùng tồn tại, nhưng không phải lúc nào chúngta cũng có thể truy cập được. Việc có thể truy cập được namespace đó haykhông phụ thuộc vào phạm vi truy cập. Tại bất kỳ thời điểm nào, có ít nhất3 phạm vi truy cập lồng nhau:

1 Phạm vi truy cập của hàm hiện tại có giá trị local

2 Phạm vi truy cập của module hiện tại có giá trị global

3 Phạm vi ngoài cùng nhất là built-in

Khi ta tham chiếu đến 1 tên ở bên trong 1 hàm, tên đó sẽ được tìm kiếmtheo thứ tự local namespace –> global namepsace –> built-in

namespace. Nếu có một hàm nằm bên trong 1 hàm khác, một phạm vi truycập mới được tạo ra nằm bên trong local scope.def outer_function():

b = 20

def inner_func():

c = 30

a = 10

Trong ví dụ bên, biến a nằm trong global namespace, biến b thuộc local namespace củahàm outer_function(), và c thuộc nested local namespace của hàm inner_function().Khi chúng ta đang ở bên trong inner_function(), phạm vi truy cập của c là local, b là

nonlocal, và a là global. Chúng ta có thể đọc/gán giá trị mới cho c, nhưng chỉ có thể đọcb và a từ bên trong hàm inner_function(). Nếu gán giá trị mới cho b, một biến b mới

được tạo ra trong local namespace, và biến này khác với biến b nonlocal. Tương tự nếu tagán giá trị mới cho biến a.

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 57 / 76

Page 58: PYTHON DÀNH CHO NETWORKERS

Không gian tên và phạm vi (3)

def outer_function():

a = 20

def inner_function():

a = 30

print(’a =’,a)

inner_function()

print(’a =’,a)

a = 10

outer_function()

print(’a =’,a)

a = 30

a = 20

a = 10

def outer_function():

global a

a = 20

def inner_function():

global a

a = 30

print(’a =’,a)

inner_function()

print(’a =’,a)

a = 10

outer_function()

print(’a =’,a)

a = 30

a = 30

a = 30

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 58 / 76

Page 59: PYTHON DÀNH CHO NETWORKERS

Đọc/ghi tập tin văn bản (1)

Đọc:#Dùng hàm open()

f = open("test.txt",mode = ’r’,encoding = ’utf-8’)

# perform file operations

f.close() #Nhớ đóng file sau khi mở

#Cách này tốt hơn

with open("test.txt",encoding = ’utf-8’) as f:

# perform file operations

#Đọc từng hàng

>>> f.readline()

’This is my first file\n’

>>> f.readline()

’This file\n’

>>> f.readline()

’contains three lines\n’

>>> f.readline()

’’ #Trả về chuỗi rỗng nếu kết thúc file

#Đọc nhiều dòng vào 1 list

>>> f.readlines() #Nhớ f.seek(0) để trở về đầu file

[’This is my first file\n’, ’This file\n’, ’contains three lines\n’]

#Hoặc cho vào vòng loop

>>> for line in f:

... print(line, end = ’’)

...

This is my first file

This file

contains three lines

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 59 / 76

Page 60: PYTHON DÀNH CHO NETWORKERS

Đọc/ghi tập tin văn bản (2)

Ghi:with open("test.txt",’w’,encoding = ’utf-8’) as f:

f.write("my first file\n")

f.write("This file\n\n")

f.write("contains three lines\n")

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 60 / 76

Page 61: PYTHON DÀNH CHO NETWORKERS

Tìm kiếm trong không gian tên

dir()#Liệt kê tất cả không gian tên đang có

[’__builtins__’, ’__doc__’, ’__name__’, ’__package__’, ’f’, ’os’]

dir(__builtins__)#Liệt kê tất cả các tên trong không gian tên built-in

[’ArithmeticError’, ’AssertionError’, ’AttributeError’, ..., ’reduce’, ’reload’, ’repr’,

’reversed’, ’round’, ’set’, ’setattr’, ’slice’, ’sorted’, ’staticmethod’, ’str’, ’sum’,

’super’, ’tuple’, ’type’, ’unichr’, ’unicode’, ’vars’, ’xrange’, ’zip’]

dir([])#Liệt kê tất cả các phương thức của List

[’__add__’, ’__class__’, ’__contains__’, ’__delattr__’, ... ’__repr__’, ’__reversed__’,

’__rmul__’, ’__setattr__’, ’__setitem__’, ’__setslice__’, ’__sizeof__’, ’__str__’,

’__subclasshook__’, ’append’, ’count’, ’extend’, ’index’, ’insert’, ’pop’, ’remove’,

’reverse’, ’sort’]

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 61 / 76

Page 62: PYTHON DÀNH CHO NETWORKERS

Tìm kiếm sự trợ giúp (1)

help()Xem cách sử dụng phương thức append() của List:>>> help([].append)

Help on built-in function append:

append(...)

L.append(object) -- append object to end

Xem cách sử dụng phương thức endswith() của String:>>> help(’vnpro’.endswith)

Help on built-in function endswith:

endswith(...)

S.endswith(suffix[, start[, end]]) -> bool

Return True if S ends with the specified suffix, False otherwise.

With optional start, test S beginning at that position.

With optional end, stop comparing S at that position.

suffix can also be a tuple of strings to try.

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 62 / 76

Page 63: PYTHON DÀNH CHO NETWORKERS

Tìm kiếm sự trợ giúp (2)

Google is a friend

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 63 / 76

Page 64: PYTHON DÀNH CHO NETWORKERS

Importing modules (1)

Module là một tập tin chứa các khai báo và chỉ lệnh của Python. Mộtmodule có thể do mình tự viết, hoặc là module chuẩn (đi kèm bộ cài

Python), hoặc do bên thứ 3 phát triển (third-party module).

Có nhiều cách để khai báo sử dụng một module:

Sử dụng mệnh đề import:

# import statement example

# to import standard module math

import math

print("The value of pi is", math.pi)

#Output

The value of pi is 3.141592653589793

Mã nguồn

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 64 / 76

Page 65: PYTHON DÀNH CHO NETWORKERS

Importing modules (2)

Import và đặt lại tên:

# import module by renaming it

import math as m

print("The value of pi is", m.pi)

Mã nguồn

Sử dụng from...import:

# import only pi from math module

from math import pi

print("The value of pi is", pi)

Mã nguồn

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 65 / 76

Page 66: PYTHON DÀNH CHO NETWORKERS

Importing modules (3)

Import tất cả các tên:

# import all names form

# the standard module math

from math import *

print("The value of pi is", pi)

Mã nguồn

Không khuyến khích sử dụng cách này vì có thể gây xung đột tên.

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 66 / 76

Page 67: PYTHON DÀNH CHO NETWORKERS

Cài đặt package

� Không nên cài package toàn cục. Sử dụng VirtualEnv để tránh xungđột.

� pip install <tên package>

� Cài đặt từ mã nguồn: chuyển đến thư mục chứa mã nguồn, gõ lệnh

python setup.py install

� Một số gói khi cài đặt đòi hỏi trên máy tính phải có trình biên dịchC++ để biên dịch mã nguồn. Với những trường hợp này, chúng tanên tìm các gói đã được biên dịch trước để cài đặt.4

4http://www.lfd.uci.edu/~gohlke/pythonlibs/HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 67 / 76

Page 68: PYTHON DÀNH CHO NETWORKERS

Giới thiệu một sốpackages sử dụngtrong lập trình tự

động hoá

Page 69: PYTHON DÀNH CHO NETWORKERS

pySerial

pip install pyserial

>>> import serial>>> ser = serial.Serial(’/dev/ttyUSB0’)# open serial port

>>> print(ser.name) # check which port was really used

>>> ser.write(b’hello’)# write a string

>>> ser.close() # close port

Mã nguồn

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 69 / 76

Page 70: PYTHON DÀNH CHO NETWORKERS

paramiko I

Cần cài đặt package pycrypto trước5

pip install paramiko>>> import paramiko

>>>

>>> ip = ’1.1.1.16’

>>> username = ’testuser’

>>> password = ’password’

>>>

>>> remote_conn_pre=paramiko.SSHClient()

>>> remote_conn_pre

<paramiko.SSHClient object at 0x15f47d0>

>>>

>>> remote_conn_pre.set_missing_host_key_policy(

... paramiko.AutoAddPolicy())

>>>

>>> remote_conn_pre.connect(ip, username=username, password=password, look_for_keys=False, allow_agent=False)

>>> remote_conn = remote_conn_pre.invoke_shell()

>>>

>>> output = remote_conn.recv(1000)

>>> print output

>>>

twb-sf-881>

>>>

>>> remote_conn.send("show ip int brief\n")

18

>>> output = remote_conn.recv(5000)

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 70 / 76

Page 71: PYTHON DÀNH CHO NETWORKERS

paramiko II

>>> print output

show ip int brief

Interface IP-Address OK? Method Status Protocol

Embedded-Service-Engine0/0 unassigned YES NVRAM administratively down down

GigabitEthernet0/0 10.1.0.3 YES NVRAM up up

GigabitEthernet0/1 10.1.247.132 YES NVRAM up up

GigabitEthernet0/2 10.1.245.1 YES NVRAM up up

FastEthernet0/0/0 10.1.250.133 YES NVRAM up up

FastEthernet0/0/1 10.1.251.2 YES NVRAM up up

Loopback0 10.1.255.2 YES NVRAM up up

Tunnel1 10.1.253.2 YES NVRAM up up

Tunnel2 10.1.253.6 YES NVRAM up up

5https://github.com/sfbahr/PyCrypto-WheelsHoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 71 / 76

Page 72: PYTHON DÀNH CHO NETWORKERS

netmiko I

Package netmiko của tác giả Kirk Byers (CCIE #6243) dựa trênparamiko nhưng đơn giản hoá các thao tác. Do đó cần phải cài đặtparamiko trước khi sử cài đặt và sử dụng netmiko.

pip install netmiko>>> from netmiko import ConnectHandler

>>> cisco_881 = {

... ’device_type’: ’cisco_ios’,

... ’ip’: ’10.10.10.227’,

... ’username’: ’pyclass’,

... ’password’: ’password’,

... }

>>> net_connect = ConnectHandler(**cisco_881)

SSH connection established to 10.10.10.227:22

Interactive SSH session established

#Hoặc sử dụng trực tiếp

>>> net_connect = ConnectHandler(device_type=’cisco_ios’, ip=’10.10.10.227’,

username=’pyclass’, password=’password’)

>>> net_connect.find_prompt()

u’pynet-rtr1#’

>>> output = net_connect.send_command("show ip int brief")

>>> print output

Interface IP-Address OK? Method Status Protocol

FastEthernet0 unassigned YES unset down down

FastEthernet1 unassigned YES unset down down

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 72 / 76

Page 73: PYTHON DÀNH CHO NETWORKERS

netmiko II

FastEthernet2 unassigned YES unset down down

FastEthernet3 unassigned YES unset down down

FastEthernet4 10.220.88.20 YES NVRAM up up

Vlan1 unassigned YES unset down down

>>> config_commands = [’logging buffered 19999’]

>>> output = net_connect.send_config_set(config_commands)

>>> print output

config term

Enter configuration commands, one per line. End with CNTL/Z.

pynet-rtr1(config)#logging buffered 19999

pynet-rtr1(config)#end

pynet-rtr1#

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 73 / 76

Page 74: PYTHON DÀNH CHO NETWORKERS

pysnmp

Tương tác với thiết bị thông qua giao thức SNMP

pip install pysnmp

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 74 / 76

Page 75: PYTHON DÀNH CHO NETWORKERS

ciscoconfparse

Phân tích file cấu hình thiết bị Cisco (hỗ trợ cả Juniper,...)

pip install ciscoconfparse

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 75 / 76

Page 76: PYTHON DÀNH CHO NETWORKERS

TextFSM

Trích xuất các thông tin từ file cấu hình theo yêu cầu.

pip install jtextfsm

import textfsm

python textfsm.py template.textfsm raw_data.txt

HoanBQ ([email protected]) Python4Networkers 27, tháng 8 - 2016 76 / 76