Python 基礎知識教程

HuangZhang_123發表於2017-03-31

歡迎加入學習交流QQ群:657341423


Python


序列有兩種:tuple(定值表; 也有翻譯為元組) 和 list (表)
列表:可增刪改。定義列表用[]
元組:不能增刪改,定義用()

範圍引用: 基本樣式 [下限:上限:步長]

print s1[:5] # 從開始到下標4 (下標5的元素 不包括在內)

print s1[2:] # 從下標2到最後

print s1[0:5:2] # 從下標0到下標4 (下標5不包括在內),每隔2取一個元素 (下標為0,2,4的元素)

print s1[2:0:-1] # 從下標2到下標1
注意:這裡獲得是新的列表,相當於擷取列表

s1=[True,1,‘ad’]
刪除元素
del s1[2] # [True,1]

增加元素
s1.append(4) # [True,1,‘ad’,4]

增加另外一個列表
s1.extend(w) #w=[1,2,3] 結果#[True,1,‘ad’,4,1,2,3]
s1+w將2個列表連線,從而得出一個新的列表,但不改變s1和w的原來元素。extend是直接增加元素,改變原來的元素.

s1.index(True) 結果 0 返回索引,如果多個,返回的是第一個
s1.insert(2,‘love’) # 2為插入位置索引,love是插入值
s1.pop()移除列表最後一個元素。s1.pop(0) 移除第一個元素。
s1.remove(‘ad’)移除列表中某個值。如果多個,移除的是第一個
s1.reverse() 反轉
s1.sort() 排序 #不保留原來列表。#如需保留原來列表則:y=sorted(s1)。#s1.sort(reverse=False)排序設定
s1.count(‘ad’) #查詢有多小個’ad’
len(s1) max(s1) min(s1) 查詢長度,最大最小值
Tuple(s1) 轉換元組 List(s1) 轉換列表

if ‘ad’ in s1:
print “yes” #判斷某個元素是否在列表,不存在用 not in


字串 //s1=‘hello world how are you?’
Find查詢子字串,有返回最左端索引,沒有返回-1
s1.find(‘you’)=s1.index(‘you’)//返回結果一樣

join連線字串列表
如s1=[‘How’,‘are’,‘you’]
s2=’ ’
s2.join(s1)->“How are you”
join()為列表或元組

lower返回小寫
s1.lower()
title首個字母大寫
s1.title()

replace替換
s1.replace(‘you’,‘do’)

split分割
s1=‘1+2+3+4+5’
s1.split(’+’)->[‘1’,‘2’,‘3’,‘4’,‘5’]
如果split()不提供分割符,則以空格,換行符為分割符。

strip去除字串兩側空格
strip(’*’)也可以去除字串兩側特定的字元,將去除內容作為引數即可
lstrip,rsplit去除某一側字元。

translate替換字元,只能處理單個字元。


字典
s1={‘lucy’:‘123’,‘Betty’:‘456’,‘Tom’:‘789’}
s1={鍵:值}
s1={}空字典

dict函式
items=[(‘name’,‘lucy’),(‘age’,42)]
d=dict(items)->{‘age’:42,‘name’:‘lucy’} 通過列表建立字典,注意列表內容格式即可。

d=dict(name=‘lucy’,age=42)
->{‘age’:42,‘name’:‘lucy’} 通過關鍵字建立字典
如果不帶引數,建立空字典。

基本字典操作
len(d)(鍵-值)數量
d[k] 返回值
d[k]=v 賦值/如果K不存在,自動新增
del d[k] 刪除
k in d 檢查是否含鍵為k的項
值可以巢狀字典。
d.clear(),返回空字典,如果有兩個以上變數關聯該字典,也會一併清空。
y=d.copy()
y=deepcopy(d) 使用deepcopy需要引用 from copy import deepcopy
d.get(‘age’)查詢鍵,如不存在返回None
d.has_key(‘age’)=‘age’ in d
d.items() 返回列表(鍵值)形式表示
d.keys() 返回字典鍵,以列表格式顯示
d.pop(‘name’) 獲得鍵對應的值,然後刪除某個鍵值
d.update(y) 將y更新到d,如果沒有的鍵值直接新增上去。
d.values() 返回字典的所有值,列表格式表示。


匯入函式
import a as b # 引入模組a,並將模組a重新命名為b
from a import function1 # 從模組a中引入function1物件。呼叫a中物件時,我們不用再說明模組,即直接使用function1,而不是a.function1。
from a import * # 從模組a中引入所有物件。呼叫a中物件時,我們不用再說明模組,即直接使用物件,而不是a.物件。
不同路徑下:
1.若在程式cc.py中匯入模組a, 需要在a資料夾中建立空檔案__init__.py檔案;
然後使用 from aa.a import *(aa為資料夾名,a為檔名)
2.多個資料夾
需要在a資料夾中建立空檔案__init__.py檔案,然後獲取路徑在import
import sys;
sys.path.append("/home/a/")
import a


包裹傳遞
在定義函式時,我們有時候並不知道呼叫的時候會傳遞多少個引數。這時候,包裹(packing)位置引數,或者包裹關鍵字引數,來進行引數傳遞,會非常有用。
下面是包裹位置傳遞的例子:
def func(name):
print type(name)
print name
func(1,4,6)
func(5,6,7,1,2,3)
兩次呼叫,儘管引數個數不同,都基於同一個func定義。在func的參數列中,所有的引數被name收集,根據位置合併成一個元組(tuple),這就是包裹位置傳遞。
為了提醒Python引數,name是包裹位置傳遞所用的元組名,在定義func時,在name前加
號。
下面是包裹關鍵字傳遞的例子:
def func(**dict):
print type(dict)
print dict
func(a=1,b=9)
func(m=2,n=1,c=11)
與上面一個例子類似,dict是一個字典,收集所有的關鍵字,傳遞給函式func。為了提醒Python,引數dict是包裹關鍵字傳遞所用的字典,在dict前加 * *。
包裹傳遞的關鍵在於定義函式時,在相應元組或字典前加 * 或 * * 。

4、解包裹

  • 和 **,也可以在呼叫的時候使用,即解包裹(unpacking), 下面為例:
    def func(a,b,c):
    print a,b,c
    args = (1,3,4)
    func(*args)
    在這個例子中,所謂的解包裹,就是在傳遞tuple時,讓tuple的每一個元素對應一個位置引數。在呼叫func時使用 * ,是為了提醒Python:我想要把args拆成分散的三個元素,分別傳遞給a,b,c。(設想一下在呼叫func時,args前面沒有 * 會是什麼後果?)
    相應的,也存在對詞典的解包裹,使用相同的func定義,然後:
    dict = {‘a’:1,‘b’:2,‘c’:3}
    func(**dict)
    在傳遞詞典dict時,讓詞典的每個鍵值對作為一個關鍵字傳遞給func。

鏈式賦值
x=y=10

if XXXX:
print’a’
elif aaa:
print’b’
else:
print’c’

while迴圈
for迴圈
for X in XX:

zip函式 注意3.0以上版本,zip返回的是一個迴圈物件
如果你多個等長的序列,然後想要每次迴圈時從各個序列分別取出一個元素,可以利用zip()方便地實現:
ta = [1,2,3]
tb = [9,8,7]
tc = [‘a’,‘b’,‘c’]
for (a,b,c) in zip(ta,tb,tc):
print(a,b,c)
每次迴圈時,從各個序列分別從左到右取出一個元素,合併成一個tuple,然後tuple的元素賦予給a,b,c 。
zip()函式的功能,就是從多個列表中,依次各取出一個元素。每次取出的(來自不同列表的)元素合成一個元組,合併成的元組放入zip()返回的列表中。zip()函式起到了聚合列表的功能。

enumerate()函式
利用enumerate()函式,可以在每次迴圈中同時得到下標和元素:
S = ‘abcdefghijk’
for (index,char) in enumerate(S):
print index
print char
實際上,enumerate()在每次迴圈中,返回的是一個包含兩個元素的定值表(tuple),兩個元素分別賦予index和char。

range() 函式
使用過 range() 來控制for迴圈。現在,我們繼續開發range的功能,以實現下標對迴圈的控制:
S = ‘abcdefghijk’
for i in range(0,len(S),2):
print S[i]
在該例子中,我們利用 len() 函式和 range() 函式,用 i 作為 S 序列的下標來控制迴圈。在range函式中,分別定義上限,下限和每次迴圈的步長。這就和C語言中的for迴圈相類似了。

open() 函式
open()返回的實際上是一個迴圈物件,包含有next()方法。而該next()方法每次返回的就是新的一行的內容,到達檔案結尾時舉出StopIteration。這樣,我們相當於手工進行了迴圈。
自動進行的話,就是:
for line in open(‘test.txt’):
print line
在這裡,for結構自動呼叫next()方法,將該方法的返回值賦予給line。迴圈知道出現StopIteration的時候結束。
相對於序列,用迴圈物件的好處在於:不用在迴圈還沒有開始的時候,就生成好要使用的元素。所使用的元素可以在迴圈過程中逐次生成。這樣,節省了空間,提高了效率,程式設計更靈活。

break跳出迴圈
continue跳過本次迴圈,執行下一次迴圈

列表推導式
表推導(list comprehension)是快速生成表的方法。它的語法簡單,很有實用價值。
假設我們生成表 L :
L = []
for x in range(10):
L.append(x2)
以上產生了表L,但實際上有快捷的寫法,也就是表推導的方式:
L = [x
2 for x in range(10)]
這與生成器表示式類似,只不過用的是中括號

pass
便於測試,對於沒有完成的函式可以這個替代用來測試。


類定義
Class Person:
def speak(self):
print’abc’
Jack=Person()
Jack.speak()

類繼承與重寫
class Aname:
def SayHello(self):
print ‘hello’
def SayWorld(self):
print ‘hello world’
class AnameChile(Aname): #多個繼承可用逗號隔開
def SayHello(self):
print “world”
Bname=AnameChile()
Bname.SayWorld()

類方法私有制
class Aname:
def SayHello(self):
self.__SayWorld()
def __SayWorld(self): #私有方法,只能內部訪問。
print ‘hello world’
Bname=Aname()
Bname.SayHello()


異常
try:
pass
except Exception,e: 在Python 3中必須使用“as”關鍵字。except Exception as e:
pass
finally:
pass

自定義丟擲異常 raise
def throw_error():
raise Exception(“丟擲一個異常”)#異常被丟擲,print函式無法執行
print(“飛天豬”)
throw_error()

例子,根據輸入內容進行判斷,直到能執行除法才停止。
else子句,try沒有異常會執行這個子句內容。
while True:
try:
x=input(‘number:’)
y=input(‘number2:’)
value=x/y
print value
except Exception,e:
print e
print’try again’
else
break


構造方法 init 可以帶引數。主要用於方法的初始化。用於類的一些屬性設定。(做一些賦值等)
class FooBar:
def init(self,value=42):
self.somevar=value
f=FooBar(‘aaaaaa’)
f.somevar
->aaaaaa

重寫和繼承
如果繼承一個類,__init__需要重寫而且帶有父類原來屬性的,super函式,全部繼承所有父類屬性
class Bird:
def init(self):
self.hungry=True
def eat(self):
print(“Aaah”)
self.hungry=False
else:
print(“No,thanks”)
class SongBird(Bird):
def init(self):
super(SongBird,self).init()
self.sound=“Squake”
def sing(self):
print(self.sound)

根據實際可以重寫標準庫的類(UserList,UserString,UserDict)(列表,字串,字典)

訪問器,宣告類時,通常將成員變數宣告為private,以防止直接訪問成員變數而引起的惡意操作。
class Rectangle:
def init(self):
self.width=0
self.height=0
def setsize(self,size):
self.width,self.height=size
def getsize(self):
return self.width,self.height
size=property(getsize,setsize)
r=Rectangle()
r.width=10
r.height=5
r.size
->(10,5)
r.size=100,90
r.width
->100

靜態方法和類成員方法(略)

getattribute(self,name):當特性name被訪問時自動被呼叫
getattr(self,name):特性name被訪問且物件沒有相應的特性時被自動呼叫
setattr(self,name,value):特性name賦值時自動呼叫
delattr(self,name):特性name刪除時自動呼叫

迭代器:iter(略)

閉包的實際例子:
def line_conf(a, b):
def line(x):
return a*x + b
return line
line1 = line_conf(1, 1)
line2 = line_conf(4, 5)
print(line1(5), line2(5))
->(6,25)
這個例子中,函式line與環境變數a,b構成閉包。在建立閉包的時候,我們通過line_conf 的引數a,b說明了這兩個環境變數的取值,這樣,我們就確定了函式的最終形式(y = x + 1和y = 4x + 5)。
我們只需要變換引數a,b,就可以獲得不同的直線表達函式。由此,我們可以看到,閉包也具有提高程式碼可複用性的作用。

生成器(generator)的主要目的是構成一個使用者自定義的迴圈物件。
生成器的編寫方法和函式定義類似,只是在return的地方改為yield。生成器中可以有多個yield。當生成器遇到一個yield時,會暫停執行生成器,返回yield後面的值。
當再次呼叫生成器的時候,會從剛才暫停的地方繼續執行,直到下一個yield。生成器自身又構成一個迴圈器,每次迴圈使用一個yield返回的值。
生成器的特點:
生成器是一個函式,而且函式的引數都會保留。
迭代到下一次的呼叫時,所使用的引數都是第一次所保留下的,即是說,在整個所有函式呼叫的引數都是第一次所呼叫時保留的,而不是新建立的
下面是一個生成器:
def gen():
a = 100
yield a
a = a*8
yield a
yield 1000
該生成器共有三個yield, 如果用作迴圈器時,會進行三次迴圈。
for i in gen():
print i
->100
->800
->1000

其他函式


filter函式的第一個引數也是一個函式物件。它也是將作為引數的函式物件作用於多個元素。如果函式物件返回的是True,則該次的元素被儲存於返回的表中。
filter通過讀入的函式來篩選資料。
同樣,在Python 3.X中,filter返回的不是表,而是迴圈物件。
filter函式的使用如下例:
def func(a):
if a > 100:
return True
else:
return False
print filter(func,[10,56,101,500])
->[101,500]


map()是Python的內建函式。它的第一個引數是一個函式物件。
re = map((lambda x: x+3),[1,3,5,6])
這裡,map()有兩個引數,一個是lambda所定義的函式物件,一個是包含有多個元素的表。map()的功能是將函式物件依次作用於表的每一個元素,每次作用的結果儲存於返回的表re中。
map通過讀入的函式(這裡是lambda函式)來運算元據(這裡“資料”是表中的每一個元素,“操作”是對每個資料加3)。
def func(a):
if a<100:
return a-10
else:
return a+100
print map(func,[10,56,101,500])


可以利用lambda函式的語法,定義函式。lambda例子如下:
func = lambda x,y: x + y
print func(3,4)
lambda生成一個函式物件。該函式引數為x,y,返回值為x+y。函式物件賦給func。func的呼叫與正常函式無異。
以上定義可以寫成以下形式:
def func(x, y):
return x + y


多執行緒
http://www.runoob.com/python/python-multithreading.html


標準庫功能(附件)
GUI介面開發(略)
資料庫支援
python3.X 使用pymysql 在CMD命令列執行:easy_install.exe pymysql3
python2.X 使用mysqldb
windows下直接pip install pymssql #MSSQL link:https://pypi.python.org/pypi/pymssql/2.1.3
教程:http://www.runoob.com/python3/python3-mysql.html


Python伺服器開發(網站開發)原生態,基於socket
SocketServer其實就是將socket進行封裝


爬蟲 標準庫 urllib 或第三方庫 requests,scrapy,BeautifulSoup 用於獲取資料網站較多。scrapy其實是框架形式,適用於大規模爬取
首選 scrapy 和 BeautifulSoup
Splinter,selenium用於操控網站的較多

推薦學習: scrapy,BeautifulSoup,Splinter,selenium(requests可以涉獵一下)

通過pip安裝
pip install scrapy
pip install requests
BeautifulSoup 教程: http://blog.csdn.net/wucl202000/article/details/46292539 http://beautifulsoup.readthedocs.io/zh_CN/latest/#id13
scrapy 教程:http://scrapy-chs.readthedocs.io/zh_CN/latest/index.html http://www.jianshu.com/p/fa614bea98eb
requests 教程:http://blog.csdn.net/shanzhizi/article/details/50903748 http://docs.python-requests.org/zh_CN/latest/ http://www.jianshu.com/p/19c846daccb3
urllib教程: http://python.jobbole.com/81336/
selenium教程 https://pypi.python.org/pypi/selenium

Splinter 是一個用 Python 編寫的 Web 應用程式進行驗收測試的工具。
Splinter的使用必修依靠Cython、lxml、selenium這三個軟體
python安裝在cmd下,輸入easy_install lxml
python安裝pip install selenium(瀏覽器需要安裝WebDriver)
https://splinter.readthedocs.io/en/latest/


單元測試(適用於Python專案中測試)
注意幾點:
測試類繼承unittest.TestCase
測試類、測試方法名字最好以test開頭,很多工具能根據名字來自動執行,很方便
測試類裡面的setUp/tearDown會在每個case執行之前/之後執行,setUpClass/tearDownClass加上@classmethod在整個測試類開始和結束的時候執行
測試檔案的main函式裡面加上unittest.main(),就可以直接用python命令執行了
unittest的基本使用方法:
1.import unittest
2.定義一個繼承自unittest.TestCase的測試用例類
3.定義setUp和tearDown,在每個測試用例前後做一些輔助工作。
4.定義測試用例,名字以test開頭。
5.一個測試用例應該只測試一個方面,測試目的和測試內容應很明確。主要是呼叫assertEqual、assertRaises等斷言方法判斷程式執行結果和預期值是否相符。
6.呼叫unittest.main()啟動測試
7.如果測試未通過,會輸出相應的錯誤提示。如果測試全部通過則不顯示任何東西,這時可以新增-v引數顯示詳細資訊。
下面是unittest模組的常用方法:
assertEqual(a, b) a == b
assertNotEqual(a, b) a != b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIs(a, b) a is b 2.7版本
assertIsNot(a, b) a is not b 2.7版本
assertIsNone(x) x is None 2.7版本
assertIsNotNone(x) x is not None 2.7版本
assertIn(a, b) a in b 2.7版本
assertNotIn(a, b) a not in b 2.7版本
assertIsInstance(a, b) isinstance(a, b) 2.7版本
assertNotIsInstance(a, b) not isinstance(a, b) 2.7版本
更詳細的教程見:http://pyunit.sourceforge.net/pyunit_cn.html


Python擴充套件
可以下載相應的編譯器,然後呼叫其他語言的包,如Java,C#
Jython:http://baike.baidu.com/item/Jython/8376458?fr=aladdin 實現Python和Java擴充套件
IronPython 是一種在 NET 和 Mono 上實現的 Python 語言 Python和.NET一起工作,提供可重用的程式碼功能而不需要你為了一個環境重寫程式碼庫。實現Python和.net擴充套件。


打包
Distutils包是標準Python庫的一部分;主要特點有兩個:
(1)是讓使用者覺得安裝新模組、包和工具的過程是簡單、一致又輕鬆的;
(2)是讓開發者覺得建立這些新模組、包和工具的分發包是簡單、一致又輕鬆的;
from distutils.core import setup
setup (
name = “testpackage”,
version = “1.0”,
description = “Distutils sample distribution testpackage”,
py_modules = [‘testpackage’],
packages = [‘TestPackage’],
ext_modules=[Extension(‘Test’,sources=[‘Test.c’])] #擴充套件打包
)
三種打包方法

python setup.py sdist //原始碼安裝包
python setup.py bdist_wininst //Windows下使用
python setup.py bdist_rpm //Linux下使用
4.安裝
原始碼包的安裝是將原始碼包解壓後,執行setup.py install;而Windows和Linux安裝包則直接執行安裝檔案


歡迎加入學習交流QQ群:657341423

相關文章