1. 程式人生 > >【Python五篇慢慢彈(5)】類的繼承案例解析,python相關知識延伸

【Python五篇慢慢彈(5)】類的繼承案例解析,python相關知識延伸

作者:白寧超

2016年10月10日22:36:57

摘要:繼<快速上手學python>一文之後,筆者又將python官方文件認真學習下。官方給出的pythondoc入門資料包含了基本要點。本文是對文件常用核心要點進行梳理,簡單冗餘知識不再介紹,作者假使你用c/java/c#/c++任一種語言基礎。本系列文章屬於入門內容,老鳥可以略看也可以略過,新鳥可以從篇一<快速上手學python>先接觸下python怎樣安裝與執行,以及pycharm編輯器的使用和配置;篇二<資料結構看python>介紹python語言中控制語句、列表、字典、元組、迴圈等基本操作;篇三<函式修行知python>細解python語言函式的範疇與內容;篇四<模組異常談python>採用登入的案例詳解模組來龍去脈;篇五<‘類’過依然繼續前行,直至ending再出發>介紹類的基本操作,擴充套件虛擬環境、標準類庫和下個系列預告。(本文原創,轉載註明出處:

類的繼承案例解析,python相關知識延伸)

目錄:

1 類的相關介紹

【小記】本文中所有程式碼經過測試均可正常執行,python有個問題就是複製後會破壞原有格式。所以讀者複製執行時報如下錯誤:SyntaxError: expected an indented block,是因為空格問題,可以預留4個空格,或者採用tab鍵空格,本篇也是系列文章的結束,除了類的相關介紹,後面擴充套件一些獨立的知識點,下一個系列將是python自然語言處理系列文章,敬請期待......

名稱空間 :從命名到物件的對映。當前名稱空間主要是通過 Python 字典實現的.Python 中任何一個“.”之後的命名可以理解為屬性 --例如,表示式 z.real 中的 real 是物件 z 的一個屬性。如:

表示式 modname.funcname 中,modname 是一個模組物件,funcname 是它的一個屬性

因此,模組的屬性和模組中的全域性命名有直接的對映關係:它們共享同一名稱空間,作用域 是一個 Python 程式可以直接訪問名稱空間的正文區域。至少有三個名稱空間可以直接訪問的作用域巢狀在一起,包含區域性命名的使用域在最裡面,首先被搜尋;其次搜尋的是中層的作用域,這裡包含了同級的函式;最後搜尋最外面的作用域,它包含內建命名。global 語句用以指明某個特定的變數為全域性作用域,並重新繫結它。nonlocal 語句用以指明某個特定的變數為封閉作用域,並重新繫結它。

作用域和名稱空間示例

def scope_test():
    def do_local():
        spam = "local spam"
    def do_nonlocal():
        nonlocal spam
        spam = "nonlocal spam"
    def do_global():
        global spam
        spam = "global spam"
    spam = "test spam"
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam)

scope_test()
print("In global scope:", spam)

執行結果:

解析:

local 賦值語句是無法改變 scope_test 的 spam 繫結。nonlocal 賦值語句改變了 scope_test 的 spam 繫結,並且 global 賦值語句從模組級改變了 spam 繫結。

類的正確設計應該使用一個例項變數

class Dog:

    def __init__(self, name):
        self.name = name
        self.tricks = []    # creates a new empty list for each dog

    def add_trick(self, trick):
        self.tricks.append(trick)
d = Dog('Fido')
d.add_trick('roll over')
print(d.tricks)

R執行結果:

E:\Python\python.exe E:/sourceCode/pydata/AddPro/MothedDome.py
['roll over']

Process finished with exit code 0
名稱空間:

①大寫方法名稱的首字母,使用一個唯一的小字串(也許只是一個下劃線)作為資料屬性名稱的字首,或者方法使用動詞而資料屬性使用名詞。
②類不能用來實現③資料型別。
③一般,方法的第一個引數被命名為 self。這僅僅是一個約定:對 Python 而言,名稱 self 絕對沒有任何特殊含義。
④函式定義程式碼不一定非得定義在類中:也可以將一個函式物件賦值給類中的一個區域性變數。例如:
通過 self 引數的方法屬性,方法可以呼叫其它的方法:

class Bag:
    def __init__(self):
        self.data = []
    def add(self, x):
        self.data.append(x)
    def addtwice(self, x):
        self.add(x)
        self.add(x)

2、類繼承例項解析

例項分析:在python中類繼承案例,要求如下:

① 建立一個BaseSubDome.py檔案,編寫類繼承檔案

② 父類是動物類,有初始化函式,且有動物講話的方法

③ 子類是一個狗類,繼承父類所有屬性,並擴充套件自己方法

④ 呼叫子類講話方法,並直接呼叫父類講話方法
類繼承例項:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__title__ = ''
__author__ = 'cuitbnc'
__mtime__ = '2016/10/9'
# 歡迎進入我的主頁:http://www.cnblogs.com/baiboy/.
"""
class BaseAnimal:
    def __init__(self,name,age):
        self.name=name
        self.age=age
        print("this is 【 %s 】 and is BaseClass." %(self.name))
    def speak(self):
        print("my name is【 %s 】,age is 【 %d 】" %(self.name,self.age))


class SubDog(BaseAnimal):
    def __init__(self,name,age,say):
        BaseAnimal.__init__(self,name,age)
        self.say=say
        print("this SubClass is 【 %s 】."%(self.name))
        print('_'*20+'呼叫子函式方法'+'_'*20)
    def talk(self):
        BaseAnimal.speak(self)
        print("my name is 【 %s 】,today I 【 %d 】 years,I want say 【 %s 】" %(self.name,self.age,self.say))


ani=SubDog('dog',12,'汪汪...')
print(ani.talk())
print('_'*20+'直接呼叫父函式方法'+'_'*20)
BaseAnimal('tom',13).speak()

執行結果:

解析:

__init__方法(雙下劃線:__init__方法在類的一個物件被建立時,馬上執行。這個方法可以用來對你的物件初始化 。注意,這個名稱的開始和結尾都是雙下劃線。

我們把__init__方法定義為取一個引數name(以及普通的引數self)。在__init__方法裡,我們只是建立一個新的域,也稱為name。注意它們是兩個不同的變數,儘管它們有相同的名字。點號使我們能夠區分它們。最重要的是,在建立一個類的新例項的時候,把引數包括在圓括號內跟在類名後面,從而傳遞給__init__方法。這是這種方法的重要之處。現在,我們能夠在我們的方法中使用self.name域。給C++/Java/C#程式設計師的註釋__init__方法類似於C++、C#和Java中的constructor 。

3、python相關技術知識點擴充套件

python裡面的私有變數與眾不同
在c/c#/Java中設定私有變數均為 private 標示。而python裡面以一個下劃線開頭的命名(例如 _spam )會被處理為 API 的非公開部分(無論它是一個函式、方法或資料成員)。
它會被視為一個實現細節,無需公開。

迭代器工作原理
還記得這個for迴圈語句?
例如:

>>> for element in ['bnc','Tom','jack']:
print(element)

bnc
Tom
jack

工作原理解析:採用迭代器機制。在後臺,for 語句在容器物件中呼叫 iter() 。返回一個定義了 __next__() 方法的迭代器物件,它在容器中逐一訪問元素。沒有後續的元素時,__next__() 丟擲一個 StopIteration 異常通知 for 語句迴圈結束。以下是其工作原理的示例:

>>> elements=['bnc','Tom','jack']
>>> it=iter(elements)
>>> it
<list_iterator object at 0x03C06E90>
>>> next(it)
'bnc'
>>> next(it)
'Tom'
>>> next(it)
'jack'
>>> next(it)
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
next(it)
StopIteration
>>>

生成器工作原理

Generator 是建立迭代器的簡單而強大的工具。它們寫起來就像是正規的函式,需要返回資料的時候使用 yield 語句。

def reverse(data):
for index in range(len(data)-1, -1, -1):
yield data[index]
>>> for char in reverse('golf'):
... print(char)
...
f
l
o
g

前一節中描述了基於類的迭代器,它能作的每一件事生成器也能作到。因為自動建立了 __iter__() 和 __next__() 方法,生成器顯得如此簡潔。另一個關鍵的功能在於兩次執行之間,區域性變數和執行狀態都自動的儲存下來。這使函式很容易寫,而且比使用 self.index 和 self.data 之類的方式更清晰。除了建立和儲存程式狀態的自動方法,當發生器終結時,還會自動丟擲 StopIteration 異常。綜上所述,這些功能使得編寫一個正規函式成為建立迭代器的最簡單方法。

虛擬環境和包

Python 應用程式經常會使用一些不屬於標準庫的包和模組。應用程式有時候需要某個特定版本的庫,意味著可能無法安裝一個 Python 來滿足每個應用程式的要求。如果應用程式 A 需要一個特定模組的 1.0 版本,但是應用程式 B 需要該模組的 2.0 版本,這兩個應用程式的要求是衝突的,安裝版本 1.0 或者版本 2.0 將會導致其中一個應用程式不能執行。這個問題的解決方案就是建立一個 虛擬環境 (通常簡稱為 “virtualenv”),包含一個特定版本的 Python,以及一些附加的包的獨立的目錄樹。不同的應用程式可以使用不同的虛擬環境。為了解決前面例子中的衝突,應用程式 A 可以有自己的虛擬環境,其中安裝了特定模組的 1.0 版本。而應用程式 B 擁有另外一個安裝了特定模組 2.0 版本的虛擬環境。如果應用程式 B 需求一個庫升級到 3.0 的話,這也不會影響到應用程式 A 的環境。

建立虛擬環境
用於建立和管理虛擬環境的指令碼叫做 pyvenv。要建立一個 virtualenv,首先決定一個你想要存放的目錄接著執行 pyvenv 後面攜帶著目錄名:
pyvenv tutorial-env
如果目錄不存在的話,這將會建立一個 tutorial-env 目錄,並且也在目錄裡面建立一個包含 Python 直譯器,標準庫,以及各種配套檔案的 Python “副本”。一旦你已經建立了一個虛擬環境,你必須啟用它。

在 Windows 上,執行:
tutorial-env/Scripts/activate
在 Unix 或者 MacOS 上,執行:
source tutorial-env/bin/activate
激活了虛擬環境會改變你的 shell 提示符,顯示你正在使用的虛擬環境,並且修改了環境以致執行 python 將會讓你得到了特定的 Python 版本。例如:

-> source ~/envs/tutorial-env/bin/activate
(tutorial-env) -> python
Python 3.5.2+ (3.4:c7b9645a6f35+, May 22 2015, 09:31:25)
...
>>> import sys
>>> sys.path
['', '/usr/local/lib/python35.zip', ...,
'~/envs/tutorial-env/lib/python3.5/site-packages']
>>>

 使用 pip 管理包

一旦你激活了一個虛擬環境,可以使用一個叫做 pip 程式來安裝,升級以及刪除包。預設情況下 pip 將會從 Python Package Index,<https://pypi.python.org/pypi>, 中安裝包。
你可以通過 web 瀏覽器瀏覽它們,或者你也能使用 pip 有限的搜尋功能:

(tutorial-env) -> pip search astronomy
skyfield - Elegant astronomy for Python
gary - Galactic astronomy and gravitational dynamics.
novas - The United States Naval Observatory NOVAS astronomy library
astroobs - Provides astronomy ephemeris to plan telescope observations
PyAstronomy - A collection of astronomy related tools for Python.

pip 有許多子命令:“搜尋”,“安裝”,“解除安裝”,“freeze”(譯者注:這個詞語暫時沒有合適的詞語來翻譯),等等。(請參考 installing-index 指南獲取 pip 更多完整的文件。)

互動模式:
①錯誤處理
當錯誤發生時,直譯器列印一個錯誤資訊和堆疊跟蹤。在互動模式下,它返回主提示符;當輸入來自檔案的時候,在列印堆疊跟蹤後以非零退出(a nonzero exit)狀態退出。有些錯誤是非常致命的會導致一個非零狀態的退出;這也適用於內部錯誤以及某些情況的記憶體耗盡。所有的錯誤資訊都寫入到標準錯誤流;來自執行的命令的普通輸出寫入到標準輸出。輸入中斷符(通常是 Control-C 或者 DEL)到主或者從提示符中會取消輸入並且返回到主提示。 當命令執行中輸入中斷符會引起 KeyboardInterrupt 異常,這個異常能夠被一個 try 宣告處理。

②可執行 Python 指令碼
在 BSD’ish Unix 系統上,Python 指令碼可直接執行,像 shell 指令碼一樣,只需要把下面內容加入到#!/usr/bin/env python3.5(假設 python 直譯器在使用者的 PATH 中)指令碼的開頭,並給予該檔案的可執行模式。#! 必須是檔案的頭兩個字元。在一些系統上,第一行必須以 Unix-style 的行結束符('\n')結束,不能以 Windows 的行結束符('\r\n')。 注意 '#' 在 Python 中是用於註釋的。使用 chmod 命令能夠給予指令碼執行模式或者許可權。
$ chmod +x myscript.py在 Windows 系統上,沒有一個 “可執行模式” 的概念。Python 安裝器會自動地把 .py 檔案和 python.exe 關聯起來,因此雙擊 Python 將會把它當成一個指令碼執行。副檔名也可以是 .pyw,在這種情況下,執行時不會出現控制檯視窗。

③互動式啟動檔案
當你使用互動式 Python 的時候,它常常很方便地執行一些命令在每次直譯器啟動時。你可以這樣做:設定一個名為 PYTHONSTARTUP 的環境變數為包含你的啟動命令的檔名。這跟 Unix shells 的 .profile 特點有些類似。這個檔案在互動式會話中是隻讀的,在當 Python 從指令碼中讀取命令,以及在當 /dev/tty 被作為明確的命令源的時候不只是可讀的。該檔案在互動式命令被執行的時候在相同的名稱空間中能夠被執行,因此在互動式會話中定義或者匯入的物件能夠無需授權就能使用。你也能在檔案中更改提示 sys.ps1 和 sys.ps2。如果你想要從當前目錄中讀取一個附加的啟動檔案,你可以在全域性啟動檔案中編寫程式碼像這樣:if os.path.isfile('.pythonrc.py'): exec(open('.pythonrc.py').read())。如果你想要在指令碼中使用啟動檔案的話,你必須在指令碼中明確要這麼做:

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    with open(filename) as fobj:
       startup_file = fobj.read()
    exec(startup_file)

定製模組

Python 提供兩個鉤子為了讓你們定製 sitecustomize 和 usercustomize。為了看看它的工作機制的話,你必須首先找到你的使用者 site-packages 目錄的位置。
啟動 Python 並且執行這段程式碼:

>>> import site
>>> site.getusersitepackages()
'/home/user/.local/lib/python3.4/site-packages'

現在你可以建立一個名為 usercustomize.py 的檔案在你的使用者 site-packages 目錄,並且在裡面放置你想要的任何內容。它會影響 Python 的每一次呼叫,

除非它以 -s (禁用自動匯入)選項啟動。sitecustomize 以同樣地方式工作,但是通常由是機器的管理員建立在全域性的 site-packages 目錄中,並且是在 usercustomize 之前匯入。請參閱 site 模組獲取更多資訊。

4、Python 標準庫概覽

作業系統介面
os 模組提供了很多與作業系統互動的函式,我們先看幾個,然後help(os),等到哪天需要使用os開發再去深入研究方法的作用。os.getcwd() 檢視當前工作路徑:

>>> import os
>>> os.getcwd()
'E:\\Python'

針對日常的檔案和目錄管理任務,shutil 模組,需要import shutil

help(os)檢視下

檔案萬用字元

glob 模組提供了一個函式用於從目錄萬用字元搜尋中生成檔案列表:

>>> import glob
>>> glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']

命令列引數

通用工具指令碼經常呼叫命令列引數。這些命令列引數以連結串列形式儲存於 sys 模組的 argv 變數。例如在命令列中執行 python demo.py one two three 後可以得到以下輸出結果:

>>> import sys
>>> print(sys.argv)
['demo.py', 'one', 'two', 'three']

 錯誤輸出重定向和程式終止

sys 還有 stdin, stdout 和 stderr 屬性,即使在 stdout 被重定向時,後者也可以用於顯示警告和錯誤資訊:

>>> sys.stderr.write('Warning, log file not found starting a new one\n')
Warning, log file not found starting a new one

大多指令碼的定向終止都使用 sys.exit()。

字串正則匹配
re 模組為高階字串處理提供了正則表示式工具。對於複雜的匹配和處理,正則表示式提供了簡潔、優化的解決方案:

>>> import re
>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
['foot', 'fell', 'fastest']
>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
'cat in the hat'

只需簡單的操作時,字串方法最好用,因為它們易讀,又容易除錯:

>>> 'tea for too'.replace('too', 'two')
'tea for two'

數學
math 模組為浮點運算提供了對底層C函式庫的訪問:

>>> import math
>>> math.cos(math.pi / 4.0)
0.70710678118654757
>>> math.log(1024, 2)
10.0

random 提供了生成隨機數的工具:

>>> import random
>>> random.choice(['apple', 'pear', 'banana'])
'apple'
>>> random.sample(range(100), 10) # sampling without replacement
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random() # random float
0.17970987693706186
>>> random.randrange(6) # random integer chosen from range(6)
4

SciPy <http://scipy.org> 專案提供了許多數值計算的模組。

網際網路訪問
有幾個模組用於訪問網際網路以及處理網路通訊協議。其中最簡單的兩個是用於處理從 urls 接收的資料的 urllib.request 以及用於傳送電子郵件的 smtplib:

>>> from urllib.request import urlopen
>>> for line in urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl'):
... line = line.decode('utf-8') # Decoding the binary data to text.
... if 'EST' in line or 'EDT' in line: # look for Eastern Time
... print(line)

<BR>Nov. 25, 09:43:32 PM EST

>>> import smtplib
>>> server = smtplib.SMTP('localhost')
>>> server.sendmail('[email protected]', '[email protected]',
... """To: [email protected]
... From: [email protected]
...
... Beware the Ides of March.

 日期和時間

datetime 支援日期和時間演算法的同時,實現的重點放在更有效的處理和格式化輸出。該模組還支援時區處理。

>>> # dates are easily constructed and formatted
>>> from datetime import date
>>> now = date.today()
>>> now
datetime.date(2003, 12, 2)
>>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
'12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'

>>> # dates support calendar arithmetic
>>> birthday = date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
14368

 資料壓縮

以下模組直接支援通用的資料打包和壓縮格式:zlib, gzip, bz2, lzma, zipfile 以及 tarfile。

>>> import zlib
>>> s = b'witch which has which witches wrist watch'
>>> len(s)
41
>>> t = zlib.compress(s)
>>> len(t)
37
>>> zlib.decompress(t)
b'witch which has which witches wrist watch'
>>> zlib.crc32(s)
226805979

 效能度量

解決同一問題的不同方法之間的效能差異。Python 提供了一個度量工具,為這些問題提供了直接答案。例如,使用元組封裝和拆封來交換元素看起來要比使用傳統的方法要誘人的多。timeit 證明了後者更快一些:

>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.056634688316198646
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.029404588209626326

相對於 timeit 的細粒度,profile 和 pstats 模組提供了針對更大程式碼塊的時間度量工具。

瑞士軍刀
Python 展現了“瑞士軍刀”的哲學。這可以通過它更大的包的高階和健壯的功能來得到最好的展現。列如:

①xmlrpc.client 和 xmlrpc.server 模組讓遠端過程呼叫變得輕而易舉。儘管模組有這樣的名字,使用者無需擁有 XML 的知識或處理 XML。
②email 包是一個管理郵件資訊的庫,包括MIME和其它基於 RFC2822 的資訊文件。
不同於實際傳送和接收資訊的 smtplib 和 poplib 模組,email 包包含一個構造或解析複雜訊息結構(包括附件)及實現網際網路編碼和頭協議的完整工具集。
③xml.dom 和 xml.sax 包為流行的資訊交換格式提供了強大的支援。同樣, csv 模組支援在通用資料庫格式中直接讀寫。綜合起來,這些模組和包大大簡化了 Python 應用程式和其它工具之間的資料交換。
④國際化由 gettext, locale 和 codecs 包支援。
執行緒

執行緒是一個分離無順序依賴關係任務的技術。在某些任務運行於後臺的時候應用程式會變得遲緩,執行緒可以提升其速度。一個有關的用途是在 I/O 的同時其它執行緒可以平行計算。下面的程式碼顯示了高階模組 threading 如何在主程式執行的同時執行任務:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__title__ = ''
__author__ = 'cuitbnc'
__mtime__ = '2016/10/9'
# 歡迎進入我的主頁:http://www.cnblogs.com/baiboy/.
"""
import threading, zipfile

class AsyncZip(threading.Thread):
    def __init__(self, infile, outfile):
        threading.Thread.__init__(self)
        self.infile = infile
        self.outfile = outfile
    def run(self):
        f = zipfile.ZipFile(self.outfile, 'w', zipfile.ZIP_DEFLATED)
        f.write(self.infile)
        f.close()
        print('Finished background zip of:', self.infile)

background = AsyncZip(r'C:\Users\cuitbnc\Desktop\testfile.txt', 'myarchive.zip')
background.start()
print('The main program continues to run in foreground.')

background.join()    # Wait for the background task to finish
print('Main program waited until background was done.')

執行結果:

6、參考文獻和推薦資料

相關推薦

Python慢慢5繼承案例解析python相關知識延伸

作者:白寧超 2016年10月10日22:36:57 摘要:繼<快速上手學python>一文之後,筆者又將python官方文件認真學習下。官方給出的pythondoc入門資料包含了基本要點。本文是對文件常用核心要點進行梳理,簡單冗餘知識不再介紹,作者假使你用c/java/c#/c++任

Python慢慢4模組異常談python

作者:白寧超 2016年10月10日12:08:31 摘要:繼<快速上手學python>一文之後,筆者又將python官方文件認真學習下。官方給出的pythondoc入門資料包含了基本要點。本文是對文件常用核心要點進行梳理,簡單冗餘知識不再介紹,作者假使你用c/java/c#/c++任

Python慢慢3函式修行知python

作者:白寧超 2016年10月9日21:51:52 摘要:繼<快速上手學python>一文之後,筆者又將python官方文件認真學習下。官方給出的pythondoc入門資料包含了基本要點。本文是對文件常用核心要點進行梳理,簡單冗餘知識不再介紹,作者假使你用c/java/c#/c++任一

Python慢慢資料結構看python

作者:白寧超 2016年10月9日14:04:47 摘要:繼<快速上手學python>一文之後,筆者又將python官方文件認真學習下。官方給出的pythondoc入門資料包含了基本要點。本文是對文件常用核心要點進行梳理,簡單冗餘知識不再介紹,作者假使你用c/java/c#/c++任一

Python慢慢快速上手學python

作者:白寧超 2016年10月4日19:59:39 摘要:python語言儼然不算新技術,七八年前甚至更早已有很多人研習,只是沒有現在流行罷了。之所以當下如此盛行,我想肯定是多因素造成了,當然市場需求的重要因素。吳軍博士對大資料流行的解釋與python流行或許有些默契。資料一直以來都存在,只是在歷

程式設計師眼中的統計學5排列組合:排序、排位、排

/** * 獲取無重線排列總數目 * 描述:從n個元數中選取m個元數進行全排列,得出一共有多少種排法 * 公式:A(m,n)=m!/(n-m)! * 優缺點:輸入資料必須互不相同。求階乘時,使用了for迴圈,避免了遞迴方法導致記憶體溢位的風險。

nodejs原理&原始碼賞析5net模組與通訊的實現

目錄 一. net模組簡介 二. Client-Server的通訊 2.1 server的建立 2.2 Socket的建立 三. IPC通訊 四. 擼一個簡易

曹工說Redis原始碼5-- redis server 啟動過程解析以及EventLoop每次處理事件前的前置工作解析

文章導航 Redis原始碼系列的初衷,是幫助我們更好地理解Redis,更懂Redis,而怎麼才能懂,光看是不夠的,建議跟著下面的這一篇,把環境搭建起來,後續可以自己閱讀原始碼,或者跟著我這邊一起閱讀。由於我用c也是好幾年以前了,些許錯誤在所難免,希望讀者能不吝指出。 曹工說Redis原始碼(1)-- redi

python爬微信公眾號前10歷史文章5-JSON相關內容小結

字符串轉換 但是 字符串 cname 例子 row none literal nco json — JSON encoder and decoder JSON: JavaScript object notation,是一種輕量級的數據交換格式。JSON 是 JS 對

python+機器學習5

歡迎大家關注公眾號【雜湊大資料】1、二元分類問題概述機器學習可以實現的兩大核心點是分類預測和迴歸預測。在之前的分享中我們介紹了連續資料的線性迴歸預測問題。但是在實際生活中,我們所面對的許多問題往往是非連續的分類問題,比如醫生根據一些指標判斷病人是否可以康復、企業根據使用者行為分析使用者是否會流失、警察根據嫌疑

功能第——批量處理JDBC

需要 res col dsta 添加 name call table creat 綜述 批量處理一般指批量插入,批量更新,刪除通過可

《selenium2 python 自動化測試實戰》5——鍵盤事件

display 技術 添加 lan data- vbs nbsp .cn images 鍵盤事件,就是鍵盤上的一些操作,比如Ctrl +C,Ctrl+V,Ctrl+X等。 對鍵盤的操作需要導入另一個鍵盤的庫: from selenium.webdriver.commo

Redis系列-生產應用-分散式鎖5-單程序Redis分散式鎖的Java實現Redisson使用與底層實現-原子鎖

Redisson單程序Redis分散式樂觀鎖的使用與實現 本文基於Redisson 3.7.5 4. 原子鎖類 Redisson中實現了兩種原子鎖類:RAtomicLong和RAtomicDouble,還有RLongAdder和RDoubleAdder RA

Python進階系列連載5——生成器

生成器 還記得在迭代器裡我們說為什麼將列表轉為迭代器麼? 小明:因為列表太大的話佔用記憶體太大,做成迭代器可以節省空間,用的時候再拿出部分 是的,今天要講的生成器是不會把結果儲存在一個系列中,而是儲存生成器的狀態。 在每次進行迭代時返回一個值,直到遇到St

深入Java虛擬機器5:多型性實現機制—靜態分派與動態分派

方法解析 Class檔案的編譯過程中不包含傳統編譯中的連線步驟,一切方法呼叫在Class檔案裡面儲存的都只是符號引用,而不是方法在實際執行時記憶體佈局中的入口地址。這個特性給Java帶來了更強大的動態擴充套件能力,使得可以在類執行期間才能確定某些目標方法的直接引

Python基礎:資料型別5

在Python中,所有的資料型別都是類,每一個變數都是類的例項。 Python中有6種標準資料型別:數字(Number)、字串(String)、列表(List)、元組(Tuple)、集合(Sets)和字典(Dictionary)。 1.數字型別   Python中數字型別:整數型別、浮

python Deep learning 學習筆記5

本節講深度學習用於文字和序列 用於處理序列的兩種基本的深度學習演算法分別是迴圈神經網路(recurrent neural network)和一維卷積神經網路(1D convnet) 與其他所有神經網路一樣,深度學習模型不會接收原始文字作為輸入,它只能處理數值張量。文字向量化(vectorize)是指將文字轉換

python+requests+unittest介面自動化5:框架主題講解

requests基礎使用講解後,開始自動化框架的搭建。 首先分析需求,從比較複雜的post來當作例項在分析: request.post(url,data,headers) 正常一個post請求需要url,body和headers。 url一般由基礎url地址和api介面地址組成。所以

原創演算法分享5演算法DBSCAN

簡介 DBSCAN:Density-based spatial clustering of applications with noise is a data clustering algorithm proposed by Martin Ester, Hans-Peter

Java+Selenium5---- 編寫第一個自動化測試指令碼

        前面介紹了環境搭建和三大瀏覽器的啟動方法,這篇文章將正式介紹自動化測試指令碼的編寫。寫了一個簡單的百度自動搜尋,先體會一下,後續的文章會詳細的介紹 Web Driver API 中的元素定位、瀏覽器控制、多視窗切換、多表單切換等等。        直接看下程式