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/目錄"
      "下")

原創文章,作者:renjin,如若轉載,請注明出處:http://www.www58058.com/76963

(0)
renjinrenjin
上一篇 2015-02-01 20:10
下一篇 2015-02-09 10:33

相關推薦

  • M22 使用非對稱密鑰實現ssh自動登陸

    一 實驗目的 一般在用戶使用ssh客戶端登陸ssh服務器時需要使用用戶名和密碼,本實驗使用非對稱加密的方式實現了無密碼登陸ssh服務器。 二 實驗流程  、 1 在客戶端生成非對稱密鑰對 2 將非對稱密鑰中的公鑰發送給ssh服務器端相應的帳號 3 當客戶端通過ssh協議與服務器端發起連接時,客戶端將私鑰加密過的簽名發送給服務器端,服務器端使用客戶端…

    2017-04-13
  • Linux系統的軟鏈接和硬鏈接

    Linux的鏈接是一種共享文件和訪問它的用戶的若干目錄項之間建立聯系的一種方法。一共分為兩種鏈接,分別是軟鏈接和硬鏈接。 一、硬鏈接 1、硬鏈接的本質上是一個文件,它們除了名字不一樣,其他都一樣,占用的空間是一個。硬鏈接會增加文件的鏈接數。如下圖 (1)建立硬鏈集之前     (2)建立硬鏈接之后 2、刪去一個鏈接名,鏈接數減一…

    Linux干貨 2016-10-22
  • Centos圖形界面和命令行界面切換—-使用init

    1、從圖形界面切換到命令行界面      點擊Applications–System Tools–Terminal。    打開后輸入: su root(運行init需要管理員權限) 按回車,輸入init 3或者init 2都可以,然后回車就可以    進入命令行界…

    Linux干貨 2015-11-10
  • N22-妙手-第四周博客作業

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。 [root@localhost ~]# cp -r /etc/skel /home/tuser1 [root@localhost ~]# chmod&nb…

    Linux干貨 2016-09-05
  • 馬哥教育網絡19期+第五周練習博客

    1、顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行;   grep "^[[:space:]]\+.*" /boot/grub/grub.conf 2、顯示/etc/rc.d/rc.sysinit文件中以#開頭,后面跟至少一個空白字符,而后又有至少一個非空白字符的行; &n…

    Linux干貨 2016-06-19
  • iptables防火墻

    Linux防火墻基礎 在Internet中,企業通過架設各種應用系統來為用戶提供各種網絡服務,例如Web網站,電子郵件系統,FTP服務器,數據庫系統等等,而防火墻就是用來保護這些服務器,過濾企業不需要的訪問甚至是惡意的入侵。 Linux防火墻體系主要工作在網絡層,針對TCP/IP數據包實施過濾和限制,屬于典型的包過濾防火墻。Linux防火墻體系基于內核編碼實…

    Linux干貨 2017-01-10
欧美性久久久久