day13-階段總結

来源:https://www.cnblogs.com/sbhglqy/p/18121003
-Advertisement-
Play Games

1.知識補充 1.1 nolocal關鍵字 在之前的課程中,我們學過global關鍵字。 name = 'root' def outer(): name = "武沛齊" def inner(): global name name = 123 inner() print(name) # 武沛齊 out ...


1.知識補充

1.1 nolocal關鍵字

在之前的課程中,我們學過global關鍵字。

name = 'root'


def outer():
    name = "武沛齊"

    def inner():
        global name
        name = 123

    inner()
    print(name)	# 武沛齊


outer()
print(name)	# 123

其實,還有一個nolocal關鍵字,用的比較少,此處作為瞭解即可。

name = 'root'


def outer():
    name = "武沛齊"

    def inner():
        nonlocal name
        name = 123

    inner()
    print(name)	# 123


outer()
print(name)	# root
name = 'root'


def outer():
    name = 'alex'

    def func():
        name = "武沛齊"

        def inner():
            nonlocal name
            name = 123

        inner()
        print(name)	# 123

    func()
    print(name)	# alex


outer()
print(name)	# root

name = 'root'


def outer():
    name = 'alex'

    def func():
        nonlocal name
        name = "武沛齊"

        def inner():
            nonlocal name
            name = 123

        inner()
        print(name)	# 123

    func()
    print(name)	# 123


outer()
print(name)	# root

1.2 yield from

在生成器部分我們瞭解了yield關鍵字,其在python3.3之後有引入了一個yield from。

def foo():
    yield 2
    yield 2
    yield 2


def func():
    yield 1
    yield 1
    yield 1
    yield from foo()
    yield 1
    yield 1


for item in func():
    print(item)

1.3 深淺拷貝

  • 淺拷貝

    • 不可變類型,不拷貝。

      import copy
      
      v1 = "武沛齊"
      print(id(v1)) # 140652260947312
      
      v2 = copy.copy(v1) 
      print(id(v2)) # 140652260947312
      

      按理說拷貝v1之後,v2的記憶體地址應該不同,但由於python內部優化機制,記憶體地址是相同的,因為對不可變類型而言,如果以後修改值,會重新創建一份數據,不會影響原數據,所以,不拷貝也無妨。

    • 可變類型,只拷貝第一層。

      import copy
      
      v1 = ["武沛齊", "root", [44, 55]]
      print(id(v1))  # 140405837216896
      print(id(v1[2]))  # 140405837214592
      
      v2 = copy.copy(v1)
      print(id(v2))  # 140405837214784
      print(id(v2[2]))  # 140405837214592
      

image

  • 深拷貝

    • 不可變類型,不拷貝

      import copy
      
      v1 = "武沛齊"
      print(id(v1))  # 140188538697072
      
      v2 = copy.deepcopy(v1)
      print(id(v2))  # 140188538697072
      

      特殊的元組:

      • 元組元素中無可變類型,不拷貝

        import copy
        
        v1 = ("武沛齊", "root")
        print(id(v1))  # 140243298961984
        
        v2 = copy.deepcopy(v1)
        print(id(v2))  # 140243298961984
        
      • 元組元素中有可變類型,找到所有【可變類型】或【含有可變類型的元組】 均拷貝一份

        import copy
        
        v1 = ("武沛齊", "root", [11, [44, 55], (11, 22), (11, [], 22), 33])
        v2 = copy.deepcopy(v1)
        
        print(id(v1))  # 140391475456384
        print(id(v2))  # 140391475456640
        
        print(id(v1[2]))  # 140352552779008
        print(id(v2[2]))  # 140352552920448
        
        print(id(v1[2][1]))  # 140642999940480
        print(id(v2[2][1]))  # 140643000088832
        
        print(id(v1[2][2]))  # 140467039914560
        print(id(v2[2][2]))  # 140467039914560
        
        print(id(v1[2][3]))  # 140675479841152
        print(id(v2[2][3]))  # 140675480454784
        
    • 可變類型,找到所有層級的 【可變類型】或【含有可變類型的元組】 均拷貝一份

      import copy
      
      v1 = ["武沛齊", "root", [11, [44, 55], (11, 22), (11, [], 22), 33]]
      v2 = copy.deepcopy(v1)
      
      print(id(v1))  # 140391475456384
      print(id(v2))  # 140391475456640
      
      print(id(v1[2]))  # 140352552779008
      print(id(v2[2]))  # 140352552920448
      
      print(id(v1[2][1]))  # 140642999940480
      print(id(v2[2][1]))  # 140643000088832
      
      print(id(v1[2][2]))  # 140467039914560
      print(id(v2[2][2]))  # 140467039914560
      
      print(id(v1[2][3]))  # 140675479841152
      print(id(v2[2][3]))  # 140675480454784
      
      import copy
      
      v1 = ["武沛齊", "root", [44, 55]]
      v2 = copy.deepcopy(v1)
      
      print(id(v1))  # 140405837216896
      print(id(v2))  # 140405837214784
      
      
      print(id(v1[2]))  # 140563140392256
      print(id(v2[2]))  # 140563140535744
      

image

2.階段總結

image

3.考試題

  1. 一個大小為100G的文件 etl_log.txt,要讀取文件中的內容,寫出具體過程代碼。
# 如果文件有多行
with open("etl_log.txt", mode="r", encoding="utf-8") as f:
    for line in f:
        print(line)
# 文件只有一行
import os

file_size = os.path.getsize("etl_log.txt")
chunk_size = 0
with open("etl_log.txt", mode='r', encoding="utf-8") as f:
    while chunk_size < file_size:
        data = f.read(1)
        chunk_size += len(data)
  1. 編寫一個函數,這個函數接受一個文件夾名稱作為參數,尋找文件夾中所有文件的路徑並輸入(包含嵌套)。
import os


def get_all_file(folder_name):
    data_list = os.walk(folder_name)
    for folder_path, folder_list, file_list in data_list:
        for file_name in file_list:
            file_path = os.path.join(folder_path, file_name)
            print(file_path)
  1. 以下的代碼數據的結果是什麼?
def extend_list(val,data=[]):
	data.append(val)
	return data

list1 = extend_list(10)
list2 = extend_list(123,[])
list3 = extend_list("a")

print(list1,list2,list3)	# [10, 'a'] [123] [10, 'a']
  1. python代碼獲取命令行參數。
import sys
print(sys.argv)
  1. 簡述深淺拷貝?
  • 淺拷貝:
    • 可變類型,只拷貝第一層
    • 不可變類型:不拷貝
  • 深拷貝:
    • 可變類型:找到所有層級的可變類型或含有可變類型的元組均拷貝一份
    • 不可變類型:不拷貝
  • 元組比較特殊
    • 元組中無可變類型,不拷貝
    • 元組中有可變類型,會將所有的可變類型或含有可變類型的元組均拷貝一份
  1. 基於推導式一行代碼生成1-100以內的偶數列表。
even_list = [i for i in range(101) if i % 2 == 0]
print(even_list)
  1. 請把以下函數轉化為python lambda匿名函數
def add(x,y):
   return x+y
add = lambda x, y: x + y
  1. 看代碼寫結果
def num():
   return [lambda x: i * x for i in range(4)]

result = [m(2) for m in num()]
print(result)	# [6, 6, 6, 6]
  1. 列表推導式和生成器表達式 [i % 2 for i in range(10)] 和 (i % 2 for i in range(10)) 輸出結果分別是什麼?
    列表推導式的輸出結果:[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
    生成器表達式的輸出結果:生成器的地址
  2. 寫裝飾器
# 寫timer裝飾器實現:計算fun函數執行時間,並將結果給 result,最終列印(不必使用datetime,使用time.time即可)。

@timer
def func():
    pass

result = func()
print(result)
import time
import functools


def timer(origin):
    @functools.wrap(origin)
    def inner(*args, **kwargs):
        start = time.time()
        res = origin(*args, **kwargs)
        end = time.time()
        message = "耗時:{}".format(end - start)
        print(message)
        return res

    return inner


@timer
def func():
    pass

result = func()
print(result)
  1. re的match和search區別?
    match會從所給文本的頭開始匹配,如果不符合條件,直接返回none
    search會從所給文本中找到第一處匹配規則的文本,然後返回,沒找到就返回none

  2. 什麼是正則的貪婪匹配?或 正則匹配中的貪婪模式與非貪婪模式的區別?
    貪婪匹配就是會儘可能多的去匹配符合正則表達式的文本
    非貪婪匹配就是只要找到符合正則表達式的文本就返回

  3. sys.path.append("/root/mods")的作用?
    將"/root/mods"加入sys.path,那麼項目就可以直接導入"/root/mods"下的模塊和包。

  4. 寫函數

    有一個數據結構如下所示,請編寫一個函數從該結構數據中返回由指定的 欄位和對應的值組成的字典。如果指定欄位不存在,則跳過該欄位。
    DATA = {
        "time": "2016-08-05T13:13:05",
        "some_id": "ID1234",
        "grp1": {"fld1": 1, "fld2": 2, },
        "xxx2": {"fld3": 0, "fld4": 0.4, },
        "fld6": 11,
        "fld7": 7,
        "fld46": 8
    }
    
    fields:由"|"連接的以fld開頭的字元串, 如fld2|fld7|fld29  
    
    def select(fields):
        print(DATA)
        return result
    
    def select(fields):
        result = {}
        field_list = fields.split("|")
        for field in field_list:
            data = DATA.get(field)
            if not data:
                continue
            result[field] = data
        return result
    
  5. 編寫函數,實現base62encode加密(62進位),例如:

內部維護的數據有:0123456789AB..Zab..z(10個數字+26個大寫字母+26個小寫字母)。
當執行函數:
    base62encode(1),獲取的返回值為1
    base62encode(61),獲取的返回值為z
    base62encode(62),獲取的返回值為10
import string
import itertools

MAP = list(itertools.chain(string.digits, string.ascii_uppercase, string.ascii_lowercase))	# 生成內部維護的數據

def base62encode(data):
    total_count = len(MAP)
    position_value = []
    while data >= total_count:
        data, div = divmod(data, total_count)  # 得到餘數和商
        position_value.insert(0, MAP[div])	# 取得MAP中對應的值放到列表最前面
    position_value.insert(0, MAP[data])
    res = "".join(position_value)
    return res
  1. 基於列表推導式一行實現輸出9*9乘法表。
print("\n".join([" ".join(["{}*{}={}".format(i, j, i * j) for i in range(1, 10) for j in range(i, 10)])]))

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • React 學習之 Hello World React 簡介 React是一個用於構建用戶界面的JavaScript庫,由Facebook開發並維護。React通過聲明式的方式來構建UI,使得代碼更易於理解和測試。React的核心概念包括組件(Component)和虛擬DOM(Virtual DOM ...
  • nvm nvm(Node Version Manager)是一個Node.js的版本管理器。 安裝nvm windows安裝nvm 1. 下載nvm 下載地址:nvm-windows,下載 nvm-noinstall 或者 nvm-setup.exe 如果使用 nvm-noinstall 可以運行 ...
  • 多租戶的概念是我在畢業後不久進第一家公司接觸到的,當時所在部門的業務是計劃建設一套基於自研的、基於開放 API 的、基於 PaaS 的、面向企業(ToB)的多租戶架構平臺,將我們的服務可以成規模地、穩定高效地交付給客戶使用。 ...
  • 什麼是客戶管理系統? 客戶管理系統,也稱為CRM(Customer Relationship Management),主要目標是建立、發展和維護好客戶關係。 CRM系統圍繞客戶全生命周期的管理,吸引和留存客戶,實現縮短銷售周期、降低銷售成本、增加銷售收入的目的,從而提高企業的盈利能力和競爭力。 CR ...
  • 布隆過濾器 極簡概括 英文名稱Bloom Filter,用於判斷一個元素是否在一個大數據集合中,如果檢測到存在則有可能存在,如果不存在則一定不存在。 Redis官網對於布隆過濾器的說明:https://redis.io/docs/data-types/probabilistic/bloom-filt ...
  • Spring學習總結 Spring基本介紹 Spring 學習的核心內容 1.IOC: 控制反轉, 可以管理java 對象 2.AOP : 切麵編程 3.JDBCTemplate : 是spring 提供一套訪問資料庫的技術, 應用性強,相對好理解 4.聲明式事務: 基於ioc/aop 實現事務管理 ...
  • 大家好,我是白夜,今天和大家聊聊類與對象 一、初識面向對象(瞭解) 1.1、面向過程和麵向對象 面向過程編程 C 語言就是面向過程編程的,關註的是過程,分析出求解問題的步驟,通過函數調用逐步解決問題。 面向對象編程 JAVA 是基於面向對象的,關註的是對象,將一件事情拆分成不同的對象,靠對象之間的交 ...
  • 引言 眾所周知,數據流分析是實現污點分析的一種常用技術 數據流分析分為過程內的數據流分析與過程間的數據流分析。前者是對一個方法體內的數據流分析,主要是基於CFG分析,不涉及方法調用;後者是基於不同方法間的數據流分析,主要是基於ICFG+CG分析,會涉及方法調用。 一、過程內數據流分析 1. CFG的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...