匿名函數,則是基於lambda表達式實現定義一個能夠沒有名字的函數html
data_list = [ lambda x:x+100, lambda x:x+110, lambda x:x+120 ] print( data_list[0] )
參數,支持任意參數。python
函數體,只能支持單行的代碼。正則表達式
返回值,默認將函數體單行代碼執行的結果返回給函數的執行這。json
func = lambda x: "大了" if x > 66 else "小了"
在內存中建立不少數據時,能夠想着用基於生成器來實現一點一點生成dom
生成器函數,但函數中有yield存在時,這個函數就是生產生成器函數。函數
生成器對象,執行生成器函數時,會返回一個生成器對象。ui
def func(): print(111) v1 = yield 1 print(v1) print(222) v2 = yield 2 print(v2) print(333) v3 = yield 3 print(v3) print(444) data = func() n1 = data.send(None) print(n1) n2 = data.send(666) print(n2) n3 = data.send(777) print(n3) n4 = data.send(888) print(n4)
阿里雲
data_list = data for data in range(5)
能夠生成列表、集合、字典、元組 url
元組不是直接生成元組,是生成器,能夠遍歷其中的元素spa
data = [ [i, j] for j in range(5) for i in range(10)]
在Python中通常對文件和文件的稱呼(不少開發者的平時開發中也有人都稱爲模塊)
一個py文件,模塊(module)。
含多個py文件的文件夾,包(package)。
注意:在包(文件夾)中有一個默認內容爲空的__init__.py
的文件,通常用於描述當前包的信息(在導入他下面的模塊時,也會自動加載)。
py2必須有,若是沒有導入包就會失敗。
py3無關緊要。
在Python內部默認設置了一些路徑,導入模塊或包時,都會按照指定順序逐一去特定的路徑查找。也能夠自動手動在sys.path中添加指定路徑
查看模塊路徑
import sys print(sys.path)
不能和內置和第三方的同名
python3.9 -m pip install --upgrade pip # 更新pip
pip3.9 config set global.index-url https://pypi.douban.com/simple/ # 設置下載源 Writing to /Users/wupeiqi/.config/pip/pip.conf
阿里雲:http://mirrors.aliyun.com/pypi/simple/ 中國科技大學:https://pypi.mirrors.ustc.edu.cn/simple/ 清華大學:https://pypi.tuna.tsinghua.edu.cn/simple/ 中國科學技術大學:http://pypi.mirrors.ustc.edu.cn/simple/
import os # 1. 獲取當前腳本絕對路徑 """ abs_path = os.path.abspath(__file__) print(abs_path) """ # 2. 獲取當前文件的上級目錄 """ base_path = os.path.dirname( os.path.dirname(路徑) ) print(base_path) """ # 3. 路徑拼接 """ p1 = os.path.join(base_path, 'xx') print(p1) p2 = os.path.join(base_path, 'xx', 'oo', 'a1.png') print(p2) """ # 4. 判斷路徑是否存在 """ exists = os.path.exists(p1) print(exists) """ # 5. 建立文件夾 """ os.makedirs(路徑) """ """ path = os.path.join(base_path, 'xx', 'oo', 'uuuu') if not os.path.exists(path): os.makedirs(path) """ # 6. 是不是文件夾 """ file_path = os.path.join(base_path, 'xx', 'oo', 'uuuu.png') is_dir = os.path.isdir(file_path) print(is_dir) # False folder_path = os.path.join(base_path, 'xx', 'oo', 'uuuu') is_dir = os.path.isdir(folder_path) print(is_dir) # True """ # 7. 刪除文件或文件夾 """ os.remove("文件路徑") """ """ path = os.path.join(base_path, 'xx') shutil.rmtree(path) """
walk,查看目錄下全部的文件(含子孫文件)
import os """ data = os.listdir("/Users/wupeiqi/PycharmProjects/luffyCourse/day14/commons") print(data) # ['convert.py', '__init__.py', 'page.py', '__pycache__', 'utils.py', 'tencent'] """ """ 要遍歷一個文件夾下的全部文件,例如:遍歷文件夾下的全部mp4文件 """ data = os.walk("/Users/wupeiqi/Documents/視頻教程/路飛Python/mp4") for path, folder_list, file_list in data: for file_name in file_list: file_abs_path = os.path.join(path, file_name) ext = file_abs_path.rsplit(".",1)[-1] if ext == "mp4": print(file_abs_path)
import shutil # 1. 刪除文件夾 """ path = os.path.join(base_path, 'xx') shutil.rmtree(path) """ # 2. 拷貝文件夾 """ shutil.copytree("/Users/wupeiqi/Desktop/圖/csdn/","/Users/wupeiqi/PycharmProjects/CodeRepository/files") """ # 3.拷貝文件 """ shutil.copy("/Users/wupeiqi/Desktop/圖/csdn/WX20201123-112406@2x.png","/Users/wupeiqi/PycharmProjects/CodeRepository/") shutil.copy("/Users/wupeiqi/Desktop/圖/csdn/WX20201123-112406@2x.png","/Users/wupeiqi/PycharmProjects/CodeRepository/x.png") """ # 4.文件或文件夾重命名 """ shutil.move("/Users/wupeiqi/PycharmProjects/CodeRepository/x.png","/Users/wupeiqi/PycharmProjects/CodeRepository/xxxx.png") shutil.move("/Users/wupeiqi/PycharmProjects/CodeRepository/files","/Users/wupeiqi/PycharmProjects/CodeRepository/images") """ # 5. 壓縮文件 """ # base_name,壓縮後的壓縮包文件 # format,壓縮的格式,例如:"zip", "tar", "gztar", "bztar", or "xztar". # root_dir,要壓縮的文件夾路徑 """ # shutil.make_archive(base_name=r'datafile',format='zip',root_dir=r'files') # 6. 解壓文件 """ # filename,要解壓的壓縮包文件 # extract_dir,解壓的路徑 # format,壓縮文件格式 """ # shutil.unpack_archive(filename=r'datafile.zip', extract_dir=r'xxxxxx/xo', format='zip')
# 2. 導入模塊路徑 """ print(sys.path) """
import random # 1. 獲取範圍內的隨機整數 v = random.randint(10, 20) print(v) # 2. 獲取範圍內的隨機小數 v = random.uniform(1, 10) print(v) # 3. 隨機抽取一個元素 v = random.choice([11, 22, 33, 44, 55]) print(v) # 4. 隨機抽取多個元素 v = random.sample([11, 22, 33, 44, 55], 3) print(v) # 5. 打亂順序 data = [1, 2, 3, 4, 5, 6, 7, 8, 9] random.shuffle(data) print(data)
res = json.dumps(data, ensure_ascii=False) # 序列化數據 data_list = json.loads(data_string) # 反序列化
實例
import json import requests url = "https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=5&page_start=20" res = requests.get( url=url, headers={ "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" } ) # json格式 print(res.text) # json格式轉換爲python數據類型 data_dict = json.loads(res.text) print(data_dict)
+-------------------+---------------+ | Python | JSON | +===================+===============+ | dict | object | +-------------------+---------------+ | list, tuple | array | +-------------------+---------------+ | str | string | +-------------------+---------------+ | int, float | number | +-------------------+---------------+ | True | true | +-------------------+---------------+ | False | false | +-------------------+---------------+ | None | null | +-------------------+---------------+
其餘類型轉換json
import json from decimal import Decimal from datetime import datetime data = [ {"id": 1, "name": "wq", "age": 18, 'size': Decimal("18.99"), 'ctime': datetime.now()}, {"id": 2, "name": "www", "age": 18, 'size': Decimal("9.99"), 'ctime': datetime.now()}, ] class MyJSONEncoder(json.JSONEncoder): def default(self, o): if type(o) == Decimal: return str(o) elif type(o) == datetime: return o.strftime("%Y-%M-%d") return super().default(o) res = json.dumps(data, cls=MyJSONEncoder) print(res)
v1 = time.time() # 獲取時間戳 time.sleep(5) # 中止n秒,再執行後續的代碼。
from datetime import datetime, timezone, timedelta v1 = datetime.now() # 當前本地時間 v2 = v1 + timedelta(days=140, minutes=5) print(datetime.now().strptime("1990-05-12", '%Y-%m-%d')) # 1990-05-12 00:00:00 轉換字符串時間爲datetime v = datetime.now().strftime("%Y-%m-%d %H:%M:%S") # 2021-08-10 轉換當前時間爲字符串格式 # 時間戳格式 --> 轉換爲datetime格式 ctime = time.time() # 11213245345.123 v1 = datetime.fromtimestamp(ctime) # datetime格式 ---> 轉換爲時間戳格式 v1 = datetime.now() val = v1.timestamp()
實例:用戶註冊,將用戶信息寫入Excel,其中包含:用戶名、密碼、註冊時間 三列。
import os import hashlib from datetime import datetime from openpyxl import load_workbook from openpyxl import workbook BASE_DIR = os.path.dirname(os.path.abspath(__file__)) FILE_NAME = "db.xlsx" def md5(origin): hash_object = hashlib.md5("sdfsdfsdfsd23sd".encode('utf-8')) hash_object.update(origin.encode('utf-8')) return hash_object.hexdigest() def register(username, password): db_file_path = os.path.join(BASE_DIR, FILE_NAME) if os.path.exists(db_file_path): wb = load_workbook(db_file_path) sheet = wb.worksheets[0] next_row_position = sheet.max_row + 1 else: wb = workbook.Workbook() sheet = wb.worksheets[0] next_row_position = 1 user = sheet.cell(next_row_position, 1) user.value = username pwd = sheet.cell(next_row_position, 2) pwd.value = md5(password) ctime = sheet.cell(next_row_position, 3) ctime.value = datetime.now().strftime("%Y-%m-%d %H:%M:%S") wb.save(db_file_path) def run(): while True: username = input("請輸入用戶名:") if username.upper() == "Q": break password = input("請輸入密碼:") register(username, password) if __name__ == '__main__': run()
ipmort re
re.findall()
data_list = re.findall("wq", text) data_list = re.findall("[abc]", text) # 匹配a或b或c data_list = re.findall("v[abc]", text) # 匹配以v開始a或b或c結尾的 data_list = re.findall("v[……abc]", text) # 匹配不以v開始a或b或c結尾的 ^取反 data_list = re.findall([0-9], text) # 匹配0-9的任意字符 [a-z]
.
代指除換行符之外的任意字符。
import re text = "alexraotrootadmin" data_list = re.findall("r.o", text) data_list = re.findall("r.+o", text) # 貪婪匹配 data_list = re.findall("r.+?o", text) # 非貪婪匹配 print(data_list) # ['rao', 'roo']
\w
匹配字母或數字或下劃線
data_list = re.findall("武\w+x", text)
\d
匹配數字
data_list = re.findall("d\d+", text)
\s
代指任意的空白符,包括空格、製表符等。
data_list = re.findall("a\w+\s\w+", text)
*
重複0次或更屢次
+
重複1次或更屢次
?
重複0次或1次
{n}
重複n次
{n,}
重複n次或更屢次
{n,m}
重複n到m次
括號(分組)
data_list = re.findall("15131(2\d{5})", text) # 取以15131開頭而且是(以2開頭後面5位數字的值) 取()中的值 ['255789']
身份證號
import re text = "dsf130429191912015219k13042919591219521Xkk" data_list = re.findall("(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)", text) print(data_list) # [('130429', '1919', '12', '01', '521', '9'), ('130429', '1959', '12', '19', '521', 'X')]
郵箱
import re text = "樓主太牛逼了,在線想要 442662578@qq.com和xxxxx@live.com謝謝樓主,手機號也可15131255789,搞起來呀" email_list = re.findall("\w+@\w+\.\w+", text, re.ASCII) print(email_list) # ['442662578@qq.com', 'xxxxx@live.com']
^
開始
$
結束
實例:校驗用戶輸入的郵箱格式是否正確
import re text = input("請輸入郵箱:") email = re.findall("^\w+@\w+.\w+$", text, re.ASCII) if not email: print("郵箱格式錯誤") else: print(email)
特殊字符 * . \ { } ( )
查找特殊字符時要轉義
從起始位置開始匹配,匹配成功返回一個對象,未匹配成功返回None
瀏覽整個字符串去匹配第一個,未匹配成功返回None
和match的區別是,match是從第一個字符查匹配到返回對象 匹配不到返回None search是查整個字符串
替換匹配成功的位置
data = re.sub("\dB", "沙雕", text) # 將(數字B)替換成(沙雕)
根據匹配成功的位置分割
匹配字符後生成字典,自定義字典的鍵,字典的值是匹配到的字符
實例:匹配年月日
text = "dsf130429191912015219k13042919591219521Xkk" data_list = re.finditer("\d{6}(?P<year>\d{4})(?P<month>\d{2})(?P<day>\d{2})\d{3}[\d|X]", text) for item in data_list: info_dict = item.groupdict() print(info_dict) ''' {'year': '1919', 'month': '12', 'day': '01'} {'year': '1959', 'month': '12', 'day': '19'} '''