在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python教程基礎(chǔ)篇,超詳細(xì)超長(zhǎng)!

人工智能和機(jī)器人研究院 ? 來(lái)源:未知 ? 作者:李倩 ? 2018-09-19 17:35 ? 次閱讀

安裝Python

前往官網(wǎng)下載對(duì)應(yīng)平臺(tái)對(duì)應(yīng)工具。另外Python2.7版本和3.3版本并不兼容,所以開(kāi)發(fā)時(shí)請(qǐng)注意使用Python的版本。

作為Mac OS X使用者,其實(shí)更推薦PyCharm IDE。安裝之后直接使用即可。

數(shù)據(jù)類型

計(jì)算機(jī)顧名思義就是可以做數(shù)學(xué)計(jì)算的機(jī)器,因此,計(jì)算機(jī)程序理所當(dāng)然地可以處理各種數(shù)值。但是,計(jì)算機(jī)能處理的遠(yuǎn)不止數(shù)值,還可以處理文本、圖形、音頻視頻、網(wǎng)頁(yè)等各種各樣的數(shù)據(jù),不同的數(shù)據(jù),需要定義不同的數(shù)據(jù)類型。在Python中,能夠直接處理的數(shù)據(jù)類型有以下幾種:

整數(shù)

Python可以處理任意大小的整數(shù),當(dāng)然包括負(fù)整數(shù),在Python程序中,整數(shù)的表示方法和數(shù)學(xué)上的寫(xiě)法一模一樣,例如:1,100,-8080,0,等等。

計(jì)算機(jī)由于使用二進(jìn)制,所以,有時(shí)候用十六進(jìn)制表示整數(shù)比較方便,十六進(jìn)制用0x前綴和0-9,a-f表示,例如:0xff00,0xa5b4c3d2,等等。

浮點(diǎn)數(shù)

浮點(diǎn)數(shù)也就是小數(shù),之所以稱為浮點(diǎn)數(shù),是因?yàn)榘凑湛茖W(xué)記數(shù)法表示時(shí),一個(gè)浮點(diǎn)數(shù)的小數(shù)點(diǎn)位置是可變的,比如,1.23×10^9 和 12.3×10^8 是相等的。浮點(diǎn)數(shù)可以用數(shù)學(xué)寫(xiě)法,如1.23,3.14,-9.01,等等。但是對(duì)于很大或很小的浮點(diǎn)數(shù),就必須用科學(xué)計(jì)數(shù)法表示,把10用e替代,1.23×10^9 就是1.23e9,或者12.3e8,0.000012可以寫(xiě)成1.2e-5,等等。

整數(shù)和浮點(diǎn)數(shù)在計(jì)算機(jī)內(nèi)部存儲(chǔ)的方式是不同的,整數(shù)運(yùn)算永遠(yuǎn)是精確的(除法難道也是精確的?是的!),而浮點(diǎn)數(shù)運(yùn)算則可能會(huì)有四舍五入的誤差。

字符串

字符串是以’’或””括起來(lái)的任意文本,比如’abc’,”xyz”等等。請(qǐng)注意,’’或””本身只是一種表示方式,不是字符串的一部分,因此,字符串’abc’只有a,b,c這3個(gè)字符。

布爾值

布爾值和布爾代數(shù)的表示完全一致,一個(gè)布爾值只有True、False兩種值,要么是True,要么是False,在Python中,可以直接用True、False表示布爾值(請(qǐng)注意大小寫(xiě)),也可以通過(guò)布爾運(yùn)算計(jì)算出來(lái)。

布爾值可以用and、or和not運(yùn)算。

and運(yùn)算是與運(yùn)算,只有所有都為 True,and運(yùn)算結(jié)果才是 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。

空值

空值是Python里一個(gè)特殊的值,用None表示。None不能理解為0,因?yàn)?是有意義的,而None是一個(gè)特殊的空值。

此外,Python還提供了列表、字典等多種數(shù)據(jù)類型,還允許創(chuàng)建自定義數(shù)據(jù)類型。

print 語(yǔ)句

print語(yǔ)句可以向屏幕上輸出指定的文字。比如輸出’hello, world’,用代碼實(shí)現(xiàn)如下:

>>> print 'hello, world'

注意:

1.當(dāng)我們?cè)赑ython交互式環(huán)境下編寫(xiě)代碼時(shí),>>>是Python解釋器的提示符,不是代碼的一部分。

2.當(dāng)我們?cè)谖谋揪庉嬈髦芯帉?xiě)代碼時(shí),千萬(wàn)不要自己添加 >>>。

print語(yǔ)句也可以跟上多個(gè)字符串,用逗號(hào)“,”隔開(kāi),就可以連成一串輸出:

>>> print 'The quick brown fox', 'jumps over', 'the lazy dog'The quick brown fox jumps over the lazy dog

print會(huì)依次打印每個(gè)字符串,遇到逗號(hào)“,”會(huì)輸出一個(gè)空格,因此,輸出的字符串是這樣拼起來(lái)的:

print也可以打印整數(shù),或者計(jì)算結(jié)果:

>>> print 300300 #運(yùn)行結(jié)果>>> print 100 + 200300 #運(yùn)行結(jié)果

因此,我們可以把計(jì)算100 + 200的結(jié)果打印得更漂亮一點(diǎn):

>>> print '100 + 200 =', 100 + 200100 + 200 = 300 #運(yùn)行結(jié)果

注意: 對(duì)于100 + 200,Python解釋器自動(dòng)計(jì)算出結(jié)果300,但是,’100 + 200 =’是字符串而非數(shù)學(xué)公式,Python把它視為字符串,請(qǐng)自行解釋上述打印結(jié)果。

Python的注釋

任何時(shí)候,我們都可以給程序加上注釋。注釋是用來(lái)說(shuō)明代碼的,給自己或別人看,而程序運(yùn)行的時(shí)候,Python解釋器會(huì)直接忽略掉注釋,所以,有沒(méi)有注釋不影響程序的執(zhí)行結(jié)果,但是影響到別人能不能看懂你的代碼。

Python的注釋以#開(kāi)頭,后面的文字直到行尾都算注釋

# 這一行全部都是注釋...print 'hello' # 這也是注釋

注釋還有一個(gè)巧妙的用途,就是一些代碼我們不想運(yùn)行,但又不想刪除,就可以用注釋暫時(shí)屏蔽掉:

# 暫時(shí)不想運(yùn)行下面一行代碼: # print 'hello, python.'

變量

在Python中,變量的概念基本上和初中代數(shù)的方程變量是一致的。

例如,對(duì)于方程式y(tǒng)=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è)變量名表示,變量名必須是 大小寫(xiě)英文、數(shù)字和下劃線(_)的組合,且不能用數(shù)字開(kāi)頭 ,比如:

a = 1

變量a是一個(gè)整數(shù)。

t_007 = 'T007'

變量t_007是一個(gè)字符串。

在Python中,等號(hào)=是賦值語(yǔ)句,可以把任意數(shù)據(jù)類型賦值給變量,同一個(gè)變量可以反復(fù)賦值,而且可以是不同類型的變量,例如:

a = 123 # a是整數(shù)print a a = 'Chars' # a變?yōu)樽址畃rint a

這種變量本身類型不固定的語(yǔ)言稱之為動(dòng)態(tài)語(yǔ)言,與之對(duì)應(yīng)的是靜態(tài)語(yǔ)言。

靜態(tài)語(yǔ)言在定義變量時(shí)必須指定變量類型,如果賦值的時(shí)候類型不匹配,就會(huì)報(bào)錯(cuò)。例如Java是靜態(tài)語(yǔ)言,賦值語(yǔ)句如下(// 表示注釋):

int a = 123; // a是整數(shù)類型變量a = "Chars"; // 錯(cuò)誤:不能把字符串賦給整型變量

和靜態(tài)語(yǔ)言相比,動(dòng)態(tài)語(yǔ)言更靈活,就是這個(gè)原因。

請(qǐng)不要把賦值語(yǔ)句的等號(hào)等同于數(shù)學(xué)的等號(hào)。比如下面的代碼:

x = 10x = x + 2

如果從數(shù)學(xué)上理解x = x + 2那無(wú)論如何是不成立的,在程序中,賦值語(yǔ)句先計(jì)算右側(cè)的表達(dá)式x + 2,得到結(jié)果12,再賦給變量x。由于x之前的值是10,重新賦值后,x的值變成12。

最后,理解變量在計(jì)算機(jī)內(nèi)存中的表示也非常重要。當(dāng)我們寫(xiě):a = 'ABC'時(shí),Python解釋器干了兩件事情:

在內(nèi)存中創(chuàng)建了一個(gè)’ABC’的字符串;

在內(nèi)存中創(chuàng)建了一個(gè)名為a的變量,并把它指向’ABC’。

也可以把一個(gè)變量a賦值給另一個(gè)變量b,這個(gè)操作實(shí)際上是把變量b指向變量a所指向的數(shù)據(jù),例如下面的代碼:

a = 'ABC'b = a a = 'XYZ'print b

最后一行打印出變量b的內(nèi)容到底是'ABC'呢還是'XYZ'?如果從數(shù)學(xué)意義上理解,就會(huì)錯(cuò)誤地得出b和a相同,也應(yīng)該是'XYZ',但實(shí)際上b的值是'ABC',讓我們一行一行地執(zhí)行代碼,就可以看到到底發(fā)生了什么事:

執(zhí)行a = 'ABC',解釋器創(chuàng)建了字符串'ABC'和變量a,并把a(bǔ)指向'ABC':

執(zhí)行b = a,解釋器創(chuàng)建了變量 b,并把b指向 a 指向的字符串'ABC':

執(zhí)行a = 'XYZ',解釋器創(chuàng)建了字符串'XYZ',并把a(bǔ)的指向改為'XYZ',但b并沒(méi)有更改:

所以,最后打印變量b的結(jié)果自然是'ABC'了。

字符串

定義字符串

前面我們講解了什么是字符串。字符串可以用''或者""括起來(lái)表示。

如果字符串本身包含’怎么辦?比如我們要表示字符串I'm OK,這時(shí),可以用" "括起來(lái)表示:

"I'm OK"

類似的,如果字符串包含”,我們就可以用’ ‘括起來(lái)表示:

'Learn "Python" in Chars's Blog'

如果字符串既包含’又包含”怎么辦?

這個(gè)時(shí)候,就需要對(duì)字符串的某些特殊字符進(jìn)行“轉(zhuǎn)義”,Python字符串用進(jìn)行轉(zhuǎn)義。

要表示字符串Bob said "I'm OK".

由于 ‘ 和 “ 會(huì)引起歧義,因此,我們?cè)谒懊娌迦胍粋€(gè)表示這是一個(gè)普通字符,不代表字符串的起始,因此,這個(gè)字符串又可以表示為

'Bob said "I'm OK".'

注意:轉(zhuǎn)義字符 不計(jì)入字符串的內(nèi)容中。

常用的轉(zhuǎn)義字符還有:

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

raw字符串與多行字符串

如果一個(gè)字符串包含很多需要轉(zhuǎn)義的字符,對(duì)每一個(gè)字符都進(jìn)行轉(zhuǎn)義會(huì)很麻煩。為了避免這種情況,我們可以在字符串前面加個(gè)前綴r,表示這是一個(gè) raw 字符串,里面的字符就不需要轉(zhuǎn)義了。例如:

r'(~_~)/ (~_~)/'

但是r'...'表示法不能表示多行字符串,也不能表示包含'和"的字符串(為什么?)

如果要表示多行字符串,可以用'''...'''表示:

'''Line 1 Line 2 Line 3'''

上面這個(gè)字符串的表示方法和下面的是完全一樣的:

'Line 1 Line 2 Line 3'

還可以在多行字符串前面添加r,把這個(gè)多行字符串也變成一個(gè)raw字符串:

r'''Python is created by "Guido". It is free and easy to learn. Let's start learn Python in Chars's Blog!'''

Unicode字符串

字符串還有一個(gè)編碼問(wèn)題。

因?yàn)橛?jì)算機(jī)只能處理數(shù)字,如果要處理文本,就必須先把文本轉(zhuǎn)換為數(shù)字才能處理。最早的計(jì)算機(jī)在設(shè)計(jì)時(shí)采用8個(gè)比特(bit)作為一個(gè)字節(jié)(byte),所以,一個(gè)字節(jié)能表示的最大的整數(shù)就是255(二進(jìn)制11111111=十進(jìn)制255),0 – 255被用來(lái)表示大小寫(xiě)英文字母、數(shù)字和一些符號(hào),這個(gè)編碼表被稱為ASCII編碼,比如大寫(xiě)字母 A 的編碼是65,小寫(xiě)字母 z 的編碼是122。

如果要表示中文,顯然一個(gè)字節(jié)是不夠的,至少需要兩個(gè)字節(jié),而且還不能和ASCII編碼沖突,所以,中國(guó)制定了GB2312編碼,用來(lái)把中文編進(jìn)去。

類似的,日文和韓文等其他語(yǔ)言也有這個(gè)問(wèn)題。為了統(tǒng)一所有文字的編碼,Unicode應(yīng)運(yùn)而生。Unicode把所有語(yǔ)言都統(tǒng)一到一套編碼里,這樣就不會(huì)再有亂碼問(wèn)題了。

Unicode通常用兩個(gè)字節(jié)表示一個(gè)字符,原有的英文編碼從單字節(jié)變成雙字節(jié),只需要把高字節(jié)全部填為0就可以。

因?yàn)镻ython的誕生比Unicode標(biāo)準(zhǔn)發(fā)布的時(shí)間還要早,所以最早的Python只支持ASCII編碼,普通的字符串’ABC’在Python內(nèi)部都是ASCII編碼的。

Python在后來(lái)添加了對(duì)Unicode的支持,以Unicode表示的字符串用u’…’表示,比如:

print u'中文'中文

注意: 不加 u ,中文就不能正常顯示。

Unicode字符串除了多了一個(gè) u 之外,與普通字符串沒(méi)啥區(qū)別,轉(zhuǎn)義字符和多行表示法仍然有效:

轉(zhuǎn)義:

u'中文 日文 韓文'

多行:

u'''第一行 第二行'''

raw+多行:

ur'''Python的Unicode字符串支持"中文", "日文", "韓文"等多種語(yǔ)言'''

如果中文字符串在Python環(huán)境下遇到UnicodeDecodeError,這是因?yàn)?py文件保存的格式有問(wèn)題。可以在第一行添加注釋

# -*- coding: utf-8 -*-

目的是告訴Python解釋器,用UTF-8編碼讀取源代碼。然后用Notepad++ 另存為… 并選擇UTF-8格式保存。

List

創(chuàng)建list

Python內(nèi)置的一種數(shù)據(jù)類型是列表:list。list是一種有序的集合,可以隨時(shí)添加和刪除其中的元素。

比如,列出班里所有同學(xué)的名字,就可以用一個(gè)list表示:

>>> ['Michael', 'Bob', 'Tracy'] ['Michael', 'Bob', 'Tracy']

list是數(shù)學(xué)意義上的有序集合,也就是說(shuō),list中的元素是按照順序排列的。

構(gòu)造list非常簡(jiǎn)單,按照上面的代碼,直接用 [ ] 把list的所有元素都括起來(lái),就是一個(gè)list對(duì)象。通常,我們會(huì)把list賦值給一個(gè)變量,這樣,就可以通過(guò)變量來(lái)引用list:

>>> classmates = ['Michael', 'Bob', 'Tracy']>>> classmates # 打印classmates變量的內(nèi)容['Michael', 'Bob', 'Tracy']

由于Python是動(dòng)態(tài)語(yǔ)言,所以list中包含的元素并不要求都必須是同一種數(shù)據(jù)類型,我們完全可以在list中包含各種數(shù)據(jù):

>>> L = ['Michael', 100, True]

一個(gè)元素也沒(méi)有的list,就是空l(shuí)ist:

>>> empty_list = []

按照索引訪問(wèn)list

由于list是一個(gè)有序集合,所以,我們可以用一個(gè)list按分?jǐn)?shù)從高到低表示出班里的3個(gè)同學(xué):

>>> L = ['Adam', 'Lisa', 'Bart']

那我們?nèi)绾螐膌ist中獲取指定第 N 名的同學(xué)呢?方法是通過(guò)索引來(lái)獲取list中的指定元素。

需要特別注意的是,索引從 0 開(kāi)始,也就是說(shuō),第一個(gè)元素的索引是0,第二個(gè)元素的索引是1,以此類推。

因此,要打印第一名同學(xué)的名字,用 L[0]:

>>> print L[0] Adam

要打印第二名同學(xué)的名字,用 L[1]:

>>> print L[1] Lisa

要打印第三名同學(xué)的名字,用 L[2]:

>>> print L[2] Bart

要打印第四名同學(xué)的名字,用 L[3]:

>>> print L[3] Traceback (most recent call last): File "", line 1, in IndexError: list index out of range

報(bào)錯(cuò)了!IndexError意思就是索引超出了范圍,因?yàn)樯厦娴膌ist只有3個(gè)元素,有效的索引是 0,1,2。

所以,使用索引時(shí),千萬(wàn)注意不要越界。

倒序訪問(wèn)list

我們還是用一個(gè)list按分?jǐn)?shù)從高到低表示出班里的3個(gè)同學(xué):

>>> L = ['Adam', 'Lisa', 'Bart']

這時(shí),老師說(shuō),請(qǐng)分?jǐn)?shù)最低的同學(xué)站出來(lái)。

要寫(xiě)代碼完成這個(gè)任務(wù),我們可以先數(shù)一數(shù)這個(gè) list,發(fā)現(xiàn)它包含3個(gè)元素,因此,最后一個(gè)元素的索引是2:

>>> print L[2] Bart

有沒(méi)有更簡(jiǎn)單的方法?有!

Bart同學(xué)是最后一名,俗稱倒數(shù)第一,所以,我們可以用 -1 這個(gè)索引來(lái)表示最后一個(gè)元素:

>>> print L[-1] Bart

Bart同學(xué)表示躺槍。

類似的,倒數(shù)第二用 -2 表示,倒數(shù)第三用 -3 表示,倒數(shù)第四用 -4 表示:

>>> print L[-2] Lisa >>> print L[-3] Adam >>> print L[-4] Traceback (most recent call last): File "", line 1, in IndexError: list index out of range

L[-4] 報(bào)錯(cuò)了,因?yàn)榈箶?shù)第四不存在,一共只有3個(gè)元素。

使用倒序索引時(shí),也要注意不要越界。

添加新元素

現(xiàn)在,班里有3名同學(xué):

>>> L = ['Adam', 'Lisa', 'Bart']

今天,班里轉(zhuǎn)來(lái)一名新同學(xué) Paul,如何把新同學(xué)添加到現(xiàn)有的 list 中呢?

第一個(gè)辦法是用 list 的 append() 方法,把新同學(xué)追加到 list 的末尾:

>>> L = ['Adam', 'Lisa', 'Bart']>>> L.append('Paul')>>> print L ['Adam', 'Lisa', 'Bart', 'Paul']

append()總是把新的元素添加到 list 的尾部。

如果 Paul 同學(xué)表示自己總是考滿分,要求添加到第一的位置,怎么辦?

方法是用list的 insert()方法,它接受兩個(gè)參數(shù),第一個(gè)參數(shù)是索引號(hào),第二個(gè)參數(shù)是待添加的新元素:

>>> L = ['Adam', 'Lisa', 'Bart']>>> L.insert(0, 'Paul')>>> print L ['Paul', 'Adam', 'Lisa', 'Bart']

L.insert(0, ‘Paul’) 的意思是,’Paul’將被添加到索引為 0 的位置上(也就是第一個(gè)),而原來(lái)索引為 0 的Adam同學(xué),以及后面的所有同學(xué),都自動(dòng)向后移動(dòng)一位。

刪除元素

Paul同學(xué)剛來(lái)幾天又要轉(zhuǎn)走了,那么我們?cè)趺窗裀aul 從現(xiàn)有的list中刪除呢?

如果Paul同學(xué)排在最后一個(gè),我們可以用list的pop()方法刪除:

>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']>>> L.pop()'Paul'>>> print L ['Adam', 'Lisa', 'Bart']

pop()方法總是刪掉list的最后一個(gè)元素,并且它還返回這個(gè)元素,所以我們執(zhí)行 L.pop() 后,會(huì)打印出 ‘Paul’。

如果Paul同學(xué)不是排在最后一個(gè)怎么辦?比如Paul同學(xué)排在第三:

>>> L = ['Adam', 'Lisa', 'Paul', 'Bart']

要把Paul踢出list,我們就必須先定位Paul的位置。由于Paul的索引是2,因此,用 pop(2)把Paul刪掉:

>>> L.pop(2)'Paul'>>> print L ['Adam', 'Lisa', 'Bart']

替換元素

假設(shè)現(xiàn)在班里仍然是3名同學(xué):

>>> L = ['Adam', 'Lisa', 'Bart']

現(xiàn)在,Bart同學(xué)要轉(zhuǎn)學(xué)走了,碰巧來(lái)了一個(gè)Paul同學(xué),要更新班級(jí)成員名單,我們可以先把Bart刪掉,再把Paul添加進(jìn)來(lái)。

另一個(gè)辦法是直接用Paul把Bart給替換掉:

>>> L[2] = 'Paul'>>> print L L = ['Adam', 'Lisa', 'Paul']

對(duì)list中的某一個(gè)索引賦值,就可以直接用新的元素替換掉原來(lái)的元素,list包含的元素個(gè)數(shù)保持不變。

由于Bart還可以用 -1 做索引,因此,下面的代碼也可以完成同樣的替換工作:

>>> L[-1] = 'Paul'

Tuple

創(chuàng)建tuple

tuple是另一種有序的列表,中文翻譯為“ 元組 ”。tuple 和 list 非常類似,但是,tuple一旦創(chuàng)建完畢,就不能修改了。

同樣是表示班里同學(xué)的名稱,用tuple表示如下:

>>> t = ('Adam', 'Lisa', 'Bart')

創(chuàng)建tuple和創(chuàng)建list唯一不同之處是用( )替代了[ ]。

現(xiàn)在,這個(gè) t 就不能改變了,tuple沒(méi)有 append()方法,也沒(méi)有insert()和pop()方法。所以,新同學(xué)沒(méi)法直接往 tuple 中添加,老同學(xué)想退出 tuple 也不行。

獲取 tuple 元素的方式和 list 是一模一樣的,我們可以正常使用 t[0],t[-1]等索引方式訪問(wèn)元素,但是不能賦值成別的元素,不信可以試試:

>>> t[0] = 'Paul'Traceback (most recent call last): File "", line 1, in TypeError: 'tuple' object does not support item assignment

創(chuàng)建單元素tuple

tuple和list一樣,可以包含 0 個(gè)、1個(gè)和任意多個(gè)元素。

包含多個(gè)元素的 tuple,前面我們已經(jīng)創(chuàng)建過(guò)了。

包含 0 個(gè)元素的 tuple,也就是空tuple,直接用 ()表示:

>>> t = ()>>> print t ()

創(chuàng)建包含1個(gè)元素的 tuple 呢?來(lái)試試:

>>> t = (1)>>> print t1

好像哪里不對(duì)!t 不是 tuple ,而是整數(shù)1。為什么呢?

因?yàn)?)既可以表示tuple,又可以作為括號(hào)表示運(yùn)算時(shí)的優(yōu)先級(jí),結(jié)果 (1) 被Python解釋器計(jì)算出結(jié)果 1,導(dǎo)致我們得到的不是tuple,而是整數(shù) 1。

正是因?yàn)橛?)定義單元素的tuple有歧義,所以 Python 規(guī)定,單元素 tuple 要多加一個(gè)逗號(hào)“,”,這樣就避免了歧義:

>>> t = (1,)>>> print t (1,)

可變的tuple

前面我們看到了tuple一旦創(chuàng)建就不能修改。現(xiàn)在,我們來(lái)看一個(gè)“可變”的tuple:

>>> t = ('a', 'b', ['A', 'B'])

注意到 t 有 3 個(gè)元素:’a’,’b’和一個(gè)list:[‘A’, ‘B’]。list作為一個(gè)整體是tuple的第3個(gè)元素。list對(duì)象可以通過(guò) t[2] 拿到:

>>> L = t[2]

然后,我們把list的兩個(gè)元素改一改:

>>> L[0] = 'X'>>> L[1] = 'Y'

再看看tuple的內(nèi)容:

>>> print t ('a', 'b', ['X', 'Y'])

不是說(shuō)tuple一旦定義后就不可變了嗎?怎么現(xiàn)在又變了?

別急,我們先看看定義的時(shí)候tuple包含的3個(gè)元素:

當(dāng)我們把list的元素’A’和’B’修改為’X’和’Y’后,tuple變?yōu)椋?/p>

表面上看,tuple的元素確實(shí)變了,但其實(shí)變的不是 tuple 的元素,而是list的元素。

tuple一開(kāi)始指向的list并沒(méi)有改成別的list,所以,tuple所謂的“不變”是說(shuō),tuple的每個(gè)元素,指向永遠(yuǎn)不變。即指向’a’,就不能改成指向’b’,指向一個(gè)list,就不能改成指向其他對(duì)象,但指向的這個(gè)list本身是可變的!

理解了“指向不變”后,要?jiǎng)?chuàng)建一個(gè)內(nèi)容也不變的tuple怎么做?那就必須保證tuple的每一個(gè)元素本身也不能變。

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

條件判斷

計(jì)算機(jī)之所以能做很多自動(dòng)化的任務(wù),因?yàn)樗梢宰约鹤鰲l件判斷。

if語(yǔ)句

比如,輸入用戶年齡,根據(jù)年齡打印不同的內(nèi)容,在Python程序中,可以用if語(yǔ)句實(shí)現(xiàn):

age = 20if age >= 18: print 'your age is', age print 'adult'print 'END'

注意: Python代碼的縮進(jìn)規(guī)則。具有相同縮進(jìn)的代碼被視為代碼塊,上面的3,4行 print 語(yǔ)句就構(gòu)成一個(gè)代碼塊(但不包括第5行的print)。如果 if 語(yǔ)句判斷為 True,就會(huì)執(zhí)行這個(gè)代碼塊。

縮進(jìn)請(qǐng)嚴(yán)格按照Python的習(xí)慣寫(xiě)法:4個(gè)空格,不要使用Tab,更不要混合Tab和空格,否則很容易造成因?yàn)榭s進(jìn)引起的語(yǔ)法錯(cuò)誤。

注意: if 語(yǔ)句后接表達(dá)式,然后用:表示代碼塊開(kāi)始。

如果你在Python交互環(huán)境下敲代碼,還要特別留意縮進(jìn),并且退出縮進(jìn)需要多敲一行回車:

>>> age = 20>>> if age >= 18:... print 'your age is', age... print 'adult'... your age is 20adult

if-else語(yǔ)句

當(dāng) if 語(yǔ)句判斷表達(dá)式的結(jié)果為 True 時(shí),就會(huì)執(zhí)行 if 包含的代碼塊:

if age >= 18: print 'adult'

如果我們想判斷年齡在18歲以下時(shí),打印出 ‘teenager’,怎么辦?

方法是再寫(xiě)一個(gè) if:

if age < 18: ? ?print 'teenager'

或者用 not 運(yùn)算:

if not age >= 18: print 'teenager'

細(xì)心的讀者可以發(fā)現(xiàn),這兩種條件判斷是“非此即彼”的,要么符合條件1,要么符合條件2,因此,完全可以用一個(gè)if ... else ...語(yǔ)句把它們統(tǒng)一起來(lái):

if age >= 18: print 'adult'else: print 'teenager'

利用if ... else ...語(yǔ)句,我們可以根據(jù)條件表達(dá)式的值為 True 或者 False ,分別執(zhí)行 if 代碼塊或者 else 代碼塊。

注意: else 后面有個(gè)“:”。

if-elif-else語(yǔ)句

有的時(shí)候,一個(gè)if ... else ...還不夠用。比如,根據(jù)年齡的劃分:

條件1:18歲或以上:adult 條件2:6歲或以上:teenager 條件3:6歲以下:kid

我們可以用一個(gè) if age >= 18 判斷是否符合條件1,如果不符合,再通過(guò)一個(gè) if 判斷 age >= 6 來(lái)判斷是否符合條件2,否則,執(zhí)行條件3:

if age >= 18: print 'adult'else: if age >= 6: print 'teenager' else: print 'kid'

這樣寫(xiě)出來(lái),我們就得到了一個(gè)兩層嵌套的if ... else ...語(yǔ)句。這個(gè)邏輯沒(méi)有問(wèn)題,但是,如果繼續(xù)增加條件,比如3歲以下是 baby:

if age >= 18: print 'adult'else: if age >= 6: print 'teenager' else: if age >= 3: print 'kid' else: print 'baby'

這種縮進(jìn)只會(huì)越來(lái)越多,代碼也會(huì)越來(lái)越難看。

要避免嵌套結(jié)構(gòu)的if ... else ...,我們可以用if ...多個(gè)elif ... else ...的結(jié)構(gòu),一次寫(xiě)完所有的規(guī)則:

if age >= 18: print 'adult'elif age >= 6: print 'teenager'elif age >= 3: print 'kid'else: print 'baby'

elif 意思就是 else if。這樣一來(lái),我們就寫(xiě)出了結(jié)構(gòu)非常清晰的一系列條件判斷。

特別注意: 這一系列條件判斷會(huì)從上到下依次判斷,如果某個(gè)判斷為 True,執(zhí)行完對(duì)應(yīng)的代碼塊,后面的條件判斷就直接忽略,不再執(zhí)行了。

循環(huán)

for循環(huán)

list或tuple可以表示一個(gè)有序集合。如果我們想依次訪問(wèn)一個(gè)list中的每一個(gè)元素呢?比如 list:

L = ['Adam', 'Lisa', 'Bart']print L[0]print L[1]print L[2]

如果list只包含幾個(gè)元素,這樣寫(xiě)還行,如果list包含1萬(wàn)個(gè)元素,我們就不可能寫(xiě)1萬(wàn)行print。

這時(shí),循環(huán)就派上用場(chǎng)了。

Python的 for 循環(huán)就可以依次把list或tuple的每個(gè)元素迭代出來(lái):

L = ['Adam', 'Lisa', 'Bart']for name in L: print name

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

這樣一來(lái),遍歷一個(gè)list或tuple就非常容易了。

while循環(huán)

和 for 循環(huán)不同的另一種循環(huán)是 while 循環(huán),while 循環(huán)不會(huì)迭代 list 或 tuple 的元素,而是根據(jù)表達(dá)式判斷循環(huán)是否結(jié)束。

比如要從 0 開(kāi)始打印不大于 N 的整數(shù):

N = 10x = 0while x < N: ? ?print x ? ?x = x + 1

while循環(huán)每次先判斷 x < N,如果為T(mén)rue,則執(zhí)行循環(huán)體的代碼塊,否則,退出循環(huán)。

在循環(huán)體內(nèi),x = x + 1 會(huì)讓 x 不斷增加,最終因?yàn)?x < N 不成立而退出循環(huán)。

如果沒(méi)有這一個(gè)語(yǔ)句,while循環(huán)在判斷 x < N 時(shí)總是為T(mén)rue,就會(huì)無(wú)限循環(huán)下去,變成死循環(huán),所以要特別留意while循環(huán)的退出條件。

break退出循環(huán)

用 for 循環(huán)或者 while 循環(huán)時(shí),如果要在循環(huán)體內(nèi)直接退出循環(huán),可以使用 break 語(yǔ)句。

比如計(jì)算1至100的整數(shù)和,我們用while來(lái)實(shí)現(xiàn):

sum = 0x = 1while True: sum = sum + x x = x + 1 if x > 100: breakprint sum

咋一看, while True 就是一個(gè)死循環(huán),但是在循環(huán)體內(nèi),我們還判斷了 x > 100 條件成立時(shí),用break語(yǔ)句退出循環(huán),這樣也可以實(shí)現(xiàn)循環(huán)的結(jié)束。

continue繼續(xù)循環(huán)

在循環(huán)過(guò)程中,可以用break退出當(dāng)前循環(huán),還可以用continue跳過(guò)后續(xù)循環(huán)代碼,繼續(xù)下一次循環(huán)。

假設(shè)我們已經(jīng)寫(xiě)好了利用for循環(huán)計(jì)算平均分的代碼:

L = [75, 98, 59, 81, 66, 43, 69, 85] sum = 0.0n = 0for x in L: sum = sum + x n = n + 1print sum / n

現(xiàn)在老師只想統(tǒng)計(jì)及格分?jǐn)?shù)的平均分,就要把 x < 60 的分?jǐn)?shù)剔除掉,這時(shí),利用 continue,可以做到當(dāng) x < 60的時(shí)候,不繼續(xù)執(zhí)行循環(huán)體的后續(xù)代碼,直接進(jìn)入下一次循環(huán):

for x in L: if x < 60: ? ? ? ?continue ? ?sum = sum + x ? ?n = n + 1

多重循環(huán)

在循環(huán)內(nèi)部,還可以嵌套循環(huán),我們來(lái)看一個(gè)例子:

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

x 每循環(huán)一次,y 就會(huì)循環(huán) 3 次。

Dict類型

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

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

或者考試的成績(jī)列表:

[95, 85, 59]

但是,要根據(jù)名字找到對(duì)應(yīng)的成績(jī),用兩個(gè) list 表示就不方便。

如果把名字和分?jǐn)?shù)關(guān)聯(lián)起來(lái),組成類似的查找表:

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

給定一個(gè)名字,就可以直接查到分?jǐn)?shù)。

Python的 dict 就是專門(mén)干這件事的。用 dict 表示“名字”-“成績(jī)”的查找表如下:

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

我們把名字稱為key,對(duì)應(yīng)的成績(jī)稱為value,dict就是通過(guò) key 來(lái)查找 value。

花括號(hào) {} 表示這是一個(gè)dict,然后按照 key: value, 寫(xiě)出來(lái)即可。最后一個(gè) key: value 的逗號(hào)可以省略。

由于dict也是集合,len() 函數(shù)可以計(jì)算任意集合的大小:

>>> len(d)3

注意: 一個(gè) key-value 算一個(gè),因此,dict大小為3。

訪問(wèn)Dict

我們已經(jīng)能創(chuàng)建一個(gè)dict,用于表示名字和成績(jī)的對(duì)應(yīng)關(guān)系:

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

那么,如何根據(jù)名字來(lái)查找對(duì)應(yīng)的成績(jī)呢?

可以簡(jiǎn)單地使用 d[key] 的形式來(lái)查找對(duì)應(yīng)的 value,這和 list 很像,不同之處是,list 必須使用索引返回對(duì)應(yīng)的元素,而dict使用key:

>>> print d['Adam']95>>> print d['Paul'] Traceback (most recent call last): File "index.py", line 11, in print d['Paul']KeyError: 'Paul'

注意: 通過(guò) key 訪問(wèn) dict 的value,只要 key 存在,dict就返回對(duì)應(yīng)的value。如果key不存在,會(huì)直接報(bào)錯(cuò):KeyError。

要避免 KeyError 發(fā)生,有兩個(gè)辦法:

一是先判斷一下 key 是否存在,用 in 操作符:

if 'Paul' in d: print d['Paul']

如果 ‘Paul’ 不存在,if語(yǔ)句判斷為False,自然不會(huì)執(zhí)行 print d[‘Paul’] ,從而避免了錯(cuò)誤。

二是使用dict本身提供的一個(gè) get 方法,在Key不存在的時(shí)候,返回None:

>>> print d.get('Bart')59>>> print d.get('Paul')None

Dict特點(diǎn)

dict的第一個(gè)特點(diǎn)是查找速度快,無(wú)論dict有10個(gè)元素還是10萬(wàn)個(gè)元素,查找速度都一樣。而list的查找速度隨著元素增加而逐漸下降。

不過(guò)dict的查找速度快不是沒(méi)有代價(jià)的,dict的缺點(diǎn)是占用內(nèi)存大,還會(huì)浪費(fèi)很多內(nèi)容,list正好相反,占用內(nèi)存小,但是查找速度慢。

由于dict是按 key 查找,所以,在一個(gè)dict中,key不能重復(fù)。

dict的第二個(gè)特點(diǎn)就是存儲(chǔ)的key-value序?qū)κ菦](méi)有順序的!這和list不一樣:

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

當(dāng)我們?cè)噲D打印這個(gè)dict時(shí):

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

打印的順序不一定是我們創(chuàng)建時(shí)的順序,而且,不同的機(jī)器打印的順序都可能不同,這說(shuō)明dict內(nèi)部是無(wú)序的,不能用dict存儲(chǔ)有序的集合。

dict的第三個(gè)特點(diǎn)是作為 key 的元素必須不可變,Python的基本類型如字符串、整數(shù)、浮點(diǎn)數(shù)都是不可變的,都可以作為 key。但是list是可變的,就不能作為 key。

可以試試用list作為key時(shí)會(huì)報(bào)什么樣的錯(cuò)誤。

不可變這個(gè)限制僅作用于key,value是否可變無(wú)所謂:

{ '123': [1, 2, 3], # key 是 str,value是list 123: '123', # key 是 int,value 是 str ('a', 'b'): True # key 是 tuple,并且tuple的每個(gè)元素都是不可變對(duì)象,value是 boolean}

最常用的key還是字符串,因?yàn)橛闷饋?lái)最方便。

更新Dict

dict是可變的,也就是說(shuō),我們可以隨時(shí)往dict中添加新的 key-value。比如已有dict:

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

要把新同學(xué)’Paul’的成績(jī) 72 加進(jìn)去,用賦值語(yǔ)句:

>>> d['Paul'] = 72

再看看dict的內(nèi)容:

>>> print d {'Lisa': 85, 'Paul': 72, 'Adam': 95, 'Bart': 59}

如果 key 已經(jīng)存在,則賦值會(huì)用新的 value 替換掉原來(lái)的 value:

>>> d['Bart'] = 60>>> print d {'Lisa': 85, 'Paul': 72, 'Adam': 95, 'Bart': 60}

遍歷Dict

由于dict也是一個(gè)集合,所以,遍歷dict和遍歷list類似,都可以通過(guò) for 循環(huán)實(shí)現(xiàn)。

直接使用for循環(huán)可以遍歷 dict 的 key:

>>> d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }>>> for key in d:... print key... Lisa Adam Bart

由于通過(guò) key 可以獲取對(duì)應(yīng)的 value,因此,在循環(huán)體內(nèi),可以獲取到value的值。

Set類型

dict的作用是建立一組 key 和一組 value 的映射關(guān)系,dict的key是不能重復(fù)的。

有的時(shí)候,我們只想要 dict 的 key,不關(guān)心 key 對(duì)應(yīng)的 value,目的就是保證這個(gè)集合的元素不會(huì)重復(fù),這時(shí),set就派上用場(chǎng)了。

set 持有一系列元素,這一點(diǎn)和 list 很像,但是set的元素沒(méi)有重復(fù),而且是無(wú)序的,這點(diǎn)和 dict 的 key很像。

創(chuàng)建 set 的方式是調(diào)用 set() 并傳入一個(gè) list,list的元素將作為set的元素:

>>> s = set(['A', 'B', 'C'])

可以查看 set 的內(nèi)容:

>>> print s set(['A', 'C', 'B'])

請(qǐng)注意,上述打印的形式類似 list, 但它不是 list,仔細(xì)看還可以發(fā)現(xiàn),打印的順序和原始 list 的順序有可能是不同的,因?yàn)閟et內(nèi)部存儲(chǔ)的元素是無(wú)序的。

因?yàn)閟et不能包含重復(fù)的元素,所以,當(dāng)我們傳入包含重復(fù)元素的 list 會(huì)怎么樣呢?

>>> s = set(['A', 'B', 'C', 'C'])>>> print s set(['A', 'C', 'B'])>>> len(s)3

結(jié)果顯示,set會(huì)自動(dòng)去掉重復(fù)的元素,原來(lái)的list有4個(gè)元素,但set只有3個(gè)元素。

訪問(wèn)Set

由于set存儲(chǔ)的是無(wú)序集合,所以我們沒(méi)法通過(guò)索引來(lái)訪問(wèn)。

訪問(wèn) set中的某個(gè)元素實(shí)際上就是判斷一個(gè)元素是否在set中。

例如,存儲(chǔ)了班里同學(xué)名字的set:

>>> s = set(['Adam', 'Lisa', 'Bart', 'Paul'])

我們可以用 in 操作符判斷:

Bart是該班的同學(xué)嗎?

>>> 'Bart' in sTrue

Bill是該班的同學(xué)嗎?

>>> 'Bill' in sFalse

bart是該班的同學(xué)嗎?

>>> 'bart' in sFalse

看來(lái)大小寫(xiě)很重要,’Bart’ 和 ‘bart’被認(rèn)為是兩個(gè)不同的元素。

Set的特點(diǎn)

set的內(nèi)部結(jié)構(gòu)和dict很像,唯一區(qū)別是不存儲(chǔ)value,因此,判斷一個(gè)元素是否在set中速度很快。

set存儲(chǔ)的元素和dict的key類似,必須是不變對(duì)象,因此,任何可變對(duì)象是不能放入set中的。

最后,set存儲(chǔ)的元素也是沒(méi)有順序的。

set的這些特點(diǎn),可以應(yīng)用在哪些地方呢?

星期一到星期日可以用字符串’MON’, ‘TUE’, … ‘SUN’表示。

假設(shè)我們讓用戶輸入星期一至星期日的某天,如何判斷用戶的輸入是否是一個(gè)有效的星期呢?

可以用 if 語(yǔ)句判斷,但這樣做非常繁瑣:

x = '???' # 用戶輸入的字符串if x!= 'MON' and x!= 'TUE' and x!= 'WED' ... and x!= 'SUN': print 'input error'else: print 'input ok'

注意:if 語(yǔ)句中的…表示沒(méi)有列出的其它星期名稱,測(cè)試時(shí),請(qǐng)輸入完整。

如果事先創(chuàng)建好一個(gè)set,包含’MON’ ~ ‘SUN’:

weekdays = set(['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'])

再判斷輸入是否有效,只需要判斷該字符串是否在set中:

x = '???' # 用戶輸入的字符串if x in weekdays: print 'input ok'else: print 'input error'

這樣一來(lái),代碼就簡(jiǎn)單多了。

遍歷Set

由于 set 也是一個(gè)集合,所以,遍歷 set 和遍歷 list 類似,都可以通過(guò) for 循環(huán)實(shí)現(xiàn)。

直接使用 for 循環(huán)可以遍歷 set 的元素:

>>> s = set(['Adam', 'Lisa', 'Bart'])>>> for name in s:... print name... Lisa Adam Bart

注意: 觀察 for 循環(huán)在遍歷set時(shí),元素的順序和list的順序很可能是不同的,而且不同的機(jī)器上運(yùn)行的結(jié)果也可能不同。

更新Set

由于set存儲(chǔ)的是一組不重復(fù)的無(wú)序元素,因此,更新set主要做兩件事:

一是把新的元素添加到set中,二是把已有元素從set中刪除。

添加元素時(shí),用set的add()方法:

>>> s = set([1, 2, 3])>>> s.add(4)>>> print s set([1, 2, 3, 4])

如果添加的元素已經(jīng)存在于set中,add()不會(huì)報(bào)錯(cuò),但是不會(huì)加進(jìn)去了:

>>> s = set([1, 2, 3])>>> s.add(3)>>> print s set([1, 2, 3])

刪除set中的元素時(shí),用set的remove()方法:

>>> s = set([1, 2, 3, 4])>>> s.remove(4)>>> print s set([1, 2, 3])

如果刪除的元素不存在set中,remove()會(huì)報(bào)錯(cuò):

>>> s = set([1, 2, 3])>>> s.remove(4) Traceback (most recent call last): File "", line 1, in KeyError: 4

所以用add()可以直接添加,而remove()前需要判斷。

函數(shù)

我們知道圓的面積計(jì)算公式為:

S = πr2

當(dāng)我們知道半徑r的值時(shí),就可以根據(jù)公式計(jì)算出面積。假設(shè)我們需要計(jì)算3個(gè)不同大小的圓的面積:

r1 = 12.34r2 = 9.08r3 = 73.1s1 = 3.14 * r1 * r1s2 = 3.14 * r2 * r2s3 = 3.14 * r3 * r3

當(dāng)代碼出現(xiàn)有規(guī)律的重復(fù)的時(shí)候,你就需要當(dāng)心了,每次寫(xiě)3.14xx不僅很麻煩,而且,如果要把3.14改成3.14159265359的時(shí)候,得全部替換。

有了函數(shù),我們就不再每次寫(xiě)s = 3.14xx,而是寫(xiě)成更有意義的函數(shù)調(diào)用 s = area_of_circle(x),而函數(shù) area_of_circle 本身只需要寫(xiě)一次,就可以多次調(diào)用。

抽象是數(shù)學(xué)中非常常見(jiàn)的概念。舉個(gè)例子:

計(jì)算數(shù)列的和,比如:1 + 2 + 3 + … + 100,寫(xiě)起來(lái)十分不方便,于是數(shù)學(xué)家發(fā)明了求和符號(hào)∑,可以把1 + 2 + 3 + … + 100記作:

100 ∑n n=1

這種抽象記法非常強(qiáng)大,因?yàn)槲覀兛吹健凭涂梢岳斫獬汕蠛停皇沁€原成低級(jí)的加法運(yùn)算。

而且,這種抽象記法是可擴(kuò)展的,比如:

100 ∑(n2+1) n=1

還原成加法運(yùn)算就變成了:

(1 x 1 + 1) + (2 x 2 + 1) + (3 x 3 + 1) + … + (100 x 100 + 1)

可見(jiàn),借助抽象,我們才能不關(guān)心底層的具體計(jì)算過(guò)程,而直接在更高的層次上思考問(wèn)題。

寫(xiě)計(jì)算機(jī)程序也是一樣,函數(shù)就是最基本的一種代碼抽象的方式。

Python不但能非常靈活地定義函數(shù),而且本身內(nèi)置了很多有用的函數(shù),可以直接調(diào)用。

調(diào)用函數(shù)

Python內(nèi)置了很多有用的函數(shù),我們可以直接調(diào)用。

要調(diào)用一個(gè)函數(shù),需要知道函數(shù)的名稱和參數(shù),比如求絕對(duì)值的函數(shù) abs,它接收一個(gè)參數(shù)。

可以直接從Python的官方網(wǎng)站查看文檔:

http://docs.python.org/2/library/functions.html#abs

也可以在交互式命令行通過(guò) help(abs) 查看abs函數(shù)的幫助信息。

調(diào)用 abs 函數(shù):

>>> abs(100)100>>> abs(-20)20>>> abs(12.34)12.34

調(diào)用函數(shù)的時(shí)候,如果傳入的參數(shù)數(shù)量不對(duì),會(huì)報(bào)TypeError的錯(cuò)誤,并且Python會(huì)明確地告訴你:abs()有且僅有1個(gè)參數(shù),但給出了兩個(gè):

>>> abs(1, 2) Traceback (most recent call last): File "", line 1, in TypeError: abs() takes exactly one argument (2 given)

如果傳入的參數(shù)數(shù)量是對(duì)的,但參數(shù)類型不能被函數(shù)所接受,也會(huì)報(bào)TypeError的錯(cuò)誤,并且給出錯(cuò)誤信息:str是錯(cuò)誤的參數(shù)類型:

>>> abs('a') Traceback (most recent call last): File "", line 1, in TypeError: bad operand type for abs(): 'str'

而比較函數(shù) cmp(x, y) 就需要兩個(gè)參數(shù),如果 x y,返回 1:

>>> cmp(1, 2) -1>>> cmp(2, 1)1>>> cmp(3, 3)0

Python內(nèi)置的常用函數(shù)還包括數(shù)據(jù)類型轉(zhuǎn)換函數(shù),比如 int()函數(shù)可以把其他數(shù)據(jù)類型轉(zhuǎn)換為整數(shù):

>>> int('123')123>>> int(12.34)12

str()函數(shù)把其他類型轉(zhuǎn)換成 str:

>>> str(123)'123'>>> str(1.23)'1.23'

編寫(xiě)函數(shù)

在Python中,定義一個(gè)函數(shù)要使用 def 語(yǔ)句,依次寫(xiě)出函數(shù)名、括號(hào)、括號(hào)中的參數(shù)和冒號(hào):,然后,在縮進(jìn)塊中編寫(xiě)函數(shù)體,函數(shù)的返回值用 return 語(yǔ)句返回。

我們以自定義一個(gè)求絕對(duì)值的 my_abs 函數(shù)為例:

def my_abs(x): if x >= 0: return x else: return -x

請(qǐng)注意,函數(shù)體內(nèi)部的語(yǔ)句在執(zhí)行時(shí),一旦執(zhí)行到return時(shí),函數(shù)就執(zhí)行完畢,并將結(jié)果返回。因此,函數(shù)內(nèi)部通過(guò)條件判斷和循環(huán)可以實(shí)現(xiàn)非常復(fù)雜的邏輯。

如果沒(méi)有return語(yǔ)句,函數(shù)執(zhí)行完畢后也會(huì)返回結(jié)果,只是結(jié)果為 None。

return None可以簡(jiǎn)寫(xiě)為return。

返回多值

函數(shù)可以返回多個(gè)值嗎?答案是肯定的。

比如在游戲中經(jīng)常需要從一個(gè)點(diǎn)移動(dòng)到另一個(gè)點(diǎn),給出坐標(biāo)、位移和角度,就可以計(jì)算出新的坐標(biāo):

# math包提供了sin()和 cos()函數(shù),我們先用import引用它:

import mathdef move(x, y, step, angle): nx = x + step * math.cos(angle) ny = y - step * math.sin(angle) return nx, ny

這樣我們就可以同時(shí)獲得返回值:

>>> x, y = move(100, 100, 60, math.pi / 6)>>> print x, y151.961524227 70.0

但其實(shí)這只是一種假象,Python函數(shù)返回的仍然是單一值:

>>> r = move(100, 100, 60, math.pi / 6)>>> print r (151.96152422706632, 70.0)

用print打印返回結(jié)果,原來(lái)返回值是一個(gè)tuple!

但是,在語(yǔ)法上,返回一個(gè)tuple可以省略括號(hào),而多個(gè)變量可以同時(shí)接收一個(gè)tuple,按位置賦給對(duì)應(yīng)的值,所以,Python的函數(shù)返回多值其實(shí)就是返回一個(gè)tuple,但寫(xiě)起來(lái)更方便。

遞歸函數(shù)

在函數(shù)內(nèi)部,可以調(diào)用其他函數(shù)。如果一個(gè)函數(shù)在內(nèi)部調(diào)用自身本身,這個(gè)函數(shù)就是遞歸函數(shù)。

舉個(gè)例子,我們來(lái)計(jì)算階乘 n! = 123…n,用函數(shù) fact(n)表示,可以看出:

fact(n) = n! = 1 * 2 * 3 * ... * (n-1) * n = (n-1)! * n = fact(n-1) * n

所以,fact(n)可以表示為 n * fact(n-1),只有n=1時(shí)需要特殊處理。

于是,fact(n)用遞歸的方式寫(xiě)出來(lái)就是:

def fact(n): if n==1: return 1 return n * fact(n - 1)

上面就是一個(gè)遞歸函數(shù)。可以試試:

>>> fact(1)1>>> fact(5)120>>> fact(100)93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000L

如果我們計(jì)算fact(5),可以根據(jù)函數(shù)定義看到計(jì)算過(guò)程如下:

===> fact(5) ===> 5 * fact(4) ===> 5 * (4 * fact(3)) ===> 5 * (4 * (3 * fact(2))) ===> 5 * (4 * (3 * (2 * fact(1)))) ===> 5 * (4 * (3 * (2 * 1))) ===> 5 * (4 * (3 * 2)) ===> 5 * (4 * 6) ===> 5 * 24 ===> 120

遞歸函數(shù)的優(yōu)點(diǎn)是定義簡(jiǎn)單,邏輯清晰。理論上,所有的遞歸函數(shù)都可以寫(xiě)成循環(huán)的方式,但循環(huán)的邏輯不如遞歸清晰。

使用遞歸函數(shù)需要注意防止棧溢出。在計(jì)算機(jī)中,函數(shù)調(diào)用是通過(guò)棧(stack)這種數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的,每當(dāng)進(jìn)入一個(gè)函數(shù)調(diào)用,棧就會(huì)加一層棧幀,每當(dāng)函數(shù)返回,棧就會(huì)減一層棧幀。由于棧的大小不是無(wú)限的,所以,遞歸調(diào)用的次數(shù)過(guò)多,會(huì)導(dǎo)致棧溢出。可以試試計(jì)算 fact(10000)。

定義默認(rèn)參數(shù)

定義函數(shù)的時(shí)候,還可以有默認(rèn)參數(shù)。

例如Python自帶的 int() 函數(shù),其實(shí)就有兩個(gè)參數(shù),我們既可以傳一個(gè)參數(shù),又可以傳兩個(gè)參數(shù):

>>> int('123')123>>> int('123', 8)83

int()函數(shù)的第二個(gè)參數(shù)是轉(zhuǎn)換進(jìn)制,如果不傳,默認(rèn)是十進(jìn)制 (base=10),如果傳了,就用傳入的參數(shù)。

可見(jiàn),函數(shù)的默認(rèn)參數(shù)的作用是簡(jiǎn)化調(diào)用,你只需要把必須的參數(shù)傳進(jìn)去。但是在需要的時(shí)候,又可以傳入額外的參數(shù)來(lái)覆蓋默認(rèn)參數(shù)值。

我們來(lái)定義一個(gè)計(jì)算 x 的N次方的函數(shù):

def power(x, n): s = 1 while n > 0: n = n - 1 s = s * x return s

假設(shè)計(jì)算平方的次數(shù)最多,我們就可以把 n 的默認(rèn)值設(shè)定為 2:

def power(x, n=2): s = 1 while n > 0: n = n - 1 s = s * x return s

這樣一來(lái),計(jì)算平方就不需要傳入兩個(gè)參數(shù)了:

>>> power(5)25

由于函數(shù)的參數(shù)按從左到右的順序匹配,所以默認(rèn)參數(shù)只能定義在必需參數(shù)的后面:

# OK:def fn1(a, b=1, c=2): pass# Error:def fn2(a=1, b): pass

定義可變參數(shù)

如果想讓一個(gè)函數(shù)能接受任意個(gè)參數(shù),我們就可以定義一個(gè)可變參數(shù):

def fn(*args): print args

可變參數(shù)的名字前面有個(gè) * 號(hào),我們可以傳入0個(gè)、1個(gè)或多個(gè)參數(shù)給可變參數(shù):

>>> fn() () >>> fn('a') ('a',) >>> fn('a', 'b') ('a', 'b') >>> fn('a', 'b', 'c') ('a', 'b', 'c')

可變參數(shù)也不是很神秘,Python解釋器會(huì)把傳入的一組參數(shù)組裝成一個(gè)tuple傳遞給可變參數(shù),因此,在函數(shù)內(nèi)部,直接把變量 args 看成一個(gè) tuple 就好了。

定義可變參數(shù)的目的也是為了簡(jiǎn)化調(diào)用。假設(shè)我們要計(jì)算任意個(gè)數(shù)的平均值,就可以定義一個(gè)可變參數(shù):

def average(*args): ...

這樣,在調(diào)用的時(shí)候,可以這樣寫(xiě):

>>> average()0>>> average(1, 2)1.5>>> average(1, 2, 2, 3, 4)2.4

切片

對(duì)list進(jìn)行切片

取一個(gè)list的部分元素是非常常見(jiàn)的操作。比如,一個(gè)list如下:

>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']

取前3個(gè)元素,應(yīng)該怎么做?

笨辦法:

>>> [L[0], L[1], L[2]] ['Adam', 'Lisa', 'Bart']

之所以是笨辦法是因?yàn)閿U(kuò)展一下,取前N個(gè)元素就沒(méi)轍了。

取前N個(gè)元素,也就是索引為0-(N-1)的元素,可以用循環(huán):

>>> r = []>>> n = 3>>> for i in range(n): ... r.append(L[i]) ... >>> r ['Adam', 'Lisa', 'Bart']

對(duì)這種經(jīng)常取指定索引范圍的操作,用循環(huán)十分繁瑣,因此,Python提供了切片(Slice)操作符,能大大簡(jiǎn)化這種操作。

對(duì)應(yīng)上面的問(wèn)題,取前3個(gè)元素,用一行代碼就可以完成切片:

>>> L[0:3] ['Adam', 'Lisa', 'Bart']

L[0:3]表示,從索引0開(kāi)始取,直到索引3為止,但不包括索引3。即索引0,1,2,正好是3個(gè)元素。

如果第一個(gè)索引是0,還可以省略:

>>> L[:3] ['Adam', 'Lisa', 'Bart']

也可以從索引1開(kāi)始,取出2個(gè)元素出來(lái):

>>> L[1:3] ['Lisa', 'Bart']

只用一個(gè) : ,表示從頭到尾:

>>> L[:] ['Adam', 'Lisa', 'Bart', 'Paul']

因此,L[:]實(shí)際上復(fù)制出了一個(gè)新list。

切片操作還可以指定第三個(gè)參數(shù):

>>> L[::2] ['Adam', 'Bart']

第三個(gè)參數(shù)表示每N個(gè)取一個(gè),上面的 L[::2] 會(huì)每?jī)蓚€(gè)元素取出一個(gè)來(lái),也就是隔一個(gè)取一個(gè)。

把list換成tuple,切片操作完全相同,只是切片的結(jié)果也變成了tuple。

倒序切片

對(duì)于list,既然Python支持L[-1]取倒數(shù)第一個(gè)元素,那么它同樣支持倒數(shù)切片,試試:

>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']>>> L[-2:] ['Bart', 'Paul']>>> L[:-2] ['Adam', 'Lisa']>>> L[-3:-1] ['Lisa', 'Bart']>>> L[-4:-1:2] ['Adam', 'Bart']

記住倒數(shù)第一個(gè)元素的索引是-1。倒序切片包含起始索引,不包含結(jié)束索引。

對(duì)字符串切片

字符串 ‘xxx’和 Unicode字符串 u’xxx’也可以看成是一種list,每個(gè)元素就是一個(gè)字符。因此,字符串也可以用切片操作,只是操作結(jié)果仍是字符串:

>>> 'ABCDEFG'[:3]'ABC'>>> 'ABCDEFG'[-3:]'EFG'>>> 'ABCDEFG'[::2]'ACEG'

在很多編程語(yǔ)言中,針對(duì)字符串提供了很多各種截取函數(shù),其實(shí)目的就是對(duì)字符串切片。Python沒(méi)有針對(duì)字符串的截取函數(shù),只需要切片一個(gè)操作就可以完成,非常簡(jiǎn)單。

迭代

在Python中,如果給定一個(gè)list或tuple,我們可以通過(guò)for循環(huán)來(lái)遍歷這個(gè)list或tuple,這種遍歷我們成為迭代(Iteration)。

在Python中,迭代是通過(guò) for … in 來(lái)完成的,而很多語(yǔ)言比如C或者Java,迭代list是通過(guò)下標(biāo)完成的,比如Java代碼:

for (i=0; i

可以看出,Python的for循環(huán)抽象程度要高于Java的for循環(huán)。

因?yàn)?Python 的 for循環(huán)不僅可以用在list或tuple上,還可以作用在其他任何可迭代對(duì)象上。

因此,迭代操作就是對(duì)于一個(gè)集合,無(wú)論該集合是有序還是無(wú)序,我們用 for 循環(huán)總是可以依次取出集合的每一個(gè)元素。

注意: 集合是指包含一組元素的數(shù)據(jù)結(jié)構(gòu),我們已經(jīng)介紹的包括:

有序集合:list,tuple,str和unicode;

無(wú)序集合:set

無(wú)序集合并且具有 key-value 對(duì):dict而迭代是一個(gè)動(dòng)詞,它指的是一種操作,在Python中,就是 for 循環(huán)。

迭代與按下標(biāo)訪問(wèn)數(shù)組最大的不同是,后者是一種具體的迭代實(shí)現(xiàn)方式,而前者只關(guān)心迭代結(jié)果,根本不關(guān)心迭代內(nèi)部是如何實(shí)現(xiàn)的。

索引迭代

Python中,迭代永遠(yuǎn)是取出元素本身,而非元素的索引。

對(duì)于有序集合,元素確實(shí)是有索引的。有的時(shí)候,我們確實(shí)想在 for 循環(huán)中拿到索引,怎么辦?

方法是使用 enumerate() 函數(shù):

>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']>>> for index, name in enumerate(L):... print index, '-', name... 0 - Adam1 - Lisa2 - Bart3 - Paul

使用 enumerate() 函數(shù),我們可以在for循環(huán)中同時(shí)綁定索引index和元素name。但是,這不是 enumerate() 的特殊語(yǔ)法。實(shí)際上,enumerate() 函數(shù)把:

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

變成了類似:

[(0, 'Adam'), (1, 'Lisa'), (2, 'Bart'), (3, 'Paul')]

因此,迭代的每一個(gè)元素實(shí)際上是一個(gè)tuple:

for t in enumerate(L): index = t[0] name = t[1] print index, '-', name

如果我們知道每個(gè)tuple元素都包含兩個(gè)元素,for循環(huán)又可以進(jìn)一步簡(jiǎn)寫(xiě)為:

for index, name in enumerate(L): print index, '-', name

這樣不但代碼更簡(jiǎn)單,而且還少了兩條賦值語(yǔ)句。

可見(jiàn),索引迭代也不是真的按索引訪問(wèn),而是由 enumerate() 函數(shù)自動(dòng)把每個(gè)元素變成 (index, element) 這樣的tuple,再迭代,就同時(shí)獲得了索引和元素本身。

迭代Dict的value

我們已經(jīng)了解了dict對(duì)象本身就是可迭代對(duì)象,用 for 循環(huán)直接迭代 dict,可以每次拿到dict的一個(gè)key。

如果我們希望迭代 dict 對(duì)象的value,應(yīng)該怎么做?

dict 對(duì)象有一個(gè) values() 方法,這個(gè)方法把dict轉(zhuǎn)換成一個(gè)包含所有value的list,這樣,我們迭代的就是 dict的每一個(gè) value:

d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }print d.values()# [85, 95, 59]for v in d.values(): print v# 85# 95# 59

如果仔細(xì)閱讀Python的文檔,還可以發(fā)現(xiàn),dict除了values()方法外,還有一個(gè) itervalues() 方法,用 itervalues() 方法替代 values() 方法,迭代效果完全一樣:

d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }print d.itervalues()# for v in d.itervalues(): print v# 85# 95# 59

那這兩個(gè)方法有何不同之處呢?

values() 方法實(shí)際上把一個(gè) dict 轉(zhuǎn)換成了包含 value 的list。

但是 itervalues() 方法不會(huì)轉(zhuǎn)換,它會(huì)在迭代過(guò)程中依次從 dict 中取出 value,所以 itervalues() 方法比 values() 方法節(jié)省了生成 list 所需的內(nèi)存。

打印 itervalues() 發(fā)現(xiàn)它返回一個(gè) 對(duì)象,這說(shuō)明在Python中,for 循環(huán)可作用的迭代對(duì)象遠(yuǎn)不止 list,tuple,str,unicode,dict等,任何可迭代對(duì)象都可以作用于for循環(huán),而內(nèi)部如何迭代我們通常并不用關(guān)心。

如果一個(gè)對(duì)象說(shuō)自己可迭代,那我們就直接用 for 循環(huán)去迭代它,可見(jiàn),迭代是一種抽象的數(shù)據(jù)操作,它不對(duì)迭代對(duì)象內(nèi)部的數(shù)據(jù)有任何要求。

迭代Dict的key和value

我們了解了如何迭代 dict 的key和value,那么,在一個(gè) for 循環(huán)中,能否同時(shí)迭代 key和value?答案是肯定的。

首先,我們看看 dict 對(duì)象的 items() 方法返回的值:

>>> d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }>>> print d.items() [('Lisa', 85), ('Adam', 95), ('Bart', 59)]

可以看到,items() 方法把dict對(duì)象轉(zhuǎn)換成了包含tuple的list,我們對(duì)這個(gè)list進(jìn)行迭代,可以同時(shí)獲得key和value:

>>> for key, value in d.items():... print key, ':', value... Lisa : 85Adam : 95Bart : 59

和 values() 有一個(gè) itervalues() 類似, items() 也有一個(gè)對(duì)應(yīng)的 iteritems(),iteritems() 不把dict轉(zhuǎn)換成list,而是在迭代過(guò)程中不斷給出 tuple,所以, iteritems() 不占用額外的內(nèi)存。

列表

列表生成

要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],我們可以用range(1, 11):

>>> range(1, 11)[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

但如果要生成[1×1, 2×2, 3×3, …, 10×10]怎么做?方法一是循環(huán):

>>> L = []>>> for x in range(1, 11):... L.append(x * x)... >>> L [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

但是循環(huán)太繁瑣,而列表生成式則可以用一行語(yǔ)句代替循環(huán)生成上面的list:

>>> [x * x for x in range(1, 11)] [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

這種寫(xiě)法就是Python特有的列表生成式。利用列表生成式,可以以非常簡(jiǎn)潔的代碼生成 list。

寫(xiě)列表生成式時(shí),把要生成的元素 x * x 放到前面,后面跟 for 循環(huán),就可以把list創(chuàng)建出來(lái),十分有用,多寫(xiě)幾次,很快就可以熟悉這種語(yǔ)法。

復(fù)雜表達(dá)式

使用for循環(huán)的迭代不僅可以迭代普通的list,還可以迭代dict。

假設(shè)有如下的dict:

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

完全可以通過(guò)一個(gè)復(fù)雜的列表生成式把它變成一個(gè) HTML 表格:

tds = ['%s%s' % (name, score) for name, score in d.iteritems()]print '

'print ''print ' '.join(tds)print '
NameScore
'

注:字符串可以通過(guò) % 進(jìn)行格式化,用指定的參數(shù)替代 %s。字符串的join()方法可以把一個(gè) list 拼接成一個(gè)字符串。

把打印出來(lái)的結(jié)果保存為一個(gè)html文件,就可以在瀏覽器中看到效果了:

NameScore
Lisa85
Adam95
Bart59

Name

Score

Lisa 85
Adam 95
Bart 59

條件過(guò)濾

列表生成式的 for 循環(huán)后面還可以加上 if 判斷。例如:

>>> [x * x for x in range(1, 11)] [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

如果我們只想要偶數(shù)的平方,不改動(dòng) range()的情況下,可以加上 if 來(lái)篩選:

>>> [x * x for x in range(1, 11) if x % 2 == 0] [4, 16, 36, 64, 100]

有了 if 條件,只有 if 判斷為 True 的時(shí)候,才把循環(huán)的當(dāng)前元素添加到列表中。

多層表達(dá)式

for循環(huán)可以嵌套,因此,在列表生成式中,也可以用多層 for 循環(huán)來(lái)生成列表。

對(duì)于字符串 ‘ABC’ 和 ‘123’,可以使用兩層循環(huán),生成全排列:

>>> [m + n for m in 'ABC' for n in '123'] ['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']

翻譯成循環(huán)代碼就像下面這樣:

L = []for m in 'ABC': for n in '123': L.append(m + n)

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7242

    瀏覽量

    91039
  • 編輯器
    +關(guān)注

    關(guān)注

    1

    文章

    817

    瀏覽量

    31781
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4825

    瀏覽量

    86221

原文標(biāo)題:【收藏】Python教程基礎(chǔ)篇,超詳細(xì)超長(zhǎng)!

文章出處:【微信號(hào):gh_ecbcc3b6eabf,微信公眾號(hào):人工智能和機(jī)器人研究院】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    詳細(xì)的JDK環(huán)境配置

    詳細(xì)的JDK環(huán)境配置 學(xué)習(xí)java的第一步,必須掌握的一步,做完環(huán)境配置才能繼續(xù)往下進(jìn)行,看這一步有多么重要。。。看到j(luò)ava私塾初級(jí)教材中一步步講的很詳細(xì),單獨(dú)把這塊摘出來(lái)分享一下。。。圖多,word格式。
    發(fā)表于 07-21 15:16

    MHDD的使用圖解詳細(xì)技術(shù)教程

    MHDD的使用圖解詳細(xì)技術(shù)教程
    發(fā)表于 07-29 11:30

    Proteus詳細(xì)教程太大了分解了分享

    Proteus詳細(xì)教程太大了分解了分享Proteus詳細(xì)教程太大了分解了分享
    發(fā)表于 09-19 12:52

    詳細(xì)的手機(jī)維修教程

    詳細(xì)的手機(jī)維修教程,從最基本的電子元件開(kāi)始講解,本人就是通過(guò)這個(gè)教程學(xué)會(huì)手機(jī)維修的。附件太大了,沒(méi)辦法傳,先上傳個(gè)截圖,需要的留下郵箱,或發(fā)郵件給我,luozq604@163.com
    發(fā)表于 07-31 16:35

    L298資料大總結(jié),詳細(xì)

    需要的朋友自行下載來(lái)看哈,內(nèi)容多,詳細(xì)
    發(fā)表于 11-04 13:28

    【分享】詳細(xì)FPGA燒錄資料

    詳細(xì)fpga下載過(guò)程
    發(fā)表于 05-13 14:48

    Verilog詳細(xì)教程.pdf

    Verilog詳細(xì)教程.pdf
    發(fā)表于 03-24 08:30

    Verilog詳細(xì)教程

    Verilog詳細(xì)教程
    發(fā)表于 03-12 08:58

    python2和python3同時(shí)安裝的詳細(xì)步驟

    整理下python2和python3同時(shí)安裝詳細(xì)步驟希望對(duì)大家有幫助坑已踩過(guò)(親測(cè)可用!!!)
    發(fā)表于 10-27 09:31

    PID控制詳細(xì)教程

    PID控制詳細(xì)教程,需要完整版的朋友可以下載附件保存哦~
    發(fā)表于 08-23 09:37

    導(dǎo)電媒質(zhì)中的超長(zhǎng)波天線研究

    超長(zhǎng)波天線工作在導(dǎo)電媒質(zhì)中,與傳統(tǒng)天線的工作環(huán)境有很大的不同。研究了導(dǎo)電媒質(zhì)中的超長(zhǎng)波電磁波傳播特性,分析了海面與空氣交界處的電磁波傳播規(guī)律,詳細(xì)地推導(dǎo)了海面下
    發(fā)表于 02-21 11:06 ?46次下載

    詳細(xì)Python寫(xiě)網(wǎng)絡(luò)爬蟲(chóng)

    詳細(xì)Python寫(xiě)網(wǎng)絡(luò)爬蟲(chóng)
    發(fā)表于 09-07 08:40 ?32次下載
    <b class='flag-5'>詳細(xì)</b>用<b class='flag-5'>Python</b>寫(xiě)網(wǎng)絡(luò)爬蟲(chóng)

    如何學(xué)習(xí)PythonPython編程環(huán)境搭建詳細(xì)說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何學(xué)習(xí)PythonPython編程環(huán)境搭建詳細(xì)說(shuō)明。
    發(fā)表于 04-26 08:00 ?25次下載
    如何學(xué)習(xí)<b class='flag-5'>Python</b>?<b class='flag-5'>Python</b>編程環(huán)境搭建<b class='flag-5'>詳細(xì)</b>說(shuō)明

    Python字符的實(shí)例詳細(xì)說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是Python字符的實(shí)例詳細(xì)說(shuō)明包括了:Python 轉(zhuǎn)義字符,Python 字符串運(yùn)算符,
    發(fā)表于 10-14 17:13 ?7次下載
    <b class='flag-5'>Python</b>字符的實(shí)例<b class='flag-5'>詳細(xì)</b>說(shuō)明

    簡(jiǎn)單:用Python讓Excel飛起來(lái)

    簡(jiǎn)單:用Python讓Excel飛起來(lái)
    發(fā)表于 05-25 10:46 ?58次下載
    主站蜘蛛池模板: 欧美老汉色 | 一级片在线播放 | 色综合激情网 | 欧美在线黄色 | 性视频网址| 日本三浦理惠子中文字幕 | 色婷婷综合网 | 国产精品美女一级在线观看 | 日本19xxxxxxxxx69| 色网站视频 | 午夜精品久久久久久久99 | 天天躁狠狠躁狠狠躁夜夜躁 | 激情六月婷婷 | 不卡精品国产_亚洲人成在线 | 午夜在线视频网站 | 屁屁影院在线 | 日本在线观看www | www.一区二区三区.com | 黄色网页在线播放 | 新四虎影院| 大尺度视频网站久久久久久久久 | 亚洲国产成人久久午夜 | 老师您的兔子好软水好多动漫视频 | 免费h视频网站 | 日本不卡在线视频高清免费 | 久久精品伊人波多野结 | 天天视频免费入口 | videosgratis乱色欧美野外 | 四虎影院在线免费观看 | 久久视频精品36线视频在线观看 | 你懂的网址免费国产 | 高清一级做a爱视频免费 | 亚洲综合色站 | 亚洲精品久久久久久久蜜桃 | 天天看天天碰 | 亚洲啪啪看看 | 久久网站免费 | 手机看片国产免费现在观看 | 国产香蕉在线精彩视频 | 免费a级午夜绝情美女视频 免费jlzzjlzz在线播放视频 | 美女自熨出白浆视频在线播放 |