Python 基础知识教程
歡迎加入學習交流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 = [x2 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
總結
以上是生活随笔為你收集整理的Python 基础知识教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用户体验研究小结—以微信读书APP为例
- 下一篇: Windows Server 2012