Python

一什猖、Python介紹

  • Python 是一個(gè)高層次的結(jié)合了解釋性牧愁、編譯性素邪、互動性和面向?qū)ο蟮哪_本語言。
    Python 的設(shè)計(jì)具有很強(qiáng)的可讀性猪半,相比其他語言經(jīng)常使用英文關(guān)鍵字兔朦,其他語言的一些標(biāo)點(diǎn)符號,它具有比其他語言更有特色語法結(jié)構(gòu)磨确。
  • Python 是一種解釋型語言: 這意味著開發(fā)過程中沒有了編譯這個(gè)環(huán)節(jié)沽甥。類似于PHP和Perl語言。
  • Python 是交互式語言: 這意味著乏奥,您可以在一個(gè)Python提示符摆舟,直接互動執(zhí)行寫你的程序。
  • Python 是面向?qū)ο笳Z言: 這意味著Python支持面向?qū)ο蟮娘L(fēng)格或代碼封裝在對象的編程技術(shù)英融。
  • Python 是初學(xué)者的語言:Python 對初級程序員而言盏檐,是一種偉大的語言歇式,它支持廣泛的應(yīng)用程序開發(fā)驶悟,從簡單的文字處理到 WWW 瀏覽器再到游戲。

二材失、發(fā)展歷程

  • Python 是由 Guido van Rossum 在八十年代末和九十年代初痕鳍,在荷蘭國家數(shù)學(xué)和計(jì)算機(jī)科學(xué)研究所設(shè)計(jì)出來的。
  • Python 本身也是由諸多其他語言發(fā)展而來的,這包括 ABC龙巨、Modula-3笼呆、C、C++旨别、Algol-68诗赌、SmallTalk、Unix shell 和其他的腳本語言等等秸弛。
  • 像 Perl 語言一樣铭若,Python 源代碼同樣遵循 GPL(GNU General Public License)協(xié)議洪碳。
  • 現(xiàn)在 Python 是由一個(gè)核心開發(fā)團(tuán)隊(duì)在維護(hù),Guido van Rossum 仍然占據(jù)著至關(guān)重要的作用叼屠。

三瞳腌、Python的特點(diǎn)

  1. 易于學(xué)習(xí):Python有相對較少的關(guān)鍵字,結(jié)構(gòu)簡單镜雨,和一個(gè)明確定義的語法嫂侍,學(xué)習(xí)起來更加簡單。
  2. 易于閱讀:Python代碼定義的更清晰荚坞。
  3. 易于維護(hù):Python的成功在于它的源代碼是相當(dāng)容易維護(hù)的挑宠。
  4. 一個(gè)廣泛的標(biāo)準(zhǔn)庫:Python的最大的優(yōu)勢之一是豐富的庫,跨平臺的颓影,在UNIX痹栖,Windows和Macintosh兼容很好。
  5. 互動模式:互動模式的支持瞭空,您可以從終端輸入執(zhí)行代碼并獲得結(jié)果的語言揪阿,互動的測試和調(diào)試代碼片斷。
  6. 可移植:基于其開放源代碼的特性咆畏,Python已經(jīng)被移植(也就是使其工作)到許多平臺南捂。
  7. 可擴(kuò)展:如果你需要一段運(yùn)行很快的關(guān)鍵代碼,或者是想要編寫一些不愿開放的算法旧找,你可以使用C或C++完成那部分程序溺健,然后從你的Python程序中調(diào)用。
  8. 數(shù)據(jù)庫:Python提供所有主要的商業(yè)數(shù)據(jù)庫的接口钮蛛。
  9. GUI編程:Python支持GUI可以創(chuàng)建和移植到許多系統(tǒng)調(diào)用鞭缭。
  10. 可嵌入: 你可以將Python嵌入到C/C++程序,讓你的程序的用戶獲得"腳本化"

四魏颓、Pycharm及python安裝詳細(xì)教程

4.1. 安裝python

4.1.1. python下載地址

進(jìn)入之后如下圖岭辣,選擇圖中紅色圈中區(qū)域進(jìn)行下載


image.png
4.1.2. 下載完成后如下圖所示
image.png
4.1.3. 安裝

雙擊exe文件進(jìn)行安裝,如下圖甸饱,并按照圈中區(qū)域進(jìn)行設(shè)置沦童,切記要勾選打鉤的框,然后再點(diǎn)擊Customize installation進(jìn)入到下一步:


image.png

image.png

image.png
4.1.4. 自定義安裝路徑

對于上圖中叹话,可以通過Browse進(jìn)行自定義安裝路徑偷遗,也可以直接點(diǎn)擊Install進(jìn)行安裝,點(diǎn)擊install后便可以完成安裝了驼壶。


image.png
4.1.5. 檢測安裝是否成功

為了檢查我們的python是否安裝成功氏豌,可以在命令窗口中輸入python進(jìn)行查詢,如顯示下圖一的信息則表示成功了热凹,如顯示第二張圖的信息則表示出錯(cuò)了泵喘。


image.png

4.2. 安裝pycharm

4.2.1. 下載地址

首先從網(wǎng)站下載pycharm瞭吃,進(jìn)入之后如下圖,根據(jù)自己電腦的操作系統(tǒng)進(jìn)行選擇涣旨,對于windows系統(tǒng)選擇圖中紅色圈中的區(qū)域歪架。


image.png
4.2.2. 下載完成之后如下圖:
image.png
4.2.3. 直接雙擊下載好的exe文件進(jìn)行安裝,安裝截圖如下:
image.png

點(diǎn)擊Next進(jìn)入下一步:


image.png

點(diǎn)擊Next進(jìn)入下一步:


image.png

點(diǎn)擊Install進(jìn)行安裝:
image.png

image.png

安裝完成后出現(xiàn)下圖界面霹陡,點(diǎn)級Finish結(jié)束安裝:


image.png

下面我們來創(chuàng)建自己的第一個(gè)程序:
1和蚪、單擊桌面上的pycharm圖標(biāo),進(jìn)入到pycharm中烹棉,如下圖所示:


image.png

2攒霹、我們選擇第二個(gè),然后點(diǎn)擊Ok:


image.png

3浆洗、點(diǎn)擊上圖中的Accept進(jìn)入下一步:
image.png

4催束、點(diǎn)擊上圖中的ok進(jìn)入下一步:
image.png

5、點(diǎn)擊Create New Project伏社,進(jìn)入如下圖的界面抠刺,圖中的Location是選擇你安裝的python的位置,選擇好后摘昌,點(diǎn)擊create速妖。


image.png

五、第一個(gè)Python程序

1.創(chuàng)建python file
2.練習(xí)打印hello world
image.png

六聪黎、Python變量和數(shù)據(jù)類型

6.1. 變量的定義

在程序中罕容,有時(shí)我們需要對2個(gè)數(shù)據(jù)進(jìn)行求和,那么該怎樣做呢稿饰?
大家類比一下現(xiàn)實(shí)生活中锦秒,比如去超市買東西,往往咱們需要一個(gè)菜籃子喉镰,用來進(jìn)行存儲物品旅择,等到所有的物品都購買完成后,在收銀臺進(jìn)行結(jié)賬即可
如果在程序中梧喷,需要把2個(gè)數(shù)據(jù)砌左,或者多個(gè)數(shù)據(jù)進(jìn)行求和的話,那么就需要把這些數(shù)據(jù)先存儲起來铺敌,然后把它們累加起來即可
在Python中,存儲一個(gè)數(shù)據(jù)屁擅,需要一個(gè)叫做變量的東西偿凭,如下示例:

num1 = 100 #num1就是一個(gè)變量,就好一個(gè)小菜籃子
num2 = 87  #num2也是一個(gè)變量
result = num1 + num2 #把num1和num2這兩個(gè)"菜籃子"中的數(shù)據(jù)進(jìn)行累加派歌,然后放到 result變量中

說明:

  • 所謂變量弯囊,可以理解為菜籃子痰哨,如果需要存儲多個(gè)數(shù)據(jù),最簡單的方式是有多個(gè)變量匾嘱,當(dāng)然了也可以使用一個(gè)
  • 程序就是用來處理數(shù)據(jù)的斤斧,而變量就是用來存儲數(shù)據(jù)的

程序中:
為了更充分的利用內(nèi)存空間以及更有效率的管理內(nèi)存,變量是有不同的類型的霎烙,如下所示:
Python3 中有六個(gè)標(biāo)準(zhǔn)的數(shù)據(jù)類型:


image.png

Python3 的六個(gè)標(biāo)準(zhǔn)數(shù)據(jù)類型中:

  • 不可變數(shù)據(jù)(3 個(gè)):Number(數(shù)字)撬讽、String(字符串)、Tuple(元組)悬垃;
  • 可變數(shù)據(jù)(3 個(gè)):List(列表)游昼、Dictionary(字典)、Set(集合)尝蠕。

注意:在python中烘豌,只要定義了一個(gè)變量,而且它有數(shù)據(jù)看彼,那么它的類型就已經(jīng)確定了廊佩,不需要咱們開發(fā)者主動的去說明它的類型,系統(tǒng)會自動辨別
可以使用type(變量的名字)靖榕,來查看變量的類型

6.1.1 概念
  1. 整數(shù)
    Python可以處理任意大小的整數(shù)罐寨,當(dāng)然包括負(fù)整數(shù),在Python程序中序矩,整數(shù)的表示方法和數(shù)學(xué)上的寫法一模一樣鸯绿,例如:1,100簸淀,-8080撵术,0,等等挤聘。
  2. 浮點(diǎn)數(shù)
    浮點(diǎn)數(shù)也就是小數(shù)着倾,之所以稱為浮點(diǎn)數(shù),是因?yàn)榘凑湛茖W(xué)記數(shù)法表示時(shí)劲绪,一個(gè)浮點(diǎn)數(shù)的小數(shù)點(diǎn)位置是可變的男窟,比如,1.23x109和12.3x108是相等的贾富。浮點(diǎn)數(shù)可以用數(shù)學(xué)寫法歉眷,如1.23,3.14颤枪,-9.01汗捡,等等。
    整數(shù)和浮點(diǎn)數(shù)在計(jì)算機(jī)內(nèi)部存儲的方式是不同的畏纲,整數(shù)運(yùn)算永遠(yuǎn)是精確的(除法難道也是精確的扇住?是的4郝啤),而浮點(diǎn)數(shù)運(yùn)算則可能會有四舍五入的誤差艘蹋。
  3. 字符串
    字符串是以''或""括起來的任意文本锄贼,比如'abc'女阀,"xyz"等等宅荤。請注意,''或""本身只是一種表示方式强品,不是字符串的一部分膘侮,因此,字符串'abc'只有a的榛,b琼了,c這3個(gè)字符。
  4. 布爾值
    布爾值和布爾代數(shù)的表示完全一致夫晌,一個(gè)布爾值只有True雕薪、False兩種值,要么是True晓淀,要么是False所袁,在Python中,可以直接用True凶掰、False表示布爾值(請注意大小寫)燥爷,也可以通過布爾運(yùn)算計(jì)算出來。
    布爾值可以用and懦窘、or和not運(yùn)算前翎。
    and運(yùn)算是與運(yùn)算,只有所有都為 True畅涂,and運(yùn)算結(jié)果才是 True港华。A與B true true
    or運(yùn)算是或運(yùn)算,只要其中有一個(gè)為 True午衰,or 運(yùn)算結(jié)果就是 True立宜。
    not運(yùn)算是非運(yùn)算,它是一個(gè)單目運(yùn)算符臊岸,把 True 變成 False橙数,F(xiàn)alse 變成 True。
  5. 空值
    空值是Python里一個(gè)特殊的值扇单,用None表示商模。None不能理解為0,因?yàn)?是有意義的蜘澜,而None是一個(gè)特殊的空值施流。
6.1.2 代碼示例
#整數(shù)
a=1;
#浮點(diǎn)數(shù)
b=1.1;
#字符串
c="abc";
#boolean類型
d=True;
#空值
e=None;
print(a);print(b);print(c);print(d);print(e)
a=True and True   # ==> True
b=True and False   # ==> False
c=False and True   # ==> False
d=False and False   # ==> False
e=True or True   # ==> True
f=True or False   # ==> True
g=False or True   # ==> True
h=False or False   # ==> False
i=not True   # ==> False
j=not False   # ==> True
print(a,b,c,d,e,f,g,h,i,j)

說明:

  1. 在計(jì)算 a and b 時(shí),如果 a 是 False鄙信,則根據(jù)與運(yùn)算法則瞪醋,整個(gè)結(jié)果必定為 False,因此返回 a装诡;如果 a 是 True银受,則整個(gè)計(jì)算結(jié)果必定取決與 b,因此返回 b鸦采。
  2. 在計(jì)算 a or b 時(shí)宾巍,如果 a 是 True,則根據(jù)或運(yùn)算法則渔伯,整個(gè)計(jì)算結(jié)果必定為 True顶霞,因此返回 a;如果 a 是 False锣吼,則整個(gè)計(jì)算結(jié)果必定取決于 b选浑,因此返回 b。
    所以Python解釋器在做布爾運(yùn)算時(shí)玄叠,只要能提前確定計(jì)算結(jié)果古徒,它就不會往后算了,直接返回結(jié)果读恃。
6.1.3 標(biāo)識符
  1. 什么是標(biāo)識符隧膘?
    開發(fā)人員在程序中自定義的一些符號和名稱
    標(biāo)識符是自己定義的,如變量名 、函數(shù)名等
  2. 標(biāo)識符的命名規(guī)則
. 標(biāo)識符只能由字母寺惫、下劃線“_”疹吃、數(shù)字組成。
. 標(biāo)識符不能以數(shù)字開頭肌蜻。
. 標(biāo)識符不能使用關(guān)鍵字
. 標(biāo)識符對大小寫敏感互墓。
(建議:標(biāo)識符命名應(yīng)“見名知意”)
  1. python中的關(guān)鍵字

'False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

  1. 注釋:
  • 單行注釋:
/*   */
//定義一個(gè)變量
name="jack"
  • 多行注釋:
'''
定義一個(gè)變量
'''
name="jack"
  1. 課堂思考:下列哪些標(biāo)識符符合規(guī)則
if   name   and   my_list    my_list1   from#1   age    2list   as    True    wetyui   
height    my_log     qwe&qwe
  1. 標(biāo)識符的命名方法
  • 小駝峰式命名法:
函數(shù)名      addName
  • 大駝峰式命名法:
類名       AddName

6.2.Python中print語句

print() 方法用于打印輸出,最常見的一個(gè)函數(shù)蒋搜。
語法:
print(*objects, sep=' ', end='\n', file=sys.stdout)
參數(shù):
objects -- 復(fù)數(shù)篡撵,表示可以一次輸出多個(gè)對象。輸出多個(gè)對象時(shí)豆挽,需要用 , 分隔育谬。
sep -- 用來間隔多個(gè)對象,默認(rèn)值是一個(gè)空格帮哈。
end -- 用來設(shè)定以什么結(jié)尾膛檀。默認(rèn)值是換行符 \n,我們可以換成其他字符串。
file -- 要寫入的文件對象咖刃。

#直接打印
print("哈哈哈哈")

#多條打印
print("哈哈哈哈","呵呵呵呵","吼吼吼吼"),

#打印+計(jì)算
print("100+200的和是:",100+200);

#設(shè)置間隔符號
print("www","runoob","com",sep=".")  # 設(shè)置間隔符  www.runoob.com

格式化輸出

方式一:使用百分號(%)字符串格式化

print("my name is %s, and my age is %d" %(name,age))

方式二:使用format字符串格式化

位置參數(shù)

print("my name is {}, and my age is {}".format(age,name))

關(guān)鍵字參數(shù)

print("my name is {name}, and my age is {age}".format(age=18,name="jack"))
注釋:位置參數(shù)("{0}".format())泳炉,關(guān)鍵字參數(shù)("{關(guān)鍵字}".format())

6.3.設(shè)置換行符號

print(a,b,c,d,e,sep=";",end="\n");

6.4.Python中input語句

input() 用來獲取控制臺的輸入。
語法:
input([prompt])


image.png

6.5.Python中變量

  • 在Python中嚎杨,變量的概念基本上和初中代數(shù)的方程變量是一致的花鹅。
    例如,對于方程式 y=x*x 枫浙,x就是變量刨肃。當(dāng)x=2時(shí),計(jì)算結(jié)果是4箩帚,當(dāng)x=5時(shí)真友,計(jì)算結(jié)果是25。
  • 只是在計(jì)算機(jī)程序中紧帕,變量不僅可以是數(shù)字盔然,還可以是任意數(shù)據(jù)類型。
    在Python程序中焕参,變量是用一個(gè)變量名表示轻纪,變量名必須是大小寫英文、數(shù)字和下劃線(_)的組合叠纷,且不能用數(shù)字開頭刻帚,比如:
a = 123    # a是整數(shù)
print (a)
a = 'imooc'   # a變?yōu)樽址?print (a)

b=11; #b是整數(shù)
d=11.1;#d是浮點(diǎn)數(shù)
print(b*d)

七、Python條件循環(huán)和判斷

7.1. If語句

Python 編程中 if 語句用于控制程序的執(zhí)行涩嚣,基本形式為:

if 判斷條件:
    執(zhí)行語句……
else:
    執(zhí)行語句……

其中"判斷條件"成立時(shí)(非零)崇众,則執(zhí)行后面的語句,而執(zhí)行內(nèi)容可以多行航厚,以縮進(jìn)來區(qū)分表示同一范圍顷歌。
else 為可選語句,當(dāng)需要在條件不成立時(shí)執(zhí)行內(nèi)容則可以執(zhí)行相關(guān)語句幔睬,具體

7.2.If else 語句

age = 12
if age>18:
    print("年齡大于18")
else:
    print("年齡小于等于18")

age=20;
if age>18:
    print("年齡大于18")
if not age <=18:
    print("年齡大于18")

注意:Python代碼的縮進(jìn)規(guī)則眯漩。具有相同縮進(jìn)的代碼被視為代碼塊,上面的 print 語句就構(gòu)成一個(gè)代碼塊麻顶。如果 if 語句判斷為 True赦抖,就會執(zhí)行這個(gè)代碼塊。
縮進(jìn)請嚴(yán)格按照Python的習(xí)慣寫法:4個(gè)空格辅肾,一個(gè)Tab队萤,更不要混合Tab和空格,否則很容易造成因?yàn)榭s進(jìn)引起的語法錯(cuò)誤矫钓。

7.3. If else else 多層嵌套方式

age=10;
if age >= 18:
    print ('adult')
else:
    if age >= 6:
        print ('teenager')
    else:
        if age >= 3:
            print ('kid')
        else:
            print ('baby')

標(biāo)準(zhǔn)格式
if 語句的判斷條件可以用>(大于)要尔、<(小于)舍杜、==(等于)、>=(大于等于)赵辕、<=(小于等于)來表示其關(guān)系既绩。
當(dāng)判斷條件為多個(gè)值時(shí),可以使用以下形式:

if 判斷條件1:
    執(zhí)行語句1……
elif 判斷條件2:
    執(zhí)行語句2……
elif 判斷條件3:
    執(zhí)行語句3……
else:
執(zhí)行語句4……

案例:

score=85;
if score>=90:
    print("成績優(yōu)秀")
elif score>=80:
    print("成績不錯(cuò)")
elif score>=60:
    print("及格")
else:
    print("不及格");

7.4. For循環(huán):重復(fù)執(zhí)行語句

for n in range(1, 20):
    print(n)

arr = [100, 90, 86, 80, 77]
for index in arr:
    print(index)

注意: b這個(gè)變量是在 for 循環(huán)中定義的匆帚,意思是熬词,依次取出list中的每一個(gè)元素旁钧,并把元素賦值給 name吸重,然后執(zhí)行for循環(huán)體(就是縮進(jìn)的代碼塊)

練習(xí):求四個(gè)同學(xué)的平均成績 L = [75, 92, 59, 68]

arr = [100, 90, 86, 80, 77]
sum = 0.0
for index in arr:
    sum += index

print(sum/len(arr))

7.5. While 循環(huán)

Python 編程中 while 語句用于循環(huán)執(zhí)行程序,即在某條件下歪今,循環(huán)執(zhí)行某段程序嚎幸,以處理需要重復(fù)處理的相同任務(wù)。其基本形式為:

while 判斷條件:
    執(zhí)行語句……

執(zhí)行語句可以是單個(gè)語句或語句塊寄猩。判斷條件可以是任何表達(dá)式嫉晶,任何非零、或非空(null)的值均為true田篇。當(dāng)判斷條件假false時(shí)替废,循環(huán)結(jié)束,while 循環(huán)不會迭代 list 或 tuple 的元素
要從 0 開始打印不大于 N 的整數(shù):

N = 20
i = 0
while i < N:
    print(i)
    i += 1;

練習(xí):求100以內(nèi)的和

sum = 0
i = 0
while i < 100:
    sum += i
    i += 1

print(sum)

7.6. Break中斷循環(huán)

break語句用來終止循環(huán)語句,即循環(huán)條件沒有False條件或者序列還沒被完全遞歸完泊柬,也會停止執(zhí)行循環(huán)語句椎镣。
break語句用在while和for循環(huán)中。
如果您使用嵌套循環(huán)兽赁,break語句將停止執(zhí)行最深層的循環(huán)状答,并開始執(zhí)行下一行代碼。

var = 10  
while var > 0:
    print(var)
    var = var - 1
    if var == 5:  # 當(dāng)變量 var 等于 5 時(shí)退出循環(huán)
        break

7.7. Continue

Python continue 語句跳出本次循環(huán)刀崖,而break跳出整個(gè)循環(huán)惊科。
continue 語句用來告訴Python跳過當(dāng)前循環(huán)的剩余語句,然后繼續(xù)進(jìn)行下一輪循環(huán)亮钦。
continue語句用在while和for循環(huán)中馆截。

var = 10                   
while var > 0:              
   var = var -1
   if var == 5:
      continue
   print(var)

7.8.嵌套循環(huán)

Python 語言允許在一個(gè)循環(huán)體里面嵌入另一個(gè)循環(huán)

for x in ['A', 'B', 'C']:
    for y in ['1', '2', '3']:
        print (x + y)

7.9.Python字符串操作

  • 字符串轉(zhuǎn)義
a='learn  "python" from teacher liang';
b='bob said \"I\'m ok\"';
print(a)
print(b);

\n 表示換行
\t 表示一個(gè)制表符
\ 表示 \ 字符本身

  • 字符串截取操作(左閉右開)
a="hello world";
print(a[0:2])  #he 截取字符串 從第0到第2個(gè) 包含頭不包含尾
print(a[1]) #e 某個(gè)索引的字符
  • 字符串拼接
b="hello";
c="world"
d=b+c;
print(d)#hello world 字符串拼接
  • 包含不包含,使用innot in判斷是否包含
e="hello world";
f='he' in e;
g='haahha' in e;
h="he" not in e;
i='haahha' not in e;
print(f,g); #True False 判斷是否包含
print(h,i); #False true 判斷是否不包含
  • 常用字符串的操作api
a="hello world"
print(a.upper())#HELLO WORLD 變成大寫
b=a.startswith("hello");#true  是以什么進(jìn)行開頭
c=a.endswith("world");#true 以什么進(jìn)行結(jié)尾
d=a.replace("h","hhhhh");#hhhhhello world 替換字符
print(d);

八、Python中List和Tuple類型

序列是Python中最基本的數(shù)據(jù)結(jié)構(gòu)蜂莉。
序列中的每個(gè)元素都分配一個(gè)數(shù)字 - 它的位置蜡娶,或索引,第一個(gè)索引是0巡语,第二個(gè)索引是1翎蹈,依此類推。
Python有6個(gè)序列的內(nèi)置類型男公,但最常見的是列表和元組荤堪。
序列都可以進(jìn)行的操作包括索引合陵,切片,加澄阳,乘拥知,檢查成員。
此外碎赢,Python已經(jīng)內(nèi)置確定序列的長度以及確定最大和最小的元素的方法低剔。
列表是最常用的Python數(shù)據(jù)類型,它可以作為一個(gè)方括號內(nèi)的逗號分隔值出現(xiàn)肮塞。
列表的數(shù)據(jù)項(xiàng)不需要具有相同的類型
創(chuàng)建一個(gè)列表襟齿,只要把逗號分隔的不同的數(shù)據(jù)項(xiàng)使用方括號括起來即可。如下所示:

a= ['physics', 'chemistry', 1997, 2000]
b = [1, 2, 3, 4, 5 ]
c = ["a", "b", "c", "d"]

8.1. 定義集合

a=["aaa",123,"bbb",True];#定義集合

8.2. 獲取某個(gè)索引的元素

print(a[1]);#123 獲取索引值為1處的元素

8.3. 倒序獲取元素

print(a[-1],a[-2],a[-3],a[-4]);#True bbb 123 aaa 倒數(shù)第一個(gè)枕赵,倒數(shù)第二個(gè)猜欺,倒數(shù)第三個(gè)

8.4.添加元素

  • 追加
a.append("哈哈哈");
print(a);#['aaa', 123, 'bbb', True, '哈哈哈']
  • 插入
a.insert(1,"82歲韓美林); 
a.insert(2,"PGone")
print(a);#['aaa', '李小璐', 'PGone', 123, 'bbb', True, '哈哈哈'] 

8.5.刪除元素

a.pop(2);
a.pop(1);
print(a);#['aaa', 123, 'bbb', True, '哈哈哈'] 刪除某索引值的元素

8.6.替換元素

a[2]="賈乃亮";
a[-1]="吼吼吼"
print(a);#['aaa', 123, '賈乃亮', True, '吼吼吼'] 替換指定位置元素

8.7.定義元組(Tuple)[?tjup(?)l]

Python的元組與列表類似,不同之處在于元組的元素不能修改拷窜。
元組使用小括號开皿,列表使用方括號。
元組創(chuàng)建很簡單篮昧,只需要在括號中添加元素赋荆,并使用逗號隔開即可。
t = ('Adam', 'Lisa', 'Bart')
現(xiàn)在懊昨,這個(gè) t 就不能改變了窄潭,tuple沒有 append()方法,也沒有insert()和pop()方法疚颊。所以狈孔,新同學(xué)沒法直接往 tuple 中添加,老同學(xué)想退出 tuple 也不行材义。

a=("a","b","c");
print(a);#('a', 'b', 'c')

8.8. 可變Tuple

元組可以使用下標(biāo)索引來訪問元組中的值均抽,如下實(shí)例:

a = (1, 2, 3, 4, 5, 6, 7 )
print(a[1:5]) # 2,3,4,5

元組中的元素值是不允許修改的,但我們可以對元組進(jìn)行連接組合其掂,如下實(shí)例:

tup1 = (12, 34.56)
tup2 = ('abc', 'xyz')
tup3 = tup1 + tup2
print(tup3)

a=("a","b",["c"]);
print(a);#('a', 'b', 'c')
l=a[2];
l.insert(0,"d");
print(a)#('a', 'b', ['d', 'c'])

九油挥、Dict介紹--字典類型 dictionary

9.1.字典介紹

我們已經(jīng)知道,list 和 tuple 可以用來表示順序集合款熬,例如深寥,班里同學(xué)的名字:

['Adam', 'Lisa', 'Bart']

或者考試的成績列表:

[95, 85, 59]

但是,要根據(jù)名字找到對應(yīng)的成績贤牛,用兩個(gè) list 表示就不方便惋鹅。
如果把名字和分?jǐn)?shù)關(guān)聯(lián)起來,組成類似的查找表:

'Adam' ==> 95
'Lisa' ==> 85
'Bart' ==> 59

給定一個(gè)名字殉簸,就可以直接查到分?jǐn)?shù)闰集。
Python的 dict 就是專門干這件事的沽讹。用 dict 表示“名字”-“成績”的查找表如下:

d = {
    'Adam': 95,
    'Lisa': 85,
    'Bart': 59
}

我們把名字稱為key,對應(yīng)的成績稱為value武鲁,dict就是通過 key 來查找 value爽雄。
花括號 {} 表示這是一個(gè)dict,然后按照 key: value, 寫出來即可沐鼠。最后一個(gè) key: value 的逗號可以省略挚瘟。
字典是另一種可變?nèi)萜髂P停铱纱鎯θ我忸愋蛯ο蟆?br> 字典的每個(gè)鍵值 key=>value 對用冒號 : 分割饲梭,每個(gè)鍵值對之間用逗號 , 分割乘盖,整個(gè)字典包括在花括號 {} 中 ,格式如下所示:

d = {key1 : value1, key2 : value2 }

鍵必須是唯一的,但值則不必排拷。
值可以取任何數(shù)據(jù)類型侧漓,但鍵必須是不可變的,如字符串监氢,數(shù)字或元組。
一個(gè)簡單的字典實(shí)例:
key value(鍵值對)形式數(shù)據(jù)對應(yīng)藤违,比如 name:張三 age:18 sex:男

info={"name":"張三","age":18,"sex":"男"}

9.2. Dict特點(diǎn)

  • 字典和列表一樣浪腐,也能夠存儲多個(gè)數(shù)據(jù)
  • 列表中找某個(gè)元素時(shí),是根據(jù)下標(biāo)進(jìn)行的顿乒;字典中找某個(gè)元素時(shí)议街,是根據(jù)'名字'(就是冒號:前面的那個(gè)值,例如上面代碼中的'name'璧榄、'age'特漩、'sex')
  • dict的第一個(gè)特點(diǎn)是查找速度快,無論dict有10個(gè)元素還是10萬個(gè)元素骨杂,查找速度都一樣涂身。而list的查找速度隨著元素增加而逐漸下降。
  • 不過dict的查找速度快不是沒有代價(jià)的搓蚪,dict的缺點(diǎn)是占用內(nèi)存大蛤售,還會浪費(fèi)很多內(nèi)容,list正好相反妒潭,占用內(nèi)存小悴能,但是查找速度慢。
  • 由于dict是按 key 查找雳灾,所以漠酿,在一個(gè)dict中,key不能重復(fù)谎亩。
  • dict的第二個(gè)特點(diǎn)就是存儲的key-value序?qū)κ菦]有順序的炒嘲!這和list不一樣:
  • dict的第三個(gè)特點(diǎn)是作為 key 的元素必須不可變谈竿,Python的基本類型如字符串、整數(shù)摸吠、浮點(diǎn)數(shù)都是不可變的空凸,都可以作為 key。但是list是可變的寸痢,就不能作為 key呀洲。

9.3. 元素獲取

print(info["name"])
print(info.get("name")) #
#print(info.get("xx")) 如果元素沒有會報(bào)錯(cuò)誤

9.4. 字典的增刪改操作

  • 修改元素
    字典中每個(gè)元素都是可修改的,只要通過key找到啼止,既可以修改Demo
    info["name"]="李四"
    
  • 添加元素
    想要添加元素道逗,只需要指定key 指定 value就可以
    info["address"]="北京"
    
  • 刪除元素
    對字典進(jìn)行刪除操作,有以下兩種方式:
    # del info[] 指定要刪除的元素
    del info["name"]
    
    # clear 清空元素
    info.clear()
    

9.5. 字典內(nèi)置函數(shù)&方法

函數(shù)及描述 實(shí)例
1 len(dict) 計(jì)算字典元素個(gè)數(shù)献烦,即鍵的總數(shù)滓窍。 >>> dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}>>> len(dict)3
2 str(dict) 輸出字典,以可打印的字符串表示巩那。 >>> dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}>>> str(dict)"{'Name': 'Runoob', 'Class': 'First', 'Age': 7}"
3 type(variable) 返回輸入的變量類型吏夯,如果變量是字典就返回字典類型。 >>> dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}>>> type(dict)<class 'dict'>

9.6.字典的常見操作

  • keys() 獲取字典的所有key 列表
    print(info.keys())
    
  • values 獲取字典的所有values 列表
    print(info.values())
    
  • items 返回一個(gè)包含所有元組(鍵即横,值)的列表
    print(info.items())
    

9.7. 字典的遍歷

  • 遍歷key
    for key in info.keys():
        print(key)
    
  • 遍歷value
    for value in info.values():
    print(value)
    
  • 遍歷items
    for item in info.items():
       print(item)
    
  • 遍歷key value
    for key,value in info.items():
        print(key,value)
    

十噪生、Python中函數(shù)

10.1.什么是函數(shù)

如果在開發(fā)的時(shí)候,需要某塊代碼多次东囚,但是為了提高便攜的效率以及代碼的重用跺嗽,所以把具有獨(dú)立功能的代碼塊組織成一個(gè)小的模塊,這就是函數(shù)页藻。

10.2.函數(shù)定義和調(diào)用

10.2.1. 定義函數(shù)
  • 定義函數(shù)的格式如下:
    def 函數(shù)名():
        代碼
    
  • 定義一個(gè)函數(shù)桨嫁,能夠完成打印信息的功能
    def printInfo():
        print '------------------------------------'
        print '         人生苦短,我用Python'
        print '------------------------------------'
    
10.2.2. 調(diào)用函數(shù)

定義了函數(shù)之后份帐,就相當(dāng)于有了一個(gè)具有某些功能的代碼璃吧,想要讓這些代碼能夠執(zhí)行,需要調(diào)用它
調(diào)用函數(shù)很簡單的弥鹦,通過函數(shù)名() 即可完成調(diào)用

  • 案例:
    # 定義完函數(shù)后肚逸,函數(shù)是不會自動執(zhí)行的,需要調(diào)用它才可以
    printInfo()
    

10.3.函數(shù)的好處

減少代碼的冗余彬坏,減少維護(hù)量朦促,功能的封裝,降低學(xué)習(xí)成本栓始,提高開發(fā)速度

10.4. 函數(shù)參數(shù)

  • 定義帶有參數(shù)的函數(shù):
    def printSum(a,b):
        print(a+b)
    
  • 調(diào)用帶有參數(shù)的函數(shù)
    printSum(10,20)
    

形式參數(shù)和實(shí)際參數(shù)
定義時(shí)小括號中的參數(shù)务冕,用來接受參數(shù)用的,稱為“形參”
調(diào)用時(shí)小括號中的參數(shù),用來傳遞給函數(shù)用的幻赚,稱為”實(shí)際參數(shù)”

10.5.缺省參數(shù)

默認(rèn)有參數(shù)值的函數(shù)

def student(name,age,sex="男"):
   print(name,age,sex)
student("格日倉",18)
student("格日倉",20,"女")

10.6. 可變參數(shù)(一 元組類型)

def getSum(*args):
    print(args)
    sum=0
    for i in args:
        sum+=i
    return sum
print(getSum(1,2,3,4))

10.7. 可變參數(shù)(二 字典類型)

dic = {
    'a': 90,
    'b': 80,
    'c': 70,
    'd': 100
}
def kv(**kwargs):
    print(kwargs)
kv(a=90,b=80,c=70,d=100)

十一禀忆、函數(shù)返回值

所謂返回值臊旭,就是程序中函數(shù)完成一件事后,最后給調(diào)用者的結(jié)果箩退。

11.1.定義帶有返回值的函數(shù)

11.2.調(diào)用帶有返回值參數(shù)的函數(shù)

11.3.多個(gè)返回值的函數(shù)

案例:兩個(gè)數(shù)字除數(shù)和商

十二离熏、函數(shù)類型

12.1.無參數(shù),無返回值的函數(shù)
12.2.無參數(shù)戴涝,有返回值的函數(shù)
12.3.有參數(shù)滋戳,無返回值的函數(shù)
12.4.有參數(shù),有返回值的函數(shù)

十三啥刻、函數(shù)的嵌套調(diào)用

案例:在函數(shù)A中調(diào)用函數(shù)B奸鸯,然后調(diào)用函數(shù)。
分析調(diào)用順序可帽。

def add ():
    print("這是add1")
    print("加法運(yùn)算的邏輯")
def add2():
    print("想實(shí)現(xiàn)加法的運(yùn)算")
    add()
    print("計(jì)算出一個(gè)結(jié)果")
add2()

十四娄涩、局部變量

局部變量,就是在函數(shù)內(nèi)部定義的變量
不同的函數(shù)映跟,可以定義相同的名字的局部變量蓄拣,各用個(gè)的不會影響
局部變量作用:為了臨時(shí)保存數(shù)據(jù)需要在函數(shù)中定義變量來存儲。

十五申窘、全局變量

如果一個(gè)變量弯蚜,既能在一個(gè)函數(shù)中使用,又能在其他函數(shù)中使用剃法,這樣的變量就是全局變量。
在函數(shù)外邊定義的變量叫做全局變量
全局變量能夠在所有的函數(shù)中進(jìn)行訪問
如果在函數(shù)中修改全局變量路鹰,那么就需要使用global進(jìn)行聲明贷洲,否則出錯(cuò)
如果全局變量的名字和局部變量的名字相同,那么使用的是局部變量的

#全局變量晋柱,局部變量
#全局變量:在函數(shù)外定義的變量
#局部變量:在函數(shù)內(nèi)部定義的變量
#全局變量與局部變量优构,就近原則
a = 100
b = 200
def add():
    global a #修改全局變量
    a = 200 #局部變量
    return a + b

def add2():
    return a + b
re = add()
print(re)
print(add2())

十六、遞歸函數(shù)

如果一個(gè)函數(shù)在內(nèi)部不調(diào)用其它的函數(shù)雁竞,而是自己本身的話钦椭,這個(gè)函數(shù)就是遞歸函數(shù)。

16.1.循環(huán)完成

求n的階乘

def getMultipy(n):
    i=1
    result=1
    while i<=n:
        result=result*i
        i+=1
    return result
print(getMultipy(10))

16.2.函數(shù)調(diào)用函數(shù)自身

求n的階乘

def getMultipy(n):
    if n>=1:
        result=n*getMultipy(n-1)
    else:
        result=1
    return result
print(getMultipy(3))

十七碑诉、Python中模塊和包

在Python中有一個(gè)概念叫做模塊(module)彪腔,這個(gè)和C語言中的頭文件以及Java中的包很類似,比如在Python中要調(diào)用sqrt函數(shù)进栽,必須用import關(guān)鍵字引入math這個(gè)模塊德挣。

  • 導(dǎo)入模塊import 語句
    模塊定義好后,我們可以使用 import 語句來引入模塊快毛,語法如下:
    import module1[, module2[,... moduleN]
    
    比如要引用模塊 math格嗅,就可以在文件最開始的地方用 import math 來引入番挺。
    在調(diào)用 math 模塊中的函數(shù)時(shí),必須這樣引用:
    #模塊名.函數(shù)名
    import math
    print(math.pi);#3.141592653589793
    
  • from…import 語句
    Python 的 from 語句讓你從模塊中導(dǎo)入一個(gè)指定的部分到當(dāng)前命名空間中屯掖。語法如下:
    from modname import name1[, name2[, ... nameN]]
    例如玄柏,要導(dǎo)入模塊 math 的 pi 函數(shù),使用如下語句:
    from math import pi
    print(pi)
    

17.1.導(dǎo)入自定義模塊

在test1中定義求和方法

def sum(a,b):
    return a+b

test中直接導(dǎo)入方法

from test2 import sum
print(sum(1,2))

十八贴铜、文件操作

18.1. 什么是文件

使用文件的目的:就是把一些文件存儲存放起來粪摘,可以讓程序下一次執(zhí)行的時(shí)候直接使用,而不必重新制作一份阀湿,省時(shí)省力

在操作文件的整體過程與使用word編寫一份簡歷的過程是很相似的:

  • 打開文件赶熟,或者新建立一個(gè)文件
  • 讀/寫數(shù)據(jù)
  • 關(guān)閉文件

18.2. 打開、關(guān)閉文件

python中打開文件陷嘴,可以使用open函數(shù)映砖,可以打開一個(gè)已經(jīng)存在的文件,或者創(chuàng)建一個(gè)新的文件灾挨。
open(文件名那伐,訪問模式)

# 新建一個(gè)文件疫铜,文件名為:test.txt
f = open('test.txt', 'w')

# 關(guān)閉這個(gè)文件
f.close()

18.3. 文件訪問模式

文件打開分為兩種:文本模式(r/w/a),二進(jìn)制模式(rb/wb/ab)


image.png

18.4. 文件的讀寫

  • 寫數(shù)據(jù)(write) - write()方法
    write()方法可將任何字符串寫入一個(gè)打開的文件。需要重點(diǎn)注意的是炫狱,Python字符串可以是二進(jìn)制數(shù)據(jù),而不是僅僅是文字顽素。
    write()方法不會在字符串的結(jié)尾添加換行符('\n'):

    f = open('test.txt', 'w')
    f.write('hello world, i am here!')
    f.close()
    
  • 讀數(shù)據(jù)(read)
    使用read(num)可以從文件中讀取數(shù)據(jù)粱胜,num表示要從文件中讀取的數(shù)據(jù)的長度(單位是字節(jié)),如果沒有傳入num砂缩,那么就表示讀取文件中所有的數(shù)據(jù)

    f = open('test3.txt','r')
    print(f.read())
    
  • Python寫入內(nèi)容

    file=open("test.txt","r+")
    content=file.read(2)
    print(content)
    content=file.read()
    print(content)
    file.close()
    
  • 如果open是打開一個(gè)文件作谚,那么可以不用寫打開的模式,即只寫 open('test.txt')
    如果使用讀了多次庵芭,那么后面讀取的數(shù)據(jù)是從上次讀完后的位置開始的
    讀數(shù)據(jù)(readline)按照行讀取內(nèi)容
    Python寫入內(nèi)容

    file=open("test.txt","r+")
    content=file.readline()
    print(content)
    content=file.readline()
    print(content)
    
  • 讀數(shù)據(jù)(readlines)讀取每一行
    就像read沒有參數(shù)時(shí)一樣妹懒,readlines可以按照行的方式把整個(gè)文件中的內(nèi)容進(jìn)行一次性讀取,并且返回的是一個(gè)列表双吆,其中每一行的數(shù)據(jù)為一個(gè)元素

#coding=utf-8
f = open('test.txt', 'r')
content = f.readlines()
print(type(content))
i=1
for temp in content:
    print("%d:%s"%(i, temp))
    i+=1
f.close()

file = open("E:\\ceshi.txt")
read = file.readlines()
read2= file.readline()
print(read)
print(read2)

18.5. File對象的屬性

一個(gè)文件被打開后眨唬,你有一個(gè)file對象,你可以得到有關(guān)該文件的各種信息好乐。
以下是和file對象相關(guān)的所有屬性的列表:

屬性 描述
file.closed 返回true如果文件已被關(guān)閉匾竿,否則返回false。
file.mode 返回被打開文件的訪問模式曹宴。
file.name 返回文件的名稱搂橙。
file.softspace 如果用print輸出后,必須跟一個(gè)空格符,則返回false区转。否則返回true苔巨。

如下實(shí)例:

#!/usr/bin/python# -*- coding: UTF-8 -*-
# 打開一個(gè)文件
fo = open("foo.txt", "w")
print "文件名: ", fo.name
print "是否已關(guān)閉 : ", fo.closed
print "訪問模式 : ", fo.mode
print "末尾是否強(qiáng)制加空格 : ", fo.softspace

十九、文件的重命名废离、刪除

有些時(shí)候侄泽,需要對文件進(jìn)行重命名、刪除等一些操作蜻韭,python的os模塊中都有這么功能

19.1.文件重命名

os模塊中的rename()可以完成對文件的重命名操作
rename(需要修改的文件名, 新的文件名)

import os
os.rename("畢業(yè)論文.txt", "畢業(yè)論文-最終版.txt")

19.2.刪除文件

os模塊中的remove()可以完成對文件的刪除操作

remove(待刪除的文件名)
import os
os.remove("畢業(yè)論文.txt")

19.3.創(chuàng)建文件夾悼尾,刪除文件夾

Python里的目錄:
所有文件都包含在各個(gè)不同的目錄下,不過Python也能輕松處理肖方。
os模塊有許多方法能幫你創(chuàng)建闺魏,刪除和更改目錄。

  • mkdir()方法
    可以使用os模塊的mkdir()方法在當(dāng)前目錄下創(chuàng)建新的目錄們俯画。你需要提供一個(gè)包含了要創(chuàng)建的目錄名稱的參數(shù)析桥。
  • rmdir()方法
    rmdir()方法刪除目錄,目錄名稱以參數(shù)傳遞艰垂。
    注意:在刪除這個(gè)目錄之前泡仗,它的所有內(nèi)容應(yīng)該先被清除。
Import os
os.mkdir("aaa")
os.rmdir("test")
print(os.getcwd()) 獲取當(dāng)前目錄

二十猜憎、文件拷貝

  1. 打開現(xiàn)有一個(gè)文件1娩怎,讀取文件當(dāng)中的內(nèi)容
test = open("E:\\ceshi.txt","r")
read = test.readlines()
  1. 新建一個(gè)文件,寫入文件1當(dāng)中的內(nèi)容
test2 = open("test2.txt","w")
for x in read:
    test2.write(x)
test.close()
test2.close()
  1. 讀取新文件內(nèi)容
test3 = open("test2.txt",'r')
print(test3 .read())

十三胰柑、Python面向?qū)ο缶幊?/h3>

面向過程:根據(jù)業(yè)務(wù)邏輯從上到下寫代碼
面向?qū)ο螅?/strong>將數(shù)據(jù)與函數(shù)綁定到一起截亦,進(jìn)行封裝,這樣能夠更快速的開發(fā)程序柬讨,減少了重復(fù)代碼的重寫過程

面向?qū)ο缶幊痰?個(gè)非常重要的概念:類和對象

對象是面向?qū)ο缶幊痰暮诵目谑褂脤ο蟮倪^程中,為了將具有共同特征和行為的一組對象抽象定義姐浮,提出了另外一個(gè)新的概念——類

就相當(dāng)于制造飛機(jī)時(shí)的圖紙,用它來進(jìn)行創(chuàng)建的飛機(jī)就相當(dāng)于對象

類與對象的關(guān)系:類就是創(chuàng)建對象的模板

13.1. Python定義類并創(chuàng)建實(shí)例

13.1.1 類(Class) 由3個(gè)部分構(gòu)成:

類的名稱:類名
類的屬性:一組數(shù)據(jù)
類的方法:允許對進(jìn)行操作的方法 (行為)
對象 = 屬性 + 方法
靜態(tài) + 動態(tài)
引入:

  • 案例一:人類設(shè)計(jì),只關(guān)心3樣?xùn)|西:
    事物名稱(類名):人(Person)
    屬性:身高(height)葬馋、年齡(age)
    方法(行為/功能):跑(run)卖鲤、打架(fight)

  • 案例二:狗類的設(shè)計(jì)
    類名:狗(Dog)
    屬性:品種 、毛色畴嘶、性別蛋逾、名字、 腿兒的數(shù)量
    方法(行為/功能):叫 窗悯、跑区匣、咬人、吃蒋院、搖尾巴

13.1.2 以 Person 為例亏钩,定義一個(gè)Person類如下:
class Person(object):
    pass
xiaoming=Person();
xiaohong=Person();
print(xiaoming)#<__main__.Person object at 0x000001C113239128>
print(xiaohong)#<__main__.Person object at 0x000001C113239160>
print(xiaohong==xiaohong)#False

按照 Python 的編程習(xí)慣莲绰,類名以大寫字母開頭,緊接著是(object)姑丑,表示該類是從哪個(gè)類繼承下來的蛤签。類的繼承將在后面的章節(jié)講解,現(xiàn)在我們只需要簡單地從object類繼承栅哀。
pass語句什么也不做震肮,一般作為占位符或者創(chuàng)建占位程序,pass語句不會執(zhí)行任何操作

13.2.創(chuàng)建對象

通過上一節(jié)課程留拾,定義了一個(gè)Car類戳晌;就好比有車一個(gè)張圖紙,那么接下來就應(yīng)該把圖紙交給生成工人們?nèi)ド闪?br> python中痴柔,可以根據(jù)已經(jīng)定義的類去創(chuàng)建出一個(gè)個(gè)對象
創(chuàng)建對象的格式為:
對象名 = 類名()
創(chuàng)建對象demo:

# 定義類
class Car:
    # 移動
    def move(self):
        print('車在奔跑...')

    # 鳴笛
    def toot(self):
        print("車在鳴笛...嘟嘟..")

# 創(chuàng)建一個(gè)對象沦偎,并用變量BMW來保存它的引用
BMW = Car()
BMW.color = '黑色'
BMW.wheelNum = 4 #輪子數(shù)量
BMW.move()
BMW.toot()
print(BMW.color)
print(BMW.wheelNum)

image.png

總結(jié):

  • BMW = Car(),這樣就產(chǎn)生了一個(gè)Car的實(shí)例對象竞帽,此時(shí)也可以通過實(shí)例對象BMW來訪問屬性或者方法
  • 第一次使用BMW.color = '黑色'表示給BMW這個(gè)對象添加屬性扛施,如果后面再次出現(xiàn)BMW.color = xxx表示對屬性進(jìn)行修改
  • BMW是一個(gè)對象,它擁有屬性(數(shù)據(jù))和方法(函數(shù))
  • 當(dāng)創(chuàng)建一個(gè)對象時(shí)屹篓,就是用一個(gè)模子疙渣,來制造一個(gè)實(shí)物

13.3. Python中創(chuàng)建實(shí)例屬性

雖然可以通過Person類創(chuàng)建出xiaoming、xiaohong等實(shí)例堆巧,但是這些實(shí)例看上除了地址不同外妄荔,沒有什么其他不同。在現(xiàn)實(shí)世界中谍肤,區(qū)分xiaoming啦租、xiaohong要依靠他們各自的名字、性別荒揣、生日等屬性篷角。
如何讓每個(gè)實(shí)例擁有各自不同的屬性?由于Python是動態(tài)語言系任,對每一個(gè)實(shí)例恳蹲,都可以直接給他們的屬性賦值,例如俩滥,給xiaoming這個(gè)實(shí)例加上name嘉蕾、gender和birth屬性:

class Person(object):
    pass
xiaoming=Person();
xiaohong=Person();
xiaoming.name="小明"
xiaoming.age=12
xiaoming.grade=3

xiaohong.name="小紅"
xiaohong.age=19;
xiaohong.sex="女"

print(xiaoming)#地址
print(xiaohong)#地址
print(xiaoming.name)#小明
print(xiaoming==xiaohong)#False

13.4. Python中初始化實(shí)例屬性

在定義 Person 類時(shí),可以為Person類添加一個(gè)特殊的init()方法霜旧,當(dāng)創(chuàng)建實(shí)例時(shí)错忱,init()方法被自動調(diào)用,我們就能在此為每個(gè)實(shí)例都統(tǒng)一加上以下屬性:

class Person:
    def __init__(self,name,sex,age):
        self.name=name;
        self.sex=sex;
        self.age=age;

person1=Person("小明","男",19);
person2=Person("小紅","女",20);

print(person1.name,person1.sex,person1.age);#小明 男 19
print(person2.name,person2.sex,person2.age);#小紅 女 20

init()方法,在創(chuàng)建一個(gè)對象時(shí)默認(rèn)被調(diào)用以清,不需要手動調(diào)用init(self)中儿普,默認(rèn)有1個(gè)參數(shù)名字為self,如果在創(chuàng)建對象時(shí)傳遞了2個(gè)實(shí)參玖媚,那么init(self)中出了self作為第一個(gè)形參外還需要2個(gè)形參箕肃,例如init(self,x,y)
init(self)中的self參數(shù),不需要開發(fā)者傳遞今魔,python解釋器會自動把當(dāng)前的對象引用傳遞進(jìn)去

13.5. Python中訪問限制

我們可以給一個(gè)實(shí)例綁定很多屬性勺像,如果有些屬性不希望被外部訪問到怎么辦?
Python對屬性權(quán)限的控制是通過屬性名來實(shí)現(xiàn)的错森,如果一個(gè)屬性由雙下劃線開頭(__)吟宦,該屬性就無法被外部訪問

class Person(object):
    def __init__(self, name, score):
        self.name = name
        self.__score = score
p = Person('Bob', 59)
print(p.name,p._score);

但是,如果一個(gè)屬性以"xxx"的形式定義涩维,那它又可以被外部訪問了殃姓,以"xxx"定義的屬性在Python的類中被稱為特殊屬性,有很多預(yù)定義的特殊屬性可以使用瓦阐,通常我們不要把普通屬性用"xxx"定義蜗侈。

13.6. python中定義實(shí)例方法

一個(gè)實(shí)例的私有屬性就是以__開頭的屬性,無法被外部訪問睡蟋,那這些屬性定義有什么用踏幻?
雖然私有屬性無法從外部訪問,但是戳杀,從類的內(nèi)部是可以訪問的该面。除了可以定義實(shí)例的屬性外,還可以定義實(shí)例的方法信卡。

實(shí)例的方法就是在類中定義的函數(shù)隔缀,它的第一個(gè)參數(shù)永遠(yuǎn)是 self,指向調(diào)用該方法的實(shí)例本身傍菇,其他參數(shù)和一個(gè)普通函數(shù)是完全一樣的:

class Person:
    def __init__(self,name,age):
        self.__name=name
        self.age=age

    def getName(self):
        return self.__name;

person1=Person("張三",19)
print(person1.getName())

13.7. python中創(chuàng)建類屬性

類是模板猾瘸,而實(shí)例則是根據(jù)類創(chuàng)建的對象。
綁定在一個(gè)實(shí)例上的屬性不會影響其他實(shí)例丢习,
但是须妻,類本身也是一個(gè)對象,如果在類上綁定一個(gè)屬性泛领,則所有實(shí)例都可以訪問類的屬性,并且敛惊,所有實(shí)例訪問的類屬性都是同一個(gè)渊鞋!
也就是說,實(shí)例屬性每個(gè)實(shí)例各自擁有,互相獨(dú)立锡宋,而類屬性有且只有一份儡湾。

class Person:
    #聲明address地址
    address="earth"
    def __init__(self,name,age):
        self.name=name
        self.age=age

person1=Person('zhangsan',19)
print(person1.address)#earth
print(Person.address)#earth

13.8. python中定義類方法

和屬性類似,方法也分實(shí)例方法和類方法执俩。
在class中定義的全部是實(shí)例方法徐钠,實(shí)例方法第一個(gè)參數(shù) self 是實(shí)例本身。

class Person(object):
    count=0
    @classmethod
    def howMany(cls):
        return cls.count
    def __init__(self,name):
        self.name=name
        Person.count=Person.count+1
        print(Person.count,"-----------")

person1=Person("張三");
print(person1.howMany())#1
print(Person.howMany())#1

十四役首、Python中繼承

14.1. 繼承概念

面向?qū)ο蟮木幊處淼闹饕锰幹皇谴a的重用尝丐,實(shí)現(xiàn)這種重用的方法之一是通過繼承機(jī)制。

通過繼承創(chuàng)建的新類稱為子類或派生類衡奥,被繼承的類稱為基類爹袁、父類或超類。

14.2. 為什么要繼承

  • 新類不必從頭編寫矮固,代碼的重用
  • 新類從現(xiàn)有類繼承失息,就自動擁有了現(xiàn)有類的所有功能
  • 新類只需要編寫現(xiàn)有類缺少的新功能

在程序中,繼承描述的是事物之間的所屬關(guān)系,例如貓和狗都屬于動物.


image.png

14.3. 繼承特點(diǎn)以及單繼承

子類在繼承的時(shí)候,在定義類時(shí)档址,小括號()中為父類的名字
父類的屬性盹兢、方法,會被繼承給子類

class Dog(object):
    def __init__(self,name,color="黃色"):
        self.name=name
        self.color=color
    def run(self):
        print("%s在跑著"%self.name)

class JinMao(Dog):
    def setNewName(self,name):
        self.name=name
    def eat(self):
        print("%s在吃飯守伸,顏色是%s"%(self.name,self.color))

dog1=JinMao("大黃")
dog1.run()
dog1.setNewName("小阿黃")
dog1.eat()

說明:雖然子類沒有定義init方法绎秒,但是父類有,所以在子類繼承父類的時(shí)候這個(gè)方法被繼承了含友,所以只要創(chuàng)建子類的對象替裆,就默認(rèn)執(zhí)行了這個(gè)init方法.

14.4. 多繼承

class Ma(object):
    def printMa(self):
        print("ma的特性")
class Lv(object):
    def printLv(self):
        print("lv的特性")
class LuoZi(Ma,Lv):
    def printLuo(self):
        print("騾子的特性")

luo=LuoZi()
luo.printLuo()
luo.printLv()
luo.printMa()

14.5. 多繼承同名方法調(diào)用

class Ma(object):
    def printMa(self):
        print("ma的特性")
    def run(self):
        print("萬馬奔騰")
class Lv(object):
    def printLv(self):
        print("lv的特性")
    def run(self):
        print("萬驢奔騰")
class LuoZi(Ma,Lv):
    def printLuo(self):
        print("騾子的特性")

luo=LuoZi()
luo.run()
print(LuoZi.__mro__)

先繼承哪個(gè),就調(diào)用哪個(gè)的方法
關(guān)于Python類的多繼承中的mro屬性使用的C3算法以及繼承順序解釋

14.6. 方法的重寫及調(diào)用父類方法

#方法的重寫
class Animal(object):
   def __init__(self,name,sex,color):
      self.name=name
      self.sex=sex
      self.color=color
      
   def play(self):
      print("動物都有各自的玩法")
      
class Cat(Animal):
   def __init__(self,name,sex,color,age):
      #super代表父類
      super().__init__(name,sex,color)
      self.age=age
   #方法的重寫/覆蓋
   def play(self):
      super().play()
      print("%d歲的貓喜歡爬墻"%self.age)
c=Cat("小花","母","花色",8)
c.play()#貓喜歡爬墻
print(c.name,c.sex)

14.7. 類屬性和對象屬性

類屬性就是類(類對象)所擁有的屬性窘问。它被類和所有對象所擁有辆童。對于共有類屬性,在類外可以通過類對象和實(shí)例對象訪問惠赫。

  • 類屬性
class Dog(object):
    name = "Tom"
    __age = 10

print(Dog.name)#正確
print(Dog.__age)#錯(cuò)誤把鉴,__age屬于私有屬性,不能在外邊訪問

d=Dog()
print(d.name)#正確
print(d.__age)#錯(cuò)誤儿咱,__age屬于私有屬性庭砍,不能在外邊訪問
  • 對象屬性
def __init__(self,name):
   self.name=name

print(Dog.name)#Tom
d=Dog("大黃",19)
print(d.name)#大黃
print(d.getAge())
def getAge(self):
    return self.__age

14.8.python中多態(tài)(了解)

類具有繼承關(guān)系,并且子類類型可以向上轉(zhuǎn)型看做父類類型混埠,如果我們從 Person 派生出 Student和Teacher 怠缸,并都寫了一個(gè) whoAmI() 方法,在一個(gè)函數(shù)中钳宪,如果我們接收一個(gè)變量 x揭北,則無論該 x 是 Person扳炬、Student還是 Teacher,都可以正確打印出結(jié)果:這種行為稱為多態(tài)搔体。
方法調(diào)用將作用在 x 的實(shí)際類型上恨樟。s 是Student類型,它實(shí)際上擁有自己的 whoAmI()方法以及從 Person繼承的 whoAmI方法疚俱,但調(diào)用 s.whoAmI()總是先查找它自身的定義劝术,如果沒有定義,則順著繼承鏈向上查找呆奕,直到在某個(gè)父類中找到為止养晋。

class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender
    def whoAmI(self):
        return 'I am a Person, my name is ' + self.name

class Student(Person):
    def __init__(self, name, gender, score):
        super().__init__(name, gender)
        self.score = score
    def whoAmI(self):
        return 'I am a Student, my name is ' + self.name

class Teacher(Person):
    def __init__(self, name, gender, course):
        super(Teacher, self).__init__(name, gender)
        self.course = course
    def whoAmI(self):
        return 'I am a Teacher, my name is '+ self.name
p = Person('Tim', 'Male')
s = Student('Bob', 'Male', 88)
t = Teacher('Alice', 'Female', 'English')
print(p.whoAmI())
print(s.whoAmI())
print(t.whoAmI())

14.9.python中多重繼承(了解)

除了從一個(gè)父類繼承外,Python允許從多個(gè)父類繼承登馒,稱為多重繼承匙握。

class A(object):
    def __init__(self, a):
        print ('init A...')
        self.a = a

class B(A):
    def __init__(self, a):
        super().__init__(a)
        print ('init B...')

class C(A):
    def __init__(self, a):
        super().__init__(a)
        print ('init C...')

class D(B, C):
    def __init__(self, a):
        super().__init__(a)
        print ('init D...')

d=D("--");
# init A...
# init C...
# init B...
# init D...

十五、Python中異常

15.1. 什么是異常陈轿?

異常即是一個(gè)事件圈纺,該事件會在程序執(zhí)行過程中發(fā)生,影響了程序的正常執(zhí)行麦射。
一般情況下蛾娶,在Python無法正常處理程序時(shí)就會發(fā)生一個(gè)異常。
異常是Python對象潜秋,表示一個(gè)錯(cuò)誤蛔琅。
當(dāng)Python腳本發(fā)生異常時(shí)我們需要捕獲處理它,否則程序會終止執(zhí)行峻呛。

#演示各種異常情況
#第一個(gè)異常罗售,數(shù)學(xué)異常
# ZeroDivisionError: division by zero <<ArithmeticError ctrl+/快速注釋
# i=1/0
#第二個(gè)異常,類型轉(zhuǎn)換錯(cuò)誤
# TypeError: must be str, not int
# age=int(input("請輸入年齡"))
# print("年齡是"+age)
#第三個(gè)異常:文件異常
# FileNotFoundError: [Errno 2] No such file or directory: 'aa.txt'
# file=open("aa.txt","r")
# file.write("哈哈")
# file.close()
#第四個(gè)異常 未定義異常
# NameError: name 'num' is not defined
# print(num)#編譯錯(cuò)誤

15.2.異常處理

捕捉異彻呈觯可以使用try/except語句寨躁。
try/except語句用來檢測try語句塊中的錯(cuò)誤,從而讓except語句捕獲異常信息并處理牙勘。
如果你不想在異常發(fā)生時(shí)結(jié)束你的程序职恳,只需在try里捕獲它。
try的工作原理是方面,當(dāng)開始一個(gè)try語句后放钦,python就在當(dāng)前程序的上下文中作標(biāo)記,這樣當(dāng)異常出現(xiàn)時(shí)就可以回到這里恭金,try子句先執(zhí)行操禀,接下來會發(fā)生什么依賴于執(zhí)行時(shí)是否出現(xiàn)異常。

如果當(dāng)try后的語句執(zhí)行時(shí)發(fā)生異常横腿,python就跳回到try并執(zhí)行第一個(gè)匹配該異常的except子句床蜘,異常處理完畢辙培,控制流就通過整個(gè)try語句(除非在處理異常時(shí)又引發(fā)新的異常)。

如果在try后的語句里發(fā)生了異常邢锯,卻沒有匹配的except子句,異常將被遞交到上層的try搀别,或者到程序的最上層(這樣將結(jié)束程序丹擎,并打印缺省的出錯(cuò)信息)。
如果在try子句執(zhí)行時(shí)沒有發(fā)生異常歇父,python將執(zhí)行else語句后的語句(如果有else的話)蒂培,然后控制流通過整個(gè)try語句。

15.3.異常效果

try:
     i=1/0
except:
    print("出現(xiàn)錯(cuò)誤")
else:
    print("一切正常")
    try:
     i=1/0
except ArithmeticError:
    print("出現(xiàn)數(shù)學(xué)錯(cuò)誤")
except ModuleNotFoundError:
    print("model找不到")
else:
    print("一切正常")

15.4.Try-finally 語句

try:
     i=1/0
except:
    print("出現(xiàn)錯(cuò)誤")
else:
    print("一切正常")
finally:
    print("無論如何都會執(zhí)行")

15.5.主動觸發(fā)異常

我們可以使用raise語句自己觸發(fā)異常
raise語法格式如下

i=1;
if i<10:
    raise Exception("數(shù)字i不能小于10")
    #異常觸發(fā)后榜苫,后邊代碼就不會執(zhí)行
#拋出異常
class Person(object):
    def __init__(self,name,age):
        self.name=name
        self.__age=age
    def setAge(self,age):
        if age<0 or age>150:
            raise Exception("年齡非法")
        else:
            self.__age=age
    def getAge(self):
        return self.__age
try:
    p=Person("張三",18)
    p.setAge(190)
except Exception as result:
    print(result)

十六护戳、Python單元測試

16.1. 單元測試框架Unittest介紹

TestCase:一個(gè)測試用例,或是一個(gè)完整的測試流程,包括測試前準(zhǔn)備環(huán)境的搭建(setUp)垂睬,執(zhí)行測試代碼(run)以及測試后環(huán)境的還原(tearDown)媳荒。
單元測試(unittest)的本質(zhì)也就在這里,一個(gè)測試用例是一個(gè)完整的測試單元驹饺,通過運(yùn)行這個(gè)測試單元钳枕,可以對某一個(gè)問題進(jìn)行驗(yàn)證。
TestSuite:多個(gè)測試用例TestCase集合在一起赏壹,就是TestSuite鱼炒,而且TestSuite也可以嵌套TestSuite。
TestLoader:用來加載TestCase到TestSuite中的蝌借,其中有幾個(gè)loadTestsFrom__()方法昔瞧,就是從各個(gè)地方尋找TestCase,創(chuàng)建它們的實(shí)例菩佑,然后add到TestSuite中自晰,再返回一個(gè)TestSuite實(shí)例。
TextTestRunner:是來執(zhí)行測試用例的擎鸠,其中的run(test)會執(zhí)行TestSuite/TestCase中的run(result)方法缀磕。測試的結(jié)果會保存到TextTestResult實(shí)例中,包括運(yùn)行了多少測試用例劣光,成功了多少袜蚕,失敗了多少等信息。

image.png

整個(gè)流程:首先是要寫好TestCase绢涡,然后由TestLoader加載TestCase到TestSuite牲剃,然后由TextTestRunner來運(yùn)行TestSuite,運(yùn)行的結(jié)果保存在TextTestResult中雄可,整個(gè)過程集成在unittest.main模塊中凿傅。
步驟:

  1. 導(dǎo)入unittest模塊
  2. 當(dāng)前測試類繼承unittest.TestCase缠犀,相當(dāng)于當(dāng)前利用unittest創(chuàng)建了一個(gè)test case,這個(gè)test case是能夠被unittest直接識別聪舒。
  3. 寫setUP(),主要是打開瀏覽器和打開站點(diǎn)
  4. 寫一個(gè)test_search()用例寫搜索的代碼
  5. 寫tearDown(),主要是瀏覽器退出操作

16.2. unittest的簡單介紹及使用

一個(gè)完整的測試腳本包含:

  1. import unittest
  2. 定義一個(gè)繼承自unittest.TestCase的測試用例類,相當(dāng)于當(dāng)前利用unittest創(chuàng)建了一個(gè)test case辨液,這個(gè)test case是能夠被unittest直接識別。
  3. 定義setUp和tearDown箱残,在每個(gè)測試用例前后做一些輔助工作滔迈。
  4. 定義測試用例,名字以test開頭被辑。
  5. 一個(gè)測試用例應(yīng)該只測試一個(gè)方面燎悍,測試目的和測試內(nèi)容應(yīng)很明確。主要是調(diào)用assertEqual盼理、assertRaises等斷言方法判斷程序執(zhí)行結(jié)果和預(yù)期值是否相符谈山。
  6. 調(diào)用unittest.main()啟動測試
  7. 如果測試未通過,會輸出相應(yīng)的錯(cuò)誤提示宏怔。如果測試全部通過則不顯示任何東西奏路,也可以添加-v參數(shù)顯示詳細(xì)信息。
# -*- coding: utf-8 -*-
import unittest
class PythonunitTest(unittest.TestCase):
    def setUp(self):
        print("---測試初始化工作---")

    def testF(self):
        i=1+1
        print(i)

    def tearDown(self):
        print("---測試掃尾工作----")
if __name__ == "__main__":
    unittest.main()

16.3.斷言

image.png
# -*- coding: utf-8 -*-
import unittest
class PythonunitTest(unittest.TestCase):
    def setUp(self):
        print("---測試初始化工作---")

    def testF(self):
       self.assertEqual(5+5,10);
       self.assertTrue(1==1)
       self.assertFalse(1==2)

    def tearDown(self):
        print("---測試掃尾工作----")
if __name__ == "__main__":
    unittest.main()

16.4.TestSuite

TestSuite:
而多個(gè)測試用例TestCase集合在一起举哟,就是TestSuite思劳,而且TestSuite也可以嵌套TestSuite。
TestLoader:
用來加載TestCase到TestSuite中的妨猩,其中有幾個(gè)loadTestsFrom__()方法潜叛,就是從各個(gè)地方尋找TestCase,創(chuàng)建它們的實(shí)例壶硅,然后add到TestSuite中威兜,再返回一個(gè)TestSuite實(shí)例。
TextTestRunner:
是來執(zhí)行測試用例的庐椒,其中的run(test)會執(zhí)行TestSuite/TestCase中的run(result)方法椒舵。

import unittest

class Test1(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def test_one(self):
print("test1中第一個(gè)測試案例-----")

def test_two(self):
    print("test1中第二個(gè)測試案例----")

class Test2(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def test_one(self):
print("test2中第一個(gè)測試案例-----")
def test_two(self):
print("test2中第二個(gè)測試案例-----")

16.5.新建一個(gè)py文件

if name == 'main':
suite = unittest.TestSuite()
# tests = [Test1("test_one"), Test1("test_two"), Test2("test_one")]
# suite.addTests(tests)
suite.addTest(Test1('test_one'))
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)

如果想全部加載到testSuite中

suite.addTest(unittest.TestLoader().loadTestsFromTestCase(PythonTest1))

suite.addTest(unittest.TestLoader().loadTestsFromTestCase(PythonTest2))

16.6.總結(jié)

1.unittest是Python自帶的單元測試框架,我們可以用其來作為我們自動化測試框架的用例組織執(zhí)行框架约谈。
2.unittest的流程:寫好TestCase笔宿,然后由TestLoader加載TestCase到TestSuite,然后由 TextTestRunner來運(yùn)行TestSuite棱诱,運(yùn)行的結(jié)果保存在TextTestResult中泼橘,我們通過命令行或者 unittest.main()執(zhí)行時(shí),main會調(diào)用TextTestRunner中的run來執(zhí)行迈勋,或者我們可以直接通過 TextTestRunner來執(zhí)行用例炬灭。
3.一個(gè)class繼承unittest.TestCase即是一個(gè)TestCase,其中以 test 開頭的方法在load時(shí)被加載為一個(gè)真正的TestCase靡菇。
4.verbosity參數(shù)可以控制執(zhí)行結(jié)果的輸出重归,0 是簡單報(bào)告米愿、1 是一般報(bào)告、2 是詳細(xì)報(bào)告鼻吮。
5.可以通過addTest和addTests向suite中添加case或suite育苟,可以用TestLoader的loadTestsFrom__()方法。
6.用 setUp()椎木、tearDown()宙搬、setUpClass()以及 tearDownClass()可以在用例執(zhí)行前布置環(huán)境,以及在用例執(zhí)行后清理環(huán)境
7.我們可以通過skip拓哺,skipIf,skipUnless裝飾器跳過某個(gè)case脖母,或者用TestCase.skipTest方法士鸥。
8.參數(shù)中加stream,可以將報(bào)告輸出到文件:可以用TextTestRunner輸出txt報(bào)告谆级,以及可以用HTMLTestRunner輸出html報(bào)告烤礁。

十七、HTMLTestRunner

對于unittest框架肥照,運(yùn)行后脚仔,測試結(jié)果不便于查看,同時(shí)多個(gè)case存在的時(shí)候舆绎,可能會導(dǎo)致case result記錄不正確的情況鲤脏。

為此,引入了HTMLTestRunner.py,它是Python標(biāo)準(zhǔn)庫unittest模塊的一個(gè)擴(kuò)展吕朵。它可以生成直觀的HTML測試報(bào)告猎醇。

17.1.將HTMLTestRunner.py拷貝到當(dāng)前項(xiàng)目下

17.2.新建一個(gè)py類

if name == 'main':
suite = unittest.TestSuite()
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(Test1))

#  定義生成測試報(bào)告的名稱

filename1=r""+str(time.strftime('%Y%m%d%H%M%S'))+".html"
fp = open(filename1, 'wb')
# 定義測試報(bào)告的路徑,標(biāo)題努溃,描述等內(nèi)容

runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title=u'自動化測試報(bào)告',description=u'自動化測試報(bào)告')
runner.run(suite)

17.3.執(zhí)行方法硫嘶,生成測試報(bào)告

17.4.使用瀏覽器打開

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市梧税,隨后出現(xiàn)的幾起案子沦疾,更是在濱河造成了極大的恐慌,老刑警劉巖第队,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哮塞,死亡現(xiàn)場離奇詭異,居然都是意外死亡斥铺,警方通過查閱死者的電腦和手機(jī)彻桃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晾蜘,“玉大人邻眷,你說我怎么就攤上這事眠屎。” “怎么了肆饶?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵改衩,是天一觀的道長。 經(jīng)常有香客問我驯镊,道長葫督,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任板惑,我火速辦了婚禮橄镜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘冯乘。我一直安慰自己洽胶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布裆馒。 她就那樣靜靜地躺著姊氓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喷好。 梳的紋絲不亂的頭發(fā)上翔横,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音梗搅,去河邊找鬼禾唁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛些膨,可吹牛的內(nèi)容都是我干的蟀俊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼订雾,長吁一口氣:“原來是場噩夢啊……” “哼肢预!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起洼哎,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤烫映,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后噩峦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锭沟,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年识补,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了族淮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖祝辣,靈堂內(nèi)的尸體忽然破棺而出贴妻,到底是詐尸還是另有隱情,我是刑警寧澤蝙斜,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布名惩,位于F島的核電站,受9級特大地震影響孕荠,放射性物質(zhì)發(fā)生泄漏娩鹉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一稚伍、第九天 我趴在偏房一處隱蔽的房頂上張望弯予。 院中可真熱鬧,春花似錦个曙、人聲如沸熙涤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至那槽,卻和暖如春悼沿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背骚灸。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工糟趾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人甚牲。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓义郑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親丈钙。 傳聞我的和親對象是個(gè)殘疾皇子非驮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345