流程python學習筆記:第一章

来源:http://www.cnblogs.com/zhanghongfeng/archive/2017/06/14/7011435.html
-Advertisement-
Play Games

這一章中作者簡要的介紹了python數據模型,主要是python的一些特殊方法。比如__len__, __getitem__. 並用一個紙牌的程式來講解了這些方法 首先介紹下Tuple和nametuple的區別: Nametuple是類似於元組的數據類型。除了能夠用索引來訪問數據,還支持用方便的屬性 ...


這一章中作者簡要的介紹了python數據模型,主要是python的一些特殊方法。比如__len__, __getitem__. 並用一個紙牌的程式來講解了這些方法

 

首先介紹下Tuple和nametuple的區別:

Nametuple是類似於元組的數據類型。除了能夠用索引來訪問數據,還支持用方便的屬性名來訪問數據。

傳統的元組訪問如下。對每個元素的訪問都必須通過索引來找到。這種找法很不直觀

tup1=('abc','def','ghi')
print tup1[1]

使用nametuple來構造:

tup2=namedtuple('tuple2',['name','age','height'])
t1=tup2('zhf','33','175')
print t1
print t1.age
print t1.height
print t1.name
得到結果如下,namedtupel中tuple2是類型名,name,age,height是屬性名字
從上面的訪問可以看到,直接用t1.age的方法訪問更加直觀。當然也可以用索引比如t1[0]的方法來訪問

 

namedtupe1也支持迭代訪問:

for t in t1:
    print t
和元組一樣,namedtupel中的元素也是不可變更的。如果執行t1.age+=1。將會提示無法設置元素

Traceback (most recent call last):

  File "E:/py_prj/fluent_py.py", line 17, in <module>

    t1.age+=1

AttributeError: can't set attribute

 

下麵來看下書中的紙牌例子,代碼如下:

from collections import namedtuple

Card=namedtuple('Card',['rank','suit'])

class FrenchDeck:
    ranks=[str(n) for n in range(2,11)] + list('JQKA')
    suits='spades diamonds clubs hearts'.split()
    def __init__(self):
        self._cards=[Card(rank,suit) for suit in self.suits
for rank in self.ranks]
    def __len__(self):
        return len(self._cards)
    def __getitem__(self, position):
        return self._cards[position]

if __name__=='__main__':
    deck=FrenchDeck()
    print len(deck)
    print deck[1]

 

首先定義了的紙牌元組Card, rank代表紙牌數字,suit代表紙牌花色。然後在FrenchDeck首先定義了ranks和suit的具體指。在__init__中對self._cards進行初始化。

__len__反饋self._cards的長度。__getitem__反饋具體的紙牌值。

結果如下,紙牌的長度為52,其中deck[1]為Card(rank=’3’,suit=’spades’)

可以看到len(deck)其實調用的是__len__方法。deck[1]調用的是__getitem__

由於有了__getitem__方法,還可以進行迭代訪問,如下:

for d in deck:
    print d

 

既然是可迭代的,那麼我們可以模擬隨機發牌的機制。

from random import choice
print choice(deck)

得到結果:

Card(rank='9', suit='hearts')

 

接下來看另外一個例子,關於向量運算的。比如有向量1 vector1(1,2),向量2 vector2(3,4)。那麼vector1+vector2的結果應該是(4,6)。Vector1和vector2都是向量,如何實現運算呢。方法是__add__,__mul__

代碼如下:

class vector:
    def __init__(self,x=0,y=0):
        self.x=x
        self.y=y
    def __repr__(self):
        return 'Vector(%r,%r)' % (self.x,self.y)
    def __abs__(self):
        return hypot(self.x,self.y)
    def __bool__(self):
        return bool(abs(self))
    def __add__(self,other):
        x=self.x+other.x
        y=self.y+other.y
        return vector(x,y)
    def __mul__(self, scalar):
        return vector(self.x*scalar,self.y*scalar)
if __name__=='__main__':
    v1=vector(1,2)
    v2=vector(2,3)
    print v1+v2
    print abs(v1)
    print v1*3

運算結果如下:

在這裡__add__,__mul__,__abs__分別實現了向量加法,乘法,以及求模的運算。

值得一提的是__repr__的方法。這個方法是在需要列印對象的時候調用。例如print vector(1,2)的時候得到vector(1,2). 否則就是表示對象的字元串:<Vector object at 0x0000>.這個__repr__和__str__的作用是類似的

 

 



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

-Advertisement-
Play Games
更多相關文章
  • Java反射機制 前言 更多文章請一步本人博客 "https://chenjiabing666.github.io/" "網頁版的jdk的API" "離線版API" 什麼是反射機制 反射是java語言的一個特性,它允程式在運行時(註意不是編譯的時候)來進行自我檢查並且對內部的成員進行操作。例如它允許 ...
  • 封裝:是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方法。 好處: 1.隱藏實現細節,提供公共的訪問方式。 2.提高了代碼的復用性。 3.提高了安全性。 封裝原則: 1.將不需要對外提供的內容都隱藏起來。 2.把屬性隱藏,提供公共方法對其訪問。 this:是當前類的對象引用。即:它就代表當前類的一 ...
  • JAVA WEB 亂碼問題解析 亂碼原因 在Java Web開發過程中,經常遇到亂碼的問題,造成亂碼的原因,概括起來就是對字元編碼和解碼的方式不匹配。 既然亂碼的原因是字元編碼與解碼的方式不匹配,那麼為什麼我們一定要對字元進行編碼,不編碼可不可以呢?這是因為在電腦中存儲數據的基本單位是1個位元組,即 ...
  • 介面 (1)當抽象類中的方法都是抽象的時候,java就提供了一種新的表現形式:介面 ,介面是功能的集合 介面不能創建對象 (2)格式 父介面:public interface Tnter{ } 子類:public class interImp implements Itner{ } 介面的使用 1. ...
  • 1. os.path.driname(path):返迴路徑的上一級路徑字元串。 >>> os.path.dirname('D:\Games') 'D:\\' >>> 2. os.path.basename(path):返迴路徑的最後一級目錄名(文件夾名)或文件名(全稱)。 >>> os.path.b ...
  • 早在去年八月份PowerShell就開始開源跨平臺了,但是一直沒有去嘗試,叫做PowerShell Core。 這裡打算簡單介紹一下如何安裝和簡單使用,為還不知道PowerShell Core on Ubuntu的同學們提供一點小小的入門幫助,謝謝大家支持~ PowerShell Core是由Mic ...
  • 匿名對象:就是沒有名字的對象 new student(); 匿名對象的應用場景: 1.僅僅調用一次對象中的方法 註意:調用多次的時候,不合適 匿名對象調用方法有什麼方法? 匿名對象調用完畢就是垃圾,可以被垃圾回收期回收。 2.匿名對象可以作為實際參數傳遞。 ...
  • 開發人員使用Jersey和CXF等工具可以方便地編寫java client,從而提供REST或SOAP服務;開發人員也可以基於Apache HC等http傳輸工具包編寫自己的java http client;而Feign的關註點在於簡化開發人員使用工具包的複雜度,以最少的代碼編寫代碼從而提供java... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...