python學習 - 記錄了部分知識點
執行: python test.py
輸出: print(變數); 如print(1+2), print("1+2")
字串可以用單引號也可以用雙引號。單引號包圍的字串可以包含雙引號,雙引號包含的字串可以包含單引號。
r'內容' 表示內容裡面的\不被轉義
'''內容
內容'" 表示可以支援換行的字串
r和'''可以組合使用。
布林值 True False注意大小寫 and is or not 都是運算子.
None空值
除法: int / int = float; 10 // 3 = 1; -10 // 3 = -4. 下取整. -10 % 3 = 2 餘數與符號有關.
Python的整數沒有大小限制,而某些語言的整數根據其儲存長度是有大小限制的,例如Java對32位整數的範圍限制在
-2147483648
-2147483647
。Python的浮點數也沒有大小限制,但是超出一定範圍就直接表示為
inf
(無限大)
編碼: 記憶體中統一使用Unicode編碼. Unicode編碼是2或4位元組表示一個字元. 寫入檔案用UTF-8編碼, UTF-8是1-6位元組, 變長的.
Unicode是用雙引號寫的字串, UTF-8等其它編碼是類似b"內容"的字串
ord('A')將字元轉int(應該是Unicode), chr(25991)將int轉字元(同Unicode)
變成utf-8之後中文字元會佔三個位元組因為前面多了一個\
'Hi, %s' % True 輸出 Hi, True
'Hi, %s is %d years old' % ('xiaoming', 5) 輸出 小明5歲了
[類似C#的輸出方式]print('Hi, {0}, {1:.3f}'.format(True, 5.201314)) 輸出 Hi, True, 5.201
List 有序陣列, 變長. 支援append追加到末尾, insert(1, "元素")插入到第一個位置, pop()刪除末尾, pop(i)刪除第i個元素, a[1] = 'Sarah', 直接替換某元素
list元素可以巢狀
tuple元素, 不可修改.
if <條件判斷1>:
<執行1>
elif <條件判斷2>:
<執行2>
elif <條件判斷3>:
<執行3>
else:
<執行4>
if
判斷條件還可以簡寫,比如寫:
if x:
print('True')
只要x
是非零數值、非空字串、非空list等,就判斷為True
,否則為False
。
包含了基本讀取 轉換為int 和判斷
s = input('birth: ')
birth = int(s)
if birth < 2000:
print('00前')
else:
print('00後')
list(range(100))
# range(100)生成一個range型別的物件, 再用本range構造一個list
Dict(對映)
# 建立和訪問
d = {"Michael": 95, 'Bob': 75, 'Tracy': 85}
print(d['Michael'])
d['ixs']=25
print(d['ixs'])
要避免key不存在的錯誤,有兩種辦法,一是通過in
判斷key是否存在:
if 'Key' in d:
二是通過dict提供的get()
方法,如果key不存在,可以返回None
,或者自己指定的value:
#get和中括號訪問的區別
d.get('Thomas') # 不存在返回None
d.get('Thomas', -1) # 不存在返回-1
dict佔用大量的記憶體空間, 速度快; list隨著元素增加速度變慢, 比較節省空間.
set有序不重複集合, 參見這裡.
強制型別轉換 int('123'), float("12.34"), str(100), bool(1), bool('')=False
Python函式在定義的時候,預設引數L
的值就被計算出來了. 所以如果預設引數指向了變數,後面對此引數的操作都是對同一個變數的操作
變長引數
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
切片(取子數列)是個很常見的操作, 地址>>>
list型別的迭代是很普通的foreach; dict型別的迭代有些特殊, 是
預設情況下,dict迭代的是key。如果要迭代value,可以用
for value in d.values()
,如果要同時迭代key和value,可以用for k, v in d.items()
。
L2 = [x.lower() for x in L if isinstance(x, str)] # 理解為for .. in L: if CONDITION: return ..
把中括號改成小括號就變成迭代器型別了. 迭代器也是Iterable的. 迭代器在訪問元素的時候才計算該元素, 所以佔記憶體小.
高階函式: (在Python 3中好像都是惰性的, 在Python 2中好像不是)
map: 對List的每個元素進行操作, 返回一個List
reduce: 依次對List的前兩個元素進行操作, 返回一個數
filter: 對List的每個元素進行判斷決定是否保留, 返回一個List
sorted: 對List的元素進行排序, 按照一定規則. 返回一個List
返回函式就是函式作為返回值. 這就是惰性函式的實現方式.
- 注意到返回的函式在其定義內部引用了局部變數
args
,所以,當一個函式返回了一個函式後,其內部的區域性變數還被新函式引用, - 返回閉包時牢記一點:返回函式不要引用任何迴圈變數,或者後續會發生變化的變數。
匿名函式 lambda [引數]: 返回值
裝飾器: 重寫(override)函式的一種方法. 定義一個以函式為引數的函式, 並返回一個Wrapper函式 wrapper(*args, **kw)
- 最典型的一行程式碼:
def wrapper(*args, **kw):
偏函式: 為函式的部分引數指定值, 並建立一個指向此函式的變數
在Python中,一個.py檔案就稱之為一個模組(Module)。
被執行的檔案的__name__會被命名為main, 而用Import匯入時則不會
安裝模組:
我們推薦直接使用Anaconda,這是一個基於Python的資料處理和科學計算平臺,它已經內建了許多非常有用的第三方庫,我們裝上Anaconda,就相當於把數十個第三方模組自動安裝好了,非常簡單易用。
我現在搞不清的是類與模組在匯入時的區別,究竟誰才是主要部分
from 檔名 import 類名
面向物件程式設計
這就是動態語言的“鴨子型別”,它並不要求嚴格的繼承體系,一個物件只要“看起來像鴨子,走起路來像鴨子”,那它就可以被看做是鴨子。
Python的“file-like object“就是一種鴨子型別。對真正的檔案物件,它有一個
read()
方法,返回其內容。但是,許多物件,只要有read()
方法,都被視為“file-like object“。許多函式接收的引數就是“file-like object“,你不一定要傳入真正的檔案物件,完全可以傳入任何實現了read()
方法的物件。
繼承一個類用Class Son(Parent): 基類是object注意o小寫
type判斷一個物件的型別 isintance()可以用於繼承關係. 能用type判斷的都能用Isinstance()判斷
has attr(), getattr(obj, 'z', 預設值) 獲取物件資訊
python中的類屬性像靜態成員變數, 屬於類不屬於物件 但是Python的動態語言特性導致給物件.變數賦值時會給物件增加自身的屬性
python的動態語言特性 甚至可以給變數新增方法. 可以用__slot__指定允許的變數
python可以像C#那樣設定getter和setter這個東西是@property 和 @變數.setter
>> 已跳過面向物件高階程式設計中Python的多重繼承後面的內容
>> 繼續單元測試