PYTHON DÀNH CHO NETWORKERS

Post on 29-Dec-2021

6 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

Transcript

PYTHON DÀNH CHO NETWORKERS

Bùi Quốc Hoàn

hoan.itmb@gmail.com

27, tháng 8 - 2016

HoanBQ (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 1 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 2 / 76

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

hay không?

HoanBQ (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 4 / 76

Có gì đó sai sai?

HoanBQ (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 5 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 6 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 7 / 76

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

HoanBQ (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 8 / 76

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

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

HoanBQ (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 9 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 10 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 11 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 12 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 13 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 14 / 76

Cài đặt Python

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

HoanBQ (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 15 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 16 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 17 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 18 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 19 / 76

Hello World

print "Hello World!"Python 2

print("Hello World!")

Python 3

HoanBQ (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 20 / 76

Chạy từ Python shell

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

Hello World #print

>>> #loop

HoanBQ (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 21 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 22 / 76

Objects

Đố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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 24 / 76

id

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

HoanBQ (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 25 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 26 / 76

MUTABLE

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

>>>

HoanBQ (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 27 / 76

IMMUTABLE

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

>>>

HoanBQ (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 28 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 29 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 30 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 31 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 32 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 33 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 34 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 35 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 36 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 37 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 38 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 39 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 40 / 76

Kiểu dữ liệu (11)

Kiểu Boolean

a = True

b = False

HoanBQ (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 41 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 42 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 43 / 76

Cấu trúc

điều khiển

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 45 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 46 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 47 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 48 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 49 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 50 / 76

Hàm

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 52 / 76

Hàm - Function (2)

• def

• function name

• (parameters)

• : + indent

• optional documentation

• body

• return

HoanBQ (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 53 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 54 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 55 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 56 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 57 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 58 / 76

Đọ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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 59 / 76

Đọ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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 60 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 61 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 62 / 76

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

Google is a friend

HoanBQ (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 63 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 64 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 65 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 66 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 67 / 76

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

động hoá

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 69 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 70 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 71 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 72 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 73 / 76

pysnmp

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

pip install pysnmp

HoanBQ (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 74 / 76

ciscoconfparse

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

pip install ciscoconfparse

HoanBQ (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 75 / 76

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 (hoan.itmb@gmail.com) Python4Networkers 27, tháng 8 - 2016 76 / 76

top related