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 必須包含某個請求參數 ...
一周排行
  • 在園子裡面有很多關於各種技術細節的研究文章,都是比較牛逼的框架研究;但是一直沒有看到關於怎麼樣提高開發效率的文章,大多提高開發效率的文章都是關於自動化等方面的輔助工具類型的,而不是開發中的一些小技巧;今天從編碼規範、編碼技巧、開發思想、設計模式等各方面的經驗來分享如何提高開發效率。 ...
  • 前言 隨著近些年微服務的流行,有越來越多的開發者和團隊所採納和使用,它的確提供了很多的優勢也解決了很多的問題,但是我們也知道也並不是銀彈,提供優勢的同時它也給我們的開發人員和團隊也帶來了很多的挑戰。 為了迎接或者採用這些新技術,開發團隊需要更加註重一些流程或工具的使用,這樣才能更好的適應這些新技術所 ...
  • 本文是本系列的完結篇。本系列前面的文章: 邏輯式編程語言極簡實現(使用C#) - 1. 邏輯式編程語言介紹 邏輯式編程語言極簡實現(使用C#) - 2. 一道邏輯題:誰是凶手 邏輯式編程語言極簡實現(使用C#) - 3. 運行原理 下午,吃飽飯的老明和小皮,各拿著一杯剛買的咖啡回到會議室,開始了邏輯 ...
  • 微服務之間的通信之gRPC 介紹 gRPC是一種與語言無關的高性能遠程過程調用 (RPC) 框架,gRPC是Google發佈的基於HTTP 2.0傳輸層協議承載的高性能開源軟體框架,提供了支持多種編程語言的、對網路設備進行配置和納管的方法。由於是開源框架,通信的雙方可以進行二次開發,所以客戶端和服務 ...
  • 一、TLS 線程本地存儲(Thread Local Storage),字面意思就是專屬某個線程的存儲空間。變數大體上分為全局變數和局部變數,一個進程中的所有線程共用地址空間,這個地址空間被劃分為幾個固有的區域,比如堆棧區,全局變數區等,全局變數存儲在全局變數區,虛擬地址固定;局部變數存儲在堆棧區,虛... ...
  • private:私有成員,在類的內部才可以訪問。 protected:保護成員,該類內部和繼承類中可以訪問。 public:公共成員,完全公開,沒有訪問限制。 internal:當前程式集內可以訪問。 ...
  • 前言 上一篇【.Net Core微服務入門全紀錄(六)——EventBus-事件匯流排】中使用CAP完成了一個簡單的Eventbus,實現了服務之間的解耦和非同步調用,並且做到數據的最終一致性。這一篇將使用IdentityServer4來搭建一個鑒權中心,來完成授權認證相關的功能。 IdentitySe ...
  • using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System. ...
  • 從今天起,我將製作一個電影推薦項目,在此寫下博客,記錄每天的成果。 其實,從我發佈 C# 爬取貓眼電影數據 這篇博客後, 我就已經開始製作電影推薦項目了,今天寫下這篇博客,也是因為項目進度已經完成50%了,我就想在這一階段停一下,回顧之前學到的知識。 一、主要為手機端 考慮到項目要有實用性,我選擇了 ...
  • 一、實現Runnable介面 public class RunnableDemo implements Runnable { public void run() { try { Thread.sleep(100); } catch (InterruptedException e) { e.print ...