1. 程式人生 > >python3筆記(合集)

python3筆記(合集)

開發十年,就只剩下這套架構體系了! >>>   

重點跟進的課程:

day14正則表示式

day16面向物件程式設計

day18多執行緒

day19http協議和request模組的使用

day16面向物件程式設計

day25結巴分詞

day27根據關鍵詞批量採集文章

day36爬蟲斷點續爬

 

2.關於網頁請求:

#最簡單的網頁請求模組:
import urllib.request

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
                  " (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"
}

url = 'https://www.duanwenxue.com/sanwen/suibi/'

req = urllib.request.Request(url, headers=headers)#請求
resp = urllib.request.urlopen(req)           #開啟網頁
html = resp.read().decode('gbk', 'ignore')   #讀取

print(html)


 

 

1.基礎篇:函式

#【1】
print("hello", 'world', sep='/', file=sys.stderr)  # 輸出到標準錯誤

#【2】
# 如果不指定,那麼就會使用系統的編碼(gbk)
f = open("輸出.txt", 'w', encoding='utf-8')  # 這個是開啟一個檔案,然後用只寫的模式開啟

#【3】
ran = range(101)
# for i in ran:
#     print(i)
print(sum(ran))
#------------------day3--------------
#【4】
引號包括:單引號、雙引號、三引號

str7 = 'hello\nworld'
print(str7)
str8 = 'hello\r\naa'
print(str8)
str9 = 'hello\tpython'
print(str9)

#【5】字串提取
len(str2)  #字串長度
str1 = "hello#world"
str3 = str1[:]

#    字串切片操作
#    [:] 提取整個字串
#    [start:] 從start提取到結尾
#    [: end] 從頭提取到end-1
#    [start: end] 從start提取到end-1
#【6】判斷一個字串是否在另一個字串
#成員操作(in)
str1 = "hello world"
isin = 'hello' in str1
print(isin)
#    - 判斷一個字串是否在另一個字串裡面
#    - 如果存在那麼就返回True,否則返回False
#【7】字串編碼
#- 只有Unicode編碼的字串才有encode方法編碼其它型別的編碼(python3中會轉成bytes型別)

#------------------day4--------------
列表的建立,訪問和賦值
[]
()
split
list()
range(n)
for
len
#如果不想要另一個列表同樣發生變化,那麼就需要使用切片[:]進行賦值
#判斷開頭,結尾,字串
url = "https://www.sanwen8.cn/subject/nxnyyi.html"
print(url.endswith('.html'))
print(url.startswith('https://'))
#都是true

#lambda方法,join方法
list1 = list('abcdef')
list2 = map(lambda x: x, 'abcde')
print('/'.join(list1)) 
-----------------------------列表-------------------------------
#format方法
str2 = 'my name is {1}, I\'m {0} years old.'.format(30, 'xiaoming')
str4 = 'my name is {name}, I\'m {age} years old.'.format(age=33, name='xiaoming')

#pop()方法,刪除
L3 = L2.pop()

pi = "PI = {:.3f}".format(3.1415926)
print(pi)
#結果 PI = 3.142  這個看不懂

#append()方法
list3.insert(1, ['a'])  # insert是指定位置插入,第一個引數是下標值
list5.extend('abc')  # extend(在末尾追加)引數必須是可迭代型別
list5.remove(6)  # remove() 函式用於移除列表中某個值的第一個匹配項
list8.sort(reverse=True)  # sort可以將列表的元素進行排序,reverse引數如果設定為True那麼結果就是倒序的
print(list12.count(10))

list15 = [1, 2, 3, 4, 5, 6]#求和
print(sum(list15)
-----------------------------元組-------------------------------
*x, y = (10, 20, "hello", 'seo', 3.14)  # 星號在解包中代表一個或多個元素,儘可能多的包含
# 星號可以將多餘的元素打包為一個list
print(x, type(x))
print('y=', y)
-----------------------------集合-------------------------------
A = {1, 2, 3}
B = {1, 2, 3, 4, 5}
print(A < B)  # 判斷集合A是不是集合B的真子集,如果是則返回True

-----------------------------字典-------------------------------

frozenset() 返回一個凍結的集合,凍結後集合不能再新增或刪除任何元素
#set和frozenset區別https://www.cnblogs.com/panwenbin-logs/p/5519617.html
D.get(k[,d]) 獲取字典中鍵名為k的值,如果k不存在,那麼就返回d,d是可選引數,預設值是None

d1 = {}
d1['seo'] = [{'seo是什麼': 90, 'SEO教程': 900, 'seo方案': 230}, {'淘寶seo': 90, 'SEO高階用法': 50}]
print(d1)
print(d1['seo'])


sorted  #sorted() 函式對所有可迭代的物件進行排序操作
title = "三星新廣告再懟蘋果 外媒:以新比舊三星未免可笑_TechWeb"

if 'TechWeb' in title:
    newtitle = title.replace('TechWeb', '')#替換   【增刪改查】

list1 = [40, 8, 15, 18, 12]
pop_sort(list1)  #排序

#迴圈
while
for
if  elif else   continue  pass  join  format  .append  n = random.randint(1, 100)  break
x for x in range(10)


-----------------------------def函數語言程式設計-------------------------------
d = 10 #全域性函式
# 函式定義:用def定義函式,
def sumx(end):
    if end <= 0:
        return 0
    return end + sumx(end - 1)

def gen():
    yield 10

 for x in gen():
     print(x)

-----------------------------檔案操作-------------------------------
# 檔案讀寫,網路請求統稱叫IO操作
# input output 輸入和輸出
# 流(stream)
"""
'buffer', 'close'關閉, 'closed', 'detach', 'encoding'獲取檔案編碼,
'errors', 'fileno', 'flush'重新整理緩衝區,將內容寫入到檔案, 'isatty', 'line_buffering',
'mode', 'name', 'newlines', 'read'讀取檔案所有內容, 'readable', 'readline',
'readlines', 'seek', 'seekable', 'tell', 'truncate',
'writable', 'write'寫入, 'writelines'
"""

f = open('test01.txt', mode='w', encoding='utf-8', buffering=1)
f.write("漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。"
        "大梵天創造世界的時候做了三根金剛石柱子\n")

# line = f.readline()
# for line in f:  # 檔案流是可迭代物件,所以可以用for迴圈一行行的讀取出來
lines[i] = line.strip()
print(f1.tell()) # 追加模式,游標一開始就移動到檔案的末尾


img = open('P1.jpg', mode='rb')  # 二進位制讀模式
# print(img.read())
print(img.tell())
img2 = open('p2.jpg', mode='wb')  # 二進位制寫模式
img2.write(img.read())
img.close()
-----------------------------錯誤與異常處理-------------------------------


1. 錯誤和異常處理
    - 每種錯誤都有自己對應的異常類
    - Exception能夠捕獲所有的錯誤
    - try可以和except配對
    - else語句是指沒有異常發生的時候才會執行,必須放在except之後
    - finally語句是指不管有沒有異常發生,都會執行finally語句中的程式碼,放在最後
    - 可以直接用try-finally語句
    - 當try-finally語句中有錯誤發生的時候,程式執行完finally語句之後就會退出,不會繼續往下執行
    - 只有通過except語句捕獲之後才會往下執行

try:
    f = open("1.txt")
    f.write('wwww')
except Exception as e:
    print(e)


def openfile(fiename):
    try:
        f = open(fiename)
    except Exception:
        raise IOError("檔案格式不對,或檔案不存在")
    else:
        return f
openfile('1.txt')
assert 1 == 1, '1 != 0'
list1 = [0, 2, 3]
try:
    assert list1[0] == 1, 'list1[1] != 1'
except AssertionError as e:
    print(e)



import random
snum = random.randint(0, 100)
while True:
    unum = input("Input a number:")
    try:
        rnum = int(unum)
    except ValueError:
        print('invalid literal')
        continue
    if rnum == snum:
        print("you guess it")
        break
    elif rnum < snum:
        print('less than')
    else:
        print("lager than")


from urllib import error
from urllib import request
def download(url, encoding='utf-8'):
    try:
        html = request.urlopen(url).read()
    except error.HTTPError as e:
        print('got http error', e)
    except error.URLError:
        print('url not true')
    except ValueError:
        print("invalid url")
    else:
        return html.decode(encoding)
-----------------------------模組和包-------------------------------
import re

1. 模組匯入
    - 用import 語句匯入一個模組
    - 一個py檔案就是一個模組
    - 檔名就是模組名
    - 匯入模組的時候,會執行模組檔案
    - 模組的搜尋路徑:當前檔案所在目錄->系統環境變數下的目錄
    - from...import... 從指定的模組中匯入指定的函式或變數或類
    - as 給匯入的模組或函式或變數等取別名

2. 第三方模組和包的安裝方法
    - pip install 包/模組名
    - easy_install 包/模組名
    - pip uninstall 包/模組名  -解除安裝

3. 包
    - 包就是普通檔案目錄下多了一個__init__.py檔案
    - 匯入包的時候會自動執行__init__.py 檔案
    - 可以使用import和from...import語句匯入包中的模組
    - 在模組中如果要使用包中某個模組的屬性、方法,那麼需要匯入模組才行,不能直接通過包來訪問
    - 如果只是匯入包名,那麼只能用包自身的屬性(變數)和方法(函式)

-----------------------------正則表示式-------------------------------【day14】重點課,常複習!
import re

# ret = re.match('(l)', 'hello world')
# ret = re.search('(l)', "hello world")
# reg = re.compile('(\D+)')
# all_list = re.findall('(^我\w+)', mul_line, flags=re.MULTILINE)
all_list = re.search('([a-c]+)', mul_line, re.I)
# print(all_list.group(1))
# new = re.sub('a(b)c', 'z\g<1>y', "hello abc")

line = '自制電椅處死蟑螂:燈泡閃爍約15秒,後蟑螂死去_新聞頻道_中華網'
ret = re.split('[:,_]#去除掉括號裡面的', line, flags=re.X)
print("_".join(ret[:-2]))

#【day14】,有個日誌分析指令碼:logAnalysis.py,main.py,

import re

content = ""
with open('xiaoqiang.html', encoding='utf-8') as f:
    content += f.read()

title = re.search(r'<title>(.*?)</title>', content, flags=(re.I | re.S))
title = title.group(1) if title else ""
print(title)
all_like = re.findall(r'<a href=".*?" class="pvOnMod1".*?>(.*?)</a>', content)
# print(all_like)

post = re.search(r'<div.*?id="endText".*?>(.*?)<div class="ep-source cDGray">', content, re.I | re.S)
newpost = post.group(1).strip()
# clean = re.sub('</?.*?>|\s', "", newpost, flags=(re.I | re.S))
clean = re.subn('</?.*?>|\s', "", newpost, flags=(re.I | re.S))
print(clean)

-----------------------------urllib庫-------------------------------
1. urllib包
    - request模組:開啟和讀取url的
    - error模組:包含了request模組丟擲的異常
    - parse模組:解析url的
    - robotparser模組:解析robots.txt檔案的

2. request模組
    - urllib.request.urlopen(url, data=None, [timeout, ]*,
     cafile=None, capath=None, cadefault=False, context=None)
     - 引數:
        - url:可以是一個字串(url連線)也可以是一個Request物件
        - data: 傳送給伺服器的資料
        - timeout: 連線超時,時間單位是秒
3.class urllib.request.Request(url, data=None, headers={},
    origin_req_host=None, unverifiable=False, method=None)
    - 返回一個Request物件,能夠作為urlopen的第一個引數
    - url就是要請求的url連線,是一個合法的字串
    - data post請求的時候要傳送的資料
    - headers 是一個字典,用於構造自定義的請求頭
    - origin_req_host 請求的host主域
    - unverifiable 是否驗證HTTPS
    - method 請求方法

 

-------------------------------------day16面向物件程式設計-----------------


class A:
    def __init__(self, name, age):
        self.name = name
        self._age = age

    def _sayhi(self):
        print('Hi, my name is{}. I am {}'.format(self.name, self._age))



"""面向物件程式設計:
面向物件:
面向過程:
    - 面向過程是按照步驟進行的
    - 有明確的步驟
    - 案例:把大象裝進大的冰箱裡
        - 1.把冰箱的門開啟
        - 2.把大象拉到冰箱門口
        - 3.把大象推進冰箱裡面
        - 4.把冰箱門關起來
什麼是面向物件?
    - 面向物件是基於物件本身的
    - 沒有固定步驟,只有相應的行為和屬性
    - 案例:把大象裝進冰箱
        - 有兩個物件:大象和冰箱
        - 大象的行為:走路,吃東西,睡覺
        - 大象的屬性:耳朵大,四條腿,鼻子長,體重高
        - 冰箱的行為:開門,關門,冰凍,裝東西
        - 冰箱的屬性:立方體的、黑色、品牌、型號
        - 通過呼叫裝東西的這個行為,就可以把大象裝進冰箱
    - 類和例項
        - 類就是分類,表明物件是屬於哪個分類的,該分類有什麼行為和屬性,也就是區別於其他的類的東西
        - 例項就是某個類下具體的某樣東西。比如:大象叫什麼名字,多重,吃多少東西,幾歲了。例項就是
            區別與別的東西
        - __main__.Elephant object at 0x00314790
          名稱空間      類名              記憶體地址

類屬性和例項屬性、例項方法
    - 直接在類下面寫的屬性(變數)就是類屬性
    - 類屬性是所有的類例項物件都共享的
    - 類屬性只能通過類名來修改
    - 例項物件可以呼叫類屬性
    - 類名可以呼叫類屬性
    - 例項屬性是每個例項獨有的,修改例項屬性本身並不會影響到其他例項物件
    - 例項屬性是在__init__函式裡面宣告(定義)的
    - 例項屬性在例項化的時候需要制定
    - 例項化時會最先執行__init__函式,如果有引數,那麼需要傳入指定的引數
    — 類名不能呼叫例項屬性
    - 例項物件可以呼叫例項方法(行為)
    - 類名如果要呼叫例項方法的時候,需要傳入具體的例項物件
    - 例項方法的第一個引數表示例項物件本身

類方法
    - 類方法的第一個引數名稱是cls,代表的是類本身
    - 類方法的宣告需要使用裝飾器@classmethod
    - 類名可以呼叫類方法
    - 例項物件也可以呼叫類方法

靜態方法
    - 當一個函式,即用不到類的屬性和方法,也用不到例項的屬性和方法的時候,但是又想把它
        放在類裡面方便管理,這時候就需要用到靜態方法
    - 靜態方法使用@staticmethod 進行修飾,表明該方法是靜態方法
    - 靜態方法裡面是不能引用例項屬性、例項方法,但是可以通過類名類呼叫類屬性和類方法(但是不建議)
    - 例項物件和類名都可以呼叫靜態方法

魔術方法
    - 魔術方法是python類內建的一些方法名稱,以雙下劃線開頭和結尾的
    - 面向物件的三大特徵:封裝、繼承、多型

類的繼承(單繼承)
    - 子類可以繼承父類,通過類名()裡面放入父類的名稱就可以了
    - 子類可以繼承父類的屬性和方法
    - 如果子類要新增自己例項屬性的時候,需要重寫__init__函式,並呼叫父類的__init__函式
    - 子類可以新增自己的方法
    - 子類也可以重寫父類的方法

類的繼承(多重繼承)
    - 要想獲取所有父類的屬性,那麼需要顯式的再__init__方法中呼叫父類的__init_方法
    - 假如多個父類的方法重名,預設使用的是第一個父類的方法,要想指明使用哪個父類的
        方法的時候,需要重寫該方法,然後重寫的方法裡面呼叫指定父類的方法

類的成員私有化
    - 屬性私有化
    - 方法私有化
    - 完全私有化,在屬性或方法名稱前面用雙下劃線(__)
    - 完全私有化的屬性和方法只能在類的內部訪問,例項物件不能訪問到
    - 部分私有化(property)保護屬性
    - 保護屬性 屬性和方法名稱前面是一個下劃線(_), 例項物件可以方法"""

 

 

pickle模組

https://www.cnblogs.com/abobo/p/8080447.html