南大慕課《用Python玩轉(zhuǎn)數(shù)據(jù)》-02Python面面觀


本章主要涉及選擇結(jié)構(gòu)既棺、循環(huán)結(jié)構(gòu)和自定義函數(shù)等內(nèi)容。

2.1 條件

1. if 語句

2. else語句

3. elif語句

4. 條件嵌套

注意下面代碼的語法

k = raw_input('input the index of shape:')
if k == '1':
 print 'circle'
elif k == '2':
 print 'oval'
elif k == '3':
 sd1 = int(raw_input('the first side:'))
 sd2 = int(raw_input('the second side:'))
 if sd1 == sd2:
     print "the square's area is:%d" %(sd1*sd2)
 else:
     print "the rectangle's area is:%d" %(sd1*sd2)
 print 'rectangle'
elif k == '4':
 print 'triangle'
else:
 print 'you input the invalid number'

2.2 range和xrange

可以產(chǎn)生一組有規(guī)律的數(shù)字泣崩,常用在循環(huán)結(jié)構(gòu)中。

1. 語法

range(start,end,step=1) #不包括end
range(start,end) #默認(rèn)步長為1劫笙,不包括end
range(end) #默認(rèn)從0開始

xrange語法與range是一樣的语婴。

2. range與xrange的異同

.



xrange 更節(jié)省內(nèi)存孕惜,因?yàn)樗姆祷刂凳且环N生成器(一種特殊的迭代器),更適合處理大數(shù)據(jù)量酌壕。

3. python3.0中的變化

在python 3當(dāng)中已沒有xrange函數(shù)了掏愁,python 2 中 xrange函數(shù),在python3 中是range()卵牍,python 2中的range函數(shù)果港,在python 3 中需要顯式調(diào)用 ,如 list(range(10))

4. 代碼示例

print range(3,12,2) #輸出:  [3, 5, 7, 9, 11]
print range(3,12) #輸出:  [3, 4, 5, 6, 7, 8, 9, 10, 11]
print range(6) #輸出:  [0, 1, 2, 3, 4, 5]
print xrange(6) #輸出:  xrange(6)
print list(xrange(6)) #輸出:  [0, 1, 2, 3, 4, 5]
for i in xrange(3,11,2):
    print "xrange %d" %i
for i1 in range(3,11,2):
    print "range %d" %i1

上述的輸出結(jié)果為

xrange 3
xrange 5
xrange 7
xrange 9
range 3
range 5
range 7
range 9

2.3 循環(huán)

1. while循環(huán)

sumA = 0
j = 1
while j < 5:
    print "j:%d" %j
    sumA += j
    j +=1
print "sumA:%d" %sumA

輸出結(jié)果為

j:1
j:2
j:3
j:4
sumA:10

2. for 循環(huán)

語法

for iter_var in iterable_object:
suite_to_repeat

iterable_object(可迭代的對(duì)象)糊昙,包含了如下

String
List
Tuple
Dictionary
File

s = 'python'
for c in s:
    print c

p
y
t
h
o
n

列表解析 print [i+1 for i in range(10) if i %2 ==0] #輸出 [1, 3, 5, 7, 9]
生成器表達(dá)式 print (a+1 for a in range(10) if a %2 ==0) #輸出 <generator object <genexpr> at 0x020EF3C8>
一般數(shù)據(jù)量比較大的時(shí)候京腥,用生成器表達(dá)式,數(shù)據(jù)量不太大的時(shí)候溅蛉,用列表解析公浪。

2.4 循環(huán)中的break,continue和else

1. break

質(zhì)數(shù)(prime number)又稱素?cái)?shù)船侧,有無限個(gè)欠气。除了1和它本身以外不再有其他的除數(shù)整除。根據(jù)算術(shù)基本定理镜撩,每一個(gè)比1大的整數(shù)预柒,要么本身是一個(gè)質(zhì)數(shù)队塘,要么可以寫成一系列質(zhì)數(shù)的乘積,最小的質(zhì)數(shù)是2宜鸯。

# 輸出2-100之間的素?cái)?shù)
from math import sqrt
j = 2
while j <= 100:
    i = 2
    k = sqrt(j)
    while(i <= k ):
        if j%i == 0:break
        i = i + 1
    if(i > k):
        print j,
    j += 1
from math import sqrt
for i in range(2,101):
    k = int(sqrt(i)) #獲取其平方根
    flag = 1 #每個(gè)循環(huán)判斷前憔古,先默認(rèn)每個(gè)數(shù)都是素?cái)?shù),0是合數(shù)淋袖,1是素?cái)?shù)
    for m in range(2,k+1):
        if ( i%m == 0): #發(fā)現(xiàn)有能被整除的數(shù)
            flag = 0 #設(shè)置其為合數(shù)
            break #一旦發(fā)現(xiàn)有可以被除的數(shù)鸿市,則終止判斷
    if (flag == 1): #如果該數(shù)是素?cái)?shù)
        print i, #添加了一個(gè)逗號(hào)后,打印的數(shù)如下即碗,不換行

輸出:2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
為什么是平方根:如果一個(gè)數(shù)不是素?cái)?shù)是合數(shù), 那么一定可以由兩個(gè)自然數(shù)相乘得到, 其中一個(gè)大于或等于它的平方根,一個(gè)小于或等于它的平方根焰情。并且成對(duì)出現(xiàn)。

問題:

i = 1
while(i % 3): 
    print i,
    if (i >= 10):
        break
    i += 1

A.1 2 4 5 7 8 #只列出了這個(gè)容易錯(cuò)誤的選項(xiàng)剥懒,注意當(dāng)循環(huán)到3的時(shí)候内舟,while內(nèi)的結(jié)果就是false了,會(huì)跳出循環(huán)初橘,不會(huì)繼續(xù)循環(huán) 后面的4-10
D.1 2 #正確答案

2. continue語句

  • 在while 和 for 循環(huán)中验游,continue語句的作用是
    • 停止當(dāng)前循環(huán),重新進(jìn)入新的循環(huán)(break是終止整個(gè)循環(huán))
    • while循環(huán)是判斷循環(huán)條件是否滿足
    • for 循環(huán)是判斷迭代是否結(jié)束
#輸出結(jié)果為 從3到101的奇數(shù)保檐,因?yàn)橛龅脚紨?shù)會(huì)被整除批狱,通過continue會(huì)跳過循環(huán)
sumA = 0
i = 1
while i <= 100:
    sumA += i
    i += 1
    if (i % 2 == 0):
        continue
    print "i=%d,sum=%d" %(i,sumA)

3. 循環(huán)中的else語句

  • 如果循環(huán)代碼從break處終止,則跳出循環(huán)
  • 正常結(jié)束循環(huán)的話展东,則執(zhí)行else中的代碼
# case1: 這個(gè)程序滿足if條件赔硫,則break跳出循環(huán),不執(zhí)行else語句
for i in range(1,10):
    if i > 5:
        print("程序終止,執(zhí)行到了第 %d 次" %i) #如果滿足if條件盐肃,則break跳出循環(huán)
        break
else:
    print ("程序被執(zhí)行到了第 %d 次" %i) #正常結(jié)束時(shí)被調(diào)用
 # case2: 這個(gè)程序不會(huì)滿足if內(nèi)的條件爪膊,會(huì)正常結(jié)束for循環(huán),然后走到else中
for i in range(1,10):
    if i > 100:
        print("程序終止,執(zhí)行到了第 %d 次" %i) #如果滿足if條件砸王,則break跳出循環(huán)
        break
else:
    print ("程序被執(zhí)行到了第 %d 次" %i) #正常結(jié)束時(shí)被調(diào)用

case1輸出結(jié)果為: 程序終止,執(zhí)行到了第 6 次
case2輸出結(jié)果為: 程序被執(zhí)行到了第 9 次

2.5 自定義函數(shù)

1. 自定義函數(shù)的創(chuàng)建

def addMe2Me(x):    #def funcation_name([arguments])
      'apply operation + to argument'    #optional documentation string
      return (x + x)    #function_suite
print addMe2Me(3.7)    #調(diào)用自定義函數(shù)

' ' 中成為DocString推盛,是一個(gè)函數(shù)的注釋,如果要看一個(gè)函數(shù)的DocString谦铃,要使用:print fn.__doc__

2.默認(rèn)參數(shù)(1)

函數(shù)可以有個(gè)默認(rèn)值耘成,在函數(shù)定義中,默認(rèn)參數(shù)以賦值語句的形式提供

def f(x = True):
    "whether x is a correct word or not"
    if x:
        print 'x is a correct word'
    print 'OK'
    
print f() #
print f(False)#

x is a correct word
OK
OK

3.默認(rèn)參數(shù)(2)

傳遞多個(gè)參數(shù)驹闰,只有一個(gè)參數(shù)有默認(rèn)值瘪菌。python中規(guī)定,默認(rèn)參數(shù)放在參數(shù)列表的最后嘹朗。

def f(x, y=True):
print f(68) # x為68师妙,y為默認(rèn)值true
print f(68,False)

  • 關(guān)鍵字參數(shù)
def f(x,y)
f(68,False) #這個(gè)叫做位置參數(shù),即參數(shù)的傳入順序與函數(shù)定義中的相同
f(y = False,x = 68) #允許改變參數(shù)列表中的參數(shù)順序屹培,但是必須要使用參數(shù)名區(qū)分默穴。這種叫做關(guān)鍵字參數(shù)
f(y = False,68) #?這種寫法是錯(cuò)誤的怔檩,一旦使用了關(guān)鍵字參數(shù),就全部要帶上參數(shù)名

4.傳遞函數(shù)

把函數(shù)名當(dāng)中一個(gè)普通的參數(shù)一樣蓄诽,傳遞給另一個(gè)函數(shù)

def addMe2Me(x):
    return 2*x
def self(f,y):
    print f(y)
self(addMe2Me,2.2) #output : 4.4

lamda函數(shù)

※以后再詳細(xì)了解※

2.6 遞歸

※略薛训,以后再補(bǔ)※

2.7 變量作用域

global_str = 'hello'
def foo():
    local_str = 'world'
    return global_str + local_str
print foo()
def f(x):
    global a   #a是一個(gè)全局變量,沒有這個(gè)global語句強(qiáng)調(diào)全局變量的話仑氛,程序會(huì)報(bào)錯(cuò)
    print a
    a = 5
    print a + x
a = 3
f(8)
print a

3 #這是輸出結(jié)果
13
5

測(cè)驗(yàn)部分

  • 如下面的代碼乙埃,輸出結(jié)果是11,lamda函數(shù)/函數(shù)參數(shù) 都有體現(xiàn)
def test(f, a, b): 
    print(f(a, b))
test((lambda x,y: x ** 3 + y), 2, 3)
  • 找前5個(gè)默尼森數(shù)调衰。P是素?cái)?shù)且M也是素?cái)?shù)膊爪,并且滿足等式M=2P-1自阱,則稱M為默尼森數(shù)嚎莉。例如,P=5沛豌,M=2P-1=31趋箩,5和31都是素?cái)?shù),因此31是默尼森數(shù)加派。
from math import sqrt

# python 2.7
# 判斷一個(gè)數(shù)是否是素?cái)?shù)的函數(shù)
def isPrime(i):
    k = int(sqrt(i))    #獲取其平方根
    flag = 1 #每個(gè)循環(huán)判斷前叫确,先默認(rèn)每個(gè)數(shù)都是素?cái)?shù),0是合數(shù)芍锦,1是素?cái)?shù)
    for m in range(2,k+1):
        if (i%m == 0):
            flag = 0 #設(shè)置為合數(shù)
            return 0 #返回不是素?cái)?shù)
            break #一旦發(fā)現(xiàn)有可以被除的數(shù)竹勉,終止判斷
    if (flag == 1):
            #print"%d is a prime" %i
            return 1 #返回是素?cái)?shù)
            
#找出NumMax 個(gè)默尼森數(shù)
def searchMonisen(NumMax):
    num = 0 # 用來給找到的默尼森數(shù) 計(jì)數(shù)
    x = 2 # 素?cái)?shù)2開始尋找
    while (num < NumMax):
        if ( isPrime(x) == 1):
            m = 2**x-1 #用來尋找 默尼森數(shù)
            if ( isPrime(m) == 1):
                print "%d is a monisen" %m
                num += 1
        x += 1

#調(diào)用函數(shù),找出前5個(gè)默尼森數(shù)
searchMonisen(5)

TODO

  1. 生成器/迭代器 的概念
  2. 列表解析 / 生成器表達(dá)式
  3. 遞歸
  4. lamda函數(shù)
  5. is 和 == 運(yùn)算符的差別
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末娄琉,一起剝皮案震驚了整個(gè)濱河市次乓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌孽水,老刑警劉巖票腰,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異女气,居然都是意外死亡杏慰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門炼鞠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缘滥,“玉大人,你說我怎么就攤上這事谒主⊥暧颍” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵瘩将,是天一觀的道長吟税。 經(jīng)常有香客問我凹耙,道長,這世上最難降的妖魔是什么肠仪? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任肖抱,我火速辦了婚禮,結(jié)果婚禮上异旧,老公的妹妹穿的比我還像新娘意述。我一直安慰自己,他們只是感情好吮蛹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布荤崇。 她就那樣靜靜地躺著,像睡著了一般潮针。 火紅的嫁衣襯著肌膚如雪术荤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天每篷,我揣著相機(jī)與錄音瓣戚,去河邊找鬼。 笑死焦读,一個(gè)胖子當(dāng)著我的面吹牛子库,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播矗晃,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼仑嗅,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了张症?” 一聲冷哼從身側(cè)響起仓技,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吠冤,沒想到半個(gè)月后浑彰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拯辙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年郭变,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涯保。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诉濒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出夕春,到底是詐尸還是另有隱情未荒,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布及志,位于F島的核電站片排,受9級(jí)特大地震影響寨腔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜率寡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一迫卢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧冶共,春花似錦乾蛤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至庙楚,卻和暖如春上荡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背醋奠。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工榛臼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伊佃,地道東北人窜司。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像航揉,于是被迫代替她去往敵國和親塞祈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容