本筆記是完全與Java和C++語言進行對比,總結(jié)Python3與其不同的地方。這樣達到一個快速學(xué)習(xí)與復(fù)習(xí)的效果气筋。只需要記住不同之處,就可以熟練愉快的敲Python3代碼了旋圆。
開發(fā)環(huán)境的搭建
- 下載有兩種方式(建議第二種)
- 官網(wǎng)下載
- 第三方下載(提供了包管理與環(huán)境管理的功能宠默,可以很方便地解決多版本python并存、切換以及各種第三方包安裝問題灵巧。)
-
命令行使用Python
當你安裝成功了搀矫,并且已經(jīng)將Python安裝目錄中的python.exe所在目錄配置好環(huán)境變量后,打開CMD刻肄,輸入python瓤球,就可以在>>>符號后敲相應(yīng)的代碼,結(jié)果如下圖:
安裝Python的ide工具
這里推薦使用PyCharm肄方,下載地址
下載好后安裝冰垄,至于如何使用,請參考這個系列的博客(看不到我)
基礎(chǔ)
Python的注釋都是以#為開頭权她,并且Python使用縮進來組織代碼塊虹茶,請務(wù)必遵守約定俗成的習(xí)慣,堅持使用4個空格的縮進隅要。如下面代碼
is_ture = False;
if is_ture:
print("哈哈哈蝴罪,嘎嘎嘎,呱呱呱")
else:
print("天王蓋地虎小雞燉蘑菇")
輸入與輸出
- print()輸出
print("你的名字是:")
print()函數(shù)也可以接受多個字符串步清,用逗號“,”隔開要门,就可以連成一串輸出虏肾,記住每個“,”為一個空格分開,并且這個函數(shù)接收大部分類型為參數(shù)欢搜,如果字符串內(nèi)部有很多換行封豪,用\n寫在一行里不好閱讀,為了簡化炒瘟,Python允許用'''...'''的格式表示多行內(nèi)容吹埠。
print("你的名字是:","吳彥祖")
那么如何輸出格式化的字符串?在Python中疮装,采用的格式化方式和C語言是一致的缘琅,用%實現(xiàn),舉例如下:
print("你好廓推,%s"%"世界")
print("再見刷袍,%s go die %s 回來吧"%("小學(xué)生","哈哈哈"))
你好,世界
再見樊展,小學(xué)生 go die 哈哈哈 回來吧
你可能猜到了呻纹,%運算符就是用來格式化字符串的。在字符串內(nèi)部滚局,%s表示用字符串替換居暖,%d表示用整數(shù)替換顽频,有幾個%?占位符藤肢,后面就跟幾個變量或者值,順序要對應(yīng)好糯景。如果只有一個%?嘁圈,括號可以省略。如果你不太確定應(yīng)該用什么蟀淮,%s永遠起作用最住,它會把任何數(shù)據(jù)類型轉(zhuǎn)換為字符串。
有些時候怠惶,字符串里面的%是一個普通字符怎么辦涨缚?這個時候就需要轉(zhuǎn)義,用%%來表示一個%:
print('growth rate: %d %%' % 7)
growth rate: 7 %
另一種格式化字符串的方法是使用字符串的format()方法策治,它會用傳入的參數(shù)依次替換字符串內(nèi)的占位符{0}脓魏、{1}……,不過這種方式寫起來比%要麻煩得多:
print('Hello, {0}, 成績提升了 {1:.1f}%'.format('小明', 17.125))
Hello, 小明, 成績提升了 17.1%
- input()輸入
name = input()
print("你的名字是...fwfwg")
來看看下面這個特殊的例子:
age = input("your age is:")
# input()返回的數(shù)據(jù)類型是str通惫,str不能直接和整數(shù)比較茂翔,必須先把str轉(zhuǎn)換成整數(shù)。Python提供了int()函數(shù)來完成這件事情
# 當然有int函數(shù)履腋,也有float函數(shù)珊燎,這就要看輸入的是整型還是浮點型了
birth = int(age)
if birth>=18:
print("成年了")
else:
print("未成年")
這里有點就是數(shù)據(jù)類型的轉(zhuǎn)換函數(shù)也是int()函數(shù)惭嚣,將一個別的類型的值傳入里面,就會轉(zhuǎn)換為int類型悔政。但是注意晚吞,轉(zhuǎn)換規(guī)則還是和Java一樣的。比如float轉(zhuǎn)成int是會報錯的谋国≡乜螅‘a(chǎn)’轉(zhuǎn)成int也是會報錯的。
數(shù)據(jù)類型與變量
- 布爾值
布爾值和布爾代數(shù)的表示完全一致烹卒,一個布爾值只有True闷盔、False兩種值,要么是True旅急,要么是False
- 運算符
在java中的 |,&,! 在Python中對應(yīng)and逢勾、or和not運算
- 空值
空值是Python里一個特殊的值,用None表示藐吮。None不能理解為0溺拱,因為0是有意義的,而None是一個特殊的空值
- 變量
變量在程序中就是用一個變量名表示了谣辞,變量名必須是大小寫英文迫摔、數(shù)字和_的組合,且不能用數(shù)字開頭
a = 2
a = "123"
a = True
同一個變量可以反復(fù)賦值泥从,而且可以是不同類型的變量句占,這種變量本身類型不固定的語言稱之為動態(tài)語言,與之對應(yīng)的是靜態(tài)語言躯嫉。靜態(tài)語言在定義變量時必須指定變量類型纱烘,如果賦值的時候類型不匹配,就會報錯祈餐。例如Java是靜態(tài)語言
- 常量
所謂常量就是不能變的變量擂啥,比如常用的數(shù)學(xué)常數(shù)π就是一個常量。在Python中帆阳,通常用全部大寫的變量名表示常量:
IP = 124568522
但事實上IP 仍然是一個變量哺壶,Python根本沒有任何機制保證IP 不會被改變,所以蜒谤,用全部大寫的變量名表示常量只是一個習(xí)慣上的用法山宾,如果你一定要改變變量IP 的值,也沒人能攔住你芭逝。
- 除法的區(qū)別
在Python中淆两,有兩種除法
>>> 10 / 3
3.3333333333333335
/除法計算結(jié)果是浮點數(shù)橄仆,即使是兩個整數(shù)恰好整除,結(jié)果也是浮點數(shù)
>>> 9 / 3
3.0
Python還提供一個余數(shù)運算权纤,可以得到兩個整數(shù)相除的余數(shù)
>>> 10 % 3
1
- 字符串
在最新的Python 3版本中,字符串是以Unicode編碼的,也就是說,Python的字符串支持多語言,對于單個字符的編碼切厘,Python提供了ord()函數(shù)獲取字符的整數(shù)表示,chr()函數(shù)把編碼轉(zhuǎn)換為對應(yīng)的字符:
print("ord:",ord('B'))
print("chr:",chr(25991))
ord: 66
chr: 文
- bytes類型
Python對bytes類型的數(shù)據(jù)用帶b前綴的單引號或雙引號表示懊缺,要注意區(qū)分'ABC'和b'ABC'疫稿,前者是str,后者雖然內(nèi)容顯示得和前者一樣鹃两,但bytes的每個字符都只占用一個字節(jié)遗座。
x = b'ABC'
以Unicode表示的str通過encode()方法可以編碼為指定的bytes,例如:
encode = 'ABCD'.encode('ascii')
encode = '中國'.encode('GB2312')
encode = '中國'.encode('ascii')
print(encode)
純英文的str可以用ASCII編碼為bytes俊扳,內(nèi)容是一樣的途蒋,含有中文的str可以用UTF-8編碼為bytes。含有中文的str無法用ASCII編碼馋记,因為中文編碼的范圍超過了ASCII編碼的范圍号坡,Python會報錯,在bytes中梯醒,無法顯示為ASCII字符的字節(jié)宽堆,用\x##顯示。
反過來茸习,如果我們從網(wǎng)絡(luò)或磁盤上讀取了字節(jié)流畜隶,那么讀到的數(shù)據(jù)就是bytes。要把bytes變?yōu)閟tr逮光,就需要用decode()方法:
decode = b'ABCD'.decode('ascii')
print(decode)
ABCD
如果bytes中包含無法解碼的字節(jié)代箭,decode()方法會報錯:
decode = b'\xe4\xb8\xad\xff'.decode('utf-8')
print(decode)
報錯:
Traceback (most recent call last):
File "F:/Pythonproject/test_dir/__init__.py", line 1, in <module>
decode = b'\xe4\xb8\xad\xff'.decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte
如果bytes中只有一小部分無效的字節(jié),可以傳入errors='ignore'忽略錯誤的字節(jié):
decode = b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
print(decode)
要計算str包含多少個字符涕刚,可以用len()函數(shù):
print(len("wfowbogqwbvg"))
print(len(b'avegegg'))
print(len('中國'.encode('utf-8')))
12
7
6
可見,1個中文字符經(jīng)過UTF-8編碼后通常會占用3個字節(jié)乙帮,而1個英文字符只占用1個字節(jié)杜漠。
在操作字符串時,我們經(jīng)常遇到str和bytes的互相轉(zhuǎn)換察净。為了避免亂碼問題驾茴,應(yīng)當始終堅持使用UTF-8編碼對str和bytes進行轉(zhuǎn)換。
由于Python源代碼也是一個文本文件氢卡,所以锈至,當你的源代碼中包含中文的時候,在保存源代碼時译秦,就需要務(wù)必指定保存為UTF-8編碼峡捡。當Python解釋器讀取源代碼時击碗,為了讓它按UTF-8編碼讀取,我們通常在文件開頭寫上這兩行:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
第一行注釋是為了告訴Linux/OS X系統(tǒng)们拙,這是一個Python可執(zhí)行程序稍途,Windows系統(tǒng)會忽略這個注釋;
第二行注釋是為了告訴Python解釋器砚婆,按照UTF-8編碼讀取源代碼械拍,否則,你在源代碼中寫的中文輸出可能會有亂碼装盯。
list和tuple
- list
Python內(nèi)置的一種數(shù)據(jù)類型是列表:list坷虑。list是一種有序的集合,可以隨時添加和刪除其中的元素埂奈。說白了它其實就是可變長度的數(shù)組猖吴!同樣可以用len()函數(shù)獲取長度。記住這個的用法挥转,就是和java的list集合與數(shù)組一樣的用法海蔽。一樣有添加,指定位置插入刪除绑谣,取元素和數(shù)組取元素一樣党窜,并且比起java的list集合還牛逼的是她可以存儲不同的數(shù)據(jù)類型,并且也可以嵌套list借宵。下面代碼演示以上所有功能:
test_list = ["哈哈哈" , 2 , 'A' , 5.2361 , [1 , "fegeg"]]
# 獲取長度
print(len(test_list))
# 去第一個元素
print(test_list[0])
# 用-1做索引幌衣,直接獲取最后一個元素,以此類推-2就是倒數(shù)第二個元素,注意不要角標越界
print(test_list[-1])
# 插入元素
test_list.append(2)
# 指定位置添加
test_list.insert(1,"我很帥")
# 刪除末尾數(shù)據(jù)
test_list.pop()
# 刪除指定位置數(shù)據(jù)
test_list.pop(2)
# 改變指定位置的元素
test_list[1] = 'C'
# 獲取list中的list的指定位置元素
print(test_list[4][0])
- tuple
另一種有序列表叫元組:tuple壤玫。tuple和list非常類似豁护,但是tuple一旦初始化就不能修改,初始化tuple的是小括號欲间,而list的是中括號楚里。如下:
test_tuple = (1,2,4,6)
test_tuple這個tuple不能變了,它也沒有append()猎贴,insert()這樣的方法班缎。其他獲取元素的方法和list是一樣的,你可以正常地使用test_tuple[0]她渴,test_tuple[-1]达址,但不能賦值成另外的元素。
不可變的tuple有什么意義趁耗?因為tuple不可變沉唠,所以代碼更安全。如果可能苛败,能用tuple代替list就盡量用tuple满葛。所以径簿,當你定義一個tuple時,在定義的時候纱扭,tuple的元素就必須被確定下來牍帚。
來看看特列:
# 定義一個空的tuple
null_tuple = ()
# 定義一個只有一個元素的tuple,注意下面兩個不是同一個意思乳蛾。
# 前一個定義的不是tuple暗赶,是1這個數(shù)!這是因為括號()既可以表示tuple肃叶,又可以表示數(shù)學(xué)公式中的小括號蹂随,
# 這就產(chǎn)生了歧義,因此因惭,Python規(guī)定岳锁,這種情況下,按小括號進行計算蹦魔,計算結(jié)果自然是1激率。
# 所以,只有1個元素的tuple定義時必須加一個逗號,勿决,來消除歧義
tu1 = (1)
tu12 = (1,)
If語句
這個語句和Java與C的區(qū)別不大乒躺,就是寫法不一樣,注意不要少了:符號就行了低缩。如下格式就可以了:
a = 20
if a>10:
print(a)
elif a<30:
print(30)
else:
print(0)
循環(huán)
Python的循環(huán)有兩種嘉冒,一種是for...in循環(huán),一種是while咆繁,依次把list或tuple中的每個元素迭代出來讳推。
- for...in
# range()函數(shù),可以生成一個整數(shù)序列玩般,再通過list()函數(shù)可以轉(zhuǎn)換為list银觅。比如range(100)生成的序列是從0開始小于100的整數(shù)
sum = 0
test_for = list(range(100))
for x in test_for:
sum = sum + x;
# 千萬記住py的縮進原則,以下代碼如果是和for 對其设拟,那么只打印一次,就是最好的結(jié)果久脯,如果是和sum = sum + x;對齊那么就會打印每次的循環(huán)
print(sum)
- while
sum = 0;
x = 99;
while x >0:
sum = sum + x
x -2
print(sum)
dict和set
- dict
Python內(nèi)置了字典:dict的支持帘撰,dict全稱dictionary,在其他語言中也稱為map万皿,使用鍵-值(key-value)存儲核行,具有極快的查找速度。具體用法和Java的map用法差不多芝雪,直接看示例吧:
test_dir = {'a':10,'a':2,'c':3,'d':4,'e':5}
# 按照key取元素
print(test_dir['a'])
# 賦值會覆蓋前面的值
test_dir['b'] = 12
# 判斷key存在的第一種方法,使用in
print('g' in test_dir)
# 第二種方式判斷key惩系,通過dict提供的get()方法,如果key不存在如筛,可以返回None堡牡,或者自己指定的value
print(test_dir.get('a'))
print(test_dir.get('y',-1))
# 刪除一個key
test_dir.pop('a')
你發(fā)現(xiàn)了,dir的key是可以重復(fù)的杨刨,并且后面的key的值會覆蓋前面的重復(fù)的值晤柄。
- set
set和dict類似,也是一組key的集合妖胀,但不存儲value芥颈。由于key不能重復(fù),所以赚抡,在set中爬坑,沒有重復(fù)的key。說白了怕品,這個有點像java中的keyset()妇垢。
示例:
# 要創(chuàng)建一個set,需要提供一個list作為輸入集合,注意:重復(fù)元素在set中自動被過濾
s = set([1,2,3,4,4,2,"sddf"])
# 添加元素到set
s.add(5)
# 刪除元素
s.remove(4)
# set可以看成數(shù)學(xué)意義上的無序和無重復(fù)元素的集合肉康,因此闯估,兩個set可以做數(shù)學(xué)意義上的交集、并集等操作:
s1 = set([1, 2, 3])
s2 = set([2, 3, 4])
print(s1&s2)
set和dict的唯一區(qū)別僅在于沒有存儲對應(yīng)的value吼和,但是涨薪,set的原理和dict一樣,所以炫乓,同樣不可以放入可變對象刚夺,因為無法判斷兩個可變對象是否相等,也就無法保證set內(nèi)部“不會有重復(fù)元素”末捣。試試把list放入set侠姑,看看是否會報錯
注意看下面代碼,和Java有所不同:
a = 'abc'
a.replace('a','A')
print(a)
輸出結(jié)果是abc箩做,而不是Abc莽红。原因就是a本身是可不變的對象,第二行代碼只是把 'abc'這個值做了變化,這個replace函數(shù)執(zhí)行后生成了新的字符串安吁,地址和a的地址不是同一個醉蚁。