1. 程式人生 > >python學習 - 記錄了部分知識點

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的多重繼承後面的內容

>> 繼續單元測試