Python:基礎(chǔ)

本筆記是完全與Java和C++語言進行對比,總結(jié)Python3與其不同的地方。這樣達到一個快速學(xué)習(xí)與復(fù)習(xí)的效果气筋。只需要記住不同之處,就可以熟練愉快的敲Python3代碼了旋圆。

開發(fā)環(huán)境的搭建

  • 下載有兩種方式(建議第二種)
  1. 官網(wǎng)下載
  2. 第三方下載(提供了包管理與環(huán)境管理的功能宠默,可以很方便地解決多版本python并存、切換以及各種第三方包安裝問題灵巧。)
  • 命令行使用Python
    當你安裝成功了搀矫,并且已經(jīng)將Python安裝目錄中的python.exe所在目錄配置好環(huán)境變量后,打開CMD刻肄,輸入python瓤球,就可以在>>>符號后敲相應(yīng)的代碼,結(jié)果如下圖:


    圖1.png
  • 安裝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的地址不是同一個醉蚁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鬼店,隨后出現(xiàn)的幾起案子网棍,更是在濱河造成了極大的恐慌,老刑警劉巖妇智,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滥玷,死亡現(xiàn)場離奇詭異,居然都是意外死亡俘陷,警方通過查閱死者的電腦和手機罗捎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桨菜,“玉大人倒得,你說我怎么就攤上這事夭禽。” “怎么了讹躯?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵潮梯,是天一觀的道長骗灶。 經(jīng)常有香客問我耙旦,道長萝究,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任绕娘,我火速辦了婚禮栽连,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘舷暮。我一直安慰自己噩茄,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布沥割。 她就那樣靜靜地躺著机杜,像睡著了一般衅谷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚀苛,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天堵未,我揣著相機與錄音盏触,去河邊找鬼。 笑死赞辩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的诗宣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼岛心,長吁一口氣:“原來是場噩夢啊……” “哼忘古!你這毒婦竟也來了诅诱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤干旁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后回怜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體换薄,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡轻要,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年冲泥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幸冻。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡洽损,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碑定,到底是詐尸還是另有隱情又官,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布碘赖,位于F島的核電站外构,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏撼班。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一砰嘁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧矮湘,春花似錦、人聲如沸宫静。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至炸枣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間适肠,已是汗流浹背候引。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工澄干, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人麸俘。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像逞泄,于是被迫代替她去往敵國和親拜效。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345