Python3(十二) Pythonic與Python雜記

来源:https://www.cnblogs.com/wlgaojin/archive/2020/02/13/12304788.html
-Advertisement-
Play Games

一.用字典映射代替switch case語句 if/else可以代替switch但是非常不合適。 用字典代替switch: day = 5 switcher = { 0:'Sunday', 1:'Monday', 2:'Tuesday' } day_name = switcher.get(day,' ...


一.用字典映射代替switch case語句

if/else可以代替switch但是非常不合適。

用字典代替switch:

day = 5

switcher = {

    0:'Sunday',

    1:'Monday',

    2:'Tuesday'

}
day_name = switcher.get(day,'Unknow')

print(day_name)

 

利用get()完整模擬。

在字典中模擬帶函數的switch:

 

day = 6


def get_sunday():

    return 'Sunday'

 

def get_monday():

    return 'Monday'

 

def get_tuesday():

    return 'Tuesday'
 

def get_default():

    return 'Unknow'
 

switcher = {

    0:get_sunday,

    1:get_monday,

    2:get_tuesday

}

day_name = switcher.get(day,get_default)()

print(day_name)

二.列表推導式

 

根據已經存在的列表創建新的列表:

a = [1,2,3,4,5,6,7,8]

 

b = [i * i for i in a]

print(b)

#[1, 4, 9, 16, 25, 36, 49, 64]

或者i**2也事代表i的平方。

 

條件篩選:用列表推導式

a = [1,2,3,4,5,6,7,8]

 

b = [i**2 for i in a if i >= 5]

print(b)

 

#[25, 36, 49, 64]

map要結合filter才能實現。

a是集合、字典、元組也可以被推導:

a = {1,2,3,4,5,6,7,8}

 

b = {i**2 for i in a if i >= 5}

print(b)

 

三. 字典如何編寫列表推導式

 

tudents = {

    'tai':18,

    'park':32,

    'a':12

}

b = [key for key,value in students.items()]

print(b)

 

students = {

    'tai':18,

    'park':32,

    'a':12

}

b = {value:key for key,value in students.items()}

print(b)

students = {

    'tai':18,

    'park':32,

    'a':12

}

b = (key for key,value in students.items())

for x in b:

print(x)

四. iterator與generator

迭代器:

可迭代對象和迭代器

可迭代對象(iterable):可被for in迴圈遍歷的對象

迭代器(iterator):是一個對象,可被for in迴圈遍歷。一定是個可迭代對象。

普通對象變成迭代器需要實現__iter__()和__next__():

class BookCollection:

    def __init__(self):

        self.data = ['《往事》','《只能》','《回味》']

        self.cur = 0


    def __iter__(self):

        return self


    def __next__(self):

        if self.cur >= len(self.data):

            raise StopIteration()

        r = self.data[self.cur]

        self.cur += 1

        return r


books = BookCollection()

for book in books:

print(book)

除了for in 遍歷,還可以調用next方法:

books = BookCollection()

print(next(books))

print(next(books))

print(next(books))

 

迭代器具有一次性,只能遍歷一次。若想再次遍歷需要實例化一個新的對象。或者:

import copy

books = BookCollection()

books_copy = copy.copy(books)    #淺拷貝

若想實現深拷貝的話:

books = BookCollection()

books_copy = copy.deepcopy(books)    #生成器

 

生成器:

列印從0-10000的數字:

n = [i for i in range(0,10001)]

for i in n :

    print(i)

可以實現但是太消耗記憶體。n是一個列表,列表存儲需要消耗記憶體的。

更好的方法:生成器

迭代器是針對一個對象的,生成器是針對一個函數的。

函數實現法:

def gen(max):

    n = 0

    while n <= max:

        print(n)

        n += 1

gen(100000)

 

每次列印的都是實時計算出來的結果,不是都存儲起來再列印。

不應該在函數內部實現如print這樣的操作。

生成器:

def gen(max):

    n = 0

    while n <= max:

        n += 1

        yield n

 

g = gen(100000)

next(g)

next(g)

for i in g:

    print(i)

yield會接著返回的地方繼續執行。

n = (i for i in range(0,10001))

此時n也為生成器。

 

五. None

None 空,不等於空字元串、空列表、0、False

不僅在類型上不同,而且在值的比較上也不相同。

class NoneType

判空操作:

def fun():

    return None

 

a = fun()

if not a:

    print('s')

else:

    print('f')

 

if a is None:

    print('s')

else:

    print('f')

#s

#s

如果 a = []則會進入到不同的分支中去。

 

推薦if a/if not a來判空。

 

None 不存在,False 假 

 

14-7 對象存在並不一定是True

 

None永遠對應False

自定義的對象:

class Test():

    def __len__(self):

        return 0

 

test = Test()

if test:

    print('s')

else:

    print('f')

#f    #進的是False分支

test存在也有可能是False,需要考慮__len__與__bool__方法。

 

14-8 __len__與__bool__內置方法

如果沒有定義__len__與__bool__方法則預設為True。

__len__返回0則為False,__len__代表長度,只能用int返回。

例外:__len__可返回True和False

調用len()時,則會調用__len__,如果沒有__len__,求長度的時候會報錯。

 

一旦加入了__bool__則由__bool__來控制對象的取值。

__bool__只能返回布爾型。

六.裝飾器的副作用

 

import time

def decorator(func):

    def wrapper():

        print(time.time())

        func()

    return wrapper

#@decorator

def f1():

    print(f1.__name__)


f1()

#f1            #不加裝飾器的函數名字
import time

def decorator(func):

    def wrapper():

        print(time.time())

        func()

    return wrapper

@decorator

def f1():

    print(f1.__name__)

f1()

#1532492964.0116718

#wrapper    #加裝飾器的函數名字

wrapper來字閉包函數。

 

python->help(len)->列印出內置說明

我們可以通過註釋書寫help()的內容

加了裝飾器之後就無法找到函數的help()了

 

保證名字不改變:

import time

from functools import wraps

 

def decorator(func):

    @wraps(func)

    def wrapper():

        print(time.time())

        func()

    return wrapper

 

@decorator

def f1():

    print(f1.__name__)

 

f1()

#1532493245.2623913

#f1

wraps傳入了原有函數,所以得知了原函數的信息,然後複製到閉包函數上,則信息得以保存。

 


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

-Advertisement-
Play Games
更多相關文章
  • MySQL官方對索引的定義為:索引(Index)是幫助MySQL高效獲取數據的數據結構。 資料庫查詢是資料庫的最主要功能之一,我們都希望查詢數據的速度能儘可能的快,因此資料庫系統的設計者會從查詢演算法的角度進行優化,這篇文章對索引做一個系統的梳理,希望對大家有幫助。 一、MySQL有哪些索引類型 索引 ...
  • 最近需要設計一個API伺服器,想要把API介面搞得規範一下,就通過網上搜集到了一些資料,以下便是自己的一些理解以及相關的具體實現 本文采用的是spring boot+maven的方案 restful規範 這個規範我在這裡也不打算長篇大論地講解,怎麼說呢,有人喜歡有人討厭,我也不去爭,因為我經驗不多, ...
  • 一、判斷一個數字X的i位是不是1 二、把一個數字二進位下的第i位改成1 三、把一個數字二進位下的最靠右的第一個1改成0(去掉) ...
  • windows破解教程 1. 首先下載jar包:(雲盤鏈接發不上去,大家關註gzh" 灰太狼學爪哇 "回覆 idea 獲取)將其放到合適的文件夾(首選IDEA的同級目錄)進行管理; 2. 進入C盤 — 用戶 — 用戶名 — .IntelliJIdea2019.2或者.IntelliJIdea2019 ...
  • VisualVM在Java 8中是JDK自帶的一個圖形化工具,項目主頁 "VisualVM" ,在後續版本中可能會從JDK移除。 VisualVM可以監控Java進程的CPU與記憶體占用情況,可以監控Java進程內的各個線程的執行情況,還可以與MAT工具一樣用來分析堆轉儲快照。 監控遠程Tomcat進 ...
  • 1.前提條件 1). 確保已經安裝需要的Python版本 2). 確保已經將Python的目錄加入到環境變數中 2. Python安裝包的幾種常用方式 1). pip安裝方式(正常線上安裝) 2). whl安裝方式(離線安裝),一般是.whl格式的包 3). 源碼安裝方式(離線安裝),tar.gz/ ...
  • 概念: 什麼是REST? REST是Representational State Transfer的縮寫。翻譯為"表現層狀態轉化",restful是一種介面設計風格,它不是一個協議,通常是基於HTTP協議的; 為什麼需要這麼一個風格呢? RESTful的重點之一就是統一的介面命名規則; 每個開發者可 ...
  • 請求限制 一些情況下我們可能需要對請求進行限制,比如僅允許POST,GET等... RequestMapping註解中提供了多個參數用於添加請求的限制條件 value 請求地址 path 請求地址 method 請求方法 headers 請求頭中必須包含指定欄位 params 必須包含某個請求參數 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...