Python學習筆記

基礎

局部變量與全局變量

函數中使用的變量是局部的html

若是在外面的變量在函數中使用,須要加global關鍵字python

APPLY = 100 # 全局變量
a = None
def fun():
    global a    # 使用以前在全局裏定義的 a
    a = 20      # 如今的 a 是全局變量了
    return a+100

print(APPLE)    # 100
print('a past:', a)  # None
fun()
print('a now:', a)   # 20

深拷貝與淺拷貝

id()能夠顯示內存地址git

=

列表能夠經過引用其元素,改變對象自身(in-place change)。這種對象類型,稱爲可變數據對象(mutable object),詞典也是這樣的數據類型。github

數字和字符串,不能改變對象自己,只能改變引用的指向,稱爲不可變數據對象(immutable object)。元組(tuple),儘管能夠調用引用元素,但不能夠賦值,所以不能改變對象自身,因此也算是immutable object。正則表達式

淺拷貝

當使用淺拷貝時,python只是拷貝了最外圍的對象自己,內部的元素都只是拷貝了一個引用而已。看代碼:express

>>> import copy
>>> a=[1,2,3]
>>> c=copy.copy(a)  #拷貝了a的外圍對象自己,
>>> id(c)
4383658568
>>> print(id(a)==id(c))  #id 改變 爲false
False
>>> c[1]=22222   #此時,我去改變c的第二個值時,a不會被改變。
>>> print(a,c)
[1, 2, 3] [1, 22222, 3] #a值不變,c的第二個值變了,這就是copy和‘==’的不一樣

深拷貝

deepcopy外圍和內部元素都進行了拷貝對象自己,而不是對象的引用。數組

#copy.copy()

>>> a=[1,2,[3,4]]  #第三個值爲列表[3,4],即內部元素
>>> d=copy.copy(a) #淺拷貝a中的[3,4]內部元素的引用,非內部元素對象的自己
>>> id(a)==id(d)
False
>>> id(a[2])==id(d[2])
True
>>> a[2][0]=3333  #改變a中內部原屬列表中的第一個值
>>> d             #這時d中的列表元素也會被改變
[1, 2, [3333, 4]]


#copy.deepcopy()

>>> e=copy.deepcopy(a) #e爲深拷貝了a
>>> a[2][0]=333 #改變a中內部元素列表第一個的值
>>> e
[1, 2, [3333, 4]] #由於時深拷貝,這時e中內部元素[]列表的值不會由於a中的值改變而改變

例子

建立二維數組數據結構

myList = [([0] * 3) for i in range(4)]
#以上會出現淺拷貝,
>>> lists = [[] for i in range(3)]
>>> lists[0].append(3)
>>> lists[1].append(5)
>>> lists[2].append(7)
#避免淺拷貝

if

var = var1 if condition else var2

若是 condition 的值爲 True, 那麼將 var1 的值賦給 var;若是爲 False 則將 var2 的值賦給 var多線程

if condition1:
    true1_expressions
elif condition2:
    true2_expressions
elif condtion3:
    true3_expressions
elif ...
    ...
else:
    else_expressions

若是有多個判斷條件,那能夠經過 elif 語句添加多個判斷條件,一旦某個條件爲 True,那麼將執行對應的 expressionapp

for

range使用

在 Python 內置了工廠函數,range 函數將會返回一個序列,總共有三種使用方法

range(start, stop)

其中 start 將會是序列的起始值,stop爲結束值,可是不包括該值,相似 數學中的表達 [start, stop),左邊爲閉區間,右邊爲開區間。

for i in range(1, 10):
    print(i)

上述表達將會返回 1-9 全部整數,但不包含 10

range(stop)

若是省略了 start 那麼將從 0 開始,至關於 range(0, stop)

range(start, stop, step)

step 表明的爲步長,即相隔的兩個值得差值。從 start 開始,依次增長 step 的值,直至等於或者大於 stop

for i in range(0,13, 5):
    print(i)

將會輸出 0, 5, 10

內置集合

Python 共內置了 listtupledictset 四種基本集合,每一個集合對象都可以迭代。

迭代器和生成器

while

在 Python 中集合類型有 listtupledictset 等,若是該集合對象做爲 while 判斷語句, 若是集合中的元素數量爲 0,那麼將會返回 False, 不然返回 True

a = range(10)
while a:
    print(a[-1])
    a = a[:len(a)-1]

上述程序將會返回 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 程序首先判斷列表是否空,若是不爲空,則 打印出最後一個內容,而後使用切片操做去掉最後一個元素,並更新列表;如此重複,直至列表爲空。

讀取操做和文件操做

input

variable=input() 表示運行後,能夠在屏幕中輸入一個數字,該數字會賦值給自變量。

print

pythonprint 字符串 要加''或者""

\n 換行命令

\t 達到 tab 對齊

open

使用 open 可以打開一個文件, open 的第一個參數爲文件名和路徑 ‘my file.txt’, 第二個參數爲將要以什麼方式打開它, 好比 w 爲可寫方式. 若是計算機沒有找到 ‘my file.txt’ 這個文件, w 方式可以建立一個新的文件, 並命名爲 my file.txt

my_file=open('my file.txt','w')   #用法: open('文件名','形式'), 其中形式有'w':write;'r':read.
my_file.write(text)               #該語句會寫入先前定義好的 text
my_file.close()                   #關閉文件

append

open('my file.txt','a') 打開類型爲 aa 即表示 append。

file.read()

使用 file.read() 可以讀取到文本的全部內容.

file= open('my file.txt','r') 
content=file.read()  
print(content)

""""
This is my first test.
This is the second line.
This the third line.
This is appended file.    
""""

file.readline()

若是想在文本中一行行的讀取文本, 可使用 file.readline(), file.readline() 讀取的內容和你使用的次數有關, 使用第二次的時候, 讀取到的是文本的第二行, 並能夠以此類推:

file= open('my file.txt','r') 
content=file.readline()  # 讀取第一行
print(content)

""""
This is my first test.
""""

second_read_time=file.readline()  # 讀取第二行
print(second_read_time)

"""
This is the second line.
"""

file.readlines()

若是想要讀取全部行, 並可使用像 for 同樣的迭代器迭代這些行結果, 咱們可使用file.readlines(), 將每一行的結果存儲在 list 中, 方便之後迭代。

file= open('my file.txt','r') 
content=file.readlines() # python_list 形式
print(content)

""""
['This is my first test.\n', 'This is the second line.\n', 'This the third line.\n', 'This is appended file.']
""""

# 以後若是使用 for 來迭代輸出:
for item in content:
    print(item)
    
"""
This is my first test.

This is the second line.

This the third line.

This is appended file.
"""

基礎數據結構

tuple

(tuple)

list

[list]

詳細文檔

dict

{dict}

詳細文檔

set

函數

默認參數

函數聲明只須要在須要默認參數的地方用 = 號給定便可, 可是要注意全部的默認參數都不能出如今非默認參數的前面。

自調用

若是想要在執行腳本的時候執行一些代碼,好比單元測試,能夠在腳本最後加上單元測試 代碼,可是該腳本做爲一個模塊對外提供功能的時候單元測試代碼也會執行,這些每每咱們不想要的,咱們能夠把這些代碼放入腳本最後:

if __name__ == '__main__':
    #code_here

若是執行該腳本的時候,該 if 判斷語句將會是 True,那麼內部的代碼將會執行。 若是外部調用該腳本,if 判斷語句則爲 False,內部代碼將不會執行。

可變參數

顧名思義,函數的可變參數是傳入的參數能夠變化的,1個,2個到任意個。固然能夠將這些 參數封裝成一個 list 或者 tuple 傳入,但不夠 pythonic。使用可變參數能夠很好解決該問題,注意可變參數在函數定義不能出如今特定參數默認參數前面,由於可變參數會吞噬掉這些參數。

def report(name, *grades):
    total_grade = 0
    for grade in grades:
        total_grade += grade
    print(name, 'total grade is ', total_grade)

定義了一個函數,傳入一個參數爲 name, 後面的參數 *grades 使用了 * 修飾,代表該參數是一個可變參數,這是一個可迭代的對象。該函數輸入姓名和各科的成績,輸出姓名和總共成績。因此能夠這樣調用函數 report('Mike', 8, 9),輸出的結果爲 Mike total grade is 17, 也能夠這樣調用 report('Mike', 8, 9, 10),輸出的結果爲 Mike total grade is 27

關鍵字參數

關鍵字參數能夠傳入0個或者任意個含參數名的參數,這些參數名在函數定義中並無出現,這些參數在函數內部自動封裝成一個字典(dict).

def portrait(name, **kw):
    print('name is', name)
    for k,v in kw.items():
        print(k, v)

定義了一個函數,傳入一個參數 name, 和關鍵字參數 kw,使用了 ** 修飾。代表該參數是關鍵字參數,一般來說關鍵字參數是放在函數參數列表的最後。若是調用參數portrait('Mike', age=24, country='China', education='bachelor') 輸出:

name is Mike
age 24
country China
education bachelor

經過可變參數和關鍵字參數,任何函數均可以用 universal_func(*args, **kw) 表達。

類變量

在類中,方法外的變量,全部實例對象公用

實例變量

在類方法中,通常在__init__中聲明定義,對象之間獨立

內置類屬性

保護與私有

單下劃線是Protect

雙下劃線是Private

方法的默認值

設置屬性的默認值, 直接在def裏輸入便可,以下:

def __init__(self,name,price,height=10,width=14,weight=16):

自定義模塊

自建一個模塊

這裏和視頻有點差異,我本身寫了另一個模塊,是計算五年複利本息的模塊,代碼以下:模塊寫好後保存在默認文件夾:balance.py

d=float(input('Please enter what is your initial balance: \n'))
p=float(input('Please input what is the interest rate (as a number): \n'))
d=float(d+d*(p/100))
year=1
while year<=5:
    d=float(d+d*p/100)
    print('Your new balance after year:',year,'is',d)
    year=year+1
print('your final year is',d)

調用本身的模塊

新開一個腳本,import balance

import balance

""""
Please enter what is your initial balance:
50000  # 手動輸入個人本金
Please input what is the interest rate (as a number):
2.3  #手動輸入個人銀行利息
Your new balance after year: 1 is 52326.45
Your new balance after year: 2 is 53529.95834999999
Your new balance after year: 3 is 54761.14739204999
Your new balance after year: 4 is 56020.653782067144
Your new balance after year: 5 is 57309.12881905469
your final year is 57309.12881905469
""""

模塊存儲路徑說明

在Mac系統中,下載的python模塊會被存儲到外部路徑site-packages,一樣,咱們本身建的模塊也能夠放到這個路徑,最後不會影響到自建模塊的調用。

錯誤處理

try

輸出錯誤:try:, except ... as ...: 看以下代碼

try:
    file=open('eeee.txt','r')  #會報錯的代碼
except Exception as e:  # 將報錯存儲在 e 中
    print(e)
"""
[Errno 2] No such file or directory: 'eeee.txt'
"""

處理錯誤:會使用到循環語句。首先報錯:沒有這樣的文件No such file or directory. 而後決定是否輸入y, 輸入y之後,系統就會新建一個文件(要用寫入的類型),再次運行後,文件中就會寫入ssss

try:
    file=open('eeee.txt','r+')
except Exception as e:
    print(e)
    response = input('do you want to create a new file:')
    if response=='y':
        file=open('eeee.txt','w')
    else:
        pass
else:
    file.write('ssss')
    file.close()
"""
[Errno 2] No such file or directory: 'eeee.txt'
do you want to create a new file:y

ssss  #eeee.txt中會寫入'ssss'

多進程和多線程

正則表達式

GUI

Reference

  1. 筆記大綱參考莫煩PYTHON
  2. 淺拷貝和深拷貝參考python 引用和對象理解Python-copy()與deepcopy()區別
  3. list和dict參考菜鳥教程
相關文章
相關標籤/搜索