使用技巧
#!/usr/bin/env python
# coding:utf-8
def fun():
return "hello"
print "world"
#在函數裡面,遇到return,這個函數執行結束,return之後的語句不再執行,是以這裡直接調用函數不會輸出結果
fun()
#如果在調用的時候使用print+函數名,表示輸出函數的傳回值,是以這裡會輸出傳回值“hello”
print fun()
疊代(iteration)
判斷一個對象可疊代:
1.可以通過for循環來周遊
2.通過collections子產品的iterable類型判斷
如果要對 list 實作類似 Java 那樣的下标循環怎麼辦:
python内置的枚舉方法enumerate,把一個 list 變成索引元素對
清單生成式
for循環輸出結果(輸出1-10之間所有整數求平方之後的結果):
In [41]: [i**2 for i in range(1,11)]
Out[41]: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
for循環+if語句(輸出1-10之間所有整數求平方,再跟2取餘為0的結果):
In [42]: [i**2 for i in range(1,11) if (i**2)%2==0]
Out[42]: [4, 16, 36, 64, 100]
for循環+for循環(輸出'abc'和'123'的全排列):
In [46]: [i+j for i in "abc" for j in "123"]
Out[46]: ['a1', 'a2', 'a3', 'b1', 'b2', 'b3', 'c1', 'c2', 'c3']
擴充:
列出目前目錄下的所有.py檔案或目錄:
In [8]: [i for i in os.listdir(".") if i.endswith(".py")]
Out[8]: ['xuehao.py', 'var_name_rule.py']
#os.listdir(".")表示列出目前目錄下所有檔案、目錄
#i.endswith(".py")表示以.py結尾的
題目1:
給定一個正整數,編寫程式計算有多少對質數的和等于輸入的這個正整數,并輸出結果。輸
入值小于1000。
如,輸入為10, 程式應該輸出結果為2。(共有兩對質數的和為10,分别為(5,5),(3,7))
解答:
#!/usr/bin/env python
# coding:utf-8
shuru=input("輸入一個正整數(<=1000):")
def zhishu(num):
for i in range(2,num):
if num%i == 0:
return False
else:
return True
p=[i for i in range(2,shuru) if zhishu(i)]
peidui=[(m,n) for m in p for n in p if m+n == shuru and m <= n]
print len(peidui)
生成器
一、簡介
1.背景
通過清單生成式,我們可以直接建立一個清單:
受到記憶體限制,清單容量肯定是有限的,例如建立一個包含 100 萬個元素的清單,會占用很大的存儲空間,建立過程有可能使電腦卡住。
2.定義
在循環的過程中不斷由前一個元素推算出後一個元素,但是後續元素并不立刻生成出來。這樣就不必建立完整的 list,進而節省大量的空間。在 Python 中,這種一邊循環一邊計算的機制,稱為生成器(Generator)
3.使用生成器的方法
(1.)把一個清單生成式的 [] 改成 ()
>>> g = (i for i in range(1,10000000))
>>> g
<generator object <genexpr> at 0x7f13a59d97d0>
調用:
- 使用.next()每調用一次顯示一個元素
- 使用for循環
(2.)yield
如果函數裡面有yield關鍵字,那麼調用這個函數的結果指派給的變量為生成器
當生成器g調用第一個next方法時,會運作函數,直到遇到第一個yield停止
當調用第二個next方法時,會從停止的地方繼續執行,直到遇到下一個yield
#!/usr/bin/env python
# coding:utf-8
def fun():
print "1." #輸出"1."
yield "第一個yield" #遇到yield停止,yield後面跟的内容可以在print g.next()時顯示出來
print "2."
yield "第二個yield"
print "3."
yield "第三個yield"
print "4."
yield "第四個yield"
g = fun()
print g.next()
print g.next()
print g.next()
print g.next()
執行結果:
[root@python code5]# python test.py
1.
第一個yield
2.
第二個yield
3.
第三個yield
4.
第四個yield
Fibonacci(斐波納契)數列,除第一個和第二個數外,任意一個數都可由前兩個數相加得到:1, 1, 2, 3, 5, 8, 13, 21,...,本題要求生成6個數即可
#!/usr/bin/env python
# coding:utf-8
def fib(max): #max為最終生成fib數列個數
n,a,b = 0,0,1 #n代表目前fib數列個數,a代表n-1的值,b代表n的值
while n < max:
yield b #目前第一個數列
a,b = b,a+b
n += 1
g = fib(6) #變量g就是生成器
print g.next()
print g.next()
print g.next()
print g.next()
print g.next()
print g.next()
(3.)send用法
使用send方法給生成器函數發送資料
使用send方法前,必須先調用一次next()方法
遇到下一個yield停止
#!/usr/bin/env python
# coding:utf-8
def fun():
print "bbbb"
num1 = yield
print num1
num2 = yield
print num2
g = fun() #g是生成器
g.next() #使用send方法前,必須先調用一次next()方法
g.send(1) #将1發送給變量num1,此時num1=1
g.send(11) #将11發送給變量num1,此時num1=11
題目2:
生産者-消費者(producer-consumer)模型,也稱作有界緩沖區(bounded-buffer)問題,兩個程序共享一個公共的固定大小的
緩沖區。其中一個是生産者,用于将消息放入緩沖區;另外一個是消費者,用于從緩沖區中取出消息。問題出現在當緩沖區已經滿了,而此時生産者還想向其中放入
一個新的資料項的情形,其解決方法是讓生産者此時進行休眠,等待消費者從緩沖區中取走了一個或者多個資料後再去喚醒它。同樣地,當緩沖區已經空了,而消費
者還想去取消息,此時也可以讓消費者進行休眠,等待生産者放入一個或者多個資料時再喚醒它。
#!/usr/bin/env python
# coding:utf-8
import time #調用time内置子產品
food = [] #定義一個food清單,模拟包子店的所有包子
def consumer(name):
print "%s準備買包子" %(name)
while True:
baozi_name = yield
print "客戶[%s]買了[%s]餡的包子" %(name,baozi_name)
food.remove(baozi_name) #當客戶買了這個餡的包子就從清單中删除
def producer(name,*kind): #*kind表示使用函數中的可變參數
c1 = consumer("客戶1")
c1.next()
print "準備制作包子..."
for i in kind:
time.sleep(1) #表示休眠一秒,模拟廚師制作包子過程
print "廚師[%s]做了[%s]餡包子" %(name,i)
food.append(i) #廚師制作了這個餡的包子就在清單中加入
c1.send(i)
producer("白胡子","牛肉","韭菜","豆沙")
題目3:
簡易聊天機器人