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:
        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

(0)
kangkang
上一篇 2017-02-05
下一篇 2017-02-05

相關推薦

  • bash腳本基礎

    一,概述 shell腳本 程序:指令+數據 程序編程風格: 過程式:以指令為中心,數據服務于指令 對象式:以數據為中心,指令服務于數據 shell程序:提供了編程能力,解釋執行 編程邏輯處理方式: 順序執行 循環執行 選擇執行 shell編程:過程式、解釋執行 編程語言的基本結構: 數據存儲:變量、數組 表達式: a + b 語句:if shell腳本是包含…

    Linux干貨 2016-08-19
  • 馬哥教育網絡班20期+第6周課程練習

    vim編輯器使用總結 一、文件的打開與關閉             打開文件:                 # vim [OPTION]… FILE…      …

    Linux干貨 2016-07-17
  • 馬哥教育網絡班20期+第二周課程練習

    1、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。  答:文件管理類命令有: touch :創建一個新文件 示例:在/tmp/目錄下創建一個1.log文件 touch /tmp/1.log mv:移動文件  示例:將/etc/fstab文件移至/tmp/目錄中。  mv /etc/fstab /tmp/…

    Linux干貨 2016-06-23
  • 快速刪除無用包組

    快速刪除無用組 第一步: [root@cloud ~]# yum grouplist >> list.txt 第二步: 編輯 list.txt把需要留下來的刪除 第三步: 創建腳本 remove.sh 運行 #/bin/bash # # while read…

    Linux干貨 2016-06-09
  • Linux學習小結3

    1.列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。[root@node1 ~]# who -q | sed -n ‘1p’centos root fedora redhat mint2.取出最后登錄到當前系統的用戶的相關信息。[root@node1 ~]# who -a | tail -1min…

    Linux干貨 2017-10-24
  • LVM練習及quota和dd命令

    練習 1、創建一個至少有兩個PV組成的大小為20G的名為testvg的 VG;要求PE大小為16MB, 而后在卷組中創建大小為5G的邏 輯卷testlv;掛載至/users目錄 第一步!首先準備足夠大的硬盤來實驗 [root@Cloud /]#lsblk  #添加了/dev/sdb/c硬盤  NAME &nb…

    Linux干貨 2016-09-09
欧美性久久久久