Python之入门篇

一、环境准备

环境准备 –> 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 

变量的命令名规则 

  1. 只能以字母、数字和下划线 
  2. 只能以字母或者下划线开始
  3. 不能是Python解释器的保留字 (for if in) for_ 这样可以做变量的命名

运算符:

  1. 算术运算符 
  2. 逻辑运算符
  3. 比较运算符
  4. 其他运算符
  5. 赋值运算符
  6. 成员运算符
  7. 身份运算符


算术运算符通常只针对数值类型 

  1. python中#事表示注示 
  2. 算术运算符:+ – * / % ** 
  3. 比较运算符: == 相等  !==不等于 >大于 >=大于等于  < 小于 <=小于等于
  4. 1==1  Ture 1==2 False 1>2 False 2>1 True 2>=1 True 2>=2 True  1<2 Ture 1<=2 True
  5. 1==’1′ False   1 != ‘1’ Ture 1 < ‘1’ 报错  3//5 取整除
  6. 所以除了 == 和!=最好类型相同

逻辑运算符 

  1. and or not 
  2. 参与运算的成员只能是bool类型,或者可以隐式转化为bool类型的类型 
  3. True False
  4. and 需要运算符两边都是True结果才为True 
  5. or 只要运算符两边任意一个True,结果就是True
  6. not True 返回False
  7. 短路
  8. def add(x, y):
  9. print(“{0} + {1}”.format(x,y))
  10. return x + y
  11. add(1, 3)
  12. add(1, 3) > add(1, 2) and add(2, 4) < add(3, 4)
  13. add(1,3) < add(1, 2) and add(2, 4) < add(3, 4)
  14. 总是从左到右的计算,一旦能够决定表达式最终的值,将立记得停止计算并返回
  15. add(1, 3) < add(1, 2) or add(2, 4) < add(3, 4)
  16. bin(60)
  17. bin(12)
  18. 60 & 12 
  19. 60 | 12 
  20. 60 ^ 12
  21. init(”)
  22. ~60 
  23. 60 >> 2 右移
  24. 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)
  1. 其他运算符,成员运算符,内置数据结构 
  2. 身份运算符,面向对象 
  3. 程序控制结构 
  4. 顺序(正常执行),分支 (if),循环 (while,for)
  5. break 用于提前结束循环 
  6. continue 用于跳过当前循环剩下的部分 
  7. 内置数据结构/内置容器 
  8. 五种内置容器
  9. 元组 
  10. 集合 
  11. 字典 
  12. 列表 
  13. 字符串 
  14.  线性结构(切片操作/解包/封包)
  15. 解析式(Python3特有)
  16. 对表解析
  17. 生成器解析 
  18. 集合解析 
  19. 字典解析
  20. #在python中如何定义一个列表
  21. 定义空列表的两种方式 
  22. lst = list()
  23. lst = []
  24. 也可以来直接赋值 
  25. lst[1,2,3]
  26. 下标/索引/操作 
  27. Python中list的索引从0开始 
  28. lst[0]
  29. lst[1]
  30. lst[-1]
  31. 负数索引表示从后往前,由-1开始,-1表示最后一个元素
  32. 如果索引超出范围,将引发IndexError 
  33. lst 
  34. lst[0] = 5 直接修改list的第五个元素 
  35. lst[-1] = 10 直接修改list的最后一个元素
  36. lst[3] = 12 对不存在的元素进行修改会报错  
  37. 修改元素的时候,如果超出索引范围,也会引发 IndexError
  38. 给list增加元素 
  39. help(list) 可以打印出list的所有方法来 
  40. ###append 
  41. lst
  42. lst.append(12) append 方法原地修改list, 给list增加一个元素,append的方法的返回值是None 
  43. help(list.apped) 可以查看append的用法的说明。
  44. help(lst.insert) 
  45. lst.insert(0,7) 在第1个元素之前加入7 
  46. lst.insert(3,0) 在第4个元素之前加入0 
  47. lst,insert(100,76) insert 超出范围的话, 是在最后增加 
  48. lst.insert(-100,78) insert 超出-范围的话,是在最前面增加 
  49. insert操作的索引超出范围,如果是正索引,等效于append,如果是负索引,等于insert(0,object)
  50. insert O(n) append O(1) 
  51. extend
  52. lst.extend([1,2,3])
  53. lst 
  54. help(lst.extend)
  55. 删除元素 
  56. pop 
  57. lst 
  58. lst.pop() 默认从最后移除一个元素,并且将这个元素返回回来! 
  59. lst.pop(0) 将第一个元素删除 
  60. lst.pop(-1) 将最后一个元素移除 
  61. index 默认为-1 如果index超出索引返回,会抛出IndexError
  62. remove 
  63. help(lst.remove) 可以提供帮助
  64. lst.remove(10)
  65. lst.apped(2)
  66. lst 
  67. lst.remove(2) 匹配到索引的第一个元素  将匹配到的2删除 
  68. pop是弹出索引对的值  remove是删除最左边的一个值 
  69. lst.remove(90)
  70. remove的时候,如果值不存在,会抛出ValueError
  71. del lst [0] 
  72. lst 
  73. lst  列出lst里头的元素 
  74. clear 方法是删除所有元素 
  75. 查找/统计元素  
  76. help(lst.index) 
  77. lst = [‘a’,’b’,c’,’d’]
  78. lst 
  79. lst.index(‘b’) 返回的是从左往右的第一个元素
  80. lst.append(‘b’) 
  81. lst.index(‘b’,2) 找匹配到的第二个元素 
  82. lst.index(‘b’,2,4)
  83. start 包含 stop 不包含 
  84. index方法是根据值找索引 
  85. 还可以用count方法来找索引  
  86. lst  
  87. help(lst.count) 
  88. lst.count(‘a’) 
  89. lst.count(‘b’) 
  90. 查看lst中包含多少个这样的值。 
  91. len 函数 
  92. len(lst) 统计列表里头所有值的个数 
  93. 修改列表
  94. sort 对列表做一个排序  
  95. help(lst.sort) 
  96. lst
  97. out: [‘a’,’b’,’c’,’d’,’b’]
  98. lst.sort() 
  99. lst.sort() 
  100. lst 
  101. out: [‘a’,’b’,’b’,’c’,’d’]
  102. lst.sort(reverse=True) 
  103. lst 
  104. out: [‘d’,’c’,’b’,’b’,’a’] 
  105. reverse反转
  106. help(lst.reverse) 
  107. lst
  108. [‘d’,’c’,’b’,’b’,’a’] 
  109. lst.reverse() 
  110. lst 
  111. [‘a’,’b’,’b’,’c’,’d’] 
  112. 其它方法 
  113. copy 如果从右往前删,则把它reverse过来 
  114. lst= [1,3,2,4,2,3,2,5] 删除最后一个元素 
  115. lst.reverse() 
  116. lst.remove(2)  删除后,再将元素反转过来 
  117. lst.reverse()
  118. lst2 = lst 相当于多加了一个指针  
  119. lst2 =lst.copy() 相当于lst对lst2全部的一个复制,而非指针  
  120. lst2.remove(2) 
  121. lst2 
  122. 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

(0)
renjinrenjin
上一篇 2015-02-01
下一篇 2015-02-09

相关推荐

  • 关于大型网站技术演进的思考(十四)–网站静态化处理—前后端分离—上(6)

    原文出处: 夏天的森林   前文讲到了CSI技术,这就说明网站静态化技术的讲述已经推进到了浏览器端了即真正到了web前端的范畴了,而时下web前端技术的前沿之一就是前后端 分离技术了,那么在这里网站静态化技术和前后端分离技术产生了交集,所以今天我将讨论下前后端分离技术,前后端分离技术讨论完后,下一篇文章我将会以网站 静态化技术的…

    Linux干货 2015-03-03
  • CentOS6系统启动流程

    概述     了解系统的启动流程,有助于我们了解Linux系统上的一些工作原理,有助于我们深入的理解一个系统的运作方式,那么本篇就以CentOS6系统为例,介绍一下有关Linux系统启动相关的内容,分为一下几个部分:     1、Linux系统的一些基础概念  &nbs…

    Linux干货 2016-09-09
  • 创建私有CA及dropbear的编译安装

    使用openssl创建私有CA 配置文件/etc/pki/tls/openssl.cnf certs           = $dir/certs         &nb…

    Linux干货 2016-09-26
  • 多网卡实验

    1、虚拟网卡实现一个网卡多个地址     网卡别名多用于虚拟机,可理解为一块网卡MAC地址对应多个IP地址,这样比较方便管理,在不需要通过添加网卡的形式就可以使用到新的IP 在此图可看到     eth1     eth1:100   &n…

    Linux干货 2016-09-06
  • IT基础设施工具—Puppet

    一、Puppet简介 Puppet是一款使用GPLV2X协议授权的开源管理配置工具,基于ruby语言开发的自动化系统配置工具,可以C/S模式或独立运行,支持对所有UNIX及类UNIX系统的配置管理,既可以通过客户端—服务器的方式运行,也可以独立运行。Puppet适用于服务器管的整个过程 ,比如初始安装、配置更新以及系统下线。puppet可以为系统管理员提供方…

    Linux干货 2017-11-26
  • awk大法

    awk awk概念 一款用于数据流的文本处理工具,它将文件作为记录序列处理。在一般情况下,文件内容的每行都是一个记录。每行内容都会被分割成一系列的域,因此,我们可以认为一行的第一个词为第一个域,第二个词为第二个,以此类推。AWK程序是由一些处理特定模式的语句块构成的。AWK一次可以读取一个输入行。对每个输入行,AWK解释器会判断它是否符合程序中出现的各个模式…

    Linux干货 2016-12-04