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
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...