一、環境準備
環境準備 –> pyenv (安裝python解釋器,管理Python版本,管理python虛擬環境)
https://github.com/pyenv/pyenv https://github.com/yyuu/pyenv-installer # yum -y install git # curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash # vim /etc/profile.d/pyenv.sh加入 export PATH="~/.pyenv/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)" # pyenv update # pyenv help (一般常用command,local,global,shell,install,uninstall,rehash,version,versions,which,whence) # pyenv version # unset PYENV_ROOT # 安裝編譯工具 `yum -y install gcc make path` # 安裝依賴 `yum -y install gdbm-devel openssl-devel sqlite-devel readline-devel zlib-devel bzip2-devel` # pyenv install 3.5.3 此處依賴開發包(gcc make patchgdbm-devel sqlite-devel zlib-devel bzip2-devel readline-devel) 注意 或者# wget -c http://7d9qvq.com1.z0.glb.clouddn.com/Python-3.5.2.tgz -O ~/.pyenv/cache/Python-3.5.2.tar.gz # pyenv install --list # 安裝Python 3.5.2 `pyenv install 3.5.3`
二、使用pyenv
- ### local 命令
- local命令切換當前目錄
- pyenv local system 或者 3.5.3
- pyenv global 雖然提供了這種功能,但建議永遠不要執行
- ##local命令切換當前目錄及其子目錄的Python版本,可以通過刪除 `.python-version`來恢復默認的Python版本
- ## global命令
- global命令切換全局默認Python版本
[root@node0 ~]# pyenv version 3.5.3 (set by /root/.python-version) [root@node0 ~]# python -V Python 3.5.3 pyenv commands virtualenv [root@node0 subdir]# pyenv virtualenv 3.5.3 magedu ##為了兼容舊的版本,所以保留 [root@node0 subdir]# pyenv uninstall magedu ##刪除 [root@node0 subdir]# ll ~/.pyenv/versions/ total 0 drwxr-xr-x 7 root root 63 Mar 27 21:56 3.5.3 lrwxrwxrwx 1 root root 39 Mar 27 21:59 magedu -> /root/.pyenv/versions/3.5.3/envs/magedu ### virtualenv命令 創建虛擬環境 # pyenv virtualenv $bash_version $name ### uninstall命令 卸載某個版本,包括虛擬環境 idea pycharm Atom vim 也可以補全
三、pip配置
mkdir ~/.pip vim ~/.pip/pip.conf http://mirrors.aliyun.com/pypi/simple/ index-url = mirrors.aliyun.com #這里指的是否認證 linux下可以使用pycharm # pip install ipython # pip install jupyter # jupyter-notebook --no-browser --ip 0.0.0.0 默認端口為8888 # jupyter notebook list
四、基礎語法
- hello world
- 常量/變量
- 運算符/表達式
- 程序控制結構
- print(‘hello world’)
- hello world
- 常量/變量 (強類型,動太語言)
- 字面常量
- 變量
- 變量是一個指針,它指向一塊內存
- v = 1 python中變量跟著賦值運算符出現
- v2 = v
變量的命令名規則
- 只能以字母、數字和下劃線
- 只能以字母或者下劃線開始
- 不能是Python解釋器的保留字 (for if in) for_ 這樣可以做變量的命名
運算符:
- 算術運算符
- 邏輯運算符
- 比較運算符
- 其他運算符
- 賦值運算符
- 成員運算符
- 身份運算符
算術運算符通常只針對數值類型
- python中#事表示注示
- 算術運算符:+ – * / % **
- 比較運算符: == 相等 !==不等于 >大于 >=大于等于 < 小于 <=小于等于
- 1==1 Ture 1==2 False 1>2 False 2>1 True 2>=1 True 2>=2 True 1<2 Ture 1<=2 True
- 1==’1′ False 1 != ‘1’ Ture 1 < ‘1’ 報錯 3//5 取整除
- 所以除了 == 和!=最好類型相同
邏輯運算符
- and or not
- 參與運算的成員只能是bool類型,或者可以隱式轉化為bool類型的類型
- True False
- and 需要運算符兩邊都是True結果才為True
- or 只要運算符兩邊任意一個True,結果就是True
- not True 返回False
- 短路
- def add(x, y):
- print(“{0} + {1}”.format(x,y))
- return x + y
- add(1, 3)
- add(1, 3) > add(1, 2) and add(2, 4) < add(3, 4)
- add(1,3) < add(1, 2) and add(2, 4) < add(3, 4)
- 總是從左到右的計算,一旦能夠決定表達式最終的值,將立記得停止計算并返回
- add(1, 3) < add(1, 2) or add(2, 4) < add(3, 4)
- bin(60)
- bin(12)
- 60 & 12
- 60 | 12
- 60 ^ 12
- init(”)
- ~60
- 60 >> 2 右移
- 60 << 2 左移
左邊是一個標示符 右邊是一個值(或者可以計算為一個值)
讓這個標示符指向這個值所在的內存
運算符的優先級
1+2*3 7
2 * 3 ** 2 18
2*3 > 1+2 True
算術運算符優先高于比較運算符
2* 3 > 1+2 and True True
比較運算符的優先級高于邏輯運算符
(2*3 > 1+2 )and True True 拿不準的時候加括號
表達式 變量/常量 和 運算符組成
程序控制結構 順序 、 分支 、 循環
程序控制結構
順序結構
a = 0
a = a+1
print (a)
分支結構
if cond:
block
if 1 < 2:
print(‘1 less 2’)
print(‘main block’) 重新回到主結構中
程序結構 main block –> 條件 –> 成功 –> 分支 –> main block
–> 失敗 –> main block
bool(0) False
bool(-0) False
bool(1) True
boole(None) False
bool([]) False
bool (”) False
0、空的內置結構、None bool的結構都是False,非0、非空的內置結構都是True
雙分支
if cond:
ture_block
else:
false_block
主流程–> 條件 –> 滿足–> true block –> 主流程
不滿足–> false block –> 主流程
if 1 < 2:
print (‘1 < 2’)
else:
print (‘1 > 2’)
if cond1:
block 1
elif cond2:
block 2
elif cond3:
block 3
.
.
.
else:
default block
主流程–> 條件1 –> 成功 –> 分支1 –> 主流程
–> 失敗 –> 條件2 –> 成功 –> 分支2 –> 主流程
失敗 –> 默認分支 –> 主流程
a = 5
if a < 0:
print(‘less 0’)
elif a < 3:
print(‘less 3’)
elif a < 5:
print(‘less 5’)
elif a < 7:
print(‘less 7’)
else:
print(‘oops’)
結果輸出為less 7
分支結構,永遠只有一個分支結構會被執行
循環語句
while block:
block
a = 0
while a < 10:
print(a)
a += 1 #a = a +1
主流程 –> 條件 –> 為真 –> 循環體 –> 主流程
–> 為假 –> 主流程
通常 在while循環中,循環體需要修改條件,以使得條件為假
for element in itratable:
block
range(0,10)
for i in range(0,10):
print(i)
輸出結果為零到十
主流程 –> 序列里是否還有元素 –> 有 –> 取出一個元素 –> 循環體 –> 序列里是否還有元素前
–> 無 –> 回到主流程
注:循環體中絕對不要修改可迭代對象
五、實驗
lst = range(0,10) for i in lst: lst.append(i) 這樣的情況會死機,產生不可預料的結果 for i in range(0,10): if i %2 == 0: print(i) 取出所有的偶數 for i in range(0,10): if i %2 == 0: print(i) if i > 3: break break 用于提前結束循環 for i in range(1,10): if i == 3: continue print(i) continue 用于跳過之后的語句 實例: 求素數 a = 6 c = 0 for i in range(2,a): if a % i == 0: break c +=1 if c < a - 2: print('no') else: print('yes') a = 6 for i in range(2,a): if a %1 == 0: break else print('yes') ##循環結構中 else子句判斷循環有沒有提前退出,如果提前退出了,執行else
is_break = False for i in range(0,10): for x in range(0,10): if x >=3: is_break = True break print('x = {0}'.format(x)) if is_break: break ##使用括號標注下面表達式的優先級 1 + 3 * 4 ** 2 > 3 and 2- 3 < 10 ##已知input函數可以接收用戶輸入,并返回字符串的輸入,int函數可以把字符串轉化為整數例如: a = input("input a number: ") # 等待用戶輸入,并賦值給a,此時a是字符串 a = int(a) #把a轉化為數字,并賦值給a 補充:將vim tab設置為四個空格 vim /etc/vimrc :set ts=4 :set expandtab :%retab! #!/usr/bin/env python NUM=35 count = 0 while count < 3: user_input = int(input('please input a number: ')) if user_input == NUM: print('you win') break elif user_input < NUM: print('less') else: print('big') count += 1 else: print('you lose') 用for 語法來實現 #!/usr/bin/env python NUM = 35 for _ in range(0, 3): (注:此處不使用此變量,直接把其丟棄,因為此處需要的是一個循環次數) user_input = int(input('please input a number: ')) if user_input == NUM: print('you win') break elif user_input < NUM: print('less') else: print('big') else: print('you lose') import math 打印一到一百的基數 for n in range (2,101): for x in range(2,n): if n % x == 0: break else: print(n)
- 其他運算符,成員運算符,內置數據結構
- 身份運算符,面向對象
- 程序控制結構
- 順序(正常執行),分支 (if),循環 (while,for)
- break 用于提前結束循環
- continue 用于跳過當前循環剩下的部分
- 內置數據結構/內置容器
- 五種內置容器
- 元組
- 集合
- 字典
- 列表
- 字符串
- 線性結構(切片操作/解包/封包)
- 解析式(Python3特有)
- 對表解析
- 生成器解析
- 集合解析
- 字典解析
- #在python中如何定義一個列表
- 定義空列表的兩種方式
- lst = list()
- lst = []
- 也可以來直接賦值
- lst[1,2,3]
- 下標/索引/操作
- Python中list的索引從0開始
- lst[0]
- lst[1]
- lst[-1]
- 負數索引表示從后往前,由-1開始,-1表示最后一個元素
- 如果索引超出范圍,將引發IndexError
- lst
- lst[0] = 5 直接修改list的第五個元素
- lst[-1] = 10 直接修改list的最后一個元素
- lst[3] = 12 對不存在的元素進行修改會報錯
- 修改元素的時候,如果超出索引范圍,也會引發 IndexError
- 給list增加元素
- help(list) 可以打印出list的所有方法來
- ###append
- lst
- lst.append(12) append 方法原地修改list, 給list增加一個元素,append的方法的返回值是None
- help(list.apped) 可以查看append的用法的說明。
- help(lst.insert)
- lst.insert(0,7) 在第1個元素之前加入7
- lst.insert(3,0) 在第4個元素之前加入0
- lst,insert(100,76) insert 超出范圍的話, 是在最后增加
- lst.insert(-100,78) insert 超出-范圍的話,是在最前面增加
- insert操作的索引超出范圍,如果是正索引,等效于append,如果是負索引,等于insert(0,object)
- insert O(n) append O(1)
- extend
- lst.extend([1,2,3])
- lst
- help(lst.extend)
- 刪除元素
- pop
- lst
- lst.pop() 默認從最后移除一個元素,并且將這個元素返回回來!
- lst.pop(0) 將第一個元素刪除
- lst.pop(-1) 將最后一個元素移除
- index 默認為-1 如果index超出索引返回,會拋出IndexError
- remove
- help(lst.remove) 可以提供幫助
- lst.remove(10)
- lst.apped(2)
- lst
- lst.remove(2) 匹配到索引的第一個元素 將匹配到的2刪除
- pop是彈出索引對的值 remove是刪除最左邊的一個值
- lst.remove(90)
- remove的時候,如果值不存在,會拋出ValueError
- del lst [0]
- lst
- lst 列出lst里頭的元素
- clear 方法是刪除所有元素
- 查找/統計元素
- help(lst.index)
- lst = [‘a’,’b’,c’,’d’]
- lst
- lst.index(‘b’) 返回的是從左往右的第一個元素
- lst.append(‘b’)
- lst.index(‘b’,2) 找匹配到的第二個元素
- lst.index(‘b’,2,4)
- start 包含 stop 不包含
- index方法是根據值找索引
- 還可以用count方法來找索引
- lst
- help(lst.count)
- lst.count(‘a’)
- lst.count(‘b’)
- 查看lst中包含多少個這樣的值。
- len 函數
- len(lst) 統計列表里頭所有值的個數
- 修改列表
- sort 對列表做一個排序
- help(lst.sort)
- lst
- out: [‘a’,’b’,’c’,’d’,’b’]
- lst.sort()
- lst.sort()
- lst
- out: [‘a’,’b’,’b’,’c’,’d’]
- lst.sort(reverse=True)
- lst
- out: [‘d’,’c’,’b’,’b’,’a’]
- reverse反轉
- help(lst.reverse)
- lst
- [‘d’,’c’,’b’,’b’,’a’]
- lst.reverse()
- lst
- [‘a’,’b’,’b’,’c’,’d’]
- 其它方法
- copy 如果從右往前刪,則把它reverse過來
- lst= [1,3,2,4,2,3,2,5] 刪除最后一個元素
- lst.reverse()
- lst.remove(2) 刪除后,再將元素反轉過來
- lst.reverse()
- lst2 = lst 相當于多加了一個指針
- lst2 =lst.copy() 相當于lst對lst2全部的一個復制,而非指針
- lst2.remove(2)
- lst2
- lst
import time a=0 while( a<10 ): time.sleep(1) print(a) a=a+1
六、好玩的python 爬蟲示例(不喜勿噴)
import requests import re from bs4 import BeautifulSoup import sys url = 'https://www.meitulu.com/' def getHTMLTEXT(url): try: headers = headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive', 'Referer': None # 注意如果依然不能抓取的話,這里可以設置抓取網站的host } response = requests.get(url, headers=headers) # raise_status_code() response.encoding = 'utf-8' return response.text except: pass def getURLlist(list): # 獲取每個鏈接的完整鏈接 html = getHTMLTEXT(url) soup = BeautifulSoup(html, 'html.parser') urllist = soup.select('div.boxs > ul > li > a ') for fhref in urllist: try: href = fhref.attrs['href'] hrefall = 'https://www.meitulu.com/' + href list.append(hrefall) except: continue return list def getpagelist(pageurl, pagelist): # 傳入一個鏈接 獲取這個個鏈接的每個頁鏈接 pagehtml = getHTMLTEXT(pageurl) soup = BeautifulSoup(pagehtml, 'html.parser') pageurllist = soup.select('html body center div#pages a') for pageurl in pageurllist: page + pageurl.get('href') pagelist.append(pagehref) pagelist.pop() return pagelist def downloaderpic(pagehref, picpath): # 傳入一個pageurl 獲取頁面里面每張圖片的鏈接并且下載到指定目錄 html = getHTMLTEXT(pagehref) soup = BeautifulSoup(html, 'html.parser') pichrefs = soup.select('html body div.content center img') for spichref in pichrefs: pichref = spichref.get('src') picname = pichref.split('/')[-1] headers = headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive', 'Referer': None # 注意如果依然不能抓取的話,這里可以設置抓取網站的host } response = requests.get(pichref, headers=headers) path = picpath + picname print(response.url) with open(picpath + picname, "wb") as f: f.write(response.content) f.close # def downloaderpic(pageurl): def main(): """ urllists 是首頁中所有頁面的集合 pagelist 是每個鏈接里面的所有頁的集合 """ picpath = "D:/pic/" ulist = [] urllists = getURLlist(ulist) plist = [] howurl = len(urllists) flag = 0 for urllist in urllists: pagelist = getpagelist(urllist, plist) # 對頁面遍歷獲取所有每個鏈接的頁面list flag = flag + 1 howpage = 0 + len(pagelist) count = 0 for pagehref in pagelist: # 對頁面list遍歷獲取所有頁面的href downloaderpic(pagehref, picpath) count = count + 1 print('共有{0}鏈接正在下載第{1}個連接-------第{1}個鏈接有{2}個頁面正在下載第{3}個頁面'.format(howurl, flag, howpage, count), end="\r") main() print("下載完成,文件保存在D:/pic/目錄" "下")
原創文章,作者:kang,如若轉載,請注明出處:http://www.www58058.com/79164