一、环境准备
环境准备 –> 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: pagehref = 'https://www.meitulu.com' + 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/目录" "下")
原创文章,作者:renjin,如若转载,请注明出处:http://www.178linux.com/76963