天天看點

Python(八)進階特性

使用技巧

#!/usr/bin/env python
# coding:utf-8
def fun():
    return "hello"
    print "world"
#在函數裡面,遇到return,這個函數執行結束,return之後的語句不再執行,是以這裡直接調用函數不會輸出結果
fun()
#如果在調用的時候使用print+函數名,表示輸出函數的傳回值,是以這裡會輸出傳回值“hello”
print fun()      

疊代(iteration)

判斷一個對象可疊代:

1.可以通過for循環來周遊

Python(八)進階特性

2.通過collections子產品的iterable類型判斷

Python(八)進階特性

如果要對 list 實作類似 Java 那樣的下标循環怎麼辦:

python内置的枚舉方法enumerate,把一個 list 變成索引­元素對

Python(八)進階特性

清單生成式

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.背景

通過清單生成式,我們可以直接建立一個清單:

Python(八)進階特性

受到記憶體限制,清單容量肯定是有限的,例如建立一個包含 100 萬個元素的清單,會占用很大的存儲空間,建立過程有可能使電腦卡住。

2.定義

在循環的過程中不斷由前一個元素推算出後一個元素,但是後續元素并不立刻生成出來。這樣就不必建立完整的 list,進而節省大量的空間。在 Python 中,這種一邊循環一邊計算的機制,稱為生成器(Generator)

3.使用生成器的方法

(1.)把一個清單生成式的 [] 改成 ()

>>> g = (i for i in range(1,10000000))

>>> g

<generator object <genexpr> at 0x7f13a59d97d0>

調用:

 - 使用.next()每調用一次顯示一個元素

Python(八)進階特性

 - 使用for循環

Python(八)進階特性

(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      
Python(八)進階特性

題目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:

簡易聊天機器人

繼續閱讀