大牛部落格滴python3總結
前言:
python編寫非常簡潔
第一行註釋是為了告訴Linux/OS X系統,這是一個Python可執行程式,Windows系統會忽略這個註釋;
CPython用>>>
作為提示符,而IPython用In [序號]:
作為提示符。
print()
函式也可以接受多個字串,用逗號“,”隔開,就可以連成一串輸出 輸入:
/
除法計算結果是浮點數,即使是兩個整數恰好整除,結果也是浮點數,
還有一種除法是//
,稱為地板除,兩個整數的除法仍然是整數
轉義字元\
可以轉義很多字元,比如\n
表示換行,\t
表示製表符,字元\
本身也要轉義,所以\\
表示的字元就是\
,
統一成Unicode編碼,亂碼問題從此消失了,本著節約的精神,又出現了把Unicode編碼轉化為“可變長編碼”的UTF-8
字元 | ASCII | Unicode | UTF-8 |
---|---|---|---|
A | 01000001 | 00000000 01000001 | 01000001 |
中 | x | 01001110 00101101 | 11100100 10111000 10101101 |
由於Python的字串型別是str
,在記憶體中以Unicode表示,一個字元對應若干個位元組。如果要在網路上傳輸,或者儲存到磁碟上,就需要把str
變為以位元組為單位的
bytes
。浮點數也就是小數 用\n寫在一行裡不好閱讀,為了簡化,Python允許用'''...'''的格式表示多行內容
因為tuple不可變,所以程式碼更安全。如果可能,能用tuple代替list就儘量用tuple。
Python提供一個range()
函式,可以生成一個整數序列,再通過list()
函式可以轉換為list。比如range(5)
生成的序列是從0開始小於5的整數
列表 list=['a','b','e'] 用len()
函式可以獲得list元素的個數
元祖 class=('a','b','e') 不能更改
input()返回的資料型別是str,str不能直接和整數比較,必須先把str轉換成整數。Python提供了int()函式來完成這件事情
要特別注意,不要濫用break
和continue
語句。break
和continue
會造成程式碼執行邏輯分叉過多,容易出錯。大多數迴圈並不需要用到break
和continue
語句,上面的兩個例子,都可以通過改寫迴圈條件或者修改迴圈邏輯,去掉break
和continue
語句。
list或tuple的部分元素是非常常見的操作 切片
給定一個list或tuple,我們可以通過for
迴圈來遍歷這個list或tuple,這種遍歷我們稱為迭代(Iteration)
我們建立了一個generator後,基本上永遠不會呼叫next()
,而是通過for
迴圈來迭代它
生成器:generator
print [x * (x + 1) for x in range(1, 100, 2)]
[x * x for x in range(1, 11) if x % 2 == 0] 條件過濾
>>> [m + n for m in 'ABC' for n in '123']
['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']
凡是可作用於for
迴圈的物件都是Iterable
型別;
凡是可作用於next()
函式的物件都是Iterator
型別,它們表示一個惰性計算的序列;
集合資料型別如list
、dict
、str
等是Iterable
但不是Iterator
,不過可以通過iter()
函式獲得一個Iterator
物件。
Python的for
迴圈本質上就是通過不斷呼叫next()
函式實現的
和list比較,dict有以下幾個特點:
- 查詢和插入的速度極快,不會隨著key的增加而變慢;
- 需要佔用大量的記憶體,記憶體浪費多。
所以,dict是用空間來換取時間的一種方法。
函式分為內建函式和自定義的函式(函式使用的原則:先定義,再呼叫)
預設引數可以簡化函式的呼叫。設定預設引數時,有幾點要注意:
一是必選引數在前,預設引數在後,否則Python的直譯器會報錯(思考一下為什麼預設引數不能放在必選引數前面);
二是如何設定預設引數。
我們可以把年齡和城市設為預設引數:
def enroll(name, gender, age=6, city='Chongqing'):
print('name:', name)
print('gender:', gender)
print('age:', age)
print('city:', city)
這樣,大多數學生註冊時不需要提供年齡和城市,只提供必須的兩個引數:
Python函式在定義的時候,預設引數L
的值就被計算出來了,即[]
,因為預設引數L
也是一個變數,它指向物件[]
,每次呼叫該函式,如果改變了L
的內容,則下次呼叫時,預設引數的內容就變了,不再是函式定義時的[]
了。
定義預設引數要牢記一點:預設引數必須指向不變物件!
要修改上面的例子,我們可以用None
這個不變物件來實現:
def add_end(L=None):
if L is None:
L = []
L.append('END')
return L
現在,無論呼叫多少次,都不會有問題:
生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
可以用list(range(1, 11))
[x * x for x in range(1, 11)]
在Python中,這種一邊迴圈一邊計算的機制,稱為生成器:generator。
g = (x * x for x in range(10))
一個最簡單的高階函式:
def add(x, y, f):
return f(x) + f(y)
print(add(-5, 6, abs))
把函式作為引數傳入,這樣的函式稱為高階函式,函數語言程式設計就是指這種高度抽象的程式設計正規化。
Python內建了map()
和reduce()
函式。
>>> def f(x):
... return x * x
...
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']
Python內建的filter()
函式用於過濾序列。
>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
['about', 'bob', 'Credit', 'Zoo']
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']
>>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
[1, 4, 9, 16, 25, 36, 49, 64, 81]
函式物件有一個__name__
屬性,可以拿到函式的名字:
在函式呼叫前後自動列印日誌,但又不希望修改now()
函式的定義,這種在程式碼執行期間動態增加功能的方式,稱之為“裝飾器”(Decorator)。
>>> int('12345', base=8)
5349
>>> int('12345', 16)
74565
現在,假設我們的abc
和xyz
這兩個模組名字與其他模組衝突了,於是我們可以通過包來組織模組,避免衝突。方法是選擇一個頂層包名,比如mycompany
,按照如下目錄存放:
mycompany
├─ __init__.py
├─ abc.py
└─ xyz.py
引入了包以後,只要頂層的包名不與別人衝突,那所有模組都不會與別人衝突。現在,abc.py
模組的名字就變成了mycompany.abc
,類似的,xyz.py
的模組名變成了mycompany.xyz
。
請注意,每一個包目錄下面都會有一個__init__.py
的檔案,這個檔案是必須存在的,否則,Python就把這個目錄當成普通目錄,而不是一個包。__init__.py
可以是空檔案,也可以有Python程式碼,因為__init__.py
本身就是一個模組,而它的模組名就是mycompany
。
建立自己的模組時,要注意:
- 模組名要遵循Python變數命名規範,不要使用中文、特殊字元;
- 模組名不要和系統模組名衝突,最好先檢視系統是否已存在該模組,檢查方法是在Python互動環境執行
import abc
,若成功則說明系統存在此模組。
面向物件
一個例子來說明面向過程和麵向物件在程式流程上的不同之處。
假設我們要處理學生的成績表,為了表示一個學生的成績,面向過程的程式可以用一個dict表示:
std1 = { 'name': 'Michael', 'score': 98 }
std2 = { 'name': 'Bob', 'score': 81 }
而處理學生成績可以通過函式實現,比如列印學生的成績:
def print_score(std):
print('%s: %s' % (std['name'], std['score']))
如果採用面向物件的程式設計思想,我們首選思考的不是程式的執行流程,而是Student
這種資料型別應該被視為一個物件,這個物件擁有name
和score
這兩個屬性(Property)。如果要列印一個學生的成績,首先必須創建出這個學生對應的物件,然後,給物件發一個print_score
訊息,讓物件自己把自己的資料打印出來。
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print('%s: %s' % (self.name, self.score))
給物件發訊息實際上就是呼叫物件對應的關聯函式,我們稱之為物件的方法(Method)。面向物件的程式寫出來就像這樣:
bart = Student('Bart Simpson', 59)
lisa = Student('Lisa Simpson', 87)
bart.print_score()
lisa.print_score()
所以,面向物件的設計思想是抽象出Class,根據Class建立Instance。
注意:特殊方法“__init__”前後分別有兩個下劃線!!!
我們來判斷物件型別,使用type()
函式:基本型別都可以用type()
判斷:
為了限制score的範圍,可以通過一個set_score()
方法來設定成績,再通過一個get_score()
來獲取成績,這樣,在set_score()
方法裡,就可以檢查引數:
錯誤處理:
try:
print('try...')
r = 10 / int('2')
print('result:', r)
except ValueError as e:
print('ValueError:', e)
except ZeroDivisionError as e:
print('ZeroDivisionError:', e)
else:
print('no error!')
finally:
print('finally...')
print('END')
SQLite是一種嵌入式資料庫,它的資料庫就是一個檔案。由於SQLite本身是C寫的,而且體積很小,所以,經常被整合到各種應用程式中,甚至在iOS和Android的App中都可以整合。
在處理一些不規範的第三方網頁的時候。雖然Python提供了Unicode表示的str
和bytes
兩種資料型別,並且可以通過encode()
和decode()
方法轉換,但是,在不知道編碼的情況下,對bytes
做decode()
不好做。
使用chardet檢測編碼非常容易,chardet支援檢測中文、日文、韓文等多種語言。
virtualenv為應用提供了隔離的Python執行環境,解決了不同應用間多版本的衝突問題。
什麼是閉包?
def foo():
m=3
n=5
def bar():
a=4
return m+n+a #引用外部變數
return bar
>>>bar = foo() #外部呼叫
>>>bar() #接著內部呼叫
12
---------------------------------------
說明:
bar在foo函式的程式碼塊中定義。我們稱bar是foo的內部函式。
在bar的區域性作用域中可以直接訪問foo區域性作用域中定義的m、n變數。
簡單的說,這種內部函式可以使用外部函式變數的行為,就叫閉包。
裝飾器
裝飾器就是閉包函式的一種應用場景
1、為何要用裝飾器
開放封閉原則:對修改封閉,對擴充套件開放
2、什麼是裝飾器
就是裝飾其他函式。
強調裝飾器的原則:
- 不修改被裝飾物件的原始碼
- 不修改被裝飾物件的呼叫方式
裝飾器的目標:在遵循1和2的前提下,為被裝飾物件新增上新功能
4、裝飾器語法
#被裝飾函式的正上方,單獨一行,就是先執行裝飾器的,再執行自己的
@deco1
@deco2
@deco3
def foo():
pass
foo=deco1(deco2(deco3(foo)))
相關推薦
大牛部落格滴python3總結
前言:python編寫非常簡潔 第一行註釋是為了告訴Linux/OS X系統,這是一個Python可執行程式,Windows系統會忽略這個註釋; CPython用>>>作為提示符,而IPython用In [序號]:作為提示符。 print()函式也
推薦6個國內技術大牛部落格,全棧工程師修行的祕籍!(建議收藏)
學習PHP語言、JavaScript語言、Python語言及前端的知識點,光是自己學習還是不夠的,我們還要借鑑大牛們的程式設計思路,瞭解程式設計的技巧和方法,這樣才能事半功倍。 今天就為大家推薦我認為比較不錯的6個技術大牛部落格,大家有興趣可以關注一下,看看大牛們的程式設計思路,學習他們思考問題
Android經典的大牛部落格推薦
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
C++—揭祕大牛部落格一些不同凡人的寫法
天下之大,無奇不有,C++也是這樣,今天小編來盤點幾個有意思的程式碼,看看你認識幾個?以後見到之後千萬別裝不認識。 一、基礎篇——不一樣的輸出 1.cerr 輸出 cout和cerr究竟有什麼不同?這也是小編以前很茫然的一部分; cout對應於標準輸出流,預設情況下是顯示器
【CSDN大牛部落格排行榜v0.1 按官方排名】
略微整理了下目前收集的部落格排名 排序依據僅僅依靠部落格頁面上顯示的排名,與其他因素無關 隨著時間變化,排名持續更新,本表排名不保證時效性 v0.1截止20181205-12-15 rank<=1000 Rank: 1 stpeace Rank: 2 php
iOS開發 非常全的三方庫、外掛、大牛部落格等等
UI 下拉重新整理 MJRefresh- 僅需一行程式碼就可以為UITableView或者CollectionView加上下拉重新整理或者上拉重新整理功能。可以自定義上下拉重新整理的文字說明。具體使用看“使用方法”。 (國人寫) XHRefreshC
深度學習FPGA實現基礎知識6(Deep Learning(深度學習)學習資料大全及CSDN大牛部落格推薦)
Deep Learning(深度學習) Machine Learning(機器學習): Computer Vision(計算機視覺): OpenCV相關: 2012年7月4日隨著opencv2.4.2版本的釋出,opencv更
【OpenCV】大牛部落格
OpenCV學習筆記 作者:CSDN 數量:55篇博文 網址:http://blog.csdn.net/column/details/opencv-manual.html 部分OpenCV的函
Android平臺大牛部落格
NO.1:我的嵌入式人生 ——Android平臺下專案經驗豐富,包括camera、sensors、PM等 NO.2:老羅的Android之旅 ——羅昇陽,還用解釋
IT大牛部落格
# 張友邦的部落格 http://blog.csdn.net/spanzhang 很不錯的web高手 * http://www.cnblogs.com/panjun-Donet/archive/2008/10/16/1312332.html 0:
資料結構與演算法——大牛部落格
1、http://www.cnblogs.com/skywang12345/ 2、http://blog.csdn.net/heroacool/article/details/510148243、https://www.61mon.com/index.php/archi
十年Python大牛花了三天總結出來的python基礎知識實例,超詳細!
python 編程 大全 文檔 詳細 1、在Python 語言中,對象是通過引用傳遞的。2、多元賦值,其實就是元組賦值3、編寫模塊4、時刻記住一個事實5、動態類型6、變量在內存中是通過引用計數來跟蹤管理的7、異常處理8、所有的Python 對像都擁有三個特性9、布爾值10、對象身份比較11
雲風大神部落格中的Lua實現面向物件
在 Lua 中實現面向物件 在 pil 中,lua 的作者推薦了一種方案來實現 OO,比較簡潔,但是我依然覺得有些繁瑣。 這裡給出一種更漂亮一點的解決方案:為了貼程式碼和修改方便,我把它貼在了 wiki 上。 Lua 中實現面向物件 在這個方案中,只定義了一個函式
大資料部落格學習
書籤選單 最近使用的標籤 Mozilla Firefox 幫助和教程 自定義 Firefox 加入進來 關於我們 Ubuntu and Free Software links Ubuntu Ubuntu Wiki (community-edited website)
部落格三--學期總結
Java期末學期總結 一學期的Java課堂已經接近尾聲,通過這學期對Java的學習,我學習到了很多知識點,比如:基本型別與資料,運算子
派大星部落格的美化之路
主題 SimpleMemory 更改背景顏色、標題、子標題 css #blogTitle h1 a { color: #515151; background: #EEE url(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAA
【部落格園2018總結帖】21天,在Github上獲取 6300 star
大家好,我是程式設計師小吳。12月初我在GitHub上上傳了一個倉庫,到現在為止獲取了 6300 star,下面和大家聊聊關於專案啟動的初衷、面臨的一些困難和未來的計劃。 「LeetcodeAnimation」的萌芽? 在刷Leetcode的過程中,遇到很多有意思和有難度的題目,有時候自己能做出來,有時候
iOS元件化思路-大神部落格研讀和思考
一、大神部落格研讀 隨著應用需求逐步迭代,應用的程式碼體積將會越來越大,為了更好的管理應用工程,我們開始藉助CocoaPods版本管理工具對原有應用工程進行拆分。但是僅僅完成程式碼拆分還不足以解決業務之間的程式碼耦合,為了更好的讓拆分出去的業務工程能夠獨立執行,必須進行元件拆分並且實現元件服務化。 下
基於node.js/jquery/bootstrap的部落格系統開發---總結
1 express Express 是一個基於 Node.js 平臺的極簡、靈活的 web 應用開發框架,它提供一系列強大的特性,幫助你建立各種 Web 和移動裝置應用。 var express = require('express'); var app =