本章主要涉及選擇結(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
- 生成器/迭代器 的概念
- 列表解析 / 生成器表達(dá)式
- 遞歸
- lamda函數(shù)
- is 和 == 運(yùn)算符的差別