python內置函數和推導式

內置函數和推導式

1. 匿名函數

  • 匿名函數,則是基於lambda表達式實現定義一個能夠沒有名字的函數html

    data_list = [ lambda x:x+100,  lambda x:x+110, lambda x:x+120 ]
     ​
     print( data_list[0] )
  • 參數,支持任意參數。python

  • 函數體,只能支持單行的代碼。正則表達式

  • 返回值,默認將函數體單行代碼執行的結果返回給函數的執行這。json

2. 三元運算

func = lambda x: "大了" if x > 66 else "小了"

3. 生成器

在內存中建立不少數據時,能夠想着用基於生成器來實現一點一點生成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)

4.內置函數

Python3 內置函數 | 菜鳥教程 (runoob.com)阿里雲

5.推導式

data_list = data for data in range(5)

能夠生成列表、集合、字典、元組 url

元組不是直接生成元組,是生成器,能夠遍歷其中的元素spa

6. 推導式支持嵌套

data = [ [i, j] for j in range(5) for i in range(10)]

7. 自定義模塊

在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/

8. 內置模塊(一)

os

點擊查看代碼
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)

shutil

點擊查看代碼
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')

sys

# 2. 導入模塊路徑
 """
 print(sys.path)
 """

random

點擊查看代碼
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)

json

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)

時間處理

time

v1 = time.time()  # 獲取時間戳
 ​
 time.sleep(5) # 中止n秒,再執行後續的代碼。

datetime

點擊查看代碼
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()
 ​

9. 正則表達式

導入模塊 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)

特殊字符 * . \ { } ( ) 查找特殊字符時要轉義

match()

從起始位置開始匹配,匹配成功返回一個對象,未匹配成功返回None

search()

瀏覽整個字符串去匹配第一個未匹配成功返回None

和match的區別是,match是從第一個字符查匹配到返回對象 匹配不到返回None search是查整個字符串

sub()

替換匹配成功的位置

data = re.sub("\dB", "沙雕", text)  # 將(數字B)替換成(沙雕)

split()

根據匹配成功的位置分割

finditer()

匹配字符後生成字典,自定義字典的鍵,字典的值是匹配到的字符

實例:匹配年月日

點擊查看代碼
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'}
 ​
 '''
相關文章
相關標籤/搜索