Python3(十二) Pythonic與Python雜記

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

一.用字典映射代替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傳入了原有函數,所以得知了原函數的信息,然後複製到閉包函數上,則信息得以保存。

 


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

更多相關文章
  • 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 必須包含某個請求參數 ...
一周排行
  • 微信公眾號dotnet跨平臺2020年初做的一個關於中國.NET開發者調查收到了開發者近 1400 條回覆。這份調查報告涵蓋了開發者工具鏈的所有部分,包括編程語言、應用架構、應用伺服器、運行時平臺、框架技術、框架配置、IDE、.NET/.NET Core 發行版部署模式、構建工具和Kubernete... ...
  • Winform控制項的雙緩衝。控制項的雙緩衝屬性是隱藏的,可以通過反射改變其屬性值。 lv.GetType().GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(lv, true, ...
  • 1. 需求 上圖這種包含多選(CheckBox)和單選(RadioButton)的菜單十分常見,可是在WPF中只提供了多選的MenuItem。順便一提,要使MenuItem可以多選,只需要將MenuItem的 屬性設置為True: 不知出於何種考慮,WPF沒有為MenuItem提供單選的功能。為了在 ...
  • gRPC的結構 在我們搭建gRPC通信系統之前,首先需要知道gRPC的結構組成。 首先,需要一個server(伺服器),它用來接收和處理請求,然後返迴響應。 既然有server,那麼肯定有client(客戶端),client的作用就是向server發送請求,具體就是生成一個請求,然後把它發送到ser ...
  • 區別 OpenId: Authentication :認證 Oauth: Aurhorize :授權 輸入賬號密碼,QQ確認輸入了正確的賬號密碼可以登錄 認證 下麵需要勾選的覆選框(獲取昵稱、頭像、性別) 授權 OpenID 當你需要訪問A網站的時候,A網站要求你輸入你的OpenId,即可跳轉到你的 ...
  • 前言 預計是通過三篇來將清楚asp.net core 3.x中的授權:1、基本概念介紹;2、asp.net core 3.x中授權的預設流程;3、擴展。 在完全沒有概念的情況下無論是看官方文檔還是源碼都暈乎乎的,希望本文能幫到你。不過我也是看源碼結合官方文檔看的,可能有些地方理解不對,所以只作為參考 ...
  • 簡介 基於生產者消費者模式,我們可以開發出線程安全的非同步消息隊列。 知識儲備 什麼是生產者消費者模式? 為了方便理解,我們暫時將它理解為垃圾的產生到結束的過程。 簡單來說,多住戶產生垃圾(生產者)將垃圾投遞到全小區唯一一個垃圾桶(單隊列),環衛將垃圾桶中的垃圾進行處理(消費者)。就是一個生產者消費者 ...
  • 很多時候,需要對類中的方法進行一些測試,來判斷是否能按要求輸出預期的結果。 C#提供了快速創建單元測試的方法,但單元測試不僅速度慢不方便,大量的單元測試還會拖慢項目的啟動速度。 所以決定自己搞個方便的測試用例。 控制台一句話調用。 測試用例.註冊並Print(EnumEx.Name); 結果畫面: ...
  • 常成員函數不能改變數據成員的值,例如定義坐標類Coordinate,成員函數changeX():void Coordinate::changeX(){ x = 10;}雖然changeX()沒有參數,但是它隱含一個參數——this指針:void Coordinate::changeX(Coordin... ...
  • 因為新冠肺炎疫情,診所還沒復工。這是在家用手機敲的,代碼顯示有問題。等復工以後在電腦上改,各位先湊和看吧。 支持向量機(Support Vector Machine, SVM)是一種基於統計學習的模式識別的分類方法,主要用於模式識別。所謂支持向量指的是在分割區域邊緣的訓練樣本點,機是指演算法。就是要找 ...
x