函數中使用的變量是局部的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) #避免淺拷貝
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
,那麼將執行對應的 expression
。app
在 Python 內置了工廠函數,range
函數將會返回一個序列,總共有三種使用方法
其中 start
將會是序列的起始值,stop
爲結束值,可是不包括該值,相似 數學中的表達 [start, stop)
,左邊爲閉區間,右邊爲開區間。
for i in range(1, 10): print(i)
上述表達將會返回 1-9
全部整數,但不包含 10
若是省略了 start
那麼將從 0 開始,至關於 range(0, stop)
step
表明的爲步長,即相隔的兩個值得差值。從 start
開始,依次增長 step
的值,直至等於或者大於 stop
for i in range(0,13, 5): print(i)
將會輸出 0, 5, 10
。
Python 共內置了 list
、 tuple
、dict
和 set
四種基本集合,每一個集合對象都可以迭代。
在 Python 中集合類型有 list
、 tuple
、dict
和 set
等,若是該集合對象做爲 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
, 程序首先判斷列表是否空,若是不爲空,則 打印出最後一個內容,而後使用切片
操做去掉最後一個元素,並更新列表;如此重複,直至列表爲空。
variable=input()
表示運行後,能夠在屏幕中輸入一個數字,該數字會賦值給自變量。
python
中 print
字符串 要加''
或者""
\n
換行命令
\t
達到 tab
對齊
使用 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() #關閉文件
open('my file.txt','a')
打開類型爲 a
,a
即表示 append。
使用 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= 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. """
若是想要讀取全部行, 並可使用像 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)
[list]
{dict}
函數聲明只須要在須要默認參數的地方用 =
號給定便可, 可是要注意全部的默認參數都不能出如今非默認參數的前面。
若是想要在執行腳本的時候執行一些代碼,好比單元測試,能夠在腳本最後加上單元測試 代碼,可是該腳本做爲一個模塊對外提供功能的時候單元測試代碼也會執行,這些每每咱們不想要的,咱們能夠把這些代碼放入腳本最後:
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:
, 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'